From 85a94516f75f7c898d6c2cfd456c2aee97668175 Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Thu, 27 Mar 2025 16:31:32 +0600 Subject: [PATCH 001/180] Caps/Num/Scroll LED states are now displayed --- src/device/keyboard.c | 15 +++++++++------ src/device/keyboard_at.c | 3 +++ src/qt/qt_mainwindow.cpp | 33 +++++++++++++++++++++++++++++++++ src/qt/qt_mainwindow.hpp | 3 +++ 4 files changed, 48 insertions(+), 6 deletions(-) diff --git a/src/device/keyboard.c b/src/device/keyboard.c index a00968cf7..aa9aba3c6 100644 --- a/src/device/keyboard.c +++ b/src/device/keyboard.c @@ -72,9 +72,9 @@ static int keydelay[512]; #endif static scancode *scan_table; /* scancode table for keyboard */ -static uint8_t caps_lock = 0; -static uint8_t num_lock = 0; -static uint8_t scroll_lock = 0; +static volatile uint8_t caps_lock = 0; +static volatile uint8_t num_lock = 0; +static volatile uint8_t scroll_lock = 0; static uint8_t shift = 0; static int key5576mode = 0; @@ -318,13 +318,16 @@ keyboard_input(int down, uint16_t scan) shift &= ~0x80; break; case 0x03a: /* Caps Lock */ - caps_lock ^= 1; + if (!(machine_has_bus(machine, MACHINE_AT) > 0)) + caps_lock ^= 1; break; case 0x045: - num_lock ^= 1; + if (!(machine_has_bus(machine, MACHINE_AT) > 0)) + num_lock ^= 1; break; case 0x046: - scroll_lock ^= 1; + if (!(machine_has_bus(machine, MACHINE_AT) > 0)) + scroll_lock ^= 1; break; default: diff --git a/src/device/keyboard_at.c b/src/device/keyboard_at.c index e61b8547a..c5f73459b 100644 --- a/src/device/keyboard_at.c +++ b/src/device/keyboard_at.c @@ -3476,6 +3476,7 @@ keyboard_at_bat(void *priv) keyboard_scan = 1; + keyboard_update_states(0, 0, 0); kbc_at_dev_queue_add(dev, 0xaa, 0); } else { bat_counter--; @@ -3510,6 +3511,7 @@ keyboard_at_write(void *priv) switch (dev->command) { case 0xed: /* Set/reset LEDs */ kbc_at_dev_queue_add(dev, 0xfa, 0); + keyboard_update_states(!!(val & 0x4), !!(val & 0x2), val & 0x1); keyboard_at_log("%s: Set/reset LEDs [%02X]\n", dev->name, val); break; @@ -3762,6 +3764,7 @@ keyboard_at_init(const device_t *info) if (dev->port != NULL) { kbc_at_dev_reset(dev, 0); + keyboard_update_states(0, 0, 0); bat_counter = 0x0000; } diff --git a/src/qt/qt_mainwindow.cpp b/src/qt/qt_mainwindow.cpp index b3d0d9fa9..9f63bf297 100644 --- a/src/qt/qt_mainwindow.cpp +++ b/src/qt/qt_mainwindow.cpp @@ -184,6 +184,32 @@ MainWindow::MainWindow(QWidget *parent) ui->menuEGA_S_VGA_settings->menuAction()->setMenuRole(QAction::NoRole); ui->stackedWidget->setMouseTracking(true); statusBar()->setVisible(!hide_status_bar); + + num_label = new QLabel; + num_label->setText(" NUM "); + statusBar()->addPermanentWidget(num_label); + + scroll_label = new QLabel; + scroll_label->setText(" SCRL "); + statusBar()->addPermanentWidget(scroll_label); + + caps_label = new QLabel; + caps_label->setText(" CAPS "); + statusBar()->addPermanentWidget(caps_label); + + QTimer* ledKeyboardTimer = new QTimer(this); + ledKeyboardTimer->setTimerType(Qt::CoarseTimer); + ledKeyboardTimer->setInterval(1); + connect(ledKeyboardTimer, &QTimer::timeout, this, [this] () { + uint8_t caps, num, scroll; + keyboard_get_states(&caps, &num, &scroll); + + num_label->setStyleSheet(num ? "QLabel { background: green; }" : ""); + caps_label->setStyleSheet(caps ? "QLabel { background: green; }" : ""); + scroll_label->setStyleSheet(scroll ? "QLabel { background: green; }" : ""); + }); + ledKeyboardTimer->start(); + #ifdef Q_OS_WINDOWS util::setWin11RoundedCorners(this->winId(), (hide_status_bar ? false : true)); #endif @@ -211,6 +237,9 @@ MainWindow::MainWindow(QWidget *parent) connect(this, &MainWindow::hardResetCompleted, this, [this]() { ui->actionMCA_devices->setVisible(machine_has_bus(machine, MACHINE_BUS_MCA)); + num_label->setVisible(machine_has_bus(machine, MACHINE_AT) > 0); + scroll_label->setVisible(machine_has_bus(machine, MACHINE_AT) > 0); + caps_label->setVisible(machine_has_bus(machine, MACHINE_AT) > 0); while (QApplication::overrideCursor()) QApplication::restoreOverrideCursor(); #ifdef USE_WACOM @@ -1306,6 +1335,10 @@ MainWindow::refreshMediaMenu() status->refresh(ui->statusbar); ui->actionMCA_devices->setVisible(machine_has_bus(machine, MACHINE_BUS_MCA)); ui->actionACPI_Shutdown->setEnabled(!!acpi_enabled); + + num_label->setVisible(machine_has_bus(machine, MACHINE_AT) > 0); + scroll_label->setVisible(machine_has_bus(machine, MACHINE_AT) > 0); + caps_label->setVisible(machine_has_bus(machine, MACHINE_AT) > 0); } void diff --git a/src/qt/qt_mainwindow.hpp b/src/qt/qt_mainwindow.hpp index f1c6cadf6..06a739dd8 100644 --- a/src/qt/qt_mainwindow.hpp +++ b/src/qt/qt_mainwindow.hpp @@ -5,6 +5,7 @@ #include #include #include +#include #include #include @@ -184,6 +185,8 @@ private: friend class RendererStack; // For UI variable access by non-primary renderer windows. friend class WindowsRawInputFilter; // Needed to reload renderers on style sheet changes. + QLabel *caps_label, *scroll_label, *num_label; + bool isShowMessage = false; }; From 81e6b2a40a292474a03a2e1df38f774f53277f5d Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Thu, 27 Mar 2025 16:58:42 +0600 Subject: [PATCH 002/180] Correct the order --- src/qt/qt_mainwindow.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/qt/qt_mainwindow.cpp b/src/qt/qt_mainwindow.cpp index 9f63bf297..3ee8d61b4 100644 --- a/src/qt/qt_mainwindow.cpp +++ b/src/qt/qt_mainwindow.cpp @@ -189,14 +189,14 @@ MainWindow::MainWindow(QWidget *parent) num_label->setText(" NUM "); statusBar()->addPermanentWidget(num_label); - scroll_label = new QLabel; - scroll_label->setText(" SCRL "); - statusBar()->addPermanentWidget(scroll_label); - caps_label = new QLabel; caps_label->setText(" CAPS "); statusBar()->addPermanentWidget(caps_label); + scroll_label = new QLabel; + scroll_label->setText(" SCRL "); + statusBar()->addPermanentWidget(scroll_label); + QTimer* ledKeyboardTimer = new QTimer(this); ledKeyboardTimer->setTimerType(Qt::CoarseTimer); ledKeyboardTimer->setInterval(1); From 8861741945404350589613bbe2ab4157c0f30c8c Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Fri, 28 Mar 2025 00:10:16 +0600 Subject: [PATCH 003/180] Some needed changes for hard resets --- src/86box.c | 3 +++ src/device/keyboard.c | 2 +- src/device/keyboard_at.c | 4 +++- 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/86box.c b/src/86box.c index 2b6e1ba9f..57faa89c1 100644 --- a/src/86box.c +++ b/src/86box.c @@ -1301,6 +1301,9 @@ pc_reset_hard_init(void) /* Mark ACPI as unavailable */ acpi_enabled = 0; + /* Reset all keyboard indicators */ + keyboard_update_states(0, 0, 0); + /* Reset the general machine support modules. */ io_init(); diff --git a/src/device/keyboard.c b/src/device/keyboard.c index aa9aba3c6..7666b0e70 100644 --- a/src/device/keyboard.c +++ b/src/device/keyboard.c @@ -75,7 +75,7 @@ static scancode *scan_table; /* scancode table for keyboard */ static volatile uint8_t caps_lock = 0; static volatile uint8_t num_lock = 0; static volatile uint8_t scroll_lock = 0; -static uint8_t shift = 0; +static uint8_t shift = 0; static int key5576mode = 0; diff --git a/src/device/keyboard_at.c b/src/device/keyboard_at.c index c5f73459b..605f51e90 100644 --- a/src/device/keyboard_at.c +++ b/src/device/keyboard_at.c @@ -3764,12 +3764,12 @@ keyboard_at_init(const device_t *info) if (dev->port != NULL) { kbc_at_dev_reset(dev, 0); - keyboard_update_states(0, 0, 0); bat_counter = 0x0000; } keyboard_send = add_data_kbd; SavedKbd = dev; + keyboard_update_states(0, 0, 0); inv_cmd_response = (dev->type & FLAG_PS2) ? 0xfe : 0xfa; @@ -3788,6 +3788,8 @@ keyboard_at_close(void *priv) /* Disable the scancode maps. */ keyboard_set_table(NULL); + keyboard_update_states(0, 0, 0); + SavedKbd = NULL; free(dev); From 7e3cf32dcacc9b6af1b709c78323cbb3e6fd9cf0 Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Fri, 28 Mar 2025 00:15:06 +0600 Subject: [PATCH 004/180] Remove some no-more-needed changes --- src/86box.c | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/86box.c b/src/86box.c index 57faa89c1..2b6e1ba9f 100644 --- a/src/86box.c +++ b/src/86box.c @@ -1301,9 +1301,6 @@ pc_reset_hard_init(void) /* Mark ACPI as unavailable */ acpi_enabled = 0; - /* Reset all keyboard indicators */ - keyboard_update_states(0, 0, 0); - /* Reset the general machine support modules. */ io_init(); From 14ffb89f4d01fe01353e97edf7b874d9f6944477 Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Sat, 5 Apr 2025 01:49:54 +0600 Subject: [PATCH 005/180] SAASound filter fixes --- src/sound/saasound/SAAImpl.cpp | 1 - src/sound/saasound/SAAImpl.h | 2 ++ 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/sound/saasound/SAAImpl.cpp b/src/sound/saasound/SAAImpl.cpp index f136eefc6..cb5d8f739 100644 --- a/src/sound/saasound/SAAImpl.cpp +++ b/src/sound/saasound/SAAImpl.cpp @@ -306,7 +306,6 @@ void scale_for_output(unsigned int left_input, unsigned int right_input, void CSAASoundInternal::GenerateMany(BYTE* pBuffer, unsigned long nSamples) { unsigned int left_mixed, right_mixed; - static double filterout_z1_left_mixed = 0, filterout_z1_right_mixed = 0; #if defined(DEBUGSAA) || defined(USE_CONFIG_FILE) BYTE* pBufferStart = pBuffer; diff --git a/src/sound/saasound/SAAImpl.h b/src/sound/saasound/SAAImpl.h index 61fa79c58..6cd3048fe 100755 --- a/src/sound/saasound/SAAImpl.h +++ b/src/sound/saasound/SAAImpl.h @@ -36,6 +36,8 @@ private: unsigned int m_nSampleRate; unsigned int m_nOversample; bool m_bHighpass; + double filterout_z1_left_mixed = 0; + double filterout_z1_right_mixed = 0; #ifdef USE_CONFIG_FILE SAAConfig m_Config; #endif From 9032af002de12ca93282f6c8778ce0a0089d6362 Mon Sep 17 00:00:00 2001 From: Torinde <97228894+Torinde@users.noreply.github.com> Date: Wed, 9 Apr 2025 12:17:50 +0200 Subject: [PATCH 006/180] VIA Cyrix III (Samuel) - add codename To distinguish from Cyrix-heritage Joshua CPUs. #5451 --- src/cpu/cpu_table.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cpu/cpu_table.c b/src/cpu/cpu_table.c index e5c91b1a8..8524306dc 100644 --- a/src/cpu/cpu_table.c +++ b/src/cpu/cpu_table.c @@ -7793,7 +7793,7 @@ const cpu_family_t cpu_families[] = { { .package = CPU_PKG_SOCKET370, .manufacturer = "VIA", - .name = "Cyrix III", + .name = "Cyrix III (Samuel)", .internal_name = "c3_samuel", .cpus = (const CPU[]) { { /* out of multiplier range */ From 2c3fc6ec1ad25ea206c3f96822487645f4f3844b Mon Sep 17 00:00:00 2001 From: OBattler Date: Wed, 16 Apr 2025 22:09:27 +0200 Subject: [PATCH 007/180] Bump version to 5.0. --- CMakeLists.txt | 2 +- debian/changelog | 4 ++-- src/unix/assets/86Box.spec | 4 ++-- src/unix/assets/net.86box.86Box.metainfo.xml | 2 +- vcpkg.json | 2 +- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index a94321038..007c1ffd8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -36,7 +36,7 @@ if(MUNT_EXTERNAL) endif() project(86Box - VERSION 4.3 + VERSION 5.0 DESCRIPTION "Emulator of x86-based systems" HOMEPAGE_URL "https://86box.net" LANGUAGES C CXX) diff --git a/debian/changelog b/debian/changelog index 5665ff968..079fba5dd 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,5 +1,5 @@ -86box (4.3) UNRELEASED; urgency=medium +86box (5.0) UNRELEASED; urgency=medium * Bump release. - -- Jasmine Iwanek Wed, 13 Nov 2024 06:31:46 +0100 + -- Jasmine Iwanek Wed, 16 Apr 2025 22:08:04 +0200 diff --git a/src/unix/assets/86Box.spec b/src/unix/assets/86Box.spec index 86f380d22..bb9b85b12 100644 --- a/src/unix/assets/86Box.spec +++ b/src/unix/assets/86Box.spec @@ -15,7 +15,7 @@ %global romver 4.1 Name: 86Box -Version: 4.3 +Version: 5.0 Release: 1%{?dist} Summary: Classic PC emulator License: GPLv2+ @@ -121,5 +121,5 @@ popd %{_datadir}/%{name}/roms %changelog -* Sat Aug 31 Jasmine Iwanek 4.3-1 +* Sat Aug 31 Jasmine Iwanek 5.0-1 - Bump release diff --git a/src/unix/assets/net.86box.86Box.metainfo.xml b/src/unix/assets/net.86box.86Box.metainfo.xml index 6618f21d2..4c6a795a7 100644 --- a/src/unix/assets/net.86box.86Box.metainfo.xml +++ b/src/unix/assets/net.86box.86Box.metainfo.xml @@ -11,7 +11,7 @@ net.86box.86Box.desktop - + diff --git a/vcpkg.json b/vcpkg.json index 87859869b..20b783add 100644 --- a/vcpkg.json +++ b/vcpkg.json @@ -1,6 +1,6 @@ { "name": "86box", - "version-string": "4.3", + "version-string": "5.0", "homepage": "https://86box.net/", "documentation": "https://86box.readthedocs.io/", "license": "GPL-2.0-or-later", From 90265546e6bb75ac5e4dac25925458e5198e6cd4 Mon Sep 17 00:00:00 2001 From: OBattler Date: Thu, 17 Apr 2025 00:18:38 +0200 Subject: [PATCH 008/180] CD-ROM: Do not stop playing on a READ command that immediately terminates with an "illegal mode for this track" error, fixes track skipping in the Windows 95 CD Player. --- src/cdrom/cdrom.c | 89 +++++++++++++++++++++++++++------------ src/include/86box/cdrom.h | 2 + src/scsi/scsi_cdrom.c | 17 ++++++++ 3 files changed, 80 insertions(+), 28 deletions(-) diff --git a/src/cdrom/cdrom.c b/src/cdrom/cdrom.c index b30d93812..644a8e245 100644 --- a/src/cdrom/cdrom.c +++ b/src/cdrom/cdrom.c @@ -2274,6 +2274,65 @@ cdrom_read_disc_info_toc(cdrom_t *dev, uint8_t *b, return ret; } +static uint32_t +cdrom_msf_to_lba(const int sector, const int ismsf, + int cdrom_sector_type, const uint8_t vendor_type) +{ + int pos = sector; + uint32_t lba; + + if ((cdrom_sector_type & 0x0f) >= 0x08) { + mult = cdrom_sector_type >> 4; + pos /= mult; + } + + if (ismsf) { + const int m = (pos >> 16) & 0xff; + const int s = (pos >> 8) & 0xff; + const int f = pos & 0xff; + + lba = MSFtoLBA(m, s, f) - 150; + } else { + switch (vendor_type) { + case 0x00: + lba = pos; + break; + case 0x40: { + const int m = bcd2bin((pos >> 24) & 0xff); + const int s = bcd2bin((pos >> 16) & 0xff); + const int f = bcd2bin((pos >> 8) & 0xff); + + lba = MSFtoLBA(m, s, f) - 150; + break; + } case 0x80: + lba = bcd2bin((pos >> 24) & 0xff); + break; + /* Never used values but the compiler complains. */ + default: + lba = 0; + } + } + + return lba; +} + +int +cdrom_is_track_audio(cdrom_t *dev, const int sector, + const int ismsf, int cdrom_sector_type, + const uint8_t vendor_type) +{ + int audio = 0; + uint32_t lba = cdrom_msf_to_lba(sector, ismsf, + cdrom_sector_type, vendor_type); + + if (dev->ops->get_track_type) + audio = dev->ops->get_track_type(dev->local, lba); + + audio &= CD_TRACK_AUDIO; + + return audio; +} + int cdrom_readsector_raw(cdrom_t *dev, uint8_t *buffer, const int sector, const int ismsf, int cdrom_sector_type, const int cdrom_sector_flags, @@ -2298,38 +2357,12 @@ cdrom_readsector_raw(cdrom_t *dev, uint8_t *buffer, const int sector, const int uint8_t *temp_b; uint8_t *b = temp_b = buffer; int audio = 0; - uint32_t lba; + uint32_t lba = cdrom_msf_to_lba(sector, ismsf, + cdrom_sector_type, vendor_type); int mode2 = 0; *len = 0; - if (ismsf) { - const int m = (pos >> 16) & 0xff; - const int s = (pos >> 8) & 0xff; - const int f = pos & 0xff; - - lba = MSFtoLBA(m, s, f) - 150; - } else { - switch (vendor_type) { - case 0x00: - lba = pos; - break; - case 0x40: { - const int m = bcd2bin((pos >> 24) & 0xff); - const int s = bcd2bin((pos >> 16) & 0xff); - const int f = bcd2bin((pos >> 8) & 0xff); - - lba = MSFtoLBA(m, s, f) - 150; - break; - } case 0x80: - lba = bcd2bin((pos >> 24) & 0xff); - break; - /* Never used values but the compiler complains. */ - default: - lba = 0; - } - } - if (dev->ops->get_track_type) audio = dev->ops->get_track_type(dev->local, lba); diff --git a/src/include/86box/cdrom.h b/src/include/86box/cdrom.h index 30c6476fb..5ff4170a2 100644 --- a/src/include/86box/cdrom.h +++ b/src/include/86box/cdrom.h @@ -425,6 +425,8 @@ extern uint8_t cdrom_mitsumi_audio_play(cdrom_t *dev, uint32_t pos, uint #endif extern uint8_t cdrom_read_disc_info_toc(cdrom_t *dev, uint8_t *b, const uint8_t track, const int type); +extern int cdrom_is_track_audio(cdrom_t *dev, const int sector, const int ismsf, + int cdrom_sector_type, const uint8_t vendor_type); extern int cdrom_readsector_raw(cdrom_t *dev, uint8_t *buffer, const int sector, const int ismsf, int cdrom_sector_type, const int cdrom_sector_flags, int *len, const uint8_t vendor_type); diff --git a/src/scsi/scsi_cdrom.c b/src/scsi/scsi_cdrom.c index 246f185e8..95c8c3640 100644 --- a/src/scsi/scsi_cdrom.c +++ b/src/scsi/scsi_cdrom.c @@ -2610,6 +2610,11 @@ scsi_cdrom_command(scsi_common_t *sc, const uint8_t *cdb) dev->sector_len = 256; dev->sector_pos = ((((uint32_t) cdb[1]) & 0x1f) << 16) | (((uint32_t) cdb[2]) << 8) | ((uint32_t) cdb[3]); + if (cdrom_is_track_audio(dev->drv, dev->sector_pos, msf, + dev->sector_type, 0x00)) { + scsi_cdrom_illegal_mode(dev); + ret = 0; + } scsi_cdrom_log(dev->log, "READ (6): Length: %i, LBA: %i\n", dev->sector_len, dev->sector_pos); break; @@ -2617,6 +2622,12 @@ scsi_cdrom_command(scsi_common_t *sc, const uint8_t *cdb) dev->sector_len = (cdb[7] << 8) | cdb[8]; dev->sector_pos = (cdb[2] << 24) | (cdb[3] << 16) | (cdb[4] << 8) | cdb[5]; + if (cdrom_is_track_audio(dev->drv, dev->sector_pos, msf, + dev->sector_type, dev->use_cdb_9 ? + (cdb[9] & 0xc0) : 0x00)) { + scsi_cdrom_illegal_mode(dev); + ret = 0; + } scsi_cdrom_log(dev->log, "READ (10): Length: %i, LBA: %i\n", dev->sector_len, dev->sector_pos); break; @@ -2627,6 +2638,12 @@ scsi_cdrom_command(scsi_common_t *sc, const uint8_t *cdb) dev->sector_pos = (((uint32_t) cdb[2]) << 24) | (((uint32_t) cdb[3]) << 16) | (((uint32_t) cdb[4]) << 8) | ((uint32_t) cdb[5]); + if (cdrom_is_track_audio(dev->drv, dev->sector_pos, msf, + dev->sector_type, dev->use_cdb_9 ? + (cdb[9] & 0xc0) : 0x00)) { + scsi_cdrom_illegal_mode(dev); + ret = 0; + } scsi_cdrom_log(dev->log, "READ (12): Length: %i, LBA: %i\n", dev->sector_len, dev->sector_pos); break; From 18aea4e19f2abe96ce40d84b07da2464dfc3e151 Mon Sep 17 00:00:00 2001 From: OBattler Date: Thu, 17 Apr 2025 00:30:12 +0200 Subject: [PATCH 009/180] CD-ROM: Fix a newly introduced accidental division by zero. --- src/cdrom/cdrom.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/cdrom/cdrom.c b/src/cdrom/cdrom.c index 644a8e245..0f468bba0 100644 --- a/src/cdrom/cdrom.c +++ b/src/cdrom/cdrom.c @@ -2338,8 +2338,9 @@ cdrom_readsector_raw(cdrom_t *dev, uint8_t *buffer, const int sector, const int int cdrom_sector_type, const int cdrom_sector_flags, int *len, const uint8_t vendor_type) { - int pos = sector; - int ret = 0; + int pos = sector; + int ret = 0; + const int old_type = cdrom_sector_type; if ((cdrom_sector_type & 0x0f) >= 0x08) { mult = cdrom_sector_type >> 4; @@ -2358,7 +2359,7 @@ cdrom_readsector_raw(cdrom_t *dev, uint8_t *buffer, const int sector, const int uint8_t *b = temp_b = buffer; int audio = 0; uint32_t lba = cdrom_msf_to_lba(sector, ismsf, - cdrom_sector_type, vendor_type); + old_type, vendor_type); int mode2 = 0; *len = 0; From 37ed6662dc2c45cf8099b3170768c1ff7a103c30 Mon Sep 17 00:00:00 2001 From: OBattler Date: Thu, 17 Apr 2025 01:10:04 +0200 Subject: [PATCH 010/180] Serial mouse: do not attempt to transmit a byte if none is queued, fixes #5475. --- src/device/mouse_serial.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/device/mouse_serial.c b/src/device/mouse_serial.c index 96d3a867c..b50a3c987 100644 --- a/src/device/mouse_serial.c +++ b/src/device/mouse_serial.c @@ -146,7 +146,11 @@ sermouse_transmit_byte(mouse_t *dev, int do_next) serial_write_fifo(dev->serial, dev->buf[dev->buf_pos]); if (do_next) { - dev->buf_pos = (dev->buf_pos + 1) % dev->buf_len; + /* If we have a buffer length of 0, pretend the state is STATE_SKIP_PACKET. */ + if (dev->buf_len == 0) + dev->buf_pos = 0; + else + dev->buf_pos = (dev->buf_pos + 1) % dev->buf_len; if (dev->buf_pos != 0) sermouse_set_period(dev, dev->transmit_period); @@ -374,6 +378,7 @@ sermouse_report(mouse_t *dev) break; default: + pclog("unknown dev->format = %02X\n", dev->format); break; } @@ -747,7 +752,7 @@ sermouse_timer(void *priv) if (!dev->prompt && !dev->continuous) sermouse_transmit_report(dev, (dev->state == STATE_TRANSMIT_REPORT)); else - dev->state = STATE_IDLE; + dev->state = STATE_IDLE; break; case STATE_TRANSMIT_REPORT: case STATE_TRANSMIT: From 6ab7f61c744611fa62284e2792698c8b51d1d499 Mon Sep 17 00:00:00 2001 From: OBattler Date: Thu, 17 Apr 2025 01:12:39 +0200 Subject: [PATCH 011/180] Serial mouse: Remove the excess logging line. --- src/device/mouse_serial.c | 1 - 1 file changed, 1 deletion(-) diff --git a/src/device/mouse_serial.c b/src/device/mouse_serial.c index b50a3c987..8ed4865cd 100644 --- a/src/device/mouse_serial.c +++ b/src/device/mouse_serial.c @@ -378,7 +378,6 @@ sermouse_report(mouse_t *dev) break; default: - pclog("unknown dev->format = %02X\n", dev->format); break; } From 629d976f8ea85e08b6049bbd2f4a492ee4f00106 Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Thu, 17 Apr 2025 13:31:28 +0600 Subject: [PATCH 012/180] Disable OpenGL 3.x logs --- src/qt/qt_openglrenderer.cpp | 48 +++++++++++++++++++++++++----------- 1 file changed, 33 insertions(+), 15 deletions(-) diff --git a/src/qt/qt_openglrenderer.cpp b/src/qt/qt_openglrenderer.cpp index 2e8869c09..53d29f9a8 100644 --- a/src/qt/qt_openglrenderer.cpp +++ b/src/qt/qt_openglrenderer.cpp @@ -145,6 +145,24 @@ const char* fragment_shader_default_color_src = " outColor.a = 1.0;\n" "}\n"; +#ifdef ENABLE_OGL3_LOG +int ogl3_do_log = ENABLE_OGL3_LOG; + +static void +ogl3_log(const char *fmt, ...) +{ + va_list ap; + + if (ogl3_do_log) { + va_start(ap, fmt); + ogl3_log_ex(fmt, ap); + va_end(ap); + } +} +#else +# define ogl3_log(fmt, ...) +#endif + static inline int next_pow2(unsigned int n) { @@ -232,8 +250,8 @@ OpenGLRenderer::compile_shader(GLenum shader_type, const char *prepend, const ch main_window->showMessage(MBX_ERROR | MBX_FATAL, tr("GLSL Error"), tr("Could not compile shader:\n\n%1").arg(log).replace("\n", "
")); // wx_simple_messagebox("GLSL Error", "Could not compile shader:\n%s", log); - pclog("Could not compile shader: %s\n", log); - // pclog("Shader: %s\n", program); + ogl3_log("Could not compile shader: %s\n", log); + // ogl3_log("Shader: %s\n", program); free(log); return 0; @@ -348,7 +366,7 @@ OpenGLRenderer::create_texture(struct shader_texture *tex) tex->width = max_texture_size; if (tex->height > max_texture_size) tex->height = max_texture_size; - pclog("Create texture with size %dx%d\n", tex->width, tex->height); + ogl3_log("Create texture with size %dx%d\n", tex->width, tex->height); glw.glGenTextures(1, (GLuint *) &tex->id); glw.glBindTexture(GL_TEXTURE_2D, tex->id); glw.glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, tex->wrap_mode); @@ -452,7 +470,7 @@ OpenGLRenderer::create_fbo(struct shader_fbo *fbo) glw.glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, fbo->texture.id, 0); if (glw.glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) - pclog("Could not create framebuffer!\n"); + ogl3_log("Could not create framebuffer!\n"); glw.glBindFramebuffer(GL_FRAMEBUFFER, 0); } @@ -629,12 +647,12 @@ OpenGLRenderer::load_glslp(glsl_t *glsl, int num_shader, const char *f) struct shader_lut_texture *tex = &gshader->lut_textures[i]; strcpy(tex->name, texture->name); - pclog("Load texture %s...\n", file); + ogl3_log("Load texture %s...\n", file); if (!load_texture(file, &tex->texture)) { //QMessageBox::critical(main_window, tr("GLSL Error"), tr("Could not load texture: %s").arg(file)); main_window->showMessage(MBX_ERROR | MBX_FATAL, tr("GLSL Error"), tr("Could not load texture: %1").arg(file)); - pclog("Could not load texture %s!\n", file); + ogl3_log("Could not load texture %s!\n", file); failed = 1; break; } @@ -676,16 +694,16 @@ OpenGLRenderer::load_glslp(glsl_t *glsl, int num_shader, const char *f) if (!strlen(pass->alias)) sprintf(pass->alias, "Pass %u", (i + 1)); - pclog("Creating pass %u (%s)\n", (i + 1), pass->alias); - pclog("Loading shader %s...\n", shader->shader_fn); + ogl3_log("Creating pass %u (%s)\n", (i + 1), pass->alias); + ogl3_log("Loading shader %s...\n", shader->shader_fn); if (!shader->shader_program) { main_window->showMessage(MBX_ERROR | MBX_FATAL, tr("GLSL Error"), tr("Could not load shader: %1").arg(shader->shader_fn)); // wx_simple_messagebox("GLSL Error", "Could not load shader: %s", shader->shader_fn); - pclog("Could not load shader %s\n", shader->shader_fn); + ogl3_log("Could not load shader %s\n", shader->shader_fn); failed = 1; break; } else - pclog("Shader %s loaded\n", shader->shader_fn); + ogl3_log("Shader %s loaded\n", shader->shader_fn); failed = !compile_shader(GL_VERTEX_SHADER, "#define VERTEX\n#define PARAMETER_UNIFORM\n", shader->shader_program, &pass->program.vertex_shader) || !compile_shader(GL_FRAGMENT_SHADER, "#define FRAGMENT\n#define PARAMETER_UNIFORM\n", @@ -856,15 +874,15 @@ OpenGLRenderer::initialize() glw.initializeOpenGLFunctions(); - pclog("OpenGL information: [%s] %s (%s)\n", glw.glGetString(GL_VENDOR), glw.glGetString(GL_RENDERER), glw.glGetString(GL_VERSION)); + ogl3_log("OpenGL information: [%s] %s (%s)\n", glw.glGetString(GL_VENDOR), glw.glGetString(GL_RENDERER), glw.glGetString(GL_VERSION)); glsl_version[0] = glsl_version[1] = -1; glw.glGetIntegerv(GL_MAJOR_VERSION, &glsl_version[0]); glw.glGetIntegerv(GL_MINOR_VERSION, &glsl_version[1]); if (glsl_version[0] < 3) { throw opengl_init_error(tr("OpenGL version 3.0 or greater is required. Current GLSL version is %1.%2").arg(glsl_version[0]).arg(glsl_version[1])); } - pclog("Using OpenGL %s\n", glw.glGetString(GL_VERSION)); - pclog("Using Shading Language %s\n", glw.glGetString(GL_SHADING_LANGUAGE_VERSION)); + ogl3_log("Using OpenGL %s\n", glw.glGetString(GL_VERSION)); + ogl3_log("Using Shading Language %s\n", glw.glGetString(GL_SHADING_LANGUAGE_VERSION)); glslVersion = reinterpret_cast(glw.glGetString(GL_SHADING_LANGUAGE_VERSION)); glslVersion.truncate(4); @@ -876,7 +894,7 @@ OpenGLRenderer::initialize() glslVersion.append(" core"); glw.glGetIntegerv(GL_MAX_TEXTURE_SIZE, &max_texture_size); - pclog("Max texture size: %dx%d\n", max_texture_size, max_texture_size); + ogl3_log("Max texture size: %dx%d\n", max_texture_size, max_texture_size); glw.glEnable(GL_TEXTURE_2D); @@ -1218,7 +1236,7 @@ OpenGLRenderer::render_pass(struct render_data *data) int i; GLuint texture_unit = 0; - // pclog("pass %d: %gx%g, %gx%g -> %gx%g, %gx%g, %gx%g\n", num_pass, pass->state.input_size[0], + // ogl3_log("pass %d: %gx%g, %gx%g -> %gx%g, %gx%g, %gx%g\n", num_pass, pass->state.input_size[0], // pass->state.input_size[1], pass->state.input_texture_size[0], pass->state.input_texture_size[1], // pass->state.output_size[0], pass->state.output_size[1], pass->state.output_texture_size[0], // pass->state.output_texture_size[1], output_size[0], output_size[1]); From 05f4906eb30c11745e30bf563883594084ad835c Mon Sep 17 00:00:00 2001 From: GH Cao Date: Fri, 18 Apr 2025 00:36:04 +0800 Subject: [PATCH 013/180] win_dynld: use LoadLibraryA specifically --- src/qt/win_dynld.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/qt/win_dynld.c b/src/qt/win_dynld.c index 88fb632bc..e4d9d5a13 100644 --- a/src/qt/win_dynld.c +++ b/src/qt/win_dynld.c @@ -51,7 +51,7 @@ dynld_module(const char *name, dllimp_t *table) void *func; /* See if we can load the desired module. */ - if ((h = LoadLibrary(name)) == NULL) { + if ((h = LoadLibraryA(name)) == NULL) { dynld_log("DynLd(\"%s\"): library not found! (%08X)\n", name, GetLastError()); return (NULL); } From 46978a808c7e0309ca4a88f0028669d49eb177a7 Mon Sep 17 00:00:00 2001 From: Alexander Babikov Date: Wed, 16 Apr 2025 19:56:48 +0500 Subject: [PATCH 014/180] Disable rich text for `ui_msgbox()`-generated dialogs No strings that gets passed to `ui_msgbox()` use HTML, and it causes newlines to be ignored unless replaced by
`MainWindow::showMessage()` can still accept rich text, but it's now optional and disabled by default --- src/network/network.c | 2 +- src/qt/qt_mainwindow.cpp | 13 +++++++------ src/qt/qt_mainwindow.hpp | 6 +++--- src/qt/qt_openglrenderer.cpp | 10 +++++----- src/qt/qt_ui.cpp | 3 +-- 5 files changed, 17 insertions(+), 17 deletions(-) diff --git a/src/network/network.c b/src/network/network.c index 047642085..52b686c7e 100644 --- a/src/network/network.c +++ b/src/network/network.c @@ -501,7 +501,7 @@ network_attach(void *card_drv, uint8_t *mac, NETRXCB rx, NETSETLINKSTATE set_lin if(net_cards_conf[net_card_current].net_type != NET_TYPE_NONE) { // We're here because of a failure - swprintf(tempmsg, sizeof_w(tempmsg), L"%ls:

%s

%ls", plat_get_string(STRING_NET_ERROR), net_drv_error, plat_get_string(STRING_NET_ERROR_DESC)); + swprintf(tempmsg, sizeof_w(tempmsg), L"%ls:\n\n%s\n\n%ls", plat_get_string(STRING_NET_ERROR), net_drv_error, plat_get_string(STRING_NET_ERROR_DESC)); ui_msgbox(MBX_ERROR, tempmsg); net_cards_conf[net_card_current].net_type = NET_TYPE_NONE; } diff --git a/src/qt/qt_mainwindow.cpp b/src/qt/qt_mainwindow.cpp index 886f84dcd..760ca7d9b 100644 --- a/src/qt/qt_mainwindow.cpp +++ b/src/qt/qt_mainwindow.cpp @@ -1342,17 +1342,17 @@ MainWindow::refreshMediaMenu() } void -MainWindow::showMessage(int flags, const QString &header, const QString &message) +MainWindow::showMessage(int flags, const QString &header, const QString &message, bool richText) { if (QThread::currentThread() == this->thread()) { if (!cpu_thread_running) { - showMessageForNonQtThread(flags, header, message, nullptr); + showMessageForNonQtThread(flags, header, message, richText, nullptr); } else - showMessage_(flags, header, message); + showMessage_(flags, header, message, richText); } else { std::atomic_bool done = false; - emit showMessageForNonQtThread(flags, header, message, &done); + emit showMessageForNonQtThread(flags, header, message, richText, &done); while (!done) { QThread::msleep(1); } @@ -1360,7 +1360,7 @@ MainWindow::showMessage(int flags, const QString &header, const QString &message } void -MainWindow::showMessage_(int flags, const QString &header, const QString &message, std::atomic_bool *done) +MainWindow::showMessage_(int flags, const QString &header, const QString &message, bool richText, std::atomic_bool *done) { if (done) { *done = false; @@ -1372,7 +1372,8 @@ MainWindow::showMessage_(int flags, const QString &header, const QString &messag } else if (!(flags & (MBX_ERROR | MBX_WARNING))) { box.setIcon(QMessageBox::Warning); } - box.setTextFormat(Qt::TextFormat::RichText); + if (richText) + box.setTextFormat(Qt::TextFormat::RichText); box.exec(); if (done) { *done = true; diff --git a/src/qt/qt_mainwindow.hpp b/src/qt/qt_mainwindow.hpp index 4b3f9ecae..739d179ff 100644 --- a/src/qt/qt_mainwindow.hpp +++ b/src/qt/qt_mainwindow.hpp @@ -26,7 +26,7 @@ public: explicit MainWindow(QWidget *parent = nullptr); ~MainWindow(); - void showMessage(int flags, const QString &header, const QString &message); + void showMessage(int flags, const QString &header, const QString &message, bool richText); void getTitle(wchar_t *title); void blitToWidget(int x, int y, int w, int h, int monitor_index); QSize getRenderWidgetSize(); @@ -55,7 +55,7 @@ signals: void setFullscreen(bool state); void setMouseCapture(bool state); - void showMessageForNonQtThread(int flags, const QString &header, const QString &message, std::atomic_bool* done); + void showMessageForNonQtThread(int flags, const QString &header, const QString &message, bool richText, std::atomic_bool* done); void getTitleForNonQtThread(wchar_t *title); public slots: void showSettings(); @@ -123,7 +123,7 @@ private slots: void on_actionRenderer_options_triggered(); void refreshMediaMenu(); - void showMessage_(int flags, const QString &header, const QString &message, std::atomic_bool* done = nullptr); + void showMessage_(int flags, const QString &header, const QString &message, bool richText, std::atomic_bool* done = nullptr); void getTitle_(wchar_t *title); void on_actionMCA_devices_triggered(); diff --git a/src/qt/qt_openglrenderer.cpp b/src/qt/qt_openglrenderer.cpp index 53d29f9a8..45bae6ea7 100644 --- a/src/qt/qt_openglrenderer.cpp +++ b/src/qt/qt_openglrenderer.cpp @@ -200,7 +200,7 @@ OpenGLRenderer::create_program(struct shader_program *program) glw.glGetProgramiv(program->id, GL_INFO_LOG_LENGTH, &maxLength); char *log = (char *) malloc(maxLength); glw.glGetProgramInfoLog(program->id, maxLength, &length, log); - main_window->showMessage(MBX_ERROR | MBX_FATAL, tr("GLSL Error"), tr("Program not linked:\n\n%1").arg(log).replace("\n", "
")); + main_window->showMessage(MBX_ERROR | MBX_FATAL, tr("GLSL Error"), tr("Program not linked:\n\n%1").arg(log), false); // wx_simple_messagebox("GLSL Error", "Program not linked:\n%s", log); free(log); return 0; @@ -247,7 +247,7 @@ OpenGLRenderer::compile_shader(GLenum shader_type, const char *prepend, const ch glw.glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &length); char *log = (char *) malloc(length); glw.glGetShaderInfoLog(shader, length, &length, log); - main_window->showMessage(MBX_ERROR | MBX_FATAL, tr("GLSL Error"), tr("Could not compile shader:\n\n%1").arg(log).replace("\n", "
")); + main_window->showMessage(MBX_ERROR | MBX_FATAL, tr("GLSL Error"), tr("Could not compile shader:\n\n%1").arg(log), false); // wx_simple_messagebox("GLSL Error", "Could not compile shader:\n%s", log); ogl3_log("Could not compile shader: %s\n", log); @@ -651,7 +651,7 @@ OpenGLRenderer::load_glslp(glsl_t *glsl, int num_shader, const char *f) if (!load_texture(file, &tex->texture)) { //QMessageBox::critical(main_window, tr("GLSL Error"), tr("Could not load texture: %s").arg(file)); - main_window->showMessage(MBX_ERROR | MBX_FATAL, tr("GLSL Error"), tr("Could not load texture: %1").arg(file)); + main_window->showMessage(MBX_ERROR | MBX_FATAL, tr("GLSL Error"), tr("Could not load texture: %1").arg(file), false); ogl3_log("Could not load texture %s!\n", file); failed = 1; break; @@ -697,7 +697,7 @@ OpenGLRenderer::load_glslp(glsl_t *glsl, int num_shader, const char *f) ogl3_log("Creating pass %u (%s)\n", (i + 1), pass->alias); ogl3_log("Loading shader %s...\n", shader->shader_fn); if (!shader->shader_program) { - main_window->showMessage(MBX_ERROR | MBX_FATAL, tr("GLSL Error"), tr("Could not load shader: %1").arg(shader->shader_fn)); + main_window->showMessage(MBX_ERROR | MBX_FATAL, tr("GLSL Error"), tr("Could not load shader: %1").arg(shader->shader_fn), false); // wx_simple_messagebox("GLSL Error", "Could not load shader: %s", shader->shader_fn); ogl3_log("Could not load shader %s\n", shader->shader_fn); failed = 1; @@ -1115,7 +1115,7 @@ OpenGLRenderer::initialize() for (auto &flag : buf_usage) flag.test_and_set(); - main_window->showMessage(MBX_ERROR | MBX_FATAL, tr("Error initializing OpenGL"), e.what() + tr("\nFalling back to software rendering.")); + main_window->showMessage(MBX_ERROR | MBX_FATAL, tr("Error initializing OpenGL"), e.what() + tr("\nFalling back to software rendering."), false); context->doneCurrent(); isFinalized = true; diff --git a/src/qt/qt_ui.cpp b/src/qt/qt_ui.cpp index b9253663b..57f8001dc 100644 --- a/src/qt/qt_ui.cpp +++ b/src/qt/qt_ui.cpp @@ -142,11 +142,10 @@ ui_msgbox_header(int flags, void *header, void *message) // any error in early init if (main_window == nullptr) { QMessageBox msgBox(QMessageBox::Icon::Critical, hdr, msg); - msgBox.setTextFormat(Qt::TextFormat::RichText); msgBox.exec(); } else { // else scope it to main_window - main_window->showMessage(flags, hdr, msg); + main_window->showMessage(flags, hdr, msg, false); } return 0; } From d5cc259d65c65069fb438ffd1e33116ebe2af610 Mon Sep 17 00:00:00 2001 From: Alexander Babikov Date: Wed, 16 Apr 2025 20:47:13 +0500 Subject: [PATCH 015/180] Dev branch: Enable Mitsumi CD-ROM in the UI --- src/cdrom/cdrom.c | 6 ++++++ src/qt/CMakeLists.txt | 4 ++++ src/qt/qt_harddrive_common.cpp | 6 +++--- src/qt/qt_settingsstoragecontrollers.cpp | 9 +++++++++ src/qt/qt_settingsstoragecontrollers.ui | 9 --------- 5 files changed, 22 insertions(+), 12 deletions(-) diff --git a/src/cdrom/cdrom.c b/src/cdrom/cdrom.c index 0f468bba0..44bf2811c 100644 --- a/src/cdrom/cdrom.c +++ b/src/cdrom/cdrom.c @@ -29,6 +29,9 @@ #include <86box/cdrom.h> #include <86box/cdrom_image.h> #include <86box/cdrom_interface.h> +#ifdef USE_CDROM_MITSUMI +#include <86box/cdrom_mitsumi.h> +#endif #include <86box/log.h> #include <86box/plat.h> #include <86box/plat_cdrom_ioctl.h> @@ -117,6 +120,9 @@ static const struct { } controllers[] = { // clang-format off { &cdrom_interface_none_device }, +#ifdef USE_CDROM_MITSUMI + { &mitsumi_cdrom_device }, +#endif { NULL } // clang-format on }; diff --git a/src/qt/CMakeLists.txt b/src/qt/CMakeLists.txt index e6e45fc25..f02e3708a 100644 --- a/src/qt/CMakeLists.txt +++ b/src/qt/CMakeLists.txt @@ -207,6 +207,10 @@ if(WACOM) target_compile_definitions(ui PRIVATE USE_WACOM) endif() +if(CDROM_MITSUMI) + target_compile_definitions(ui PRIVATE USE_CDROM_MITSUMI) +endif() + if(WIN32) enable_language(RC) target_sources(86Box PUBLIC 86Box-qt.rc) diff --git a/src/qt/qt_harddrive_common.cpp b/src/qt/qt_harddrive_common.cpp index e0b0233f1..52ae10a98 100644 --- a/src/qt/qt_harddrive_common.cpp +++ b/src/qt/qt_harddrive_common.cpp @@ -51,7 +51,7 @@ void Harddrives::populateRemovableBuses(QAbstractItemModel *model) { model->removeRows(0, model->rowCount()); -#if 0 +#ifdef USE_CDROM_MITSUMI model->insertRows(0, 4); #else model->insertRows(0, 3); @@ -59,14 +59,14 @@ Harddrives::populateRemovableBuses(QAbstractItemModel *model) model->setData(model->index(0, 0), QObject::tr("Disabled")); model->setData(model->index(1, 0), QObject::tr("ATAPI")); model->setData(model->index(2, 0), QObject::tr("SCSI")); -#if 0 +#ifdef USE_CDROM_MITSUMI model->setData(model->index(3, 0), QObject::tr("Mitsumi")); #endif model->setData(model->index(0, 0), HDD_BUS_DISABLED, Qt::UserRole); model->setData(model->index(1, 0), HDD_BUS_ATAPI, Qt::UserRole); model->setData(model->index(2, 0), HDD_BUS_SCSI, Qt::UserRole); -#if 0 +#ifdef USE_CDROM_MITSUMI model->setData(model->index(3, 0), CDROM_BUS_MITSUMI, Qt::UserRole); #endif } diff --git a/src/qt/qt_settingsstoragecontrollers.cpp b/src/qt/qt_settingsstoragecontrollers.cpp index 9bd1bda6f..6fa5906b5 100644 --- a/src/qt/qt_settingsstoragecontrollers.cpp +++ b/src/qt/qt_settingsstoragecontrollers.cpp @@ -142,6 +142,15 @@ SettingsStorageControllers::onCurrentMachineChanged(int machineId) ui->comboBoxFD->setCurrentIndex(selectedRow); /*CD interface controller config*/ +#ifdef USE_CDROM_MITSUMI + ui->label_7->setVisible(true); + ui->comboBoxCDInterface->setVisible(true); + ui->pushButtonCDInterface->setVisible(true); +#else + ui->label_7->setVisible(false); + ui->comboBoxCDInterface->setVisible(false); + ui->pushButtonCDInterface->setVisible(false); +#endif c = 0; model = ui->comboBoxCDInterface->model(); removeRows = model->rowCount(); diff --git a/src/qt/qt_settingsstoragecontrollers.ui b/src/qt/qt_settingsstoragecontrollers.ui index 16d6e2494..a167e5bc1 100644 --- a/src/qt/qt_settingsstoragecontrollers.ui +++ b/src/qt/qt_settingsstoragecontrollers.ui @@ -51,9 +51,6 @@ - - false - CD-ROM Controller: @@ -61,9 +58,6 @@ - - false - 30 @@ -71,9 +65,6 @@ - - false - Configure From a4a26f8b56c1f39ef0356032bd2c6657ae3872c9 Mon Sep 17 00:00:00 2001 From: Alexander Babikov Date: Wed, 16 Apr 2025 22:04:14 +0500 Subject: [PATCH 016/180] qt: Fix HDD model still being speed in the HDD list --- src/qt/qt_settingsharddisks.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/qt/qt_settingsharddisks.cpp b/src/qt/qt_settingsharddisks.cpp index ded50ac34..32b677888 100644 --- a/src/qt/qt_settingsharddisks.cpp +++ b/src/qt/qt_settingsharddisks.cpp @@ -116,7 +116,7 @@ SettingsHarddisks::SettingsHarddisks(QWidget *parent) model->setHeaderData(ColumnHeads, Qt::Horizontal, tr("H")); model->setHeaderData(ColumnSectors, Qt::Horizontal, tr("S")); model->setHeaderData(ColumnSize, Qt::Horizontal, tr("MiB")); - model->setHeaderData(ColumnSpeed, Qt::Horizontal, tr("Speed")); + model->setHeaderData(ColumnSpeed, Qt::Horizontal, tr("Model")); ui->tableView->setModel(model); for (int i = 0; i < HDD_NUM; i++) { From 4160fd6a5a00e649e57d2639ef97fbff757ef8c6 Mon Sep 17 00:00:00 2001 From: Alexander Babikov Date: Wed, 16 Apr 2025 22:23:52 +0500 Subject: [PATCH 017/180] qt: Add colons to dropdown labels on the network settings page For consistency purposes --- src/qt/qt_settingsnetwork.ui | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/src/qt/qt_settingsnetwork.ui b/src/qt/qt_settingsnetwork.ui index 741b60648..8fb048f71 100644 --- a/src/qt/qt_settingsnetwork.ui +++ b/src/qt/qt_settingsnetwork.ui @@ -58,7 +58,7 @@ - Adapter + Adapter: @@ -84,7 +84,7 @@ - Mode + Mode: @@ -124,14 +124,14 @@ - Interface + Interface: - VDE Socket + VDE Socket: @@ -197,7 +197,7 @@ - Interface + Interface: @@ -217,7 +217,7 @@ - Mode + Mode: @@ -237,7 +237,7 @@ - VDE Socket + VDE Socket: @@ -257,7 +257,7 @@ - Adapter + Adapter: @@ -326,7 +326,7 @@ - VDE Socket + VDE Socket: @@ -362,7 +362,7 @@ - Interface + Interface: @@ -382,7 +382,7 @@ - Mode + Mode: @@ -408,7 +408,7 @@ - Adapter + Adapter: @@ -461,7 +461,7 @@ - Mode + Mode: @@ -481,7 +481,7 @@ - VDE Socket + VDE Socket: @@ -494,7 +494,7 @@ - Adapter + Adapter: @@ -514,7 +514,7 @@ - Interface + Interface: From de35961bb4a14911f64d862448754a245d310d1d Mon Sep 17 00:00:00 2001 From: Alexander Babikov Date: Thu, 17 Apr 2025 17:20:08 +0500 Subject: [PATCH 018/180] qt: Use Yu Gothic UI as the Japanese font on Windows 10 and later --- src/qt/qt_progsettings.cpp | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/qt/qt_progsettings.cpp b/src/qt/qt_progsettings.cpp index 0fce0d705..aa9bbe97b 100644 --- a/src/qt/qt_progsettings.cpp +++ b/src/qt/qt_progsettings.cpp @@ -26,6 +26,10 @@ #include #include #include +#ifdef Q_OS_WINDOWS +# include +# include +#endif extern "C" { #include <86box/86box.h> @@ -115,7 +119,11 @@ ProgSettings::getFontName(uint32_t lcid) case 0x0404: /* zh-TW */ return "Microsoft JhengHei"; case 0x0411: /* ja-JP */ - return "Meiryo UI"; + /* Check for Windows 10 or later to choose the appropriate system font */ + if (QVersionNumber::fromString(QSysInfo::kernelVersion()).majorVersion() >= 10) + return "Yu Gothic UI"; + else + return "Meiryo UI"; case 0x0412: /* ko-KR */ return "Malgun Gothic"; case 0x0804: /* zh-CN */ From e1007d2377f572639ac9d847cfca371d2fffac20 Mon Sep 17 00:00:00 2001 From: Alexander Babikov Date: Thu, 17 Apr 2025 21:52:32 +0500 Subject: [PATCH 019/180] Get rid of Windows LCIDs as numeric language IDs --- src/86box.c | 3 +- src/config.c | 6 +-- src/include/86box/86box.h | 8 ++- src/include/86box/plat.h | 4 +- src/qt/qt_platform.cpp | 53 +++--------------- src/qt/qt_progsettings.cpp | 108 ++++++++++++++++++++++++++----------- src/qt/qt_progsettings.hpp | 16 +++--- src/unix/unix.c | 10 ++-- 8 files changed, 106 insertions(+), 102 deletions(-) diff --git a/src/86box.c b/src/86box.c index ad1cfc519..168e8a8dc 100644 --- a/src/86box.c +++ b/src/86box.c @@ -160,6 +160,7 @@ int window_remember; int vid_resize; /* (C) allow resizing */ int invert_display = 0; /* (C) invert the display */ int suppress_overscan = 0; /* (C) suppress overscans */ +int lang_id = 0; /* (C) language id */ int scale = 0; /* (C) screen scale factor */ int dpi_scale = 0; /* (C) DPI scaling of the emulated screen */ @@ -584,7 +585,7 @@ pc_init(int argc, char *argv[]) uint32_t *uid; uint32_t *shwnd; #endif - uint32_t lang_init = 0; + int lang_init = 0; /* Grab the executable's full path. */ plat_get_exe_name(exe_path, sizeof(exe_path) - 1); diff --git a/src/config.c b/src/config.c index 6f023cf67..b3de77d71 100644 --- a/src/config.c +++ b/src/config.c @@ -186,7 +186,7 @@ load_general(void) if (p != NULL) lang_id = plat_language_code(p); else - lang_id = 0xffff; + lang_id = plat_language_code(DEFAULT_LANGUAGE); mouse_sensitivity = ini_section_get_double(cat, "mouse_sensitivity", 1.0); if (mouse_sensitivity < 0.1) @@ -1842,7 +1842,7 @@ config_load(void) cassette_pcm = 0; cassette_ui_writeprot = 0; - lang_id = DEFAULT_LANGUAGE; + lang_id = plat_language_code(DEFAULT_LANGUAGE); config_log("Config file not present or invalid!\n"); } else { @@ -2029,7 +2029,7 @@ save_general(void) else ini_section_delete_var(cat, "mouse_sensitivity"); - if (lang_id == DEFAULT_LANGUAGE) + if (lang_id == plat_language_code(DEFAULT_LANGUAGE)) ini_section_delete_var(cat, "language"); else { plat_language_code_r(lang_id, buffer, 511); diff --git a/src/include/86box/86box.h b/src/include/86box/86box.h index ddca937f1..c85311688 100644 --- a/src/include/86box/86box.h +++ b/src/include/86box/86box.h @@ -44,8 +44,8 @@ /* Max UUID Length */ #define MAX_UUID_LEN 64 -/* Default language 0xFFFF = from system, 0x409 = en-US */ -#define DEFAULT_LANGUAGE 0xffff +/* Default language code */ +#define DEFAULT_LANGUAGE "system" #define POSTCARDS_NUM 4 #define POSTCARD_MASK (POSTCARDS_NUM - 1) @@ -84,8 +84,6 @@ extern "C" { #endif /* Global variables. */ -extern uint32_t lang_sys; /* (-) system language code */ - extern int dump_on_exit; /* (O) dump regs on exit*/ extern int start_in_fullscreen; /* (O) start in fullscreen */ #ifdef _WIN32 @@ -117,7 +115,7 @@ extern int window_remember; extern int vid_resize; /* (C) allow resizing */ extern int invert_display; /* (C) invert the display */ extern int suppress_overscan; /* (C) suppress overscans */ -extern uint32_t lang_id; /* (C) language code identifier */ +extern int lang_id; /* (C) language id */ extern int scale; /* (C) screen scale factor */ extern int dpi_scale; /* (C) DPI scaling of the emulated screen */ extern int vid_api; /* (C) video renderer */ diff --git a/src/include/86box/plat.h b/src/include/86box/plat.h index 7ed6e80d4..bbc673dcf 100644 --- a/src/include/86box/plat.h +++ b/src/include/86box/plat.h @@ -160,8 +160,8 @@ extern int plat_vidapi(const char *name); extern char *plat_vidapi_name(int api); extern void plat_resize(int x, int y, int monitor_index); extern void plat_resize_request(int x, int y, int monitor_index); -extern uint32_t plat_language_code(char *langcode); -extern void plat_language_code_r(uint32_t lcid, char *outbuf, int len); +extern int plat_language_code(char *langcode); +extern void plat_language_code_r(int id, char *outbuf, int len); extern void plat_get_cpu_string(char *outbuf, uint8_t len); extern void plat_set_thread_name(void *thread, const char *name); extern void plat_break(void); diff --git a/src/qt/qt_platform.cpp b/src/qt/qt_platform.cpp index e8a02fc3b..0f792feda 100644 --- a/src/qt/qt_platform.cpp +++ b/src/qt/qt_platform.cpp @@ -140,7 +140,6 @@ int update_icons = 1; int kbd_req_capture = 0; int hide_status_bar = 0; int hide_tool_bar = 0; -uint32_t lang_id = 0x0409, lang_sys = 0x0409; // Multilangual UI variables, for now all set to LCID of en-US int stricmp(const char *s1, const char *s2) @@ -461,58 +460,18 @@ plat_power_off(void) QTimer::singleShot(0, (const QWidget *) main_window, &QMainWindow::close); } -extern "C++" { -QMap> ProgSettings::lcid_langcode = { - { 0x0403, { "ca-ES", "Catalan (Spain)" } }, - { 0x0804, { "zh-CN", "Chinese (Simplified)" } }, - { 0x0404, { "zh-TW", "Chinese (Traditional)" } }, - { 0x041A, { "hr-HR", "Croatian (Croatia)" } }, - { 0x0405, { "cs-CZ", "Czech (Czech Republic)" } }, - { 0x0407, { "de-DE", "German (Germany)" } }, - { 0x0809, { "en-GB", "English (United Kingdom)" }}, - { 0x0409, { "en-US", "English (United States)" } }, - { 0x040B, { "fi-FI", "Finnish (Finland)" } }, - { 0x040C, { "fr-FR", "French (France)" } }, - { 0x040E, { "hu-HU", "Hungarian (Hungary)" } }, - { 0x0410, { "it-IT", "Italian (Italy)" } }, - { 0x0411, { "ja-JP", "Japanese (Japan)" } }, - { 0x0412, { "ko-KR", "Korean (Korea)" } }, - { 0x0413, { "nl-NL", "Dutch (Netherlands)" } }, - { 0x0415, { "pl-PL", "Polish (Poland)" } }, - { 0x0416, { "pt-BR", "Portuguese (Brazil)" } }, - { 0x0816, { "pt-PT", "Portuguese (Portugal)" } }, - { 0x0419, { "ru-RU", "Russian (Russia)" } }, - { 0x041B, { "sk-SK", "Slovak (Slovakia)" } }, - { 0x0424, { "sl-SI", "Slovenian (Slovenia)" } }, - { 0x0C0A, { "es-ES", "Spanish (Spain, Modern Sort)" } }, - { 0x041F, { "tr-TR", "Turkish (Turkey)" } }, - { 0x0422, { "uk-UA", "Ukrainian (Ukraine)" } }, - { 0x042A, { "vi-VN", "Vietnamese (Vietnam)" } }, - { 0xFFFF, { "system", "(System Default)" } }, -}; -} - -/* Sets up the program language before initialization. */ -uint32_t +/* Converts the language code string to a numeric language ID */ +int plat_language_code(char *langcode) { - for (auto &curKey : ProgSettings::lcid_langcode.keys()) { - if (ProgSettings::lcid_langcode[curKey].first == langcode) { - return curKey; - } - } - return 0xFFFF; + return ProgSettings::languageCodeToId(QString(langcode)); } -/* Converts back the language code to LCID */ +/* Converts the numeric language ID to a language code string */ void -plat_language_code_r(uint32_t lcid, char *outbuf, int len) +plat_language_code_r(int id, char *outbuf, int len) { - if (!ProgSettings::lcid_langcode.contains(lcid)) { - qstrncpy(outbuf, "system", len); - return; - } - qstrncpy(outbuf, ProgSettings::lcid_langcode[lcid].first.toUtf8().constData(), len); + qstrncpy(outbuf, ProgSettings::languageIdToCode(id).toUtf8().constData(), len); return; } diff --git a/src/qt/qt_progsettings.cpp b/src/qt/qt_progsettings.cpp index aa9bbe97b..3903c9d9f 100644 --- a/src/qt/qt_progsettings.cpp +++ b/src/qt/qt_progsettings.cpp @@ -45,18 +45,45 @@ extern MainWindow *main_window; ProgSettings::CustomTranslator *ProgSettings::translator = nullptr; QTranslator *ProgSettings::qtTranslator = nullptr; +QVector> ProgSettings::languages = { + { "system", "(System Default)" }, + { "ca-ES", "Catalan (Spain)" }, + { "zh-CN", "Chinese (Simplified)" }, + { "zh-TW", "Chinese (Traditional)" }, + { "hr-HR", "Croatian (Croatia)" }, + { "cs-CZ", "Czech (Czech Republic)" }, + { "de-DE", "German (Germany)" }, + { "en-GB", "English (United Kingdom)" }, + { "en-US", "English (United States)" }, + { "fi-FI", "Finnish (Finland)" }, + { "fr-FR", "French (France)" }, + { "hu-HU", "Hungarian (Hungary)" }, + { "it-IT", "Italian (Italy)" }, + { "ja-JP", "Japanese (Japan)" }, + { "ko-KR", "Korean (Korea)" }, + { "nl-NL", "Dutch (Netherlands)" }, + { "pl-PL", "Polish (Poland)" }, + { "pt-BR", "Portuguese (Brazil)" }, + { "pt-PT", "Portuguese (Portugal)" }, + { "ru-RU", "Russian (Russia)" }, + { "sk-SK", "Slovak (Slovakia)" }, + { "sl-SI", "Slovenian (Slovenia)" }, + { "es-ES", "Spanish (Spain)" }, + { "tr-TR", "Turkish (Turkey)" }, + { "uk-UA", "Ukrainian (Ukraine)" }, + { "vi-VN", "Vietnamese (Vietnam)" }, +}; + ProgSettings::ProgSettings(QWidget *parent) : QDialog(parent) , ui(new Ui::ProgSettings) { ui->setupUi(this); - ui->comboBoxLanguage->setItemData(0, 0xFFFF); - for (auto i = lcid_langcode.begin(); i != lcid_langcode.end(); i++) { - if (i.key() == 0xFFFF) - continue; - ui->comboBoxLanguage->addItem(lcid_langcode[i.key()].second, i.key()); - if (i.key() == lang_id) { - ui->comboBoxLanguage->setCurrentIndex(ui->comboBoxLanguage->findData(i.key())); + ui->comboBoxLanguage->setItemData(0, 0); + for (int i = 1; i < languages.length(); i++) { + ui->comboBoxLanguage->addItem(languages[i].second, i); + if (i == lang_id) { + ui->comboBoxLanguage->setCurrentIndex(ui->comboBoxLanguage->findData(i)); } } ui->comboBoxLanguage->model()->sort(Qt::AscendingOrder); @@ -78,7 +105,7 @@ ProgSettings::ProgSettings(QWidget *parent) void ProgSettings::accept() { - lang_id = ui->comboBoxLanguage->currentData().toUInt(); + lang_id = ui->comboBoxLanguage->currentData().toInt(); open_dir_usr_path = ui->openDirUsrPath->isChecked() ? 1 : 0; confirm_exit = ui->checkBoxConfirmExit->isChecked() ? 1 : 0; confirm_save = ui->checkBoxConfirmSave->isChecked() ? 1 : 0; @@ -113,27 +140,46 @@ ProgSettings::~ProgSettings() /* Return the standard font name on Windows, which is overridden per-language to prevent CJK fonts with embedded bitmaps being chosen as a fallback. */ QString -ProgSettings::getFontName(uint32_t lcid) +ProgSettings::getFontName(int langId) { - switch (lcid) { - case 0x0404: /* zh-TW */ - return "Microsoft JhengHei"; - case 0x0411: /* ja-JP */ - /* Check for Windows 10 or later to choose the appropriate system font */ - if (QVersionNumber::fromString(QSysInfo::kernelVersion()).majorVersion() >= 10) - return "Yu Gothic UI"; - else - return "Meiryo UI"; - case 0x0412: /* ko-KR */ - return "Malgun Gothic"; - case 0x0804: /* zh-CN */ - return "Microsoft YaHei"; - default: - return "Segoe UI"; - } + QString langCode = languageIdToCode(lang_id); + if (langCode == "ja-JP") { + /* Check for Windows 10 or later to choose the appropriate system font */ + if (QVersionNumber::fromString(QSysInfo::kernelVersion()).majorVersion() >= 10) + return "Yu Gothic UI"; + else + return "Meiryo UI"; + } else if (langCode == "ko-KR") + return "Malgun Gothic"; + else if (langCode == "zh-CN") + return "Microsoft YaHei"; + else if (langCode == "zh-TW") + return "Microsoft JhengHei"; + else + return "Segoe UI"; } #endif +int +ProgSettings::languageCodeToId(QString langCode) +{ + for (int i = 0; i < languages.length(); i++) { + if (languages[i].first == langCode) { + return i; + } + } + return 0; +} + +QString +ProgSettings::languageIdToCode(int id) +{ + if ((id == 0) || (id >= languages.length())) { + return "system"; + } + return languages[id].first; +} + void ProgSettings::loadTranslators(QObject *parent) { @@ -148,7 +194,7 @@ ProgSettings::loadTranslators(QObject *parent) qtTranslator = new QTranslator(parent); translator = new CustomTranslator(parent); QString localetofilename = ""; - if (lang_id == 0xFFFF || lcid_langcode.contains(lang_id) == false) { + if (lang_id == 0 || lang_id >= languages.length()) { for (int i = 0; i < QLocale::system().uiLanguages().size(); i++) { localetofilename = QLocale::system().uiLanguages()[i]; if (translator->load(QLatin1String("86box_") + localetofilename, QLatin1String(":/"))) { @@ -166,12 +212,12 @@ ProgSettings::loadTranslators(QObject *parent) } } } else { - translator->load(QLatin1String("86box_") + lcid_langcode[lang_id].first, QLatin1String(":/")); + translator->load(QLatin1String("86box_") + languages[lang_id].first, QLatin1String(":/")); QCoreApplication::installTranslator(translator); - if (!qtTranslator->load(QLatin1String("qtbase_") + QString(lcid_langcode[lang_id].first).replace('-', '_'), QLibraryInfo::location(QLibraryInfo::TranslationsPath))) - if (!qtTranslator->load(QLatin1String("qtbase_") + QString(lcid_langcode[lang_id].first).left(QString(lcid_langcode[lang_id].first).indexOf('-')), QLibraryInfo::location(QLibraryInfo::TranslationsPath))) - if(!qtTranslator->load(QLatin1String("qt_") + QString(lcid_langcode[lang_id].first).replace('-', '_'), QApplication::applicationDirPath() + "/./translations/")) - qtTranslator->load(QLatin1String("qt_") + QString(lcid_langcode[lang_id].first).replace('-', '_'), QLatin1String(":/")); + if (!qtTranslator->load(QLatin1String("qtbase_") + QString(languages[lang_id].first).replace('-', '_'), QLibraryInfo::location(QLibraryInfo::TranslationsPath))) + if (!qtTranslator->load(QLatin1String("qtbase_") + QString(languages[lang_id].first).left(QString(languages[lang_id].first).indexOf('-')), QLibraryInfo::location(QLibraryInfo::TranslationsPath))) + if(!qtTranslator->load(QLatin1String("qt_") + QString(languages[lang_id].first).replace('-', '_'), QApplication::applicationDirPath() + "/./translations/")) + qtTranslator->load(QLatin1String("qt_") + QString(languages[lang_id].first).replace('-', '_'), QLatin1String(":/")); QCoreApplication::installTranslator(qtTranslator); } diff --git a/src/qt/qt_progsettings.hpp b/src/qt/qt_progsettings.hpp index 1c7295f56..31600e7f1 100644 --- a/src/qt/qt_progsettings.hpp +++ b/src/qt/qt_progsettings.hpp @@ -15,10 +15,12 @@ public: explicit ProgSettings(QWidget *parent = nullptr); ~ProgSettings(); #ifdef Q_OS_WINDOWS - static QString getFontName(uint32_t lcid); + static QString getFontName(int langId); #endif - static void loadTranslators(QObject *parent = nullptr); - static void reloadStrings(); + static int languageCodeToId(QString langCode); + static QString languageIdToCode(int id); + static void loadTranslators(QObject *parent = nullptr); + static void reloadStrings(); class CustomTranslator : public QTranslator { public: CustomTranslator(QObject *parent = nullptr) @@ -31,10 +33,10 @@ public: return QTranslator::translate("", sourceText, disambiguation, n); } }; - static CustomTranslator *translator; - static QTranslator *qtTranslator; - static QMap> lcid_langcode; - static QMap translatedstrings; + static CustomTranslator *translator; + static QTranslator *qtTranslator; + static QVector> languages; + static QMap translatedstrings; protected slots: void accept() override; diff --git a/src/unix/unix.c b/src/unix/unix.c index c41aee2a4..395e6f540 100644 --- a/src/unix/unix.c +++ b/src/unix/unix.c @@ -71,8 +71,6 @@ SDL_mutex *blitmtx; SDL_threadID eventthread; static int exit_event = 0; static int fullscreen_pending = 0; -uint32_t lang_id = 0x0409; // Multilangual UI variables, for now all set to LCID of en-US -uint32_t lang_sys = 0x0409; // Multilangual UI variables, for now all set to LCID of en-US static const uint16_t sdl_to_xt[0x200] = { [SDL_SCANCODE_ESCAPE] = 0x01, @@ -1378,8 +1376,8 @@ plat_vidapi_name(UNUSED(int i)) return "default"; } -/* Sets up the program language before initialization. */ -uint32_t +/* Converts the language code string to a numeric language ID */ +int plat_language_code(UNUSED(char *langcode)) { /* or maybe not */ @@ -1419,9 +1417,9 @@ plat_set_thread_name(void *thread, const char *name) #endif } -/* Converts back the language code to LCID */ +/* Converts the numeric language ID to a language code string */ void -plat_language_code_r(UNUSED(uint32_t lcid), UNUSED(char *outbuf), UNUSED(int len)) +plat_language_code_r(UNUSED(int id), UNUSED(char *outbuf), UNUSED(int len)) { /* or maybe not */ return; From b6483a20cf023b71ff0781eae403085dfff1033f Mon Sep 17 00:00:00 2001 From: Alexander Babikov Date: Wed, 16 Apr 2025 21:54:39 +0500 Subject: [PATCH 020/180] languages: French translation updates by jvernet Co-Authored-by: jvernet --- src/qt/languages/fr-FR.po | 138 +++++++++++++++++++------------------- 1 file changed, 69 insertions(+), 69 deletions(-) diff --git a/src/qt/languages/fr-FR.po b/src/qt/languages/fr-FR.po index ebb181a30..0701a188e 100644 --- a/src/qt/languages/fr-FR.po +++ b/src/qt/languages/fr-FR.po @@ -40,7 +40,7 @@ msgid "Hide &toolbar" msgstr "Masquer la &barre d'outils" msgid "&Resizeable window" -msgstr "Fenètre &Retaillable" +msgstr "Fenêtre &Redimensionnable" msgid "R&emember size && position" msgstr "S&auvegarder taille && position" @@ -61,7 +61,7 @@ msgid "&VNC" msgstr "&VNC" msgid "Specify dimensions..." -msgstr "Specifier dimensions..." +msgstr "Spécifier dimensions..." msgid "F&orce 4:3 display ratio" msgstr "F&orcer 4:3" @@ -100,7 +100,7 @@ msgid "&8x" msgstr "&8x" msgid "Filter method" -msgstr "Methode Filtre" +msgstr "Méthode Filtre" msgid "&Nearest" msgstr "&Plus proche" @@ -157,7 +157,7 @@ msgid "&White monitor" msgstr "Moniteur &Blanc" msgid "Grayscale &conversion type" -msgstr "Grayscale &conversion type" +msgstr "Mode &Conversion tons de gris" msgid "BT&601 (NTSC/PAL)" msgstr "BT&601 (NTSC/PAL)" @@ -169,7 +169,7 @@ msgid "&Average" msgstr "&Moyenne" msgid "CGA/PCjr/Tandy/E&GA/(S)VGA overscan" -msgstr "CGA/PCjr/Tandy/E&GA/(S)VGA overscan" +msgstr "Overscan CGA/PCjr/Tandy/E&GA/(S)VGA" msgid "Change contrast for &monochrome display" msgstr "Modifier contraste affichage &monochrome" @@ -205,7 +205,7 @@ msgid "Begin trace" msgstr "Démarrer traces" msgid "End trace" -msgstr "Finir traces" +msgstr "Arrêter traces" msgid "&Help" msgstr "&Aide" @@ -244,7 +244,7 @@ msgid "&Image..." msgstr "&Image..." msgid "E&xport to 86F..." -msgstr "E&xport vers 86F..." +msgstr "E&xporter vers 86F..." msgid "&Mute" msgstr "&Couper" @@ -301,7 +301,7 @@ msgid "Settings" msgstr "Réglages" msgid "Specify Main Window Dimensions" -msgstr "Spécifier le détournement de la fenêtre principale" +msgstr "Spécifier les dimensions de la fenêtre principale" msgid "OK" msgstr "OK" @@ -349,7 +349,7 @@ msgid "Configure" msgstr "Configurer" msgid "CPU type:" -msgstr "Type du processeur:" +msgstr "Type de processeur:" msgid "Speed:" msgstr "Vitesse:" @@ -403,7 +403,7 @@ msgid "Mouse:" msgstr "Souris:" msgid "Joystick:" -msgstr "Manette de commande:" +msgstr "Manette:" msgid "Joystick 1..." msgstr "Manette 1..." @@ -607,7 +607,7 @@ msgid "ISA RTC:" msgstr "Horloge temps réel ISA:" msgid "ISA Memory Expansion" -msgstr "Expansion de la mémoire ISA" +msgstr "Extension de mémoire ISA" msgid "Card 1:" msgstr "Carte 1:" @@ -670,7 +670,7 @@ msgid "Off" msgstr "Désactivé" msgid "All images" -msgstr "Tous les images" +msgstr "Toutes les images" msgid "Basic sector images" msgstr "Images basiques du secteur" @@ -862,16 +862,16 @@ msgid "Hardware not available" msgstr "Matériel non disponible" msgid "Make sure %1 is installed and that you are on a %1-compatible network connection." -msgstr "Assurez-vous que %1 est installé et que vou utilisez une connexion réseau compatible avec %1." +msgstr "Assurez-vous que %1 est installé et que vous utilisez une connexion réseau compatible avec %1." msgid "Invalid configuration" msgstr "Configuration non valide" msgid "%1 is required for automatic conversion of PostScript files to PDF.\n\nAny documents sent to the generic PostScript printer will be saved as PostScript (.ps) files." -msgstr "%1 est nécessair pour la conversion automatique des fichiers PostScript dans PDF.\n\nTous les documents envoyés à l'imprimante générique PostScript seront sauvés comme des fichiers PostScript (.ps)." +msgstr "%1 est nécessaire pour la conversion automatique des fichiers PostScript en PDF.\n\nTous les documents envoyés à l'imprimante générique PostScript seront sauvés en tant que fichiers PostScript (.ps)." msgid "%1 is required for automatic conversion of PCL files to PDF.\n\nAny documents sent to the generic PCL printer will be saved as Printer Command Language (.pcl) files." -msgstr "%1 est nécessair pour la conversion automatique des fichiers PCL dans PDF.\n\nTous les documents envoyés à l'imprimante générique PCL seront sauvés comme des fichiers Printer Command Language (.pcl)." +msgstr "%1 est nécessaire pour la conversion automatique des fichiers PCL en PDF.\n\nTous les documents envoyés à l'imprimante générique PCL seront sauvés en tant quefichiers Printer Command Language (.pcl)." msgid "Entering fullscreen mode" msgstr "Entrer en mode plein écran" @@ -904,7 +904,7 @@ msgid "You are loading an unsupported configuration" msgstr "Vous chargez une configuration non prise en charge" msgid "CPU type filtering based on selected machine is disabled for this emulated machine.\n\nThis makes it possible to choose a CPU that is otherwise incompatible with the selected machine. However, you may run into incompatibilities with the machine BIOS or other software.\n\nEnabling this setting is not officially supported and any bug reports filed may be closed as invalid." -msgstr "La filtrage du type du processeur sur la base de la machine sélectionné est désactivé pur cette machine émulée.\n\nCela permet de sélectionner une processeur que est sinon incompatible avec la machine sélectionné. Cependant, il pourrait y avoir des incompatibilités avec le BIOS de la machine ou autres logiciels.\n\nL'activatione de cette configuration non est officiellement prise en charge et tout rapport de bogue peut être fermé comme étant invalide." +msgstr "Le filtrage du type du processeur sur la base de la machine sélectionnée est désactivé pur cette machine émulée.\n\nCela permet de sélectionner un processeur qui est sinon incompatible avec la machine sélectionné. Cependant, il pourrait y avoir des incompatibilités avec le BIOS de la machine ou autres logiciels.\n\nL'activation de cette configuration non officiellement prise en charge implique que tout rapport de bogue peut être fermé comme étant invalide." msgid "Continue" msgstr "Continuer" @@ -928,7 +928,7 @@ msgid "Pause execution" msgstr "Pause de l'exécution" msgid "Press Ctrl+Alt+Del" -msgstr "Appuyer sur Ctrl+Alt+Suppr." +msgstr "Appuyer sur Ctrl+Alt+Suppr" msgid "Press Ctrl+Alt+Esc" msgstr "Appuyer sur Ctrl+Alt+Esc" @@ -958,13 +958,13 @@ msgid "Add Existing Hard Disk" msgstr "Ajouter un disque dur existant" msgid "HDI disk images cannot be larger than 4 GB." -msgstr "Les images de disque HDI ne peuvent pas avoir une taille supériure à Go." +msgstr "Les images de disque HDI ne peuvent pas avoir une taille supérieure à 4 Go." msgid "Disk images cannot be larger than 127 GB." -msgstr "Les images de disque ne peuvent pas avoir un taille supérieure à 127 Go." +msgstr "Les images de disque ne peuvent pas avoir une taille supérieure à 127 Go." msgid "Hard disk images" -msgstr "Images de dique dur" +msgstr "Images de disque dur" msgid "Unable to read file" msgstr "Impossible de lire le fichier" @@ -973,10 +973,10 @@ msgid "Unable to write file" msgstr "Impossible d'écrire le fichier" msgid "HDI or HDX images with a sector size other than 512 are not supported." -msgstr "Les images HDI ou HDX avec une taille de secteur différente de 512 non sont pas prises en charge." +msgstr "Les images HDI ou HDX avec une taille de secteur différente de 512 ne sont pas prises en charge." msgid "Disk image file already exists" -msgstr "Le fichier de l'image disque existe déjà." +msgstr "Le fichier de l'image disque existe déjà" msgid "Please specify a valid file name." msgstr "Veuillez spécifier un nom de fichier valide." @@ -1048,10 +1048,10 @@ msgid "Differencing VHD (.vhd)" msgstr "VHD à différenciation (.vhd)" msgid "Large blocks (2 MB)" -msgstr "Blocs grands (2 Mo)" +msgstr "Grands Blocs (2 Mo)" msgid "Small blocks (512 KB)" -msgstr "Blocs petits (512 Ko)" +msgstr "Petits Blocs (512 Ko)" msgid "VHD files" msgstr "Fichiers VHD" @@ -1060,10 +1060,10 @@ msgid "Select the parent VHD" msgstr "Sélectionnez le VHD parent" msgid "This could mean that the parent image was modified after the differencing image was created.\n\nIt can also happen if the image files were moved or copied, or by a bug in the program that created this disk.\n\nDo you want to fix the timestamps?" -msgstr "Il est possible que l'image parente a été modifié après la création de l'image à différenciation.\n\nIl est même possible que les fichiers de l'mage ont été déplacés ou copiés ou il existe un bogue dans le programme que a créé ce disque.\n\nVoulez-vous réparer l'horodatage?" +msgstr "Il est possible que l'image parente ai été modifiée après la création de l'image à différenciation.\n\nIl est même possible que les fichiers de l’image ont été déplacés ou copiés ou il existe un bogue dans le programme qui a créé ce disque.\n\nVoulez-vous réparer l'horodatage?" msgid "Parent and child disk timestamps do not match" -msgstr "Les horodatages des disques parent et enfant ne correspondent pas" +msgstr "Les horodatages des disques parents et enfants ne correspondent pas" msgid "Could not fix VHD timestamp." msgstr "Impossible de réparer l'horodatage du VHD." @@ -1174,7 +1174,7 @@ msgid "Failed to initialize network driver" msgstr "Échec de l'initialisation du pilote réseau" msgid "The network configuration will be switched to the null driver" -msgstr "La configuration du réseau passera au pilote nul" +msgstr "La configuration du réseau passera au pilote NULL" msgid "Mouse sensitivity:" msgstr "Sensibilité de la souris:" @@ -1195,7 +1195,7 @@ msgid "Fast" msgstr "Rapide" msgid "&Auto-pause on focus loss" -msgstr "&Pause automatique à perte de mise au point" +msgstr "&Pause automatique à perte de focus" msgid "WinBox is no longer supported" msgstr "WinBox n'est plus pris en charge" @@ -1225,13 +1225,13 @@ msgid "List of MCA devices:" msgstr "Liste des dispositifs MCA :" msgid "Tablet tool" -msgstr "Nástroj pro tablety" +msgstr "Outil Tablette" msgid "Qt (OpenGL &ES)" msgstr "Qt (OpenGL &ES)" msgid "About Qt" -msgstr "O programu Qt" +msgstr "A propos de Qt" msgid "MCA devices..." msgstr "Dispositifs MCA..." @@ -1270,7 +1270,7 @@ msgid "Unknown Bus" msgstr "Bus inconnu" msgid "Null Driver" -msgstr "Pilote nul" +msgstr "Pilote NULL" msgid "NIC %1 (%2) %3" msgstr "NIC %1 (%2) %3" @@ -1282,7 +1282,7 @@ msgid "Use target framerate:" msgstr "Utiliser le taux de rafraîchissement cible:" msgid " fps" -msgstr " mages par seconde" +msgstr " Images par seconde" msgid "VSync" msgstr "VSync" @@ -1330,7 +1330,7 @@ msgid "I Copied It" msgstr "Je l'ai copié" msgid "86Box Monitor #" -msgstr "Moniteur 86Box " +msgstr "Moniteur 86Box" msgid "No MCA devices." msgstr "Pas de dispositifs MCA." @@ -1621,7 +1621,7 @@ msgid "Enable Game port" msgstr "Activer le port de jeu" msgid "Surround module" -msgstr "Module d'ambiance" +msgstr "Module Surround" msgid "CODEC" msgstr "CODEC" @@ -1846,7 +1846,7 @@ msgid "2 MB" msgstr "2 Mo" msgid "8 MB" -msgstr " 8 Mo" +msgstr "8 Mo" msgid "28 MB" msgstr "28 Mo" @@ -2002,10 +2002,10 @@ msgid "Stereo LPT DAC" msgstr "Convertisseur numérique stéréo LPT" msgid "Generic Text Printer" -msgstr "Imprimante de texte générique" +msgstr "Imprimante Texte générique" msgid "Generic ESC/P Dot-Matrix Printer" -msgstr "Imprimant générique ESC/P à matrice à points" +msgstr "Imprimante matricielle générique ESC/P" msgid "Generic PostScript Printer" msgstr "Imprimante PostScript générique" @@ -2062,100 +2062,100 @@ msgid "[Generic] RAM Disk (max. speed)" msgstr "[Generic] Disque RAM (vitesse maximale)" msgid "[Generic] 1989 (3500 RPM)" -msgstr "" +msgstr "[Generic] 1989 (3500 RPM)" msgid "[Generic] 1992 (3600 RPM)" -msgstr "" +msgstr "[Generic] 1992 (3600 RPM)" msgid "[Generic] 1994 (4500 RPM)" -msgstr "" +msgstr "[Generic] 1994 (4500 RPM)" msgid "[Generic] 1996 (5400 RPM)" -msgstr "" +msgstr "[Generic] 1996 (5400 RPM)" msgid "[Generic] 1997 (5400 RPM)" -msgstr "" +msgstr "[Generic] 1997 (5400 RPM)" msgid "[Generic] 1998 (5400 RPM)" -msgstr "" +msgstr "[Generic] 1998 (5400 RPM)" msgid "[Generic] 2000 (7200 RPM)" -msgstr "" +msgstr "[Generic] 2000 (7200 RPM)" msgid "IBM 8514/A clone (ISA)" -msgstr "Clon IBM 8514/A (ISA)" +msgstr "Clone IBM 8514/A (ISA)" msgid "Vendor" msgstr "Fabricant" msgid "Generic PC/XT Memory Expansion" -msgstr "Expansion de la mémoire générique PC/XT" +msgstr "Extension de mémoire générique PC/XT" msgid "Generic PC/AT Memory Expansion" -msgstr "Expansion de la mémoire générique PC/AT" +msgstr "Extension de mémoire générique PC/AT" msgid "Unable to find Dot-Matrix fonts" -msgstr "Impossible de trouver les polices à matrice à points" +msgstr "Impossible de trouver les polices matricielles" msgid "TrueType fonts in the \"roms/printer/fonts\" directory are required for the emulation of the Generic ESC/P Dot-Matrix Printer." -msgstr "Les polices TrueType dans le répertoire \"roms/printer/fonts\" sont nécessaires à l'émulation de l'imprimante générique ESC/P à matrice à points." +msgstr "Les polices TrueType dans le répertoire \"roms/printer/fonts\" sont nécessaires à l'émulation de l'imprimante générique ESC/P matricielle." msgid "Inhibit multimedia keys" -msgstr "" +msgstr "Désactiver les touches multimédia" msgid "Ask for confirmation before saving settings" -msgstr "" +msgstr "Demander confirmation avant de sauvegarder les réglages" msgid "Ask for confirmation before hard resetting" -msgstr "" +msgstr "Demander confirmation avant Hard Reset" msgid "Ask for confirmation before quitting" -msgstr "" +msgstr "Demander confirmation avant de quitter" msgid "Display hotkey message when entering full-screen mode" -msgstr "" +msgstr "Afficher Raccourcis Clavier avant de passer en plein écran" msgid "Options" -msgstr "" +msgstr "Options" msgid "Model:" -msgstr "" +msgstr "Modèle:" msgid "Failed to initialize Vulkan renderer." -msgstr "" +msgstr "Impossible d’initialiser le moteur de rendu Vulkan." msgid "GLSL Error" -msgstr "" +msgstr "Erreur GLSL" msgid "Could not load shader: %1" -msgstr "" +msgstr "Impossible de charger le shaker %1" msgid "OpenGL version 3.0 or greater is required. Current GLSL version is %1.%2" -msgstr "" +msgstr "OpenGL version 3.0 ou supérieur requis. Version installée: %1.%2" msgid "Could not load texture: %1" -msgstr "" +msgstr "Impossible de charger la texture %1" msgid "Could not compile shader:\n\n%1" -msgstr "" +msgstr "Impossible de compiler le shader:\n\n%1" msgid "Program not linked:\n\n%1" -msgstr "" +msgstr "Programme non linké:\n\n%1" msgid "Shader Manager" -msgstr "" +msgstr "Gestionnaire de shader" msgid "Shader Configuration" -msgstr "" +msgstr "Configuration Shader" msgid "Add" -msgstr "" +msgstr "Ajouter" msgid "Move up" -msgstr "" +msgstr "Monter" msgid "Move down" -msgstr "" +msgstr "Descendre" msgid "Could not load file %1" -msgstr "" +msgstr "Impossible de charger le fichier %1" From 0d1f3a61cd271fc091d32570c525d6504590e4bb Mon Sep 17 00:00:00 2001 From: Alexander Babikov Date: Wed, 16 Apr 2025 22:03:06 +0500 Subject: [PATCH 021/180] languages: Fix HDD model still being speed in the HDD list --- src/qt/languages/86box.pot | 3 +++ src/qt/languages/ca-ES.po | 3 +++ src/qt/languages/cs-CZ.po | 3 +++ src/qt/languages/de-DE.po | 3 +++ src/qt/languages/es-ES.po | 3 +++ src/qt/languages/fi-FI.po | 3 +++ src/qt/languages/fr-FR.po | 3 +++ src/qt/languages/hr-HR.po | 3 +++ src/qt/languages/hu-HU.po | 3 +++ src/qt/languages/it-IT.po | 3 +++ src/qt/languages/ja-JP.po | 3 +++ src/qt/languages/ko-KR.po | 3 +++ src/qt/languages/nl-NL.po | 3 +++ src/qt/languages/pl-PL.po | 3 +++ src/qt/languages/pt-BR.po | 3 +++ src/qt/languages/pt-PT.po | 3 +++ src/qt/languages/ru-RU.po | 3 +++ src/qt/languages/sk-SK.po | 3 +++ src/qt/languages/sl-SI.po | 3 +++ src/qt/languages/tr-TR.po | 3 +++ src/qt/languages/uk-UA.po | 3 +++ src/qt/languages/vi-VN.po | 3 +++ src/qt/languages/zh-CN.po | 3 +++ src/qt/languages/zh-TW.po | 3 +++ 24 files changed, 72 insertions(+) diff --git a/src/qt/languages/86box.pot b/src/qt/languages/86box.pot index 1d151a9d9..74481e068 100644 --- a/src/qt/languages/86box.pot +++ b/src/qt/languages/86box.pot @@ -2124,6 +2124,9 @@ msgstr "" msgid "Options" msgstr "" +msgid "Model" +msgstr "" + msgid "Model:" msgstr "" diff --git a/src/qt/languages/ca-ES.po b/src/qt/languages/ca-ES.po index 9dec41c32..94b17adb3 100644 --- a/src/qt/languages/ca-ES.po +++ b/src/qt/languages/ca-ES.po @@ -2118,6 +2118,9 @@ msgstr "" msgid "Options" msgstr "" +msgid "Model" +msgstr "" + msgid "Model:" msgstr "" diff --git a/src/qt/languages/cs-CZ.po b/src/qt/languages/cs-CZ.po index 2098fe018..e6a172e66 100644 --- a/src/qt/languages/cs-CZ.po +++ b/src/qt/languages/cs-CZ.po @@ -2118,6 +2118,9 @@ msgstr "" msgid "Options" msgstr "" +msgid "Model" +msgstr "" + msgid "Model:" msgstr "" diff --git a/src/qt/languages/de-DE.po b/src/qt/languages/de-DE.po index 2088e4141..eead942eb 100644 --- a/src/qt/languages/de-DE.po +++ b/src/qt/languages/de-DE.po @@ -2121,6 +2121,9 @@ msgstr "" msgid "Options" msgstr "" +msgid "Model" +msgstr "" + msgid "Model:" msgstr "" diff --git a/src/qt/languages/es-ES.po b/src/qt/languages/es-ES.po index bc11a4d4c..269d2f75e 100644 --- a/src/qt/languages/es-ES.po +++ b/src/qt/languages/es-ES.po @@ -2117,6 +2117,9 @@ msgstr "" msgid "Options" msgstr "" +msgid "Model" +msgstr "" + msgid "Model:" msgstr "" diff --git a/src/qt/languages/fi-FI.po b/src/qt/languages/fi-FI.po index 34e9aeead..6f4efd607 100644 --- a/src/qt/languages/fi-FI.po +++ b/src/qt/languages/fi-FI.po @@ -2121,6 +2121,9 @@ msgstr "" msgid "Options" msgstr "" +msgid "Model" +msgstr "" + msgid "Model:" msgstr "" diff --git a/src/qt/languages/fr-FR.po b/src/qt/languages/fr-FR.po index 0701a188e..d24f21c8d 100644 --- a/src/qt/languages/fr-FR.po +++ b/src/qt/languages/fr-FR.po @@ -2118,6 +2118,9 @@ msgstr "Afficher Raccourcis Clavier avant de passer en plein écran" msgid "Options" msgstr "Options" +msgid "Model" +msgstr "Modèle" + msgid "Model:" msgstr "Modèle:" diff --git a/src/qt/languages/hr-HR.po b/src/qt/languages/hr-HR.po index c1f6480c2..346346687 100644 --- a/src/qt/languages/hr-HR.po +++ b/src/qt/languages/hr-HR.po @@ -2118,6 +2118,9 @@ msgstr "" msgid "Options" msgstr "" +msgid "Model" +msgstr "" + msgid "Model:" msgstr "" diff --git a/src/qt/languages/hu-HU.po b/src/qt/languages/hu-HU.po index 09f914860..113591409 100644 --- a/src/qt/languages/hu-HU.po +++ b/src/qt/languages/hu-HU.po @@ -2118,6 +2118,9 @@ msgstr "" msgid "Options" msgstr "" +msgid "Model" +msgstr "" + msgid "Model:" msgstr "" diff --git a/src/qt/languages/it-IT.po b/src/qt/languages/it-IT.po index c9694c3be..028d86f40 100644 --- a/src/qt/languages/it-IT.po +++ b/src/qt/languages/it-IT.po @@ -2118,6 +2118,9 @@ msgstr "" msgid "Options" msgstr "" +msgid "Model" +msgstr "" + msgid "Model:" msgstr "" diff --git a/src/qt/languages/ja-JP.po b/src/qt/languages/ja-JP.po index 1c139aaec..e66c8b2c1 100644 --- a/src/qt/languages/ja-JP.po +++ b/src/qt/languages/ja-JP.po @@ -2118,6 +2118,9 @@ msgstr "" msgid "Options" msgstr "" +msgid "Model" +msgstr "" + msgid "Model:" msgstr "" diff --git a/src/qt/languages/ko-KR.po b/src/qt/languages/ko-KR.po index 941bd740a..61f65ad98 100644 --- a/src/qt/languages/ko-KR.po +++ b/src/qt/languages/ko-KR.po @@ -2118,6 +2118,9 @@ msgstr "" msgid "Options" msgstr "" +msgid "Model" +msgstr "" + msgid "Model:" msgstr "" diff --git a/src/qt/languages/nl-NL.po b/src/qt/languages/nl-NL.po index fd2b66245..5e0670385 100644 --- a/src/qt/languages/nl-NL.po +++ b/src/qt/languages/nl-NL.po @@ -2118,6 +2118,9 @@ msgstr "" msgid "Options" msgstr "" +msgid "Model" +msgstr "" + msgid "Model:" msgstr "" diff --git a/src/qt/languages/pl-PL.po b/src/qt/languages/pl-PL.po index ab50711f6..1a4ddda37 100644 --- a/src/qt/languages/pl-PL.po +++ b/src/qt/languages/pl-PL.po @@ -2118,6 +2118,9 @@ msgstr "" msgid "Options" msgstr "" +msgid "Model" +msgstr "" + msgid "Model:" msgstr "" diff --git a/src/qt/languages/pt-BR.po b/src/qt/languages/pt-BR.po index db07a69ae..cfc7fa42b 100644 --- a/src/qt/languages/pt-BR.po +++ b/src/qt/languages/pt-BR.po @@ -2118,6 +2118,9 @@ msgstr "" msgid "Options" msgstr "" +msgid "Model" +msgstr "" + msgid "Model:" msgstr "" diff --git a/src/qt/languages/pt-PT.po b/src/qt/languages/pt-PT.po index f67ddbdf8..564932890 100644 --- a/src/qt/languages/pt-PT.po +++ b/src/qt/languages/pt-PT.po @@ -2118,6 +2118,9 @@ msgstr "" msgid "Options" msgstr "" +msgid "Model" +msgstr "" + msgid "Model:" msgstr "" diff --git a/src/qt/languages/ru-RU.po b/src/qt/languages/ru-RU.po index fb1908f60..3c0eb619a 100644 --- a/src/qt/languages/ru-RU.po +++ b/src/qt/languages/ru-RU.po @@ -2124,6 +2124,9 @@ msgstr "Показывать сообщение о горячих клавиша msgid "Options" msgstr "Параметры" +msgid "Model" +msgstr "Модель" + msgid "Model:" msgstr "Модель:" diff --git a/src/qt/languages/sk-SK.po b/src/qt/languages/sk-SK.po index 5080c49b5..1121aefb6 100644 --- a/src/qt/languages/sk-SK.po +++ b/src/qt/languages/sk-SK.po @@ -2119,6 +2119,9 @@ msgstr "" msgid "Options" msgstr "" +msgid "Model" +msgstr "" + msgid "Model:" msgstr "" diff --git a/src/qt/languages/sl-SI.po b/src/qt/languages/sl-SI.po index c34fb6f7e..e3e8dba95 100644 --- a/src/qt/languages/sl-SI.po +++ b/src/qt/languages/sl-SI.po @@ -2118,6 +2118,9 @@ msgstr "" msgid "Options" msgstr "" +msgid "Model" +msgstr "" + msgid "Model:" msgstr "" diff --git a/src/qt/languages/tr-TR.po b/src/qt/languages/tr-TR.po index b7a59b620..2abe174ee 100644 --- a/src/qt/languages/tr-TR.po +++ b/src/qt/languages/tr-TR.po @@ -2118,6 +2118,9 @@ msgstr "" msgid "Options" msgstr "" +msgid "Model" +msgstr "" + msgid "Model:" msgstr "" diff --git a/src/qt/languages/uk-UA.po b/src/qt/languages/uk-UA.po index 3145f5e34..7514e2fff 100644 --- a/src/qt/languages/uk-UA.po +++ b/src/qt/languages/uk-UA.po @@ -2124,6 +2124,9 @@ msgstr "" msgid "Options" msgstr "" +msgid "Model" +msgstr "" + msgid "Model:" msgstr "" diff --git a/src/qt/languages/vi-VN.po b/src/qt/languages/vi-VN.po index 932150f7b..d05396430 100644 --- a/src/qt/languages/vi-VN.po +++ b/src/qt/languages/vi-VN.po @@ -2118,6 +2118,9 @@ msgstr "" msgid "Options" msgstr "" +msgid "Model" +msgstr "" + msgid "Model:" msgstr "" diff --git a/src/qt/languages/zh-CN.po b/src/qt/languages/zh-CN.po index 18f5a8fb8..450f148cf 100644 --- a/src/qt/languages/zh-CN.po +++ b/src/qt/languages/zh-CN.po @@ -2118,6 +2118,9 @@ msgstr "" msgid "Options" msgstr "" +msgid "Model" +msgstr "" + msgid "Model:" msgstr "" diff --git a/src/qt/languages/zh-TW.po b/src/qt/languages/zh-TW.po index 9dbf51c70..c53753d28 100644 --- a/src/qt/languages/zh-TW.po +++ b/src/qt/languages/zh-TW.po @@ -2118,6 +2118,9 @@ msgstr "" msgid "Options" msgstr "" +msgid "Model" +msgstr "" + msgid "Model:" msgstr "" From ab9e1eae5f3f3dc9a9c6a4f687e1a9d007f79c57 Mon Sep 17 00:00:00 2001 From: Alexander Babikov Date: Thu, 17 Apr 2025 00:18:15 +0500 Subject: [PATCH 022/180] languages: Remove more unused strings --- src/qt/languages/86box.pot | 9 --------- src/qt/languages/ca-ES.po | 9 --------- src/qt/languages/cs-CZ.po | 9 --------- src/qt/languages/de-DE.po | 9 --------- src/qt/languages/es-ES.po | 9 --------- src/qt/languages/fi-FI.po | 9 --------- src/qt/languages/fr-FR.po | 9 --------- src/qt/languages/hr-HR.po | 9 --------- src/qt/languages/hu-HU.po | 9 --------- src/qt/languages/it-IT.po | 9 --------- src/qt/languages/ja-JP.po | 9 --------- src/qt/languages/ko-KR.po | 9 --------- src/qt/languages/nl-NL.po | 9 --------- src/qt/languages/pl-PL.po | 9 --------- src/qt/languages/pt-BR.po | 9 --------- src/qt/languages/pt-PT.po | 9 --------- src/qt/languages/ru-RU.po | 9 --------- src/qt/languages/sk-SK.po | 9 --------- src/qt/languages/sl-SI.po | 9 --------- src/qt/languages/tr-TR.po | 9 --------- src/qt/languages/uk-UA.po | 9 --------- src/qt/languages/vi-VN.po | 9 --------- src/qt/languages/zh-CN.po | 9 --------- src/qt/languages/zh-TW.po | 9 --------- 24 files changed, 216 deletions(-) diff --git a/src/qt/languages/86box.pot b/src/qt/languages/86box.pot index 74481e068..81b639b7d 100644 --- a/src/qt/languages/86box.pot +++ b/src/qt/languages/86box.pot @@ -450,15 +450,6 @@ msgstr "" msgid "YMFM (faster)" msgstr "" -msgid "Network type:" -msgstr "" - -msgid "PCap device:" -msgstr "" - -msgid "Network adapter:" -msgstr "" - msgid "COM1 Device:" msgstr "" diff --git a/src/qt/languages/ca-ES.po b/src/qt/languages/ca-ES.po index 94b17adb3..63b9b7a9b 100644 --- a/src/qt/languages/ca-ES.po +++ b/src/qt/languages/ca-ES.po @@ -450,15 +450,6 @@ msgstr "Nuked (més acurat)" msgid "YMFM (faster)" msgstr "YMFM (més ràpid)" -msgid "Network type:" -msgstr "Tipus de xarxa:" - -msgid "PCap device:" -msgstr "Dispositiu PCap:" - -msgid "Network adapter:" -msgstr "Adaptador de xarxa:" - msgid "COM1 Device:" msgstr "Dispositiu COM1:" diff --git a/src/qt/languages/cs-CZ.po b/src/qt/languages/cs-CZ.po index e6a172e66..fd9769479 100644 --- a/src/qt/languages/cs-CZ.po +++ b/src/qt/languages/cs-CZ.po @@ -450,15 +450,6 @@ msgstr "Nuked (přesnější)" msgid "YMFM (faster)" msgstr "YMFM (rychlejší)" -msgid "Network type:" -msgstr "Druh sítě:" - -msgid "PCap device:" -msgstr "PCap zařízení:" - -msgid "Network adapter:" -msgstr "Síťový adaptér:" - msgid "COM1 Device:" msgstr "Zařízení na COM1:" diff --git a/src/qt/languages/de-DE.po b/src/qt/languages/de-DE.po index eead942eb..cc734cb8b 100644 --- a/src/qt/languages/de-DE.po +++ b/src/qt/languages/de-DE.po @@ -450,15 +450,6 @@ msgstr "Nuked (genauer)" msgid "YMFM (faster)" msgstr "YMFM (schneller)" -msgid "Network type:" -msgstr "Netzwerktyp:" - -msgid "PCap device:" -msgstr "PCap-Gerät:" - -msgid "Network adapter:" -msgstr "Netzwerkadapter:" - msgid "COM1 Device:" msgstr "COM1-Gerät:" diff --git a/src/qt/languages/es-ES.po b/src/qt/languages/es-ES.po index 269d2f75e..cf349cd6d 100644 --- a/src/qt/languages/es-ES.po +++ b/src/qt/languages/es-ES.po @@ -450,15 +450,6 @@ msgstr "Nuked (más preciso)" msgid "YMFM (faster)" msgstr "YMFM (más rápido)" -msgid "Network type:" -msgstr "Tipo de red:" - -msgid "PCap device:" -msgstr "Dispositivo PCap:" - -msgid "Network adapter:" -msgstr "Adaptador de red:" - msgid "COM1 Device:" msgstr "Dispositivo COM1:" diff --git a/src/qt/languages/fi-FI.po b/src/qt/languages/fi-FI.po index 6f4efd607..3835165c0 100644 --- a/src/qt/languages/fi-FI.po +++ b/src/qt/languages/fi-FI.po @@ -450,15 +450,6 @@ msgstr "Nuked (tarkempi)" msgid "YMFM (faster)" msgstr "YMFM (nopeampi)" -msgid "Network type:" -msgstr "Verkon tyyppi:" - -msgid "PCap device:" -msgstr "PCap-laite:" - -msgid "Network adapter:" -msgstr "Verkkokortti:" - msgid "COM1 Device:" msgstr "COM1-laite:" diff --git a/src/qt/languages/fr-FR.po b/src/qt/languages/fr-FR.po index d24f21c8d..8c53a7264 100644 --- a/src/qt/languages/fr-FR.po +++ b/src/qt/languages/fr-FR.po @@ -450,15 +450,6 @@ msgstr "Nuked (plus précis)" msgid "YMFM (faster)" msgstr "YMFM (plus rapide)" -msgid "Network type:" -msgstr "Type de réseau:" - -msgid "PCap device:" -msgstr "Dispositif PCap:" - -msgid "Network adapter:" -msgstr "Adaptateur de réseau:" - msgid "COM1 Device:" msgstr "Dispositif COM1:" diff --git a/src/qt/languages/hr-HR.po b/src/qt/languages/hr-HR.po index 346346687..f55ad7f53 100644 --- a/src/qt/languages/hr-HR.po +++ b/src/qt/languages/hr-HR.po @@ -450,15 +450,6 @@ msgstr "Nuked (precizniji)" msgid "YMFM (faster)" msgstr "YMFM (brži)" -msgid "Network type:" -msgstr "Tip mreže:" - -msgid "PCap device:" -msgstr "Uređaj PCap:" - -msgid "Network adapter:" -msgstr "Mrežna kartica:" - msgid "COM1 Device:" msgstr "Uređaj COM1:" diff --git a/src/qt/languages/hu-HU.po b/src/qt/languages/hu-HU.po index 113591409..009b6345e 100644 --- a/src/qt/languages/hu-HU.po +++ b/src/qt/languages/hu-HU.po @@ -450,15 +450,6 @@ msgstr "Nuked (pontosabb)" msgid "YMFM (faster)" msgstr "YMFM (gyorsabb)" -msgid "Network type:" -msgstr "Hálózati típusa:" - -msgid "PCap device:" -msgstr "PCap eszköz:" - -msgid "Network adapter:" -msgstr "Hálózati kártya:" - msgid "COM1 Device:" msgstr "COM1 eszköz:" diff --git a/src/qt/languages/it-IT.po b/src/qt/languages/it-IT.po index 028d86f40..75614e309 100644 --- a/src/qt/languages/it-IT.po +++ b/src/qt/languages/it-IT.po @@ -450,15 +450,6 @@ msgstr "Nuked (più accurato)" msgid "YMFM (faster)" msgstr "YMFM (più veloce)" -msgid "Network type:" -msgstr "Tipo di rete:" - -msgid "PCap device:" -msgstr "Dispositivo PCap:" - -msgid "Network adapter:" -msgstr "Scheda di rete:" - msgid "COM1 Device:" msgstr "Dispositivo COM1:" diff --git a/src/qt/languages/ja-JP.po b/src/qt/languages/ja-JP.po index e66c8b2c1..7cf3e660e 100644 --- a/src/qt/languages/ja-JP.po +++ b/src/qt/languages/ja-JP.po @@ -450,15 +450,6 @@ msgstr "Nuked(高精度化)" msgid "YMFM (faster)" msgstr "YMFM(より速く)" -msgid "Network type:" -msgstr "ネットワーク タイプ:" - -msgid "PCap device:" -msgstr "PCapデバイス:" - -msgid "Network adapter:" -msgstr "ネットワークアダプター:" - msgid "COM1 Device:" msgstr "COM1デバイス:" diff --git a/src/qt/languages/ko-KR.po b/src/qt/languages/ko-KR.po index 61f65ad98..266a4c581 100644 --- a/src/qt/languages/ko-KR.po +++ b/src/qt/languages/ko-KR.po @@ -450,15 +450,6 @@ msgstr "Nuked (더 정확한)" msgid "YMFM (faster)" msgstr "YMFM (더 빠르게)" -msgid "Network type:" -msgstr "네트워크 종류:" - -msgid "PCap device:" -msgstr "PCap 장치:" - -msgid "Network adapter:" -msgstr "네트워크 어댑터:" - msgid "COM1 Device:" msgstr "COM1 장치:" diff --git a/src/qt/languages/nl-NL.po b/src/qt/languages/nl-NL.po index 5e0670385..bb2613d4e 100644 --- a/src/qt/languages/nl-NL.po +++ b/src/qt/languages/nl-NL.po @@ -450,15 +450,6 @@ msgstr "Nuked (nauwkeuriger)" msgid "YMFM (faster)" msgstr "YMFM (sneller)" -msgid "Network type:" -msgstr "Type netwerk:" - -msgid "PCap device:" -msgstr "PCap-apparaat:" - -msgid "Network adapter:" -msgstr "Netwerkadapter:" - msgid "COM1 Device:" msgstr "COM1-apparaat:" diff --git a/src/qt/languages/pl-PL.po b/src/qt/languages/pl-PL.po index 1a4ddda37..13904e627 100644 --- a/src/qt/languages/pl-PL.po +++ b/src/qt/languages/pl-PL.po @@ -450,15 +450,6 @@ msgstr "Nuked (dokładniejszy)" msgid "YMFM (faster)" msgstr "YMFM (szybszy)" -msgid "Network type:" -msgstr "Rodzaj sieci:" - -msgid "PCap device:" -msgstr "Urządzenie PCap:" - -msgid "Network adapter:" -msgstr "Karta sieciowa:" - msgid "COM1 Device:" msgstr "Urządzenie COM1:" diff --git a/src/qt/languages/pt-BR.po b/src/qt/languages/pt-BR.po index cfc7fa42b..9466d25df 100644 --- a/src/qt/languages/pt-BR.po +++ b/src/qt/languages/pt-BR.po @@ -450,15 +450,6 @@ msgstr "Nuked (mais preciso)" msgid "YMFM (faster)" msgstr "YMFM (mais rápido)" -msgid "Network type:" -msgstr "Tipo de rede:" - -msgid "PCap device:" -msgstr "Dispositivo PCap:" - -msgid "Network adapter:" -msgstr "Adaptador de rede:" - msgid "COM1 Device:" msgstr "Dispositivo COM1:" diff --git a/src/qt/languages/pt-PT.po b/src/qt/languages/pt-PT.po index 564932890..8d212b67f 100644 --- a/src/qt/languages/pt-PT.po +++ b/src/qt/languages/pt-PT.po @@ -450,15 +450,6 @@ msgstr "Nuked (mais exacto)" msgid "YMFM (faster)" msgstr "YMFM (mais rápido)" -msgid "Network type:" -msgstr "Tipo de rede:" - -msgid "PCap device:" -msgstr "Dispositivo PCap:" - -msgid "Network adapter:" -msgstr "Placa de rede:" - msgid "COM1 Device:" msgstr "Dispositivo COM1:" diff --git a/src/qt/languages/ru-RU.po b/src/qt/languages/ru-RU.po index 3c0eb619a..9795638d0 100644 --- a/src/qt/languages/ru-RU.po +++ b/src/qt/languages/ru-RU.po @@ -450,15 +450,6 @@ msgstr "Nuked (более точный)" msgid "YMFM (faster)" msgstr "YMFM (быстрее)" -msgid "Network type:" -msgstr "Тип сети:" - -msgid "PCap device:" -msgstr "Устройство PCap:" - -msgid "Network adapter:" -msgstr "Сетевая карта:" - msgid "COM1 Device:" msgstr "Устройство COM1:" diff --git a/src/qt/languages/sk-SK.po b/src/qt/languages/sk-SK.po index 1121aefb6..c7855d823 100644 --- a/src/qt/languages/sk-SK.po +++ b/src/qt/languages/sk-SK.po @@ -450,15 +450,6 @@ msgstr "Nuked (presnejší)" msgid "YMFM (faster)" msgstr "YMFM (rýchlejší)" -msgid "Network type:" -msgstr "Druh siete:" - -msgid "PCap device:" -msgstr "PCap zariadenia:" - -msgid "Network adapter:" -msgstr "Sieťový adaptér:" - msgid "COM1 Device:" msgstr "Zariadenie na COM1:" diff --git a/src/qt/languages/sl-SI.po b/src/qt/languages/sl-SI.po index e3e8dba95..3e5b35c6a 100644 --- a/src/qt/languages/sl-SI.po +++ b/src/qt/languages/sl-SI.po @@ -450,15 +450,6 @@ msgstr "Nuked (točnejši)" msgid "YMFM (faster)" msgstr "YMFM (hitrejši)" -msgid "Network type:" -msgstr "Vrsta omrežja:" - -msgid "PCap device:" -msgstr "Naprava PCap:" - -msgid "Network adapter:" -msgstr "Omrežna kartica:" - msgid "COM1 Device:" msgstr "Naprava COM1:" diff --git a/src/qt/languages/tr-TR.po b/src/qt/languages/tr-TR.po index 2abe174ee..879277f20 100644 --- a/src/qt/languages/tr-TR.po +++ b/src/qt/languages/tr-TR.po @@ -450,15 +450,6 @@ msgstr "Nuked (daha doğru)" msgid "YMFM (faster)" msgstr "YMFM (daha hızlı)" -msgid "Network type:" -msgstr "Ağ türü:" - -msgid "PCap device:" -msgstr "PCap cihazı:" - -msgid "Network adapter:" -msgstr "Ağ cihazı:" - msgid "COM1 Device:" msgstr "COM1 cihazı:" diff --git a/src/qt/languages/uk-UA.po b/src/qt/languages/uk-UA.po index 7514e2fff..0cb04da38 100644 --- a/src/qt/languages/uk-UA.po +++ b/src/qt/languages/uk-UA.po @@ -450,15 +450,6 @@ msgstr "Nuked (більш точний)" msgid "YMFM (faster)" msgstr "YMFM (швидший)" -msgid "Network type:" -msgstr "Тип мережі:" - -msgid "PCap device:" -msgstr "Пристрій PCap:" - -msgid "Network adapter:" -msgstr "Мережевий адаптер:" - msgid "COM1 Device:" msgstr "Пристрій COM1:" diff --git a/src/qt/languages/vi-VN.po b/src/qt/languages/vi-VN.po index d05396430..8776ad40d 100644 --- a/src/qt/languages/vi-VN.po +++ b/src/qt/languages/vi-VN.po @@ -450,15 +450,6 @@ msgstr "Nuked (chính xác hơn)" msgid "YMFM (faster)" msgstr "YMFM (nhanh hơn)" -msgid "Network type:" -msgstr "Kiểu loại mạng:" - -msgid "PCap device:" -msgstr "Thiết bị PCap:" - -msgid "Network adapter:" -msgstr "Bộ thích ứng (adapter) mạng:" - msgid "COM1 Device:" msgstr "Thiết bị COM1:" diff --git a/src/qt/languages/zh-CN.po b/src/qt/languages/zh-CN.po index 450f148cf..787925f3b 100644 --- a/src/qt/languages/zh-CN.po +++ b/src/qt/languages/zh-CN.po @@ -450,15 +450,6 @@ msgstr "Nuked (更准确)" msgid "YMFM (faster)" msgstr "YMFM (更快)" -msgid "Network type:" -msgstr "网络类型:" - -msgid "PCap device:" -msgstr "PCap 设备:" - -msgid "Network adapter:" -msgstr "网络适配器:" - msgid "COM1 Device:" msgstr "COM1 设备:" diff --git a/src/qt/languages/zh-TW.po b/src/qt/languages/zh-TW.po index c53753d28..6bf3ddd28 100644 --- a/src/qt/languages/zh-TW.po +++ b/src/qt/languages/zh-TW.po @@ -450,15 +450,6 @@ msgstr "Nuked (更準確)" msgid "YMFM (faster)" msgstr "YMFM (更快)" -msgid "Network type:" -msgstr "網路類型:" - -msgid "PCap device:" -msgstr "PCap 裝置:" - -msgid "Network adapter:" -msgstr "網路配接器:" - msgid "COM1 Device:" msgstr "COM1 裝置:" From ff0889c1a74a3e259ab2c04016713d0054966f03 Mon Sep 17 00:00:00 2001 From: Alexander Babikov Date: Thu, 17 Apr 2025 00:34:01 +0500 Subject: [PATCH 023/180] languages: Add colons to dropdown labels on the network settings page --- src/qt/languages/86box.pot | 8 ++++---- src/qt/languages/ca-ES.po | 16 ++++++++-------- src/qt/languages/cs-CZ.po | 16 ++++++++-------- src/qt/languages/de-DE.po | 16 ++++++++-------- src/qt/languages/es-ES.po | 16 ++++++++-------- src/qt/languages/fi-FI.po | 16 ++++++++-------- src/qt/languages/fr-FR.po | 16 ++++++++-------- src/qt/languages/hr-HR.po | 16 ++++++++-------- src/qt/languages/hu-HU.po | 16 ++++++++-------- src/qt/languages/it-IT.po | 16 ++++++++-------- src/qt/languages/ja-JP.po | 16 ++++++++-------- src/qt/languages/ko-KR.po | 16 ++++++++-------- src/qt/languages/nl-NL.po | 16 ++++++++-------- src/qt/languages/pl-PL.po | 16 ++++++++-------- src/qt/languages/pt-BR.po | 16 ++++++++-------- src/qt/languages/pt-PT.po | 16 ++++++++-------- src/qt/languages/ru-RU.po | 16 ++++++++-------- src/qt/languages/sk-SK.po | 16 ++++++++-------- src/qt/languages/sl-SI.po | 16 ++++++++-------- src/qt/languages/tr-TR.po | 16 ++++++++-------- src/qt/languages/uk-UA.po | 16 ++++++++-------- src/qt/languages/vi-VN.po | 16 ++++++++-------- src/qt/languages/zh-CN.po | 16 ++++++++-------- src/qt/languages/zh-TW.po | 16 ++++++++-------- 24 files changed, 188 insertions(+), 188 deletions(-) diff --git a/src/qt/languages/86box.pot b/src/qt/languages/86box.pot index 81b639b7d..71dc7572a 100644 --- a/src/qt/languages/86box.pot +++ b/src/qt/languages/86box.pot @@ -1341,16 +1341,16 @@ msgstr "" msgid "Network Card #4" msgstr "" -msgid "Mode" +msgid "Mode:" msgstr "" -msgid "Interface" +msgid "Interface:" msgstr "" -msgid "Adapter" +msgid "Adapter:" msgstr "" -msgid "VDE Socket" +msgid "VDE Socket:" msgstr "" msgid "86Box Unit Tester" diff --git a/src/qt/languages/ca-ES.po b/src/qt/languages/ca-ES.po index 63b9b7a9b..e3bb805a0 100644 --- a/src/qt/languages/ca-ES.po +++ b/src/qt/languages/ca-ES.po @@ -1341,17 +1341,17 @@ msgstr "Targeta de xarxa 3" msgid "Network Card #4" msgstr "Targeta de xarxa 4" -msgid "Mode" -msgstr "Mode" +msgid "Mode:" +msgstr "Mode:" -msgid "Interface" -msgstr "Interfície" +msgid "Interface:" +msgstr "Interfície:" -msgid "Adapter" -msgstr "Adaptador" +msgid "Adapter:" +msgstr "Adaptador:" -msgid "VDE Socket" -msgstr "Socket de VDE" +msgid "VDE Socket:" +msgstr "Socket de VDE:" msgid "86Box Unit Tester" msgstr "Test de la unitat de 86 Box" diff --git a/src/qt/languages/cs-CZ.po b/src/qt/languages/cs-CZ.po index fd9769479..84c2cb94f 100644 --- a/src/qt/languages/cs-CZ.po +++ b/src/qt/languages/cs-CZ.po @@ -1341,17 +1341,17 @@ msgstr "Síťová karta 3" msgid "Network Card #4" msgstr "Síťová karta 4" -msgid "Mode" -msgstr "Režim" +msgid "Mode:" +msgstr "Režim:" -msgid "Interface" -msgstr "Rozhraní" +msgid "Interface:" +msgstr "Rozhraní:" -msgid "Adapter" -msgstr "Adaptér" +msgid "Adapter:" +msgstr "Adaptér:" -msgid "VDE Socket" -msgstr "Zásuvka VDE" +msgid "VDE Socket:" +msgstr "Zásuvka VDE:" msgid "86Box Unit Tester" msgstr "86Box Unit Tester" diff --git a/src/qt/languages/de-DE.po b/src/qt/languages/de-DE.po index cc734cb8b..588a2b5cd 100644 --- a/src/qt/languages/de-DE.po +++ b/src/qt/languages/de-DE.po @@ -1344,17 +1344,17 @@ msgstr "Netzwerkkarte 3" msgid "Network Card #4" msgstr "Netzwerkkarte 4" -msgid "Mode" -msgstr "Modus" +msgid "Mode:" +msgstr "Modus:" -msgid "Interface" -msgstr "Schnittstelle" +msgid "Interface:" +msgstr "Schnittstelle:" -msgid "Adapter" -msgstr "Adapter" +msgid "Adapter:" +msgstr "Adapter:" -msgid "VDE Socket" -msgstr "VDE Port" +msgid "VDE Socket:" +msgstr "VDE Port:" msgid "86Box Unit Tester" msgstr "86Box-Gerätetester" diff --git a/src/qt/languages/es-ES.po b/src/qt/languages/es-ES.po index cf349cd6d..ac22a4d5c 100644 --- a/src/qt/languages/es-ES.po +++ b/src/qt/languages/es-ES.po @@ -1340,17 +1340,17 @@ msgstr "Tarjeta de red 3" msgid "Network Card #4" msgstr "Tarjeta de red 4" -msgid "Mode" -msgstr "Modalidad" +msgid "Mode:" +msgstr "Modalidad:" -msgid "Interface" -msgstr "Interfaz" +msgid "Interface:" +msgstr "Interfaz:" -msgid "Adapter" -msgstr "Adaptador" +msgid "Adapter:" +msgstr "Adaptador:" -msgid "VDE Socket" -msgstr "Toma VDE" +msgid "VDE Socket:" +msgstr "Toma VDE:" msgid "86Box Unit Tester" msgstr "Comprobador de unidad 86Box" diff --git a/src/qt/languages/fi-FI.po b/src/qt/languages/fi-FI.po index 3835165c0..8b8ca8374 100644 --- a/src/qt/languages/fi-FI.po +++ b/src/qt/languages/fi-FI.po @@ -1344,17 +1344,17 @@ msgstr "Verkkokortti 3" msgid "Network Card #4" msgstr "Verkkokortti 4" -msgid "Mode" -msgstr "Tila" +msgid "Mode:" +msgstr "Tila:" -msgid "Interface" -msgstr "Liitäntä" +msgid "Interface:" +msgstr "Liitäntä:" -msgid "Adapter" -msgstr "Sovitin" +msgid "Adapter:" +msgstr "Sovitin:" -msgid "VDE Socket" -msgstr "VDE-pistorasia" +msgid "VDE Socket:" +msgstr "VDE-pistorasia:" msgid "86Box Unit Tester" msgstr "86Box Unit Tester" diff --git a/src/qt/languages/fr-FR.po b/src/qt/languages/fr-FR.po index 8c53a7264..cc2d8c310 100644 --- a/src/qt/languages/fr-FR.po +++ b/src/qt/languages/fr-FR.po @@ -1341,17 +1341,17 @@ msgstr "Carte réseau 3" msgid "Network Card #4" msgstr "Carte réseau 4" -msgid "Mode" -msgstr "Mode" +msgid "Mode:" +msgstr "Mode:" -msgid "Interface" -msgstr "Interface" +msgid "Interface:" +msgstr "Interface:" -msgid "Adapter" -msgstr "Adaptateur" +msgid "Adapter:" +msgstr "Adaptateur:" -msgid "VDE Socket" -msgstr "Prise VDE" +msgid "VDE Socket:" +msgstr "Prise VDE:" msgid "86Box Unit Tester" msgstr "Testeur d'unité de 86Box" diff --git a/src/qt/languages/hr-HR.po b/src/qt/languages/hr-HR.po index f55ad7f53..d074401a2 100644 --- a/src/qt/languages/hr-HR.po +++ b/src/qt/languages/hr-HR.po @@ -1341,17 +1341,17 @@ msgstr "Mrežna kartica 3" msgid "Network Card #4" msgstr "Mrežna kartica 4" -msgid "Mode" -msgstr "Način" +msgid "Mode:" +msgstr "Način:" -msgid "Interface" -msgstr "Sučelje" +msgid "Interface:" +msgstr "Sučelje:" -msgid "Adapter" -msgstr "Adapter" +msgid "Adapter:" +msgstr "Adapter:" -msgid "VDE Socket" -msgstr "VDE utičnica" +msgid "VDE Socket:" +msgstr "VDE utičnica:" msgid "86Box Unit Tester" msgstr "Jedinični ispitivač 86Box-a" diff --git a/src/qt/languages/hu-HU.po b/src/qt/languages/hu-HU.po index 009b6345e..841ed5e81 100644 --- a/src/qt/languages/hu-HU.po +++ b/src/qt/languages/hu-HU.po @@ -1341,17 +1341,17 @@ msgstr "Hálózati kártya 3" msgid "Network Card #4" msgstr "Hálózati kártya 4" -msgid "Mode" -msgstr "Mód" +msgid "Mode:" +msgstr "Mód:" -msgid "Interface" -msgstr "Interfész" +msgid "Interface:" +msgstr "Interfész:" -msgid "Adapter" -msgstr "Adapter" +msgid "Adapter:" +msgstr "Adapter:" -msgid "VDE Socket" -msgstr "VDE aljzat" +msgid "VDE Socket:" +msgstr "VDE aljzat:" msgid "86Box Unit Tester" msgstr "86Box Unit Tester" diff --git a/src/qt/languages/it-IT.po b/src/qt/languages/it-IT.po index 75614e309..8de67d28b 100644 --- a/src/qt/languages/it-IT.po +++ b/src/qt/languages/it-IT.po @@ -1341,17 +1341,17 @@ msgstr "Scheda di rete n. 3" msgid "Network Card #4" msgstr "Scheda di rete n. 4" -msgid "Mode" -msgstr "Modalità" +msgid "Mode:" +msgstr "Modalità:" -msgid "Interface" -msgstr "Interfaccia" +msgid "Interface:" +msgstr "Interfaccia:" -msgid "Adapter" -msgstr "Adattatore" +msgid "Adapter:" +msgstr "Adattatore:" -msgid "VDE Socket" -msgstr "Presa VDE" +msgid "VDE Socket:" +msgstr "Presa VDE:" msgid "86Box Unit Tester" msgstr "Tester di unità 86Box" diff --git a/src/qt/languages/ja-JP.po b/src/qt/languages/ja-JP.po index 7cf3e660e..6add03617 100644 --- a/src/qt/languages/ja-JP.po +++ b/src/qt/languages/ja-JP.po @@ -1341,17 +1341,17 @@ msgstr "ネットワークカード 3" msgid "Network Card #4" msgstr "ネットワークカード 4" -msgid "Mode" -msgstr "モード" +msgid "Mode:" +msgstr "モード:" -msgid "Interface" -msgstr "インターフェース" +msgid "Interface:" +msgstr "インターフェース:" -msgid "Adapter" -msgstr "アダプター" +msgid "Adapter:" +msgstr "アダプター:" -msgid "VDE Socket" -msgstr "VDEソケット" +msgid "VDE Socket:" +msgstr "VDEソケット:" msgid "86Box Unit Tester" msgstr "86Boxユニットテスター" diff --git a/src/qt/languages/ko-KR.po b/src/qt/languages/ko-KR.po index 266a4c581..f32a23ec4 100644 --- a/src/qt/languages/ko-KR.po +++ b/src/qt/languages/ko-KR.po @@ -1341,17 +1341,17 @@ msgstr "네트워크 카드 3" msgid "Network Card #4" msgstr "네트워크 카드 4" -msgid "Mode" -msgstr "모드" +msgid "Mode:" +msgstr "모드:" -msgid "Interface" -msgstr "인터페이스" +msgid "Interface:" +msgstr "인터페이스:" -msgid "Adapter" -msgstr "어댑터" +msgid "Adapter:" +msgstr "어댑터:" -msgid "VDE Socket" -msgstr "VDE 소켓" +msgid "VDE Socket:" +msgstr "VDE 소켓:" msgid "86Box Unit Tester" msgstr "86Box 유닛 테스터" diff --git a/src/qt/languages/nl-NL.po b/src/qt/languages/nl-NL.po index bb2613d4e..f1b4eed91 100644 --- a/src/qt/languages/nl-NL.po +++ b/src/qt/languages/nl-NL.po @@ -1341,17 +1341,17 @@ msgstr "Netwerkkaart #3" msgid "Network Card #4" msgstr "Netwerkkaart #4" -msgid "Mode" -msgstr "Modus" +msgid "Mode:" +msgstr "Modus:" -msgid "Interface" -msgstr "Interface" +msgid "Interface:" +msgstr "Interface:" -msgid "Adapter" -msgstr "Adapter" +msgid "Adapter:" +msgstr "Adapter:" -msgid "VDE Socket" -msgstr "VDE-socket" +msgid "VDE Socket:" +msgstr "VDE-socket:" msgid "86Box Unit Tester" msgstr "86Box apparaattester" diff --git a/src/qt/languages/pl-PL.po b/src/qt/languages/pl-PL.po index 13904e627..1ad5dcf88 100644 --- a/src/qt/languages/pl-PL.po +++ b/src/qt/languages/pl-PL.po @@ -1341,17 +1341,17 @@ msgstr "Karta sieciowa 3" msgid "Network Card #4" msgstr "Karta sieciowa 4" -msgid "Mode" -msgstr "Tryb" +msgid "Mode:" +msgstr "Tryb:" -msgid "Interface" -msgstr "Interfejs" +msgid "Interface:" +msgstr "Interfejs:" -msgid "Adapter" -msgstr "Adapter" +msgid "Adapter:" +msgstr "Adapter:" -msgid "VDE Socket" -msgstr "Gniazdo VDE" +msgid "VDE Socket:" +msgstr "Gniazdo VDE:" msgid "86Box Unit Tester" msgstr "Tester urządzeń 86Box" diff --git a/src/qt/languages/pt-BR.po b/src/qt/languages/pt-BR.po index 9466d25df..3eead12fe 100644 --- a/src/qt/languages/pt-BR.po +++ b/src/qt/languages/pt-BR.po @@ -1341,17 +1341,17 @@ msgstr "Placa de rede 3" msgid "Network Card #4" msgstr "Placa de rede 4" -msgid "Mode" -msgstr "Modo" +msgid "Mode:" +msgstr "Modo:" -msgid "Interface" -msgstr "Interface" +msgid "Interface:" +msgstr "Interface:" -msgid "Adapter" -msgstr "Adaptador" +msgid "Adapter:" +msgstr "Adaptador:" -msgid "VDE Socket" -msgstr "Soquete VDE" +msgid "VDE Socket:" +msgstr "Soquete VDE:" msgid "86Box Unit Tester" msgstr "Testador de unidade 86Box" diff --git a/src/qt/languages/pt-PT.po b/src/qt/languages/pt-PT.po index 8d212b67f..1ffcf0c3b 100644 --- a/src/qt/languages/pt-PT.po +++ b/src/qt/languages/pt-PT.po @@ -1341,17 +1341,17 @@ msgstr "Placa de rede 3" msgid "Network Card #4" msgstr "Placa de rede 4" -msgid "Mode" -msgstr "Modo" +msgid "Mode:" +msgstr "Modo:" -msgid "Interface" -msgstr "Interface" +msgid "Interface:" +msgstr "Interface:" -msgid "Adapter" -msgstr "Adaptador" +msgid "Adapter:" +msgstr "Adaptador:" -msgid "VDE Socket" -msgstr "Tomada VDE" +msgid "VDE Socket:" +msgstr "Tomada VDE:" msgid "86Box Unit Tester" msgstr "Testador de unidades 86Box" diff --git a/src/qt/languages/ru-RU.po b/src/qt/languages/ru-RU.po index 9795638d0..f1c250a51 100644 --- a/src/qt/languages/ru-RU.po +++ b/src/qt/languages/ru-RU.po @@ -1341,17 +1341,17 @@ msgstr "Сетевая карта 3" msgid "Network Card #4" msgstr "Сетевая карта 4" -msgid "Mode" -msgstr "Режим" +msgid "Mode:" +msgstr "Режим:" -msgid "Interface" -msgstr "Интерфейс" +msgid "Interface:" +msgstr "Интерфейс:" -msgid "Adapter" -msgstr "Адаптер" +msgid "Adapter:" +msgstr "Адаптер:" -msgid "VDE Socket" -msgstr "VDE сокет" +msgid "VDE Socket:" +msgstr "VDE сокет:" msgid "86Box Unit Tester" msgstr "Модульный Тестер 86Box" diff --git a/src/qt/languages/sk-SK.po b/src/qt/languages/sk-SK.po index c7855d823..9ce9abc2f 100644 --- a/src/qt/languages/sk-SK.po +++ b/src/qt/languages/sk-SK.po @@ -1342,17 +1342,17 @@ msgstr "Sieťová karta 3" msgid "Network Card #4" msgstr "Sieťová karta 4" -msgid "Mode" -msgstr "Režim" +msgid "Mode:" +msgstr "Režim:" -msgid "Interface" -msgstr "Rozhranie" +msgid "Interface:" +msgstr "Rozhranie:" -msgid "Adapter" -msgstr "Adaptér" +msgid "Adapter:" +msgstr "Adaptér:" -msgid "VDE Socket" -msgstr "Zásuvka VDE" +msgid "VDE Socket:" +msgstr "Zásuvka VDE:" msgid "86Box Unit Tester" msgstr "86Box Unit Tester" diff --git a/src/qt/languages/sl-SI.po b/src/qt/languages/sl-SI.po index 3e5b35c6a..af5fd1fc1 100644 --- a/src/qt/languages/sl-SI.po +++ b/src/qt/languages/sl-SI.po @@ -1341,17 +1341,17 @@ msgstr "Omrežna kartica 3" msgid "Network Card #4" msgstr "Omrežna kartica 4" -msgid "Mode" -msgstr "Način" +msgid "Mode:" +msgstr "Način:" -msgid "Interface" -msgstr "Vmesnik" +msgid "Interface:" +msgstr "Vmesnik:" -msgid "Adapter" -msgstr "Adapter" +msgid "Adapter:" +msgstr "Adapter:" -msgid "VDE Socket" -msgstr "Vtičnica VDE" +msgid "VDE Socket:" +msgstr "Vtičnica VDE:" msgid "86Box Unit Tester" msgstr "Tester enote 86Box" diff --git a/src/qt/languages/tr-TR.po b/src/qt/languages/tr-TR.po index 879277f20..d3c1871e9 100644 --- a/src/qt/languages/tr-TR.po +++ b/src/qt/languages/tr-TR.po @@ -1341,17 +1341,17 @@ msgstr "Ağ kartı 3" msgid "Network Card #4" msgstr "Ağ kartı 4" -msgid "Mode" -msgstr "Mod" +msgid "Mode:" +msgstr "Mod:" -msgid "Interface" -msgstr "Arayüz" +msgid "Interface:" +msgstr "Arayüz:" -msgid "Adapter" -msgstr "Adaptör" +msgid "Adapter:" +msgstr "Adaptör:" -msgid "VDE Socket" -msgstr "VDE soketi" +msgid "VDE Socket:" +msgstr "VDE soketi:" msgid "86Box Unit Tester" msgstr "86Box birim test cihazı" diff --git a/src/qt/languages/uk-UA.po b/src/qt/languages/uk-UA.po index 0cb04da38..d4b4c7847 100644 --- a/src/qt/languages/uk-UA.po +++ b/src/qt/languages/uk-UA.po @@ -1341,17 +1341,17 @@ msgstr "Мережева карта 3" msgid "Network Card #4" msgstr "Мережева карта 4" -msgid "Mode" -msgstr "Режим" +msgid "Mode:" +msgstr "Режим:" -msgid "Interface" -msgstr "Інтерфейс" +msgid "Interface:" +msgstr "Інтерфейс:" -msgid "Adapter" -msgstr "Адаптер" +msgid "Adapter:" +msgstr "Адаптер:" -msgid "VDE Socket" -msgstr "VDE сокет" +msgid "VDE Socket:" +msgstr "VDE сокет:" msgid "86Box Unit Tester" msgstr "Тестер блоків 86Box" diff --git a/src/qt/languages/vi-VN.po b/src/qt/languages/vi-VN.po index 8776ad40d..9dcbf01ca 100644 --- a/src/qt/languages/vi-VN.po +++ b/src/qt/languages/vi-VN.po @@ -1341,17 +1341,17 @@ msgstr "Thẻ mạng 3" msgid "Network Card #4" msgstr "Thẻ mạng 4" -msgid "Mode" -msgstr "Chế độ" +msgid "Mode:" +msgstr "Chế độ:" -msgid "Interface" -msgstr "Giao diện" +msgid "Interface:" +msgstr "Giao diện:" -msgid "Adapter" -msgstr "Bộ chuyển đổi" +msgid "Adapter:" +msgstr "Bộ chuyển đổi:" -msgid "VDE Socket" -msgstr "Ổ cắm VDE" +msgid "VDE Socket:" +msgstr "Ổ cắm VDE:" msgid "86Box Unit Tester" msgstr "Trình kiểm tra đơn vị 86box" diff --git a/src/qt/languages/zh-CN.po b/src/qt/languages/zh-CN.po index 787925f3b..041b7bb6b 100644 --- a/src/qt/languages/zh-CN.po +++ b/src/qt/languages/zh-CN.po @@ -1341,17 +1341,17 @@ msgstr "网卡 3" msgid "Network Card #4" msgstr "网卡 4" -msgid "Mode" -msgstr "模式" +msgid "Mode:" +msgstr "模式:" -msgid "Interface" -msgstr "界面" +msgid "Interface:" +msgstr "界面:" -msgid "Adapter" -msgstr "适配器" +msgid "Adapter:" +msgstr "适配器:" -msgid "VDE Socket" -msgstr "VDE 套接字" +msgid "VDE Socket:" +msgstr "VDE 套接字:" msgid "86Box Unit Tester" msgstr "86Box 装置测试仪" diff --git a/src/qt/languages/zh-TW.po b/src/qt/languages/zh-TW.po index 6bf3ddd28..c3e3fb4d5 100644 --- a/src/qt/languages/zh-TW.po +++ b/src/qt/languages/zh-TW.po @@ -1341,17 +1341,17 @@ msgstr "網路卡 3" msgid "Network Card #4" msgstr "網路卡 4" -msgid "Mode" -msgstr "模式" +msgid "Mode:" +msgstr "模式:" -msgid "Interface" -msgstr "介面" +msgid "Interface:" +msgstr "介面:" -msgid "Adapter" -msgstr "配接器" +msgid "Adapter:" +msgstr "配接器:" -msgid "VDE Socket" -msgstr "VDE 插座" +msgid "VDE Socket:" +msgstr "VDE 插座:" msgid "86Box Unit Tester" msgstr "86Box 單元測試器" From 0559d803a7cb7c3d86513c93e7055b559483ea34 Mon Sep 17 00:00:00 2001 From: Alexander Babikov Date: Thu, 17 Apr 2025 11:03:41 +0500 Subject: [PATCH 024/180] languages: update the Russian translation Co-Authored-by: usergithub64 <58270614+usergithub64@users.noreply.github.com> --- src/qt/languages/ru-RU.po | 56 +++++++++++++++++++-------------------- 1 file changed, 28 insertions(+), 28 deletions(-) diff --git a/src/qt/languages/ru-RU.po b/src/qt/languages/ru-RU.po index f1c250a51..42ad1716c 100644 --- a/src/qt/languages/ru-RU.po +++ b/src/qt/languages/ru-RU.po @@ -55,7 +55,7 @@ msgid "Qt (&OpenGL)" msgstr "Qt (&OpenGL)" msgid "Open&GL (3.0 Core)" -msgstr "Open&GL (3.0)" +msgstr "Open&GL (3.0 Core)" msgid "&VNC" msgstr "&VNC" @@ -214,7 +214,7 @@ msgid "&Documentation..." msgstr "&Документация..." msgid "&About 86Box..." -msgstr "&О программе 86Box..." +msgstr "&О 86Box..." msgid "&New image..." msgstr "&Новый образ..." @@ -253,7 +253,7 @@ msgid "E&mpty" msgstr "П&устой" msgid "Reload previous image" -msgstr "Загрузить предыдущий образ" +msgstr "Перезагрузить предыдущий образ" msgid "&Folder..." msgstr "&Папка..." @@ -430,10 +430,10 @@ msgid "Sound card #4:" msgstr "Звуковая карта 4:" msgid "MIDI Out Device:" -msgstr "MIDI Out устройство:" +msgstr "Устройство вывода MIDI:" msgid "MIDI In Device:" -msgstr "MIDI In устройство:" +msgstr "Устройство ввода MIDI:" msgid "Standalone MPU-401" msgstr "Отдельный MPU-401" @@ -1435,7 +1435,7 @@ msgid "BIOS Revision" msgstr "Версия BIOS" msgid "Translate 26 -> 17" -msgstr "Перевести 26 -> 17" +msgstr "Переводить 26 -> 17" msgid "Language" msgstr "Язык" @@ -1531,7 +1531,7 @@ msgid "Reversed stereo" msgstr "Реверс стерео" msgid "Nice ramp" -msgstr "Nice ramp" +msgstr "Улучшение рампы" msgid "Hz" msgstr "Гц" @@ -1582,7 +1582,7 @@ msgid "RAM Address" msgstr "Адрес оперативной памяти" msgid "RAM size" -msgstr "Объем оперативной памяти" +msgstr "Размер оперативной памяти" msgid "Initial RAM size" msgstr "Начальный размер оперативной памяти" @@ -1615,10 +1615,10 @@ msgid "Surround module" msgstr "Модуль объемного звучания" msgid "CODEC" -msgstr "КОДЕК" +msgstr "Кодек" msgid "Raise CODEC interrupt on CODEC setup (needed by some drivers)" -msgstr "Поднимать прерывание CODEC при настройке CODEC (необходимо некоторым драйверам)." +msgstr "Поднимать прерывание кодека при настройке кодека (необходимо некоторым драйверам)." msgid "SB Address" msgstr "Адрес SB" @@ -1645,7 +1645,7 @@ msgid "Enable CMS" msgstr "Включить CMS" msgid "Mixer" -msgstr "Смеситель" +msgstr "Микшер" msgid "High DMA" msgstr "Высокий DMA" @@ -1654,7 +1654,7 @@ msgid "Control PC speaker" msgstr "Управление динамиком ПК" msgid "Memory size" -msgstr "Объем памяти" +msgstr "Размер памяти" msgid "EMU8000 Address" msgstr "Адрес EMU8000" @@ -1669,7 +1669,7 @@ msgid "GUS type" msgstr "Тип GUS" msgid "Enable 0x04 \"Exit 86Box\" command" -msgstr "Включить команду 0x04 \"Выход 86Box\"." +msgstr "Включить команду 0x04 \"Выход из 86Box\"" msgid "Display type" msgstr "Тип дисплея" @@ -1711,13 +1711,13 @@ msgid "Bilinear filtering" msgstr "Билинейная фильтрация" msgid "Dithering" -msgstr "Dithering" +msgstr "Дизеринг" msgid "Enable NMI for CGA emulation" msgstr "Включение NMI для эмуляции CGA" msgid "Voodoo type" -msgstr "Тип Вуду" +msgstr "Тип Voodoo" msgid "Framebuffer memory size" msgstr "Размер памяти фреймбуфера" @@ -1726,10 +1726,10 @@ msgid "Texture memory size" msgstr "Размер памяти текстур" msgid "Dither subtraction" -msgstr "Вычитание с вычитанием" +msgstr "Вычитание дизеринга" msgid "Screen Filter" -msgstr "Фильтр экрана" +msgstr "Экранный фильтр" msgid "Render threads" msgstr "Потоки рендеринга" @@ -1912,7 +1912,7 @@ msgid "Monochrome (5151/MDA) (white)" msgstr "Монохромный (5151/MDA) (белый)" msgid "Monochrome (5151/MDA) (green)" -msgstr "Монохромный (5151/MDA) (зеленый)" +msgstr "Монохромный (5151/MDA) (зелёный)" msgid "Monochrome (5151/MDA) (amber)" msgstr "Монохромный (5151/MDA) (янтарный)" @@ -1930,7 +1930,7 @@ msgid "Enhanced Color - Enhanced Mode (5154/ECD)" msgstr "Улучшенный цветной - улучшенный режим (5154/ECD)" msgid "Green" -msgstr "Зеленый" +msgstr "Зелёный" msgid "Amber" msgstr "Янтарный" @@ -1954,13 +1954,13 @@ msgid "Bochs latest" msgstr "Bochs последний" msgid "Mono Non-Interlaced" -msgstr "Монохромный без чересстрочной развертки" +msgstr "Монохромный без чересстрочной развёртки" msgid "Color Interlaced" -msgstr "Цветной с чересстрочной разверткой" +msgstr "Цветной с чересстрочной развёрткой" msgid "Color Non-Interlaced" -msgstr "Цветной без чересстрочной развертки" +msgstr "Цветной без чересстрочной развёртки" msgid "3Dfx Voodoo Graphics" msgstr "Ускоритель 3Dfx Voodoo" @@ -2011,10 +2011,10 @@ msgid "Protection Dongle for Savage Quest" msgstr "Защитный донгл для Savage Quest" msgid "Serial Passthrough Device" -msgstr "Устройство прохода через последовательный порт" +msgstr "Устройство проброса через последовательный порт" msgid "Passthrough Mode" -msgstr "Проходной режим" +msgstr "Режим проброса" msgid "Host Serial Device" msgstr "Последовательное устройство хоста" @@ -2101,16 +2101,16 @@ msgid "Inhibit multimedia keys" msgstr "Перехватывать мультимедиа-клавиши" msgid "Ask for confirmation before saving settings" -msgstr "Спрашивать подтверждения перед сохранением настроек" +msgstr "Запрашивать подтверждение перед сохранением настроек" msgid "Ask for confirmation before hard resetting" -msgstr "Спрашивать подтверждения перед холодной перезагрузкой" +msgstr "Запрашивать подтверждение перед холодной перезагрузкой" msgid "Ask for confirmation before quitting" -msgstr "Спрашивать подтвержждения перед выходом" +msgstr "Запрашивать подтверждение перед выходом" msgid "Display hotkey message when entering full-screen mode" -msgstr "Показывать сообщение о горячих клавишах при включении полноэкранного режима" +msgstr "Показывать сообщение о горячей клавише при входе в полноэкранный режим" msgid "Options" msgstr "Параметры" From ed4820b798482a5de53ac82971404a00fd8cf197 Mon Sep 17 00:00:00 2001 From: Alexander Babikov Date: Thu, 17 Apr 2025 11:08:04 +0500 Subject: [PATCH 025/180] languages: Add string for the 5-button 2-wheel mouse --- src/qt/languages/86box.pot | 3 +++ src/qt/languages/ca-ES.po | 3 +++ src/qt/languages/cs-CZ.po | 3 +++ src/qt/languages/de-DE.po | 3 +++ src/qt/languages/es-ES.po | 3 +++ src/qt/languages/fi-FI.po | 3 +++ src/qt/languages/fr-FR.po | 3 +++ src/qt/languages/hr-HR.po | 3 +++ src/qt/languages/hu-HU.po | 3 +++ src/qt/languages/it-IT.po | 3 +++ src/qt/languages/ja-JP.po | 3 +++ src/qt/languages/ko-KR.po | 3 +++ src/qt/languages/nl-NL.po | 3 +++ src/qt/languages/pl-PL.po | 5 ++++- src/qt/languages/pt-BR.po | 3 +++ src/qt/languages/pt-PT.po | 3 +++ src/qt/languages/ru-RU.po | 3 +++ src/qt/languages/sk-SK.po | 3 +++ src/qt/languages/sl-SI.po | 3 +++ src/qt/languages/tr-TR.po | 3 +++ src/qt/languages/uk-UA.po | 3 +++ src/qt/languages/vi-VN.po | 3 +++ src/qt/languages/zh-CN.po | 3 +++ src/qt/languages/zh-TW.po | 3 +++ 24 files changed, 73 insertions(+), 1 deletion(-) diff --git a/src/qt/languages/86box.pot b/src/qt/languages/86box.pot index 71dc7572a..6e6dd3fc3 100644 --- a/src/qt/languages/86box.pot +++ b/src/qt/languages/86box.pot @@ -1809,6 +1809,9 @@ msgstr "" msgid "Five + Wheel" msgstr "" +msgid "Five + 2 Wheels" +msgstr "" + msgid "A3 - SMT2 Serial / SMT3(R)V" msgstr "" diff --git a/src/qt/languages/ca-ES.po b/src/qt/languages/ca-ES.po index e3bb805a0..847cc0138 100644 --- a/src/qt/languages/ca-ES.po +++ b/src/qt/languages/ca-ES.po @@ -1809,6 +1809,9 @@ msgstr "Roda" msgid "Five + Wheel" msgstr "Cinc + roda" +msgid "Five + 2 Wheels" +msgstr "" + msgid "A3 - SMT2 Serial / SMT3(R)V" msgstr "A3 - SMT2 sèrie / SMT3(R)V" diff --git a/src/qt/languages/cs-CZ.po b/src/qt/languages/cs-CZ.po index 84c2cb94f..ea492f0b6 100644 --- a/src/qt/languages/cs-CZ.po +++ b/src/qt/languages/cs-CZ.po @@ -1809,6 +1809,9 @@ msgstr "Kolečko" msgid "Five + Wheel" msgstr "Pět + kolečko" +msgid "Five + 2 Wheels" +msgstr "" + msgid "A3 - SMT2 Serial / SMT3(R)V" msgstr "A3 - SMT2 sériová / SMT3(R)V" diff --git a/src/qt/languages/de-DE.po b/src/qt/languages/de-DE.po index 588a2b5cd..95d1b0249 100644 --- a/src/qt/languages/de-DE.po +++ b/src/qt/languages/de-DE.po @@ -1812,6 +1812,9 @@ msgstr "Rad" msgid "Five + Wheel" msgstr "Fünf + Rad" +msgid "Five + 2 Wheels" +msgstr "" + msgid "A3 - SMT2 Serial / SMT3(R)V" msgstr "A3 - SMT2 Seriell / SMT3(R)V" diff --git a/src/qt/languages/es-ES.po b/src/qt/languages/es-ES.po index ac22a4d5c..57474ae53 100644 --- a/src/qt/languages/es-ES.po +++ b/src/qt/languages/es-ES.po @@ -1808,6 +1808,9 @@ msgstr "Rueda" msgid "Five + Wheel" msgstr "Cinco + rueda" +msgid "Five + 2 Wheels" +msgstr "" + msgid "A3 - SMT2 Serial / SMT3(R)V" msgstr "A3 - SMT2 serie / SMT3(R)V" diff --git a/src/qt/languages/fi-FI.po b/src/qt/languages/fi-FI.po index 8b8ca8374..187a423f6 100644 --- a/src/qt/languages/fi-FI.po +++ b/src/qt/languages/fi-FI.po @@ -1812,6 +1812,9 @@ msgstr "Pyörä" msgid "Five + Wheel" msgstr "Viisi + pyörä" +msgid "Five + 2 Wheels" +msgstr "" + msgid "A3 - SMT2 Serial / SMT3(R)V" msgstr "A3 - SMT2 sarja / SMT3(R)V" diff --git a/src/qt/languages/fr-FR.po b/src/qt/languages/fr-FR.po index cc2d8c310..8456baf2f 100644 --- a/src/qt/languages/fr-FR.po +++ b/src/qt/languages/fr-FR.po @@ -1809,6 +1809,9 @@ msgstr "Molette" msgid "Five + Wheel" msgstr "Cinq + molette" +msgid "Five + 2 Wheels" +msgstr "" + msgid "A3 - SMT2 Serial / SMT3(R)V" msgstr "A3 - SMT2 série / SMT3(R)V" diff --git a/src/qt/languages/hr-HR.po b/src/qt/languages/hr-HR.po index d074401a2..0fd342f88 100644 --- a/src/qt/languages/hr-HR.po +++ b/src/qt/languages/hr-HR.po @@ -1809,6 +1809,9 @@ msgstr "Kotač" msgid "Five + Wheel" msgstr "Pet + kotač" +msgid "Five + 2 Wheels" +msgstr "" + msgid "A3 - SMT2 Serial / SMT3(R)V" msgstr "A3 - SMT2 serijski / SMT3(R)V" diff --git a/src/qt/languages/hu-HU.po b/src/qt/languages/hu-HU.po index 841ed5e81..cbb753890 100644 --- a/src/qt/languages/hu-HU.po +++ b/src/qt/languages/hu-HU.po @@ -1809,6 +1809,9 @@ msgstr "Kerék" msgid "Five + Wheel" msgstr "Öt + kerék" +msgid "Five + 2 Wheels" +msgstr "" + msgid "A3 - SMT2 Serial / SMT3(R)V" msgstr "A3 - SMT2 soros / SMT3(R)V" diff --git a/src/qt/languages/it-IT.po b/src/qt/languages/it-IT.po index 8de67d28b..c505b9eaa 100644 --- a/src/qt/languages/it-IT.po +++ b/src/qt/languages/it-IT.po @@ -1809,6 +1809,9 @@ msgstr "Ruota" msgid "Five + Wheel" msgstr "Cinque + ruota" +msgid "Five + 2 Wheels" +msgstr "" + msgid "A3 - SMT2 Serial / SMT3(R)V" msgstr "A3 - SMT2 seriale / SMT3(R)V" diff --git a/src/qt/languages/ja-JP.po b/src/qt/languages/ja-JP.po index 6add03617..cff667239 100644 --- a/src/qt/languages/ja-JP.po +++ b/src/qt/languages/ja-JP.po @@ -1809,6 +1809,9 @@ msgstr "ホイール" msgid "Five + Wheel" msgstr "五つ+ホイール" +msgid "Five + 2 Wheels" +msgstr "" + msgid "A3 - SMT2 Serial / SMT3(R)V" msgstr "A3 - SMT2 シリアル / SMT3(R)V" diff --git a/src/qt/languages/ko-KR.po b/src/qt/languages/ko-KR.po index f32a23ec4..55f47be27 100644 --- a/src/qt/languages/ko-KR.po +++ b/src/qt/languages/ko-KR.po @@ -1809,6 +1809,9 @@ msgstr "휠" msgid "Five + Wheel" msgstr "5개 + 휠" +msgid "Five + 2 Wheels" +msgstr "" + msgid "A3 - SMT2 Serial / SMT3(R)V" msgstr "A3 - SMT2 직렬/SMT3(R)V" diff --git a/src/qt/languages/nl-NL.po b/src/qt/languages/nl-NL.po index f1b4eed91..e854ea3f3 100644 --- a/src/qt/languages/nl-NL.po +++ b/src/qt/languages/nl-NL.po @@ -1809,6 +1809,9 @@ msgstr "Wiel" msgid "Five + Wheel" msgstr "Vijf + Wiel" +msgid "Five + 2 Wheels" +msgstr "" + msgid "A3 - SMT2 Serial / SMT3(R)V" msgstr "A3 - SMT2 Serieel / SMT3(R)V" diff --git a/src/qt/languages/pl-PL.po b/src/qt/languages/pl-PL.po index 1ad5dcf88..3fc731e5f 100644 --- a/src/qt/languages/pl-PL.po +++ b/src/qt/languages/pl-PL.po @@ -1807,7 +1807,10 @@ msgid "Wheel" msgstr "Koło" msgid "Five + Wheel" -msgstr "Five + Wheel" +msgstr "" + +msgid "Five + 2 Wheels" +msgstr "" msgid "A3 - SMT2 Serial / SMT3(R)V" msgstr "A3 - SMT2 szeregowa / SMT3(R)V" diff --git a/src/qt/languages/pt-BR.po b/src/qt/languages/pt-BR.po index 3eead12fe..02abe2321 100644 --- a/src/qt/languages/pt-BR.po +++ b/src/qt/languages/pt-BR.po @@ -1809,6 +1809,9 @@ msgstr "Roda" msgid "Five + Wheel" msgstr "Cinco + roda" +msgid "Five + 2 Wheels" +msgstr "" + msgid "A3 - SMT2 Serial / SMT3(R)V" msgstr "A3 - SMT2 Serial / SMT3(R)V" diff --git a/src/qt/languages/pt-PT.po b/src/qt/languages/pt-PT.po index 1ffcf0c3b..42550a266 100644 --- a/src/qt/languages/pt-PT.po +++ b/src/qt/languages/pt-PT.po @@ -1809,6 +1809,9 @@ msgstr "Roda" msgid "Five + Wheel" msgstr "Cinco + Roda" +msgid "Five + 2 Wheels" +msgstr "" + msgid "A3 - SMT2 Serial / SMT3(R)V" msgstr "A3 - SMT2 série / SMT3(R)V" diff --git a/src/qt/languages/ru-RU.po b/src/qt/languages/ru-RU.po index 42ad1716c..dde5387a7 100644 --- a/src/qt/languages/ru-RU.po +++ b/src/qt/languages/ru-RU.po @@ -1809,6 +1809,9 @@ msgstr "Колесо" msgid "Five + Wheel" msgstr "Пять + колесо" +msgid "Five + 2 Wheels" +msgstr "Пять + 2 колеса" + msgid "A3 - SMT2 Serial / SMT3(R)V" msgstr "A3 - SMT2 последовательная / SMT3(R)V" diff --git a/src/qt/languages/sk-SK.po b/src/qt/languages/sk-SK.po index 9ce9abc2f..6039adedc 100644 --- a/src/qt/languages/sk-SK.po +++ b/src/qt/languages/sk-SK.po @@ -1810,6 +1810,9 @@ msgstr "Koleso" msgid "Five + Wheel" msgstr "Päť + koleso" +msgid "Five + 2 Wheels" +msgstr "" + msgid "A3 - SMT2 Serial / SMT3(R)V" msgstr "A3 - SMT2 sériová / SMT3(R)V" diff --git a/src/qt/languages/sl-SI.po b/src/qt/languages/sl-SI.po index af5fd1fc1..b6641f8a1 100644 --- a/src/qt/languages/sl-SI.po +++ b/src/qt/languages/sl-SI.po @@ -1809,6 +1809,9 @@ msgstr "Kolesa" msgid "Five + Wheel" msgstr "Pet + kolo" +msgid "Five + 2 Wheels" +msgstr "" + msgid "A3 - SMT2 Serial / SMT3(R)V" msgstr "A3 - SMT2 serijska / SMT3(R)V" diff --git a/src/qt/languages/tr-TR.po b/src/qt/languages/tr-TR.po index d3c1871e9..e9a42a896 100644 --- a/src/qt/languages/tr-TR.po +++ b/src/qt/languages/tr-TR.po @@ -1809,6 +1809,9 @@ msgstr "Tekerlek" msgid "Five + Wheel" msgstr "Beş + tekerlek" +msgid "Five + 2 Wheels" +msgstr "" + msgid "A3 - SMT2 Serial / SMT3(R)V" msgstr "A3 - SMT2 seri / SMT3(R)V" diff --git a/src/qt/languages/uk-UA.po b/src/qt/languages/uk-UA.po index d4b4c7847..bceb7bea5 100644 --- a/src/qt/languages/uk-UA.po +++ b/src/qt/languages/uk-UA.po @@ -1809,6 +1809,9 @@ msgstr "Колесо" msgid "Five + Wheel" msgstr "П'ять + колесо" +msgid "Five + 2 Wheels" +msgstr "" + msgid "A3 - SMT2 Serial / SMT3(R)V" msgstr "A3 - SMT2 послідовна / SMT3(R)V" diff --git a/src/qt/languages/vi-VN.po b/src/qt/languages/vi-VN.po index 9dcbf01ca..e14386bf8 100644 --- a/src/qt/languages/vi-VN.po +++ b/src/qt/languages/vi-VN.po @@ -1809,6 +1809,9 @@ msgstr "Con lăn" msgid "Five + Wheel" msgstr "Năm + con lăn" +msgid "Five + 2 Wheels" +msgstr "" + msgid "A3 - SMT2 Serial / SMT3(R)V" msgstr "A3 - SMT2 Serial / SMT3(R)V" diff --git a/src/qt/languages/zh-CN.po b/src/qt/languages/zh-CN.po index 041b7bb6b..9f6cc0328 100644 --- a/src/qt/languages/zh-CN.po +++ b/src/qt/languages/zh-CN.po @@ -1809,6 +1809,9 @@ msgstr "滚轮" msgid "Five + Wheel" msgstr "五键+滚轮" +msgid "Five + 2 Wheels" +msgstr "" + msgid "A3 - SMT2 Serial / SMT3(R)V" msgstr "A3 - SMT2 串行 / SMT3(R)V" diff --git a/src/qt/languages/zh-TW.po b/src/qt/languages/zh-TW.po index c3e3fb4d5..aefa89d5f 100644 --- a/src/qt/languages/zh-TW.po +++ b/src/qt/languages/zh-TW.po @@ -1809,6 +1809,9 @@ msgstr "滾輪" msgid "Five + Wheel" msgstr "五鍵 + 滾輪" +msgid "Five + 2 Wheels" +msgstr "" + msgid "A3 - SMT2 Serial / SMT3(R)V" msgstr "A3 - SMT2 序列 / SMT3(R)V" From 48903bb48ecd8ea842e6395efec18158571717be Mon Sep 17 00:00:00 2001 From: Alexander Babikov Date: Fri, 18 Apr 2025 03:32:16 +0500 Subject: [PATCH 026/180] qt: Add Swedish translation Contributed by toshineon on Discord --- src/qt/languages/sv-SE.po | 2164 +++++++++++++++++++++++++++++++++ src/qt/qt_progsettings.cpp | 1 + src/qt/qt_translations.qrc.in | 1 + 3 files changed, 2166 insertions(+) create mode 100644 src/qt/languages/sv-SE.po diff --git a/src/qt/languages/sv-SE.po b/src/qt/languages/sv-SE.po new file mode 100644 index 000000000..a47997225 --- /dev/null +++ b/src/qt/languages/sv-SE.po @@ -0,0 +1,2164 @@ +msgid "" +msgstr "" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Language: sv_SE\n" +"X-Source-Language: en_US\n" + +msgid "&Action" +msgstr "" + +msgid "&Keyboard requires capture" +msgstr "Tangentbord behöver uppfångas" + +msgid "&Right CTRL is left ALT" +msgstr "&Höger CTRL är vänster ALT" + +msgid "&Hard Reset..." +msgstr "&Hård omstart..." + +msgid "&Ctrl+Alt+Del" +msgstr "&Ctrl+Alt+Del" + +msgid "Ctrl+Alt+&Esc" +msgstr "Ctrl+Alt+&Esc" + +msgid "&Pause" +msgstr "&Pausa" + +msgid "E&xit..." +msgstr "A&vsluta..." + +msgid "&View" +msgstr "&Visa" + +msgid "&Hide status bar" +msgstr "&Dölj statusfältet" + +msgid "Hide &toolbar" +msgstr "Dölj &verktygsfältet" + +msgid "&Resizeable window" +msgstr "&Ändringsbar fönsterstorlek" + +msgid "R&emember size && position" +msgstr "K&om ihåg storlek && position" + +msgid "Re&nderer" +msgstr "Re&nderare" + +msgid "&Qt (Software)" +msgstr "&Qt (Mjukvara)" + +msgid "Qt (&OpenGL)" +msgstr "Qt (&OpenGL)" + +msgid "Open&GL (3.0 Core)" +msgstr "Open&GL (3.0 Core)" + +msgid "&VNC" +msgstr "&VNC" + +msgid "Specify dimensions..." +msgstr "Ange mått..." + +msgid "F&orce 4:3 display ratio" +msgstr "T&vinga 4:3 bildförhållande" + +msgid "&Window scale factor" +msgstr "&Skalningsfaktor för fönster" + +msgid "&0.5x" +msgstr "&0.5x" + +msgid "&1x" +msgstr "&1x" + +msgid "1.&5x" +msgstr "1.&5x" + +msgid "&2x" +msgstr "&2x" + +msgid "&3x" +msgstr "&3x" + +msgid "&4x" +msgstr "&4x" + +msgid "&5x" +msgstr "&5x" + +msgid "&6x" +msgstr "&6x" + +msgid "&7x" +msgstr "&7x" + +msgid "&8x" +msgstr "&8x" + +msgid "Filter method" +msgstr "Filtermetod" + +msgid "&Nearest" +msgstr "&Närmsta" + +msgid "&Linear" +msgstr "&Linjär" + +msgid "Hi&DPI scaling" +msgstr "Hög&DPI-skalning" + +msgid "&Fullscreen" +msgstr "&Helskärm" + +msgid "Fullscreen &stretch mode" +msgstr "Sträckningsläge för &helskärm" + +msgid "&Full screen stretch" +msgstr "&Sträck till helskärm" + +msgid "&4:3" +msgstr "&4:3" + +msgid "&Square pixels (Keep ratio)" +msgstr "&Fyrkantiga pixlar (Behåll bildförhållande)" + +msgid "&Integer scale" +msgstr "&Skala till heltal" + +msgid "4:&3 Integer scale" +msgstr "Skala till heltal i 4:&3" + +msgid "E&GA/(S)VGA settings" +msgstr "E&GA/(S)VGA-inställningar" + +msgid "&Inverted VGA monitor" +msgstr "&Inverterad VGA-skärm" + +msgid "VGA screen &type" +msgstr "Skärmtyp för &VGA" + +msgid "RGB &Color" +msgstr "RGB &färg" + +msgid "&RGB Grayscale" +msgstr "&RGB gråskala" + +msgid "&Amber monitor" +msgstr "&Bärnstensfärgad skärm" + +msgid "&Green monitor" +msgstr "&Grön skärm" + +msgid "&White monitor" +msgstr "&Vit skärm" + +msgid "Grayscale &conversion type" +msgstr "Konverteringstyp till &gråskala" + +msgid "BT&601 (NTSC/PAL)" +msgstr "BT&601 (NTSC/PAL)" + +msgid "BT&709 (HDTV)" +msgstr "BT&709 (HDTV)" + +msgid "&Average" +msgstr "&Genomsnittlig" + +msgid "CGA/PCjr/Tandy/E&GA/(S)VGA overscan" +msgstr "CGA/PCjr/Tandy/E&GA/(S)VGA överskanning" + +msgid "Change contrast for &monochrome display" +msgstr "Ändra kontrast för &svartvita skärmar" + +msgid "&Media" +msgstr "&Media" + +msgid "&Tools" +msgstr "&Verktyg" + +msgid "&Settings..." +msgstr "&Inställningar..." + +msgid "&Update status bar icons" +msgstr "&Uppdatera statusfältets ikoner" + +msgid "Take s&creenshot" +msgstr "Tag s&kärmbild" + +msgid "S&ound" +msgstr "L&jud" + +msgid "&Preferences..." +msgstr "&Preferenser..." + +msgid "Enable &Discord integration" +msgstr "Aktivera &integration med Discord" + +msgid "Sound &gain..." +msgstr "Ljud&förstärkning..." + +msgid "Begin trace" +msgstr "Börja spårning" + +msgid "End trace" +msgstr "Avsluta spårning" + +msgid "&Help" +msgstr "&Hjälp" + +msgid "&Documentation..." +msgstr "&Dokumentation..." + +msgid "&About 86Box..." +msgstr "&Om 86Box..." + +msgid "&New image..." +msgstr "&Ny avbildning..." + +msgid "&Existing image..." +msgstr "&Befintlig avbildning..." + +msgid "Existing image (&Write-protected)..." +msgstr "Befintlig avbildning (&skrivskyddad)..." + +msgid "&Record" +msgstr "&Spela in" + +msgid "&Play" +msgstr "&Spela upp" + +msgid "&Rewind to the beginning" +msgstr "&Spola tillbaka till början" + +msgid "&Fast forward to the end" +msgstr "&Spola fram till slutet" + +msgid "E&ject" +msgstr "M&ata ut" + +msgid "&Image..." +msgstr "&Avbildning..." + +msgid "E&xport to 86F..." +msgstr "E&xportera till 86F..." + +msgid "&Mute" +msgstr "&Tysta" + +msgid "E&mpty" +msgstr "T&om" + +msgid "Reload previous image" +msgstr "Ladda om föregående avbildning" + +msgid "&Folder..." +msgstr "&Mapp..." + +msgid "Target &framerate" +msgstr "Mål för &bildhastighet" + +msgid "&Sync with video" +msgstr "&Synkronisera med bild" + +msgid "&25 fps" +msgstr "&25 fps" + +msgid "&30 fps" +msgstr "&30 fps" + +msgid "&50 fps" +msgstr "&50 fps" + +msgid "&60 fps" +msgstr "&60 fps" + +msgid "&75 fps" +msgstr "&75 fps" + +msgid "&VSync" +msgstr "&VSync" + +msgid "&Select shader..." +msgstr "&Välj shader..." + +msgid "&Remove shader" +msgstr "&Ta bort shader" + +msgid "Preferences" +msgstr "Preferenser" + +msgid "Sound Gain" +msgstr "Ljudförstärkning" + +msgid "New Image" +msgstr "Ny avbildning" + +msgid "Settings" +msgstr "Inställningar" + +msgid "Specify Main Window Dimensions" +msgstr "Ange mått för huvudfönster" + +msgid "OK" +msgstr "Okej" + +msgid "Cancel" +msgstr "Avbryt" + +msgid "&Default" +msgstr "&Standard" + +msgid "Language:" +msgstr "Språk:" + +msgid "Gain" +msgstr "Förstärkning" + +msgid "File name:" +msgstr "Filnamn:" + +msgid "Disk size:" +msgstr "Storlek på disk:" + +msgid "RPM mode:" +msgstr "Varvtalsläge:" + +msgid "Progress:" +msgstr "Framsteg:" + +msgid "Width:" +msgstr "Bredd:" + +msgid "Height:" +msgstr "Höjd:" + +msgid "Lock to this size" +msgstr "Lås till denna storlek" + +msgid "Machine type:" +msgstr "Maskintyp:" + +msgid "Machine:" +msgstr "Maskin:" + +msgid "Configure" +msgstr "Konfigurera" + +msgid "CPU type:" +msgstr "Processortyp:" + +msgid "Speed:" +msgstr "Hastighet:" + +msgid "Frequency:" +msgstr "Frekvens:" + +msgid "FPU:" +msgstr "Flyttalsprocessor:" + +msgid "Wait states:" +msgstr "Väntcykler:" + +msgid "MB" +msgstr "MB" + +msgid "Memory:" +msgstr "Minne:" + +msgid "Time synchronization" +msgstr "Synkronisera tid" + +msgid "Disabled" +msgstr "Inaktiverad" + +msgid "Enabled (local time)" +msgstr "Aktiverad (lokal tid)" + +msgid "Enabled (UTC)" +msgstr "Aktiverad (UTC)" + +msgid "Dynamic Recompiler" +msgstr "Dynamisk omkompilering" + +msgid "Video:" +msgstr "Bildskärmskort:" + +msgid "Video #2:" +msgstr "Bildskärmskort #2:" + +msgid "Voodoo 1 or 2 Graphics" +msgstr "Voodoo 1 eller 2-grafik" + +msgid "IBM 8514/A Graphics" +msgstr "IBM 8514/A-grafik" + +msgid "XGA Graphics" +msgstr "XGA-grafik" + +msgid "Mouse:" +msgstr "Mus:" + +msgid "Joystick:" +msgstr "Styrspak:" + +msgid "Joystick 1..." +msgstr "Styrspak 1..." + +msgid "Joystick 2..." +msgstr "Styrspak 2..." + +msgid "Joystick 3..." +msgstr "Styrspak 3..." + +msgid "Joystick 4..." +msgstr "Styrspak 4..." + +msgid "Sound card #1:" +msgstr "Ljudkort #1:" + +msgid "Sound card #2:" +msgstr "Ljudkort #2:" + +msgid "Sound card #3:" +msgstr "Ljudkort #3:" + +msgid "Sound card #4:" +msgstr "Ljudkort #4:" + +msgid "MIDI Out Device:" +msgstr "Enhet för MIDI-utdata:" + +msgid "MIDI In Device:" +msgstr "Enhet för MIDI-indata:" + +msgid "Standalone MPU-401" +msgstr "Fristående MPU-401" + +msgid "Use FLOAT32 sound" +msgstr "Använd FLOAT32-ljud" + +msgid "FM synth driver" +msgstr "Drivrutin för FM-synt" + +msgid "Nuked (more accurate)" +msgstr "Nuked (mer exakt)" + +msgid "YMFM (faster)" +msgstr "YMFM (snabbare)" + +msgid "COM1 Device:" +msgstr "COM1-enhet:" + +msgid "COM2 Device:" +msgstr "COM2-enhet:" + +msgid "COM3 Device:" +msgstr "COM3-enhet:" + +msgid "COM4 Device:" +msgstr "COM4-enhet:" + +msgid "LPT1 Device:" +msgstr "LPT1-enhet:" + +msgid "LPT2 Device:" +msgstr "LPT2-enhet:" + +msgid "LPT3 Device:" +msgstr "LPT3-enhet:" + +msgid "LPT4 Device:" +msgstr "LPT4-enhet:" + +msgid "Serial port 1" +msgstr "Serieport 1" + +msgid "Serial port 2" +msgstr "Serieport 2" + +msgid "Serial port 3" +msgstr "Serieport 3" + +msgid "Serial port 4" +msgstr "Serieport 4" + +msgid "Parallel port 1" +msgstr "Parallellport 1" + +msgid "Parallel port 2" +msgstr "Parallellport 2" + +msgid "Parallel port 3" +msgstr "Parallellport 3" + +msgid "Parallel port 4" +msgstr "Parallellport 4" + +msgid "HD Controller:" +msgstr "Styrenhet för hårddisk:" + +msgid "FD Controller:" +msgstr "Styrenhet för diskett:" + +msgid "Tertiary IDE Controller" +msgstr "Tertiär IDE-kontroller" + +msgid "Quaternary IDE Controller" +msgstr "Kvartär IDE-kontroller" + +msgid "SCSI" +msgstr "SCSI" + +msgid "Controller 1:" +msgstr "Styrenhet 1:" + +msgid "Controller 2:" +msgstr "Styrenhet 2:" + +msgid "Controller 3:" +msgstr "Styrenhet 3:" + +msgid "Controller 4:" +msgstr "Styrenhet 4:" + +msgid "Cassette" +msgstr "Kassettband" + +msgid "Hard disks:" +msgstr "Hårddiskar:" + +msgid "&New..." +msgstr "&Ny..." + +msgid "&Existing..." +msgstr "&Befintlig..." + +msgid "&Remove" +msgstr "&Ta bort" + +msgid "Bus:" +msgstr "Buss:" + +msgid "Channel:" +msgstr "Kanal:" + +msgid "ID:" +msgstr "ID:" + +msgid "&Specify..." +msgstr "&Specificera..." + +msgid "Sectors:" +msgstr "Sektorer:" + +msgid "Heads:" +msgstr "Läshuvuden:" + +msgid "Cylinders:" +msgstr "Cylindrar:" + +msgid "Size (MB):" +msgstr "Storlek (MB):" + +msgid "Type:" +msgstr "Typ:" + +msgid "Image Format:" +msgstr "Avbildningsformat:" + +msgid "Block Size:" +msgstr "Blockstorlek:" + +msgid "Floppy drives:" +msgstr "Diskettenhet:" + +msgid "Turbo timings" +msgstr "Turbo timings" + +msgid "Check BPB" +msgstr "Kontrollera BPB" + +msgid "CD-ROM drives:" +msgstr "CD-ROM-enheter:" + +msgid "MO drives:" +msgstr "MO-enheter:" + +msgid "ZIP drives:" +msgstr "Zip-enheter:" + +msgid "ZIP 250" +msgstr "ZIP 250" + +msgid "ISA RTC:" +msgstr "ISA realtidsklocka:" + +msgid "ISA Memory Expansion" +msgstr "ISA minnesexpansion" + +msgid "Card 1:" +msgstr "Kort 1:" + +msgid "Card 2:" +msgstr "Kort 2:" + +msgid "Card 3:" +msgstr "Kort 3:" + +msgid "Card 4:" +msgstr "Kort 4:" + +msgid "ISABugger device" +msgstr "ISABugger-enhet" + +msgid "POST card" +msgstr "POST-kort" + +msgid "86Box" +msgstr "86Box" + +msgid "Error" +msgstr "Fel" + +msgid "Fatal error" +msgstr "Allvarligt fel" + +msgid " - PAUSED" +msgstr " - PAUSAD" + +msgid "Press Ctrl+Alt+PgDn to return to windowed mode." +msgstr "Tryck på Ctrl+Alt+PgDn för att återvända till fönsterläge." + +msgid "Speed" +msgstr "Hastighet" + +msgid "ZIP %1 %2 (%3): %4" +msgstr "ZIP %1 %2 (%3): %4" + +msgid "ZIP images" +msgstr "Zip-avbildningar" + +msgid "86Box could not find any usable ROM images.\n\nPlease download a ROM set and extract it into the \"roms\" directory." +msgstr "86Box kunde inte hitta några användbara ROM-avbildningar.\n\nVänligen ladda ner en ROM-uppsättning och extrahera den till mappen \"roms\"." + +msgid "(empty)" +msgstr "(tom)" + +msgid "All files" +msgstr "Alla filer" + +msgid "Turbo" +msgstr "Turbo" + +msgid "On" +msgstr "På" + +msgid "Off" +msgstr "Av" + +msgid "All images" +msgstr "Alla avbildningar" + +msgid "Basic sector images" +msgstr "Grundläggande sektoravbildningar" + +msgid "Surface images" +msgstr "Ytavbildningar" + +msgid "Machine \"%hs\" is not available due to missing ROMs in the roms/machines directory. Switching to an available machine." +msgstr "Maskinen \"%hs\" är inte tillgänglig på grund av saknade ROM-avbildningar i mappen roms/machines. Byter till en tillgänglig maskin." + +msgid "Video card \"%hs\" is not available due to missing ROMs in the roms/video directory. Switching to an available video card." +msgstr "Bildskärmskortet \"%hs\" är inte tillgängligt på grund av saknade ROM-avbildningar i mappen roms/video. Byter till ett tillgängligt bildskärmskort." + +msgid "Video card #2 \"%hs\" is not available due to missing ROMs in the roms/video directory. Disabling the second video card." +msgstr "Bildskärmskort #2 \"%hs\" är inte tillgängligt på grund av saknade ROM-avbildningar i mappen roms/video. Avaktiverar det andra bildskärmskortet." + +msgid "Device \"%hs\" is not available due to missing ROMs. Ignoring the device." +msgstr "Enheten \"%hs\" är inte tillgänglig på grund av saknade ROM-avbildningar. Ignorerar enheten." + +msgid "Machine" +msgstr "Maskin" + +msgid "Display" +msgstr "Bildskärm" + +msgid "Input devices" +msgstr "Inmatningsenheter" + +msgid "Sound" +msgstr "Ljud" + +msgid "Network" +msgstr "Nätverk" + +msgid "Ports (COM & LPT)" +msgstr "Portar (COM & LPT)" + +msgid "Storage controllers" +msgstr "Styrenheter för lagring" + +msgid "Hard disks" +msgstr "Hårddiskar" + +msgid "Floppy & CD-ROM drives" +msgstr "Diskett- och CD-ROM-enheter" + +msgid "Other removable devices" +msgstr "Andra flyttbara enheter" + +msgid "Other peripherals" +msgstr "Andra tillbehör" + +msgid "Click to capture mouse" +msgstr "Klicka för att fånga upp musen" + +msgid "Press %1 to release mouse" +msgstr "Tryck på %1 för att släppa musen" + +msgid "Press %1 or middle button to release mouse" +msgstr "Tryck på %1 eller mellersta musknappen för att släppa musen" + +msgid "Bus" +msgstr "Buss" + +msgid "File" +msgstr "Fil" + +msgid "C" +msgstr "C" + +msgid "H" +msgstr "H" + +msgid "S" +msgstr "S" + +msgid "KB" +msgstr "KB" + +msgid "Default" +msgstr "Standard" + +msgid "%1 Wait state(s)" +msgstr "" + +msgid "Type" +msgstr "Typ" + +msgid "No PCap devices found" +msgstr "Inga PCap-enheter hittade" + +msgid "Invalid PCap device" +msgstr "Ogiltig PCap-enhet" + +msgid "2-axis, 2-button joystick(s)" +msgstr "Styrspak med 2 axlar och 2 knappar" + +msgid "2-axis, 4-button joystick" +msgstr "Styrspak med 2 axlar och 4 knappar" + +msgid "2-axis, 6-button joystick" +msgstr "Styrspak med 2 axlar och 6 knappar" + +msgid "2-axis, 8-button joystick" +msgstr "Styrspak med 2 axlar och 8 knappar" + +msgid "3-axis, 2-button joystick" +msgstr "Styrspak med 3 axlar och 2 knappar" + +msgid "3-axis, 4-button joystick" +msgstr "Styrspak med 3 axlar och 4 knappar" + +msgid "4-axis, 4-button joystick" +msgstr "Styrspak med 4 axlar och 4 knappar" + +msgid "CH Flightstick Pro" +msgstr "CH Flightstick Pro" + +msgid "Microsoft SideWinder Pad" +msgstr "Microsoft SideWinder Pad" + +msgid "Thrustmaster Flight Control System" +msgstr "Thrustmaster Flight Control System" + +msgid "None" +msgstr "Ingen" + +msgid "%1 MB (CHS: %2, %3, %4)" +msgstr "%1 MB (CHS: %2, %3, %4)" + +msgid "Floppy %1 (%2): %3" +msgstr "Diskett %1 (%2): %3" + +msgid "Advanced sector images" +msgstr "Avancerade sektoravbildningar" + +msgid "Flux images" +msgstr "Flux-avbildningar" + +msgid "Are you sure you want to hard reset the emulated machine?" +msgstr "Är du säker på att du vill göra en hård omstart av den emulerade maskinen?" + +msgid "Are you sure you want to exit 86Box?" +msgstr "Är du säker på att du vill avsluta 86Box?" + +msgid "Unable to initialize Ghostscript" +msgstr "Ej möjligt att initialisera Ghostscript" + +msgid "Unable to initialize GhostPCL" +msgstr "Ej möjligt att initialisera GhostPCL" + +msgid "MO %1 (%2): %3" +msgstr "MO %1 (%2): %3" + +msgid "MO images" +msgstr "MO-avbildningar" + +msgid "Welcome to 86Box!" +msgstr "Välkommen till 86Box!" + +msgid "Internal device" +msgstr "Intern enhet" + +msgid "Exit" +msgstr "Avsluta" + +msgid "No ROMs found" +msgstr "Inga ROM-avbildningar hittades" + +msgid "Do you want to save the settings?" +msgstr "Vill du spara inställningarna?" + +msgid "This will hard reset the emulated machine." +msgstr "Detta kommer att göra en hård omstart av den emulerade maskinen." + +msgid "Save" +msgstr "Spara" + +msgid "About 86Box" +msgstr "Om 86Box" + +msgid "86Box v" +msgstr "86Box v" + +msgid "An emulator of old computers\n\nAuthors: Miran Grča (OBattler), RichardG867, Jasmine Iwanek, TC1995, coldbrewed, Teemu Korhonen (Manaatti), Joakim L. Gilje, Adrien Moulin (elyosh), Daniel Balsom (gloriouscow), Cacodemon345, Fred N. van Kempen (waltje), Tiseno100, reenigne, and others.\n\nWith previous core contributions from Sarah Walker, leilei, JohnElliott, greatpsycho, and others.\n\nReleased under the GNU General Public License version 2 or later. See LICENSE for more information." +msgstr "En emulator av gamla datorer\n\nUpphovsmän: Miran Grča (OBattler), RichardG867, Jasmine Iwanek, TC1995, coldbrewed, Teemu Korhonen (Manaatti), Joakim L. Gilje, Adrien Moulin (elyosh), Daniel Balsom (gloriouscow), Cacodemon345, Fred N. van Kempen (waltje), Tiseno100, reenigne, med flera.\n\nMed tidigare grundbidrag från Sarah Walker, leilei, JohnElliott, greatpsycho, med flera.\n\nSläppt under GNU General Public License upplaga 2 eller senare. Se LICENSE för mer information." + +msgid "Hardware not available" +msgstr "Hårdvara ej tillgänglig" + +msgid "Make sure %1 is installed and that you are on a %1-compatible network connection." +msgstr "Säkerställ att %1 är installerad och att du använder en %1-kompatibel nätverksanslutning." + +msgid "Invalid configuration" +msgstr "Ogiltig konfiguration" + +msgid "%1 is required for automatic conversion of PostScript files to PDF.\n\nAny documents sent to the generic PostScript printer will be saved as PostScript (.ps) files." +msgstr "%1 krävs för automatisk omvandling av PostScript-filer till PDF.\n\nAlla dokument som skickats till den allmänna PostScript-skrivaren kommer att sparas som PostScript-filer (.ps)." + +msgid "%1 is required for automatic conversion of PCL files to PDF.\n\nAny documents sent to the generic PCL printer will be saved as Printer Command Language (.pcl) files." +msgstr "%1 krävs för automatisk omvandling av PCL-filer till PDF.\n\nAlla dokument som skickas till den allmänna PCL-skrivaren kommer att sparas som Printer Command Language-filer (.pcl)." + +msgid "Entering fullscreen mode" +msgstr "Startar helskärmsläge" + +msgid "Don't show this message again" +msgstr "Visa inte detta meddelande igen" + +msgid "Don't exit" +msgstr "Avsluta inte" + +msgid "Reset" +msgstr "Starta om" + +msgid "Don't reset" +msgstr "Starta inte om" + +msgid "CD-ROM images" +msgstr "CD-ROM-avbildningar" + +msgid "%1 Device Configuration" +msgstr "%1 Enhetskonfiguration" + +msgid "Monitor in sleep mode" +msgstr "Skärm i viloläge" + +msgid "GLSL shaders" +msgstr "GLSL shaders" + +msgid "You are loading an unsupported configuration" +msgstr "Du laddar en konfiguration som inte stöds" + +msgid "CPU type filtering based on selected machine is disabled for this emulated machine.\n\nThis makes it possible to choose a CPU that is otherwise incompatible with the selected machine. However, you may run into incompatibilities with the machine BIOS or other software.\n\nEnabling this setting is not officially supported and any bug reports filed may be closed as invalid." +msgstr "Filtrering av processortyp grundat på den valda maskinen är avaktiverat för denna emulerade maskin.\n\nDetta gör det möjligt att välja en processor som annars är oförenlig med den valda maskinen. Detta kan dock leda till oförenligheter med maskinens BIOS eller annan mjukvara\n\nAtt aktivera denna inställning stöds inte officiellt, och alla felrapporter som lämnas in kan komma att stängas som ogiltiga." + +msgid "Continue" +msgstr "Fortsätt" + +msgid "Cassette: %1" +msgstr "Kassettband: %1" + +msgid "Cassette images" +msgstr "Kassettbandsavbildningar" + +msgid "Cartridge %1: %2" +msgstr "Kassett %1: %2" + +msgid "Cartridge images" +msgstr "Kassettavbildningar" + +msgid "Resume execution" +msgstr "Fortsätt exekvering" + +msgid "Pause execution" +msgstr "Pausa exekvering" + +msgid "Press Ctrl+Alt+Del" +msgstr "Tryck på Ctrl+Alt+Del" + +msgid "Press Ctrl+Alt+Esc" +msgstr "Tryck på Ctrl+Alt+Esc" + +msgid "Hard reset" +msgstr "Hård omstart" + +msgid "ACPI shutdown" +msgstr "ACPI-avstängning" + +msgid "Hard disk (%1)" +msgstr "Hårddisk (%1)" + +msgid "MFM/RLL or ESDI CD-ROM drives never existed" +msgstr "MFM/RLL eller ESDI CD-ROM-enheter fanns aldrig" + +msgid "Custom..." +msgstr "Egen..." + +msgid "Custom (large)..." +msgstr "Egen (stor)..." + +msgid "Add New Hard Disk" +msgstr "Lägg till ny hårddisk" + +msgid "Add Existing Hard Disk" +msgstr "Lägg till befintlig hårddisk" + +msgid "HDI disk images cannot be larger than 4 GB." +msgstr "Avbildningar i HDI-format kan inte vara större än 4 GB." + +msgid "Disk images cannot be larger than 127 GB." +msgstr "Avbildningar kan inte vara större än 127 GB." + +msgid "Hard disk images" +msgstr "Hårddiskavbilningar" + +msgid "Unable to read file" +msgstr "Kan inte läsa fil" + +msgid "Unable to write file" +msgstr "Kan inte skriva till fil" + +msgid "HDI or HDX images with a sector size other than 512 are not supported." +msgstr "HDI- eller HDX-avbildningar med en sektorstorlek annat än 512 stöds inte." + +msgid "Disk image file already exists" +msgstr "Avbildningsfil finns redan" + +msgid "Please specify a valid file name." +msgstr "Vänligen ange ett giltigt filnamn." + +msgid "Disk image created" +msgstr "Avbildning skapad" + +msgid "Make sure the file exists and is readable." +msgstr "Säkerställ att filen finns och är läsbar." + +msgid "Make sure the file is being saved to a writable directory." +msgstr "Säkerställ att filen sparas till en skrivbar mapp." + +msgid "Disk image too large" +msgstr "Avbildning för stor" + +msgid "Remember to partition and format the newly-created drive." +msgstr "Kom ihåg att partitionera och formatera den skapade enheten." + +msgid "The selected file will be overwritten. Are you sure you want to use it?" +msgstr "Den valda filen kommer att skrivas över. Är du säker på att du vill använda den?" + +msgid "Unsupported disk image" +msgstr "Avbildning stöds inte" + +msgid "Overwrite" +msgstr "Skriv över" + +msgid "Don't overwrite" +msgstr "Skriv inte över" + +msgid "Raw image" +msgstr "Rå avbildning" + +msgid "HDI image" +msgstr "HDI-avbildning" + +msgid "HDX image" +msgstr "HDX-avbildning" + +msgid "Fixed-size VHD" +msgstr "VHD med fastställd storlek" + +msgid "Dynamic-size VHD" +msgstr "VHD med dynamisk storlek" + +msgid "Differencing VHD" +msgstr "Differencing-avbildning av VHD" + +msgid "(N/A)" +msgstr "(ej)" + +msgid "Raw image (.img)" +msgstr "Rå avbildning (.img)" + +msgid "HDI image (.hdi)" +msgstr "HDI-avbildning (.hdi)" + +msgid "HDX image (.hdx)" +msgstr "HDX-avbildning (.hdx)" + +msgid "Fixed-size VHD (.vhd)" +msgstr "VHD med fastställd storlek (.vhd)" + +msgid "Dynamic-size VHD (.vhd)" +msgstr "VHD med dynamisk storlek (.vhd)" + +msgid "Differencing VHD (.vhd)" +msgstr "Differencing-avbildning av VHD (.vhd)" + +msgid "Large blocks (2 MB)" +msgstr "Stora block (2 MB)" + +msgid "Small blocks (512 KB)" +msgstr "Små block (512 KB)" + +msgid "VHD files" +msgstr "VHD-filer" + +msgid "Select the parent VHD" +msgstr "Välj moders-VHDn" + +msgid "This could mean that the parent image was modified after the differencing image was created.\n\nIt can also happen if the image files were moved or copied, or by a bug in the program that created this disk.\n\nDo you want to fix the timestamps?" +msgstr "Detta kan betyda att modersavbildningen har ändrats efter att skillnadsavbildningen skapades.\n\nDet kan också hända om avbildningarna har flyttats eller kopierats, eller av en bugg i programmet som skapade denna disk.\n\nVill du laga tidsstämplarna?" + +msgid "Parent and child disk timestamps do not match" +msgstr "Tidsstämpeln på moders- och dotterdisken stämmer inte överens" + +msgid "Could not fix VHD timestamp." +msgstr "Kunde inte laga tidsstämpeln på VHDn." + +msgid "MFM/RLL" +msgstr "MFM/RLL" + +msgid "XTA" +msgstr "XTA" + +msgid "ESDI" +msgstr "ESDI" + +msgid "IDE" +msgstr "IDE" + +msgid "ATAPI" +msgstr "ATAPI" + +msgid "CD-ROM %1 (%2): %3" +msgstr "CD-ROM %1 (%2): %3" + +msgid "160 KB" +msgstr "160 KB" + +msgid "180 KB" +msgstr "180 KB" + +msgid "320 KB" +msgstr "320 KB" + +msgid "360 KB" +msgstr "360 KB" + +msgid "640 KB" +msgstr "640 KB" + +msgid "720 KB" +msgstr "720 KB" + +msgid "1.2 MB" +msgstr "1.2 MB" + +msgid "1.25 MB" +msgstr "1.25 MB" + +msgid "1.44 MB" +msgstr "1.44 MB" + +msgid "DMF (cluster 1024)" +msgstr "DMF (kluster 1024)" + +msgid "DMF (cluster 2048)" +msgstr "DMF (kluster 2048)" + +msgid "2.88 MB" +msgstr "2.88 MB" + +msgid "ZIP 100" +msgstr "ZIP 100" + +msgid "3.5\" 128 MB (ISO 10090)" +msgstr "3.5\" 128 MB (ISO 10090)" + +msgid "3.5\" 230 MB (ISO 13963)" +msgstr "3.5\" 230 MB (ISO 13963)" + +msgid "3.5\" 540 MB (ISO 15498)" +msgstr "3.5\" 540 MB (ISO 15498)" + +msgid "3.5\" 640 MB (ISO 15498)" +msgstr "3.5\" 640 MB (ISO 15498)" + +msgid "3.5\" 1.3 GB (GigaMO)" +msgstr "3.5\" 1.3 GB (GigaMO)" + +msgid "3.5\" 2.3 GB (GigaMO 2)" +msgstr "3.5\" 2.3 GB (GigaMO 2)" + +msgid "5.25\" 600 MB" +msgstr "5.25\" 600 MB" + +msgid "5.25\" 650 MB" +msgstr "5.25\" 650 MB" + +msgid "5.25\" 1 GB" +msgstr "5.25\" 1 GB" + +msgid "5.25\" 1.3 GB" +msgstr "5.25\" 1.3 GB" + +msgid "Perfect RPM" +msgstr "Perfekt varv/min" + +msgid "1% below perfect RPM" +msgstr "1% under perfekt varv/min" + +msgid "1.5% below perfect RPM" +msgstr "1.5% under perfekt varv/min" + +msgid "2% below perfect RPM" +msgstr "2& under perfekt varm/min" + +msgid "(System Default)" +msgstr "(Systemstandard)" + +msgid "Failed to initialize network driver" +msgstr "Kunde inte initialisera drivrutiner för nätverk" + +msgid "The network configuration will be switched to the null driver" +msgstr "Nätverkskonfigurationen kommer att bytas till den tomma drivrutinen" + +msgid "Mouse sensitivity:" +msgstr "Muskänslighet:" + +msgid "Select media images from program working directory" +msgstr "Välj medieavbildningar från programmets arbetsmapp" + +msgid "PIT mode:" +msgstr "PIT-läge:" + +msgid "Auto" +msgstr "Automatisk" + +msgid "Slow" +msgstr "Långsam" + +msgid "Fast" +msgstr "Snabb" + +msgid "&Auto-pause on focus loss" +msgstr "&Pausa automatiskt när fokus tappas" + +msgid "WinBox is no longer supported" +msgstr "WinBox stöds inte längre" + +msgid "Development of the WinBox manager stopped in 2022 due to a lack of maintainers. As we direct our efforts towards making 86Box even better, we have made the decision to no longer support WinBox as a manager.\n\nNo further updates will be provided through WinBox, and you may encounter incorrect behavior should you continue using it with newer versions of 86Box. Any bug reports related to WinBox behavior will be closed as invalid.\n\nGo to 86box.net for a list of other managers you can use." +msgstr "Utvecklingen av hanteraren WinBox stoppades under 2022 på grund av avsaknad av underhållare. När vi nu riktar våra ansträngningar till att göra 86Box ännu bättre så har vi fattat beslutet att inte längre stödja WinBox som en hanterare.\n\nInga framtida uppdateringar kommer att tillhandahållas genom WinBox, och du kan stöta på felaktiga beteenden om du skulle fortsätta att använda det med nyare versioner av 86Box. Alla felrapporter som har att göra med WinBox kommer att stängas som ogiltiga.\n\nGå till 86Box.net för en lista med andra hanterare som du kan använda." + +msgid "Generate" +msgstr "Generera" + +msgid "Joystick configuration" +msgstr "Konfiguration av styrspak" + +msgid "Device" +msgstr "Enhet" + +msgid "%1 (X axis)" +msgstr "%1 (X-axeln)" + +msgid "%1 (Y axis)" +msgstr "%1 (Y-axeln)" + +msgid "MCA devices" +msgstr "MCA-enheter" + +msgid "List of MCA devices:" +msgstr "Lista på MCA-enheter:" + +msgid "Tablet tool" +msgstr "Plattverktyg" + +msgid "Qt (OpenGL &ES)" +msgstr "Qt (OpenGL &ES)" + +msgid "About Qt" +msgstr "Om Qt" + +msgid "MCA devices..." +msgstr "MCA-enheter..." + +msgid "Show non-primary monitors" +msgstr "Visa icke-primära skärmar" + +msgid "Open screenshots folder..." +msgstr "Öppna skärmbildsmappen..." + +msgid "Apply fullscreen stretch mode when maximized" +msgstr "Tillämpa sträckläge för helskärm när den är maximerad" + +msgid "Cursor/Puck" +msgstr "Pekare/puck" + +msgid "Pen" +msgstr "Penna" + +msgid "Host CD/DVD Drive (%1:)" +msgstr "Värdenhet för CD/DVD (%1:)" + +msgid "&Connected" +msgstr "&Ansluten" + +msgid "Clear image history" +msgstr "Rensa historik för avbildningar" + +msgid "Create..." +msgstr "Skapa..." + +msgid "Host CD/DVD Drive (%1)" +msgstr "Värdenhet för CD/DVD (%1)" + +msgid "Unknown Bus" +msgstr "Okänd buss" + +msgid "Null Driver" +msgstr "Tom drivrutin" + +msgid "NIC %1 (%2) %3" +msgstr "NIC %1 (%2) %3" + +msgid "Render behavior" +msgstr "Renderingsbeteende" + +msgid "Use target framerate:" +msgstr "Använd målbildhatighet:" + +msgid " fps" +msgstr " Bildhastighet" + +msgid "VSync" +msgstr "VSync" + +msgid "Synchronize with video" +msgstr "Synkronisera med bild" + +msgid "Shaders" +msgstr "" + +msgid "Remove" +msgstr "Ta bort" + +msgid "Browse..." +msgstr "Bläddra..." + +msgid "Couldn't create OpenGL context." +msgstr "Kunde inte skapa OpenGL-sammanhang." + +msgid "Couldn't switch to OpenGL context." +msgstr "Kunde inte växla till OpenGL-sammanhang." + +msgid "OpenGL version 3.0 or greater is required. Current version is %1.%2" +msgstr "OpenGL version 3.0 eller högre krävs. Nuvarande version är %1.%2" + +msgid "Error initializing OpenGL" +msgstr "Fel vid initialisering av OpenGL" + +msgid "\nFalling back to software rendering." +msgstr "\nFaller tillbaka på mjukvarurendering." + +msgid "<html><head/><body><p>When selecting media images (CD-ROM, floppy, etc.) the open dialog will start in the same directory as the 86Box configuration file. This setting will likely only make a difference on macOS.</p></body></html>" +msgstr "<html><head/><body><p>Vid val av medieavbildningar (CD-ROM, diskett, osv.) så kommer fönstret att börja i samma mapp som 86Box konfigurationsfil. Denna inställning kommer troligtvis endast göra en skillnad på macOS.</p></body></html>" + +msgid "This machine might have been moved or copied." +msgstr "Denna maskin kan ha flyttats eller kopierats." + +msgid "In order to ensure proper networking functionality, 86Box needs to know if this machine was moved or copied.\n\nSelect \"I Copied It\" if you are not sure." +msgstr "För att säkerställa korrekt funktionalitet av nätverk så behöver 86Box veta om denna maskin har flyttats eller kopierats.\n\nVälj \"Jag kopierade den\" om du är osäker." + +msgid "I Moved It" +msgstr "Jag flyttade den" + +msgid "I Copied It" +msgstr "Jag kopierade den" + +msgid "86Box Monitor #" +msgstr "86Box skärm #" + +msgid "No MCA devices." +msgstr "Inga MCA-enheter." + +msgid "MiB" +msgstr "MiB" + +msgid "Network Card #1" +msgstr "Nätverkskort #1" + +msgid "Network Card #2" +msgstr "Nätverkskort #2" + +msgid "Network Card #3" +msgstr "Nätverkskort #3" + +msgid "Network Card #4" +msgstr "Nätverkskort #4" + +msgid "Mode:" +msgstr "Läge:" + +msgid "Interface:" +msgstr "Gränssnitt:" + +msgid "Adapter:" +msgstr "Adapter:" + +msgid "VDE Socket:" +msgstr "VDE-sockel:" + +msgid "86Box Unit Tester" +msgstr "86Box enhetsprövare" + +msgid "Novell NetWare 2.x Key Card" +msgstr "Novell NetWare 2.x nyckelkort" + +msgid "Serial port passthrough 1" +msgstr "Serieport passthrough 1" + +msgid "Serial port passthrough 2" +msgstr "Serieport passthrough 2" + +msgid "Serial port passthrough 3" +msgstr "Serieport passthrough 3" + +msgid "Serial port passthrough 4" +msgstr "Serieport passthrough 4" + +msgid "Renderer options..." +msgstr "Renderingsalternativ..." + +msgid "Logitech/Microsoft Bus Mouse" +msgstr "Logitech/Microsoft-buss-mus" + +msgid "Microsoft Bus Mouse (InPort)" +msgstr "Microsoft-buss-mus (InPort)" + +msgid "Mouse Systems Serial Mouse" +msgstr "Mouse Systems seriemus" + +msgid "Microsoft Serial Mouse" +msgstr "Microsoft seriemus" + +msgid "Logitech Serial Mouse" +msgstr "Logitech seriemus" + +msgid "PS/2 Mouse" +msgstr "PS/2-mus" + +msgid "3M MicroTouch (Serial)" +msgstr "3M MicroTouch (serie)" + +msgid "[COM] Standard Hayes-compliant Modem" +msgstr "[COM] Standard Hayes-kompatibelt modem" + +msgid "Roland MT-32 Emulation" +msgstr "Roland MT-32 emulering" + +msgid "Roland MT-32 (New) Emulation" +msgstr "Roland MT-32 (ny) emulering" + +msgid "Roland CM-32L Emulation" +msgstr "Roland CM-32L emulering" + +msgid "Roland CM-32LN Emulation" +msgstr "Roland CM-32LN emulering" + +msgid "OPL4-ML Daughterboard" +msgstr "OPL4-ML dotterkort" + +msgid "System MIDI" +msgstr "System-MIDI" + +msgid "MIDI Input Device" +msgstr "Indataenhet för MIDI" + +msgid "BIOS Address" +msgstr "BIOS-adress" + +msgid "Enable BIOS extension ROM Writes" +msgstr "Aktivera ROM-skrivningar för utökat BIOS" + +msgid "Address" +msgstr "Adress" + +msgid "IRQ" +msgstr "IRQ" + +msgid "BIOS Revision" +msgstr "BIOS revision" + +msgid "Translate 26 -> 17" +msgstr "Översätt 26 -> 17" + +msgid "Language" +msgstr "Språk" + +msgid "Enable backlight" +msgstr "Aktivera bakgrundsbelysning" + +msgid "Invert colors" +msgstr "Invertera färger" + +msgid "BIOS size" +msgstr "Storlek på BIOS" + +msgid "Map C0000-C7FFF as UMB" +msgstr "Kartlägg C0000-C7FFF som UMB" + +msgid "Map C8000-CFFFF as UMB" +msgstr "Kartlägg C8000-CFFFF som UMB" + +msgid "Map D0000-D7FFF as UMB" +msgstr "Kartlägg D0000-D7FFF som UMB" + +msgid "Map D8000-DFFFF as UMB" +msgstr "Kartlägg D8000-DFFFF som UMB" + +msgid "Map E0000-E7FFF as UMB" +msgstr "Kartlägg E0000-E7FFF som UMB" + +msgid "Map E8000-EFFFF as UMB" +msgstr "Kartlägg E8000-EFFFF som UMB" + +msgid "JS9 Jumper (JIM)" +msgstr "JS9-bygel (JIM)" + +msgid "MIDI Output Device" +msgstr "Utdataenhet för MIDI" + +msgid "MIDI Real time" +msgstr "Realtid för MIDI" + +msgid "MIDI Thru" +msgstr "MIDI genom" + +msgid "MIDI Clockout" +msgstr "MIDI utklockning" + +msgid "SoundFont" +msgstr "Ljudsnitt" + +msgid "Output Gain" +msgstr "Förstärkning av utmatning" + +msgid "Chorus" +msgstr "Chorus" + +msgid "Chorus Voices" +msgstr "Chorus voices" + +msgid "Chorus Level" +msgstr "Chorus nivå" + +msgid "Chorus Speed" +msgstr "Chorus hastighet" + +msgid "Chorus Depth" +msgstr "Chorus djup" + +msgid "Chorus Waveform" +msgstr "Chorus vågform" + +msgid "Reverb" +msgstr "Reverb" + +msgid "Reverb Room Size" +msgstr "Reverb rumsstorlek" + +msgid "Reverb Damping" +msgstr "Reverb dämpning" + +msgid "Reverb Width" +msgstr "Reverb bredd" + +msgid "Reverb Level" +msgstr "Reverb nivå" + +msgid "Interpolation Method" +msgstr "Interpoleringsmetod" + +msgid "Reverb Output Gain" +msgstr "Reverb utmatningsförstärkning" + +msgid "Reversed stereo" +msgstr "Omvänd stereo" + +msgid "Nice ramp" +msgstr "Nice ramp" + +msgid "Hz" +msgstr "Hz" + +msgid "Buttons" +msgstr "Knappar" + +msgid "Serial Port" +msgstr "Serieport" + +msgid "RTS toggle" +msgstr "RTS-brytare" + +msgid "Revision" +msgstr "Revision" + +msgid "Controller" +msgstr "Styrenhet" + +msgid "Show Crosshair" +msgstr "Visa hårkors" + +msgid "DMA" +msgstr "DMA" + +msgid "MAC Address" +msgstr "MAC-adress" + +msgid "MAC Address OUI" +msgstr "MAC-adress OUI" + +msgid "Enable BIOS" +msgstr "Aktivera BIOS" + +msgid "Baud Rate" +msgstr "Baudhastighet" + +msgid "TCP/IP listening port" +msgstr "TCP/IP lyssningsport" + +msgid "Phonebook File" +msgstr "Telefonsboksfil" + +msgid "Telnet emulation" +msgstr "Telnet-emulering" + +msgid "RAM Address" +msgstr "RAM-adress" + +msgid "RAM size" +msgstr "RAM-storlek" + +msgid "Initial RAM size" +msgstr "Ursprunglig RAM-storlek" + +msgid "Serial Number" +msgstr "Serienummer" + +msgid "Host ID" +msgstr "Värd-ID" + +msgid "FDC Address" +msgstr "Adress till diskettstyrenhet" + +msgid "MPU-401 Address" +msgstr "Adress till MPU-401" + +msgid "MPU-401 IRQ" +msgstr "MPU-401 IRQ" + +msgid "Receive MIDI input" +msgstr "Ta emot MIDI-indata" + +msgid "Low DMA" +msgstr "Låg DMA" + +msgid "Enable Game port" +msgstr "Aktivera spelport" + +msgid "Surround module" +msgstr "Sorround-modul" + +msgid "CODEC" +msgstr "CODEC" + +msgid "Raise CODEC interrupt on CODEC setup (needed by some drivers)" +msgstr "Öka avbrottsnummer för CODEC vid CODEC-installation (krävs av vissa drivrutiner)" + +msgid "SB Address" +msgstr "Adress för SB" + +msgid "WSS IRQ" +msgstr "WSS IRQ" + +msgid "WSS DMA" +msgstr "WSS DMA" + +msgid "Enable OPL" +msgstr "Aktivera OPL" + +msgid "Receive MIDI input (MPU-401)" +msgstr "Ta emot MIDI-indata (MPU-401)" + +msgid "SB low DMA" +msgstr "Låg DMA för SB" + +msgid "6CH variant (6-channel)" +msgstr "6CH-variant (6-kanals)" + +msgid "Enable CMS" +msgstr "Aktivera CMS" + +msgid "Mixer" +msgstr "Mixer" + +msgid "High DMA" +msgstr "Hög DMA" + +msgid "Control PC speaker" +msgstr "Styr PC-speaker" + +msgid "Memory size" +msgstr "Minnesstorlek" + +msgid "EMU8000 Address" +msgstr "Adress till EMU8000" + +msgid "IDE Controller" +msgstr "IDE-styrenhet" + +msgid "Codec" +msgstr "Kodek" + +msgid "GUS type" +msgstr "GUS-typ" + +msgid "Enable 0x04 \"Exit 86Box\" command" +msgstr "Aktivera kommandot 0x04 \"Avsluta 86Box\"" + +msgid "Display type" +msgstr "Skärmtyp" + +msgid "Composite type" +msgstr "Komposittyp" + +msgid "RGB type" +msgstr "RGB-typ" + +msgid "Line doubling type" +msgstr "Linjefördubblingstyp" + +msgid "Snow emulation" +msgstr "Snöemulering" + +msgid "Monitor type" +msgstr "Bildskärmstyp" + +msgid "Character set" +msgstr "Teckenuppsättning" + +msgid "XGA type" +msgstr "XGA-typ" + +msgid "Instance" +msgstr "Instans" + +msgid "MMIO Address" +msgstr "Adress för MMIO" + +msgid "RAMDAC type" +msgstr "RAMDAC-typ" + +msgid "Blend" +msgstr "Blanda" + +msgid "Bilinear filtering" +msgstr "Bilinjär filtrering" + +msgid "Dithering" +msgstr "Dithering" + +msgid "Enable NMI for CGA emulation" +msgstr "Aktivera NMI till CGA-emulering" + +msgid "Voodoo type" +msgstr "Voodoo-typ" + +msgid "Framebuffer memory size" +msgstr "Minnesstorlek för videobuffert" + +msgid "Texture memory size" +msgstr "Minnesstorlek för texturer" + +msgid "Dither subtraction" +msgstr "Dither subtraktion" + +msgid "Screen Filter" +msgstr "Skärmfilter" + +msgid "Render threads" +msgstr "Renderingstrådar" + +msgid "SLI" +msgstr "SLI" + +msgid "Start Address" +msgstr "Startadress" + +msgid "Contiguous Size" +msgstr "Angränsande storlek" + +msgid "I/O Width" +msgstr "I/O-bredd" + +msgid "Transfer Speed" +msgstr "Överföringshastighet" + +msgid "EMS mode" +msgstr "EMS-läge" + +msgid "Address for > 2 MB" +msgstr "Adress till > 2 MB" + +msgid "Frame Address" +msgstr "Bildadress" + +msgid "USA" +msgstr "Förenta staterna" + +msgid "Danish" +msgstr "Danska" + +msgid "Always at selected speed" +msgstr "Alltid vid den valda hastigheten" + +msgid "BIOS setting + Hotkeys (off during POST)" +msgstr "BIOS-inställningar + Snabbtangenter (av under POST)" + +msgid "64 kB starting from F0000" +msgstr "64 kB som börjar från F0000" + +msgid "128 kB starting from E0000 (address MSB inverted, last 64KB first)" +msgstr "128 kB som börjar från E0000 (adress MSB inverterad, de sista 64KB först)" + +msgid "Sine" +msgstr "Sinus" + +msgid "Triangle" +msgstr "Triangel" + +msgid "Linear" +msgstr "Linjär" + +msgid "4th Order" +msgstr "Fjärde ordningen" + +msgid "7th Order" +msgstr "Sjunde ordningen" + +msgid "Non-timed (original)" +msgstr "Ej tajmad (ursprunglig)" + +msgid "45 Hz (JMP2 not populated)" +msgstr "45 Hz (JMP2 ej byglad)" + +msgid "Two" +msgstr "Två" + +msgid "Three" +msgstr "Tre" + +msgid "Wheel" +msgstr "Hjul" + +msgid "Five + Wheel" +msgstr "Fem med hjul" + +msgid "Five + 2 Wheels" +msgstr "" + +msgid "A3 - SMT2 Serial / SMT3(R)V" +msgstr "A3 - SMT2 serie / SMT3(R)V" + +msgid "Q1 - SMT3(R) Serial" +msgstr "Q1 - SMT3(R) serie" + +msgid "8 KB" +msgstr "8 KB" + +msgid "32 KB" +msgstr "32 KB" + +msgid "16 KB" +msgstr "16 KB" + +msgid "64 KB" +msgstr "64 KB" + +msgid "Disable BIOS" +msgstr "Avaktivera BIOS" + +msgid "512 KB" +msgstr "512 KB" + +msgid "2 MB" +msgstr "2 MB" + +msgid "8 MB" +msgstr "8 MB" + +msgid "28 MB" +msgstr "28 MB" + +msgid "1 MB" +msgstr "1 MB" + +msgid "4 MB" +msgstr "4 MB" + +msgid "12 MB" +msgstr "12 MB" + +msgid "16 MB" +msgstr "16 MB" + +msgid "20 MB" +msgstr "20 MB" + +msgid "24 MB" +msgstr "24 MB" + +msgid "SigmaTel STAC9721T (stereo)" +msgstr "SigmaTel STAC9721T (stereo)" + +msgid "Classic" +msgstr "Klassisk" + +msgid "256 KB" +msgstr "256 KB" + +msgid "Composite" +msgstr "Komposit" + +msgid "Old" +msgstr "Gammal" + +msgid "New" +msgstr "Ny" + +msgid "Color (generic)" +msgstr "Färg (allmän)" + +msgid "Green Monochrome" +msgstr "Grön monokrom" + +msgid "Amber Monochrome" +msgstr "Bärnstensfärgad monokrom" + +msgid "Gray Monochrome" +msgstr "Grå monokrom" + +msgid "Color (no brown)" +msgstr "Färg (utan brun)" + +msgid "Color (IBM 5153)" +msgstr "Färg (IBM 5153)" + +msgid "Simple doubling" +msgstr "Enkel fördubbling" + +msgid "sRGB interpolation" +msgstr "sRGB-interpolering" + +msgid "Linear interpolation" +msgstr "Linjär interpolering" + +msgid "128 KB" +msgstr "128 KB" + +msgid "Monochrome (5151/MDA) (white)" +msgstr "Monokrom (5151/MDA) (vit)" + +msgid "Monochrome (5151/MDA) (green)" +msgstr "Monokrom (5151/MDA) (grön)" + +msgid "Monochrome (5151/MDA) (amber)" +msgstr "Monokrom (5151/MDA) (bärnstensfärgad)" + +msgid "Color 40x25 (5153/CGA)" +msgstr "Färg 40x25 (5153/CGA)" + +msgid "Color 80x25 (5153/CGA)" +msgstr "Färg 80x25 (5153/CGA)" + +msgid "Enhanced Color - Normal Mode (5154/ECD)" +msgstr "Utökad färg - normalt läge (5154/ECD)" + +msgid "Enhanced Color - Enhanced Mode (5154/ECD)" +msgstr "Utökad färg - utökat läge (5154/ECD)" + +msgid "Green" +msgstr "Grön" + +msgid "Amber" +msgstr "Bärnstensfärgad" + +msgid "Gray" +msgstr "Grå" + +msgid "Color" +msgstr "Färg" + +msgid "U.S. English" +msgstr "Amerikansk engelska" + +msgid "Scandinavian" +msgstr "Skandinaviska" + +msgid "Other languages" +msgstr "Andra språk" + +msgid "Bochs latest" +msgstr "Bochs senaste" + +msgid "Mono Non-Interlaced" +msgstr "Ej sammanflätad monokrom" + +msgid "Color Interlaced" +msgstr "Sammanflätad färg" + +msgid "Color Non-Interlaced" +msgstr "Ej sammanflätad färg" + +msgid "3Dfx Voodoo Graphics" +msgstr "3Dfx Voodoo-grafik" + +msgid "Obsidian SB50 + Amethyst (2 TMUs)" +msgstr "Obsidian SB50 + Amethyst (2 TMUs)" + +msgid "8-bit" +msgstr "8-bitar" + +msgid "16-bit" +msgstr "16-bitar" + +msgid "Standard (150ns)" +msgstr "Standard (150ns)" + +msgid "High-Speed (120ns)" +msgstr "Höghastighet (120ns)" + +msgid "Enabled" +msgstr "Aktiverad" + +msgid "Standard" +msgstr "Standard" + +msgid "High-Speed" +msgstr "Höghastighet" + +msgid "Stereo LPT DAC" +msgstr "Stereo LPT DAC" + +msgid "Generic Text Printer" +msgstr "Allmän textskrivare" + +msgid "Generic ESC/P Dot-Matrix Printer" +msgstr "Allmän ESC/P punktmatrisskrivare" + +msgid "Generic PostScript Printer" +msgstr "Allmän PostScript-skrivare" + +msgid "Generic PCL5e Printer" +msgstr "Allmän PCL5e-skrivare" + +msgid "Parallel Line Internet Protocol" +msgstr "Parallel Line Internet Protocol" + +msgid "Protection Dongle for Savage Quest" +msgstr "Skyddsdongel till Savage Quest" + +msgid "Serial Passthrough Device" +msgstr "Seriepassthrough-enhet" + +msgid "Passthrough Mode" +msgstr "Passthrough-läge" + +msgid "Host Serial Device" +msgstr "Värd-serieenhet" + +msgid "Name of pipe" +msgstr "Namn på pipe" + +msgid "Data bits" +msgstr "Databitar" + +msgid "Stop bits" +msgstr "Stopbitar" + +msgid "Baud Rate of Passthrough" +msgstr "Passthroughns Baudhastighet" + +msgid "Named Pipe (Server)" +msgstr "Namngiven pipe (server)" + +msgid "Host Serial Passthrough" +msgstr "Värd-seriepassthrough" + +msgid "E&ject %1" +msgstr "M&ata ut %1" + +msgid "&Unmute" +msgstr "&Avtysta" + +msgid "Softfloat FPU" +msgstr "Softfloat flyttalsprocessor" + +msgid "High performance impact" +msgstr "Hög påverkan på prestanda" + +msgid "[Generic] RAM Disk (max. speed)" +msgstr "[Allmän] RAM-disk (max hastighet)" + +msgid "[Generic] 1989 (3500 RPM)" +msgstr "[Allmän] 1989 (3500 varv/min)" + +msgid "[Generic] 1992 (3600 RPM)" +msgstr "[Allmän] 1992 (3600 varv/min)" + +msgid "[Generic] 1994 (4500 RPM)" +msgstr "[Allmän] 1994 (4500 varv/min)" + +msgid "[Generic] 1996 (5400 RPM)" +msgstr "[Allmän] 1996 (5400 varv/min)" + +msgid "[Generic] 1997 (5400 RPM)" +msgstr "[Allmän] 1997 (5400 varv/min)" + +msgid "[Generic] 1998 (5400 RPM)" +msgstr "[Allmän] 1998 (5400 varv/min)" + +msgid "[Generic] 2000 (7200 RPM)" +msgstr "[Allmän] 2000 (7200 varv/min)" + +msgid "IBM 8514/A clone (ISA)" +msgstr "IBM 8514/A-klon (ISA)" + +msgid "Vendor" +msgstr "Leverantör" + +msgid "30 Hz (JMP2 = 1)" +msgstr "30 Hz (JMP2 = 1)" + +msgid "60 Hz (JMP2 = 2)" +msgstr "60 Hz (JMP2 = 2)" + +msgid "Generic PC/XT Memory Expansion" +msgstr "Allmän minnesexpansion för PC/XT" + +msgid "Generic PC/AT Memory Expansion" +msgstr "Allmän minnesexpansion PC/AT" + +msgid "Unable to find Dot-Matrix fonts" +msgstr "Kunde inte hitta typsnitt för punktmatris" + +msgid "TrueType fonts in the \"roms/printer/fonts\" directory are required for the emulation of the Generic ESC/P Dot-Matrix Printer." +msgstr "TrueType-typsnitt i mappen \"roms/printer/fonts\" krävs för emulering av den allmänna ESC/P punktmatrisskrivaren." + +msgid "Inhibit multimedia keys" +msgstr "Hindra multimediatangenter" + +msgid "Ask for confirmation before saving settings" +msgstr "Bekräfta innan inställningarna sparas" + +msgid "Ask for confirmation before hard resetting" +msgstr "Bekräfta innan hård omstart" + +msgid "Ask for confirmation before quitting" +msgstr "Bekräfta innan avslut" + +msgid "Display hotkey message when entering full-screen mode" +msgstr "Visa meddelande om snabbtangenter när helskärmsläget startas" + +msgid "Options" +msgstr "Alternativ" + +msgid "Model" +msgstr "Modell" + +msgid "Model:" +msgstr "Modell:" + +msgid "Failed to initialize Vulkan renderer." +msgstr "Kunde inte initialisera Vulkan-renderaren" + +msgid "GLSL Error" +msgstr "GLSL-fel" + +msgid "Could not load shader: %1" +msgstr "Kunde inte ladda shader: %1" + +msgid "OpenGL version 3.0 or greater is required. Current GLSL version is %1.%2" +msgstr "OpenGL version 3.0 eller högre krävs. Nuvarande GLSL-version är %1.%2" + +msgid "Could not load texture: %1" +msgstr "Kunde inte ladda textur: %1" + +msgid "Could not compile shader:\n\n%1" +msgstr "Kunde inte kompilera shader:\n\n%1" + +msgid "Program not linked:\n\n%1" +msgstr "Program inte länkat:\n\n%1" + +msgid "Shader Manager" +msgstr "Shader-hanterare" + +msgid "Shader Configuration" +msgstr "Shader-inställningar" + +msgid "Add" +msgstr "Lägg till" + +msgid "Move up" +msgstr "Flytta upp" + +msgid "Move down" +msgstr "Flytta ner" + +msgid "Could not load file %1" +msgstr "Kunde inte ladda fil %1" diff --git a/src/qt/qt_progsettings.cpp b/src/qt/qt_progsettings.cpp index 3903c9d9f..4894b99c0 100644 --- a/src/qt/qt_progsettings.cpp +++ b/src/qt/qt_progsettings.cpp @@ -68,6 +68,7 @@ QVector> ProgSettings::languages = { { "ru-RU", "Russian (Russia)" }, { "sk-SK", "Slovak (Slovakia)" }, { "sl-SI", "Slovenian (Slovenia)" }, + { "sv-SE", "Swedish (Sweden)" }, { "es-ES", "Spanish (Spain)" }, { "tr-TR", "Turkish (Turkey)" }, { "uk-UA", "Ukrainian (Ukraine)" }, diff --git a/src/qt/qt_translations.qrc.in b/src/qt/qt_translations.qrc.in index 655323563..c050747c0 100644 --- a/src/qt/qt_translations.qrc.in +++ b/src/qt/qt_translations.qrc.in @@ -20,6 +20,7 @@ 86box_ru-RU.qm 86box_sk-SK.qm 86box_sl-SI.qm + 86box_sv-SE.qm 86box_tr-TR.qm 86box_uk-UA.qm 86box_vi-VN.qm From 38389579c4b89fa9817c56f27490443f17dc1043 Mon Sep 17 00:00:00 2001 From: toggo9 <121191375+toggo9@users.noreply.github.com> Date: Fri, 18 Apr 2025 10:23:23 +0200 Subject: [PATCH 027/180] Add Acer P3 (SiS 496). --- src/machine/m_at_386dx_486.c | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/src/machine/m_at_386dx_486.c b/src/machine/m_at_386dx_486.c index 4e659dd77..ef30a5aa4 100644 --- a/src/machine/m_at_386dx_486.c +++ b/src/machine/m_at_386dx_486.c @@ -1182,6 +1182,39 @@ machine_at_ms4144_init(const machine_t *model) return ret; } +int +machine_at_acerp3_init(const machine_t *model) +{ + int ret; + + ret = bios_load_linear("roms/machines/acerp3/Acer Mate 600 P3 BIOS U13 V2.0R02-J3 ACR8DE00-S00-950911-R02-J3.bin", + 0x000e0000, 131072, 0); + + if (bios_only || !ret) + return ret; + + machine_at_common_init_ex(model, 2); + + machine_at_sis_85c496_common_init(model); + device_add(&sis_85c496_device); + pci_register_slot(0x09, PCI_CARD_VIDEO, 0, 0, 0, 0); + pci_register_slot(0x0A, PCI_CARD_IDE, 0, 0, 0, 0); + pci_register_slot(0x12, PCI_CARD_NORMAL, 3, 4, 1, 2); + pci_register_slot(0x13, PCI_CARD_NORMAL, 2, 3, 4, 1); + pci_register_slot(0x14, PCI_CARD_NORMAL, 1, 2, 3, 4); + + device_add(&fdc37c665_ide_device); + device_add(&keyboard_ps2_acer_pci_device); + device_add(&ide_cmd640_pci_legacy_only_device); + + if (gfxcard[0] == VID_INTERNAL) + device_add(&gd5434_onboard_pci_device); + + device_add(&intel_flash_bxt_device); + + return ret; +} + int machine_at_486sp3c_init(const machine_t *model) { From 658a00b4c7e3bfea85f095705275c73151220633 Mon Sep 17 00:00:00 2001 From: toggo9 <121191375+toggo9@users.noreply.github.com> Date: Fri, 18 Apr 2025 10:25:16 +0200 Subject: [PATCH 028/180] Add Acer P3 machine table entry. --- src/machine/machine_table.c | 39 +++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/src/machine/machine_table.c b/src/machine/machine_table.c index 42ac79417..39d9cc9ff 100644 --- a/src/machine/machine_table.c +++ b/src/machine/machine_table.c @@ -8357,6 +8357,45 @@ const machine_t machines[] = { .snd_device = NULL, .net_device = NULL }, + { + .name = "[SiS 496] Acer P3", + .internal_name = "acerp3", + .type = MACHINE_TYPE_486_S3_PCI, + .chipset = MACHINE_CHIPSET_SIS_496, + .init = machine_at_acerp3_init, + .p1_handler = NULL, + .gpio_handler = NULL, + .available_flag = MACHINE_AVAILABLE, + .gpio_acpi_handler = NULL, + .cpu = { + .package = CPU_PKG_SOCKET3, + .block = CPU_BLOCK(CPU_i486SX, CPU_i486DX, CPU_Am486SX, CPU_Am486DX), + .min_bus = 0, + .max_bus = 0, + .min_voltage = 0, + .max_voltage = 0, + .min_multi = 0, + .max_multi = 0 + }, + .bus_flags = MACHINE_PS2_PCI, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_VIDEO, + .ram = { + .min = 2048, + .max = 131072, + .step = 1024 + }, + .nvrmask = 255, + .kbc_device = NULL, + .kbc_p1 = 0xff, + .gpio = 0xffffffff, + .gpio_acpi = 0xffffffff, + .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, + .vid_device = NULL, + .snd_device = NULL, + .net_device = NULL + }, /* This has an AMIKey-2, which is an updated version of type 'H'. */ { .name = "[SiS 496] ASUS PVI-486SP3C", From 40eaeb6ed5897ce9314f5e23ea4be24c422763a4 Mon Sep 17 00:00:00 2001 From: toggo9 <121191375+toggo9@users.noreply.github.com> Date: Fri, 18 Apr 2025 10:26:16 +0200 Subject: [PATCH 029/180] Add Acer P3 machine definition. --- src/include/86box/machine.h | 1 + 1 file changed, 1 insertion(+) diff --git a/src/include/86box/machine.h b/src/include/86box/machine.h index 5a552d6eb..4469b55c2 100644 --- a/src/include/86box/machine.h +++ b/src/include/86box/machine.h @@ -571,6 +571,7 @@ extern int machine_at_r418_init(const machine_t *); extern int machine_at_ls486e_init(const machine_t *); extern int machine_at_4dps_init(const machine_t *); extern int machine_at_ms4144_init(const machine_t *); +extern int machine_at_acerp3_init(const machine_t *); extern int machine_at_4saw2_init(const machine_t *); extern int machine_at_m4li_init(const machine_t *); extern int machine_at_alfredo_init(const machine_t *); From af908dadc65ff09f4abf0bbe4ec603ba6cc78ba1 Mon Sep 17 00:00:00 2001 From: MaxwellS04 Date: Fri, 18 Apr 2025 22:32:37 +0700 Subject: [PATCH 030/180] Fixed internal_name for Phoenix PS/2 PCI KBC --- src/device/kbc_at.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/device/kbc_at.c b/src/device/kbc_at.c index f8fd33e62..447c07780 100644 --- a/src/device/kbc_at.c +++ b/src/device/kbc_at.c @@ -2807,7 +2807,7 @@ const device_t keyboard_ps2_acer_pci_device = { const device_t keyboard_ps2_phoenix_pci_device = { .name = "PS/2 Keyboard (Phoenix)", - .internal_name = "keyboard_ps2_acer_pci", + .internal_name = "keyboard_ps2_phoenix_pci", .flags = DEVICE_KBC | DEVICE_PCI, .local = KBC_TYPE_PS2_1 | KBC_VEN_PHOENIX, .init = kbc_at_init, From 13ac57da95999fa58b5cf2a899abd86e76446816 Mon Sep 17 00:00:00 2001 From: Alexander Babikov Date: Sat, 19 Apr 2025 13:48:22 +0500 Subject: [PATCH 031/180] workflows: Don't rebuild libsndfile on macOS --- .github/workflows/cmake_macos.yml | 18 ------------------ 1 file changed, 18 deletions(-) diff --git a/.github/workflows/cmake_macos.yml b/.github/workflows/cmake_macos.yml index 5a0454385..2ae417e13 100644 --- a/.github/workflows/cmake_macos.yml +++ b/.github/workflows/cmake_macos.yml @@ -56,22 +56,13 @@ jobs: - name: SDL GUI qt: off static: on - src-packages: >- - libsndfile - name: Qt GUI qt: on slug: -Qt packages: >- qt@5 - src-packages: >- - libsndfile steps: - - name: Install source dependencies - run: >- - brew reinstall -s - ${{ matrix.ui.src-packages }} - - name: Install dependencies run: >- brew install @@ -158,22 +149,13 @@ jobs: - name: SDL GUI qt: off static: on - src-packages: >- - libsndfile - name: Qt GUI qt: on slug: -Qt packages: >- qt@5 - src-packages: >- - libsndfile steps: - - name: Install source dependencies - run: >- - brew reinstall -s - ${{ matrix.ui.src-packages }} - - name: Install dependencies run: >- brew install From bfb3ff8460395219d752f2893cf550e8824258b9 Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Sat, 19 Apr 2025 18:53:20 -0300 Subject: [PATCH 032/180] 7sbb: Fix AGP bridge IRQ links --- src/machine/m_at_socket370.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/machine/m_at_socket370.c b/src/machine/m_at_socket370.c index b2e311166..3f8db4e8c 100644 --- a/src/machine/m_at_socket370.c +++ b/src/machine/m_at_socket370.c @@ -561,11 +561,11 @@ machine_at_7sbb_init(const machine_t *model) pci_register_slot(0x0F, PCI_CARD_NORMAL, 1, 2, 3, 4); pci_register_slot(0x10, PCI_CARD_NORMAL, 2, 3, 4, 1); pci_register_slot(0x11, PCI_CARD_NORMAL, 3, 4, 1, 2); - pci_register_slot(0x02, PCI_CARD_AGPBRIDGE, 0, 0, 0, 0); + pci_register_slot(0x02, PCI_CARD_AGPBRIDGE, 1, 2, 3, 4); device_add(&sis_5600_device); device_add(&keyboard_ps2_ami_pci_device); device_add(&it8661f_device); device_add(&sst_flash_29ee020_device); /* assumed */ return ret; -} \ No newline at end of file +} From 7f5d1b86c76c7afb401ec865617366670556a793 Mon Sep 17 00:00:00 2001 From: = Date: Sat, 19 Apr 2025 19:44:47 -0700 Subject: [PATCH 033/180] Added keybind customization system --- CMakeLists.txt | 2 +- src/86box.c | 24 ++++-- src/config.c | 84 +++++++++++++++++++ src/device/keyboard.c | 21 ----- src/include/86box/86box.h | 18 ++-- src/qt/CMakeLists.txt | 5 ++ src/qt/qt.c | 2 +- src/qt/qt_mainwindow.cpp | 70 ++++++++++++++-- src/qt/qt_mainwindow.hpp | 6 +- src/qt/qt_settingsinput.cpp | 159 +++++++++++++++++++++++++++++++++++- src/qt/qt_settingsinput.hpp | 11 +++ src/qt/qt_settingsinput.ui | 118 ++++++++++++++++---------- 12 files changed, 429 insertions(+), 91 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 007c1ffd8..a6ffa89e5 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -73,7 +73,7 @@ if(WIN32) # Default value for the `WIN32` target property, which specifies whether # to build the application for the Windows GUI or console subsystem - option(CMAKE_WIN32_EXECUTABLE "Build a Windows GUI executable" ON) + option(CMAKE_WIN32_EXECUTABLE "Build a Windows GUI executable" OFF) else() # Prefer dynamic builds everywhere else set(PREFER_STATIC OFF) diff --git a/src/86box.c b/src/86box.c index 168e8a8dc..d8c05c8bb 100644 --- a/src/86box.c +++ b/src/86box.c @@ -222,6 +222,9 @@ int other_ide_present = 0; /* IDE control int other_scsi_present = 0; /* SCSI controllers from non-SCSI cards are present */ +// Accelerator key array +struct accelKey acc_keys[NUM_ACCELS]; + /* Statistics. */ extern int mmuflush; extern int readlnum; @@ -654,7 +657,6 @@ usage: #ifdef USE_INSTRUMENT printf("-J or --instrument name - set 'name' to be the profiling instrument\n"); #endif - printf("-K or --keycodes codes - set 'codes' to be the uncapture combination\n"); printf("-L or --logfile path - set 'path' to be the logfile\n"); printf("-M or --missing - dump missing machines and video cards\n"); printf("-N or --noconfirm - do not ask for confirmation on quit\n"); @@ -745,13 +747,6 @@ usage: do_nothing = 1; } else if (!strcasecmp(argv[c], "--nohook") || !strcasecmp(argv[c], "-W")) { hook_enabled = 0; - } else if (!strcasecmp(argv[c], "--keycodes") || !strcasecmp(argv[c], "-K")) { - if ((c + 1) == argc) - goto usage; - - sscanf(argv[++c], "%03hX,%03hX,%03hX,%03hX,%03hX,%03hX", - &key_prefix_1_1, &key_prefix_1_2, &key_prefix_2_1, &key_prefix_2_2, - &key_uncapture_1, &key_uncapture_2); } else if (!strcasecmp(argv[c], "--clearboth") || !strcasecmp(argv[c], "-X")) { if ((c + 1) == argc) goto usage; @@ -1789,3 +1784,16 @@ do_pause(int p) } atomic_store(&pause_ack, 0); } + +// Helper to find an accelerator key and return it's index in acc_keys +int FindAccelerator(const char *name) { + for(int x=0;x= QT_VERSION_CHECK(6, 0, 0) - auto windowedShortcut = new QShortcut(QKeySequence(Qt::CTRL | Qt::ALT | Qt::Key_PageDown), this); + windowedShortcut = new QShortcut(QKeySequence(Qt::CTRL | Qt::ALT | Qt::Key_PageDown), this); #else - auto windowedShortcut = new QShortcut(QKeySequence(Qt::CTRL + Qt::ALT + Qt::Key_PageDown), this); + windowedShortcut = new QShortcut(QKeySequence(Qt::CTRL + Qt::ALT + Qt::Key_PageDown), this); #endif windowedShortcut->setContext(Qt::ShortcutContext::ApplicationShortcut); connect(windowedShortcut, &QShortcut::activated, this, [this] () { @@ -761,6 +762,8 @@ MainWindow::MainWindow(QWidget *parent) }); } #endif + + updateShortcuts(); } void @@ -826,6 +829,56 @@ MainWindow::closeEvent(QCloseEvent *event) event->accept(); } + +void MainWindow::updateShortcuts() +{ + // Update menu shortcuts from accelerator table + // Note that the "Release mouse" shortcut is hardcoded elsewhere + // This section only applies to shortcuts anchored to UI elements + + ui->actionTake_screenshot->setShortcut(QKeySequence()); + ui->actionCtrl_Alt_Del->setShortcut(QKeySequence()); + ui->actionCtrl_Alt_Esc->setShortcut(QKeySequence()); + ui->actionFullscreen->setShortcut(QKeySequence()); + ui->actionHard_Reset->setShortcut(QKeySequence()); + + int accID; + QKeySequence seq; + + accID = FindAccelerator("screenshot"); + seq = QKeySequence::fromString(acc_keys[accID].seq); + ui->actionTake_screenshot->setShortcut(seq); + + accID = FindAccelerator("send_ctrl_alt_del"); + seq = QKeySequence::fromString(acc_keys[accID].seq); + ui->actionCtrl_Alt_Del->setShortcut(seq); + + accID = FindAccelerator("send_ctrl_alt_esc"); + seq = QKeySequence::fromString(acc_keys[accID].seq); + ui->actionCtrl_Alt_Esc->setShortcut(seq); + + accID = FindAccelerator("fullscreen"); + seq = QKeySequence::fromString(acc_keys[accID].seq); + //printf("shortcut: %s\n", qPrintable(ui->actionFullscreen->shortcut().toString())); + ui->actionFullscreen->setShortcut(seq); + + accID = FindAccelerator("hard_reset"); + seq = QKeySequence::fromString(acc_keys[accID].seq); + ui->actionHard_Reset->setShortcut(seq); + + // To rebind leave_fullscreen we have to disconnect the existing signal, + // build a new shortcut, then connect it. + accID = FindAccelerator("leave_fullscreen"); + seq = QKeySequence::fromString(acc_keys[accID].seq); + disconnect(windowedShortcut,0,0,0); + windowedShortcut = new QShortcut(seq, this); + windowedShortcut->setContext(Qt::ShortcutContext::ApplicationShortcut); + connect(windowedShortcut, &QShortcut::activated, this, [this] () { + if (video_fullscreen) + ui->actionFullscreen->trigger(); + }); +} + void MainWindow::resizeEvent(QResizeEvent *event) { @@ -1026,6 +1079,8 @@ MainWindow::on_actionSettings_triggered() case QDialog::Accepted: settings.save(); config_changed = 2; + printf("about to try\n"); + updateShortcuts(); pc_reset_hard(); break; case QDialog::Rejected: @@ -1394,9 +1449,14 @@ MainWindow::keyPressEvent(QKeyEvent *event) #endif } - if (keyboard_ismsexit()) - plat_mouse_capture(0); - + // Check if mouse release combo has been entered + int accID = FindAccelerator("release_mouse"); + QKeySequence seq = QKeySequence::fromString(acc_keys[accID].seq); + if (seq[0] == (event->key() | event->modifiers())) + plat_mouse_capture(0); + + // TODO: Other accelerators should probably be here? + event->accept(); } diff --git a/src/qt/qt_mainwindow.hpp b/src/qt/qt_mainwindow.hpp index 739d179ff..99b0021c2 100644 --- a/src/qt/qt_mainwindow.hpp +++ b/src/qt/qt_mainwindow.hpp @@ -5,6 +5,7 @@ #include #include #include +#include #include #include @@ -32,7 +33,8 @@ public: QSize getRenderWidgetSize(); void setSendKeyboardInput(bool enabled); void reloadAllRenderers(); - + QShortcut *windowedShortcut; + std::array, 8> renderers; signals: void paint(const QImage &image); @@ -159,6 +161,7 @@ private: std::unique_ptr status; std::shared_ptr mm; + void updateShortcuts(); void processKeyboardInput(bool down, uint32_t keycode); #ifdef Q_OS_MACOS uint32_t last_modifiers = 0; @@ -184,7 +187,6 @@ private: friend class RendererStack; // For UI variable access by non-primary renderer windows. friend class WindowsRawInputFilter; // Needed to reload renderers on style sheet changes. - bool isShowMessage = false; }; diff --git a/src/qt/qt_settingsinput.cpp b/src/qt/qt_settingsinput.cpp index d7c61e8d2..924594083 100644 --- a/src/qt/qt_settingsinput.cpp +++ b/src/qt/qt_settingsinput.cpp @@ -16,8 +16,11 @@ */ #include "qt_settingsinput.hpp" #include "ui_qt_settingsinput.h" +#include "qt_mainwindow.hpp" #include +#include +#include extern "C" { #include <86box/86box.h> @@ -25,11 +28,18 @@ extern "C" { #include <86box/machine.h> #include <86box/mouse.h> #include <86box/gameport.h> +#include <86box/ui.h> } #include "qt_models_common.hpp" #include "qt_deviceconfig.hpp" #include "qt_joystickconfiguration.hpp" +#include "qt_keybind.hpp" + +extern MainWindow *main_window; + +// Temporary working copy of key list +accelKey acc_keys_t[NUM_ACCELS]; SettingsInput::SettingsInput(QWidget *parent) : QWidget(parent) @@ -37,9 +47,55 @@ SettingsInput::SettingsInput(QWidget *parent) { ui->setupUi(this); + QStandardItemModel *model; + QStringList horizontalHeader; + QStringList verticalHeader; + + horizontalHeader.append("Action"); + horizontalHeader.append("Keybind"); + + QTableWidget *keyTable = ui->tableKeys; + keyTable->setRowCount(10); + keyTable->setColumnCount(3); + keyTable->setColumnHidden(2, true); + keyTable->setColumnWidth(0, 200); + keyTable->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch); + QStringList headers; + headers << "Action" << "Bound key"; + keyTable->setHorizontalHeaderLabels(headers); + keyTable->verticalHeader()->setVisible(false); + keyTable->setEditTriggers(QAbstractItemView::NoEditTriggers); + keyTable->setSelectionBehavior(QAbstractItemView::SelectRows); + keyTable->setSelectionMode(QAbstractItemView::SingleSelection); + keyTable->setShowGrid(true); + keyTable->setStyleSheet("QTableWidget::item:hover { }"); + keyTable->setFocusPolicy(Qt::NoFocus); + keyTable->setSelectionMode(QAbstractItemView::NoSelection); + + // Make a working copy of acc_keys so we can check for dupes later without getting + // confused + printf("Instantiating list\n"); + for(int x=0;xtableKeys, &QTableWidget::cellDoubleClicked, + this, &SettingsInput::on_tableKeys_doubleClicked); + + connect(ui->pushButtonBind, &QPushButton::clicked, + this, &SettingsInput::on_pushButtonBind_Clicked); + + connect(ui->pushButtonClearBind, &QPushButton::clicked, + this, &SettingsInput::on_pushButtonClearBind_Clicked); + onCurrentMachineChanged(machine); } + SettingsInput::~SettingsInput() { delete ui; @@ -50,8 +106,15 @@ SettingsInput::save() { mouse_type = ui->comboBoxMouse->currentData().toInt(); joystick_type = ui->comboBoxJoystick->currentData().toInt(); + + // Copy accelerators from working set to global set + for(int x=0;xcomboBoxJoystick->setCurrentIndex(selectedRow); } +void +SettingsInput::refreshInputList() +{ + + for (int x=0;xtableKeys->setItem(x, 0, new QTableWidgetItem(acc_keys_t[x].desc)); + ui->tableKeys->setItem(x, 1, new QTableWidgetItem(acc_keys_t[x].seq)); + ui->tableKeys->setItem(x, 2, new QTableWidgetItem(acc_keys_t[x].name)); + } +} + +void +SettingsInput::on_tableKeys_currentCellChanged(int currentRow, int currentColumn, int previousRow, int previousColumn) +{ + // Enable/disable bind/clear buttons if user clicked valid row + QTableWidgetItem *cell = ui->tableKeys->item(currentRow,1); + if (!cell) + { + ui->pushButtonBind->setEnabled(false); + ui->pushButtonClearBind->setEnabled(false); + } + else + { + ui->pushButtonBind->setEnabled(true); + ui->pushButtonClearBind->setEnabled(true); + } +} + +void +SettingsInput::on_tableKeys_doubleClicked(int row, int col) +{ + // Edit bind + QTableWidgetItem *cell = ui->tableKeys->item(row,1); + if (!cell) return; + + QKeySequence keyseq = KeyBinder::BindKey(cell->text()); + if (keyseq != false) { + // If no change was made, don't change anything. + if (keyseq.toString(QKeySequence::NativeText) == cell->text()) return; + + // Otherwise, check for conflicts. + // Check against the *working* copy - NOT the one in use by the app, + // so we don't test against shortcuts the user already changed. + for(int x=0;xshowMessage(MBX_ANSI & MBX_INFO, "Bind conflict", "This key combo is already in use", false); + return; + } + } + // If we made it here, there were no conflicts. + // Go ahead and apply the bind. + + // Find the correct accelerator key entry + int accKeyID = FindAccelerator(qPrintable(ui->tableKeys->item(row,2)->text())); + if (!accKeyID) return; // this should never happen + + // Make the change + cell->setText(keyseq.toString(QKeySequence::NativeText)); + strcpy(acc_keys_t[accKeyID].seq, qPrintable(keyseq.toString(QKeySequence::NativeText))); + + refreshInputList(); + } +} + +void +SettingsInput::on_pushButtonBind_Clicked() +{ + // Edit bind + QTableWidgetItem *cell = ui->tableKeys->currentItem(); + if (!cell) return; + + on_tableKeys_doubleClicked(cell->row(), cell->column()); +} + +void +SettingsInput::on_pushButtonClearBind_Clicked() +{ + // Wipe bind + QTableWidgetItem *cell = ui->tableKeys->currentItem(); + if (!cell) return; + + cell->setText(""); + // Find the correct accelerator key entry + int accKeyID = FindAccelerator(qPrintable(ui->tableKeys->item(cell->row(),2)->text())); + if (!accKeyID) return; // this should never happen + + // Make the change + cell->setText(""); + strcpy(acc_keys_t[accKeyID].seq, ""); +} + void SettingsInput::on_comboBoxMouse_currentIndexChanged(int index) { diff --git a/src/qt/qt_settingsinput.hpp b/src/qt/qt_settingsinput.hpp index 0b8b665aa..ec7dc393b 100644 --- a/src/qt/qt_settingsinput.hpp +++ b/src/qt/qt_settingsinput.hpp @@ -2,6 +2,12 @@ #define QT_SETTINGSINPUT_HPP #include +#include +#include +#include +#include +#include +#include namespace Ui { class SettingsInput; @@ -27,10 +33,15 @@ private slots: void on_pushButtonJoystick2_clicked(); void on_pushButtonJoystick3_clicked(); void on_pushButtonJoystick4_clicked(); + void on_tableKeys_doubleClicked(int row, int col); + void on_tableKeys_currentCellChanged(int currentRow, int currentColumn, int previousRow, int previousColumn); + void on_pushButtonBind_Clicked(); + void on_pushButtonClearBind_Clicked(); private: Ui::SettingsInput *ui; int machineId = 0; + void refreshInputList(); }; #endif // QT_SETTINGSINPUT_HPP diff --git a/src/qt/qt_settingsinput.ui b/src/qt/qt_settingsinput.ui index 839461119..b7074eeaa 100644 --- a/src/qt/qt_settingsinput.ui +++ b/src/qt/qt_settingsinput.ui @@ -23,17 +23,16 @@ 0 - - - - Joystick 2... + + + + + 0 + 0 + - - - - - - Joystick: + + 30 @@ -44,13 +43,6 @@ - - - - Mouse: - - - @@ -58,21 +50,15 @@ - - - - Qt::Vertical + + + + false - - QSizePolicy::Expanding + + Bind - - - 20 - 40 - - - + @@ -81,6 +67,44 @@ + + + + 30 + + + + + + + Mouse: + + + + + + + false + + + Clear binding + + + + + + + Joystick: + + + + + + + Joystick 2... + + + @@ -94,23 +118,29 @@ - - - - 30 - - - - 0 - 0 - + + + + Key Bindings: - - - - 30 + + + + QAbstractItemView::EditTrigger::NoEditTriggers + + + false + + + false + + + true + + + QAbstractItemView::SelectionBehavior::SelectRows From f199fa5ce4b4b58ba0b857921b8f492ba3f10faa Mon Sep 17 00:00:00 2001 From: = Date: Sat, 19 Apr 2025 19:50:45 -0700 Subject: [PATCH 034/180] Added new UI files --- src/qt/qt_keybind.cpp | 95 ++++++++++++++++++++++++++++++++++ src/qt/qt_keybind.hpp | 32 ++++++++++++ src/qt/qt_keybind.ui | 85 ++++++++++++++++++++++++++++++ src/qt/qt_singlekeyseqedit.cpp | 20 +++++++ src/qt/qt_singlekeyseqedit.hpp | 16 ++++++ 5 files changed, 248 insertions(+) create mode 100644 src/qt/qt_keybind.cpp create mode 100644 src/qt/qt_keybind.hpp create mode 100644 src/qt/qt_keybind.ui create mode 100644 src/qt/qt_singlekeyseqedit.cpp create mode 100644 src/qt/qt_singlekeyseqedit.hpp diff --git a/src/qt/qt_keybind.cpp b/src/qt/qt_keybind.cpp new file mode 100644 index 000000000..dcfe424d9 --- /dev/null +++ b/src/qt/qt_keybind.cpp @@ -0,0 +1,95 @@ +/* + * 86Box A hypervisor and IBM PC system emulator that specializes in + * running old operating systems and software designed for IBM + * PC systems and compatibles from 1981 through fairly recent + * system designs based on the PCI bus. + * + * This file is part of the 86Box distribution. + * + * Device configuration UI code. + * + * + * + * Authors: Joakim L. Gilje + * Cacodemon345 + * + * Copyright 2021 Joakim L. Gilje + * Copyright 2022 Cacodemon345 + */ +#include "qt_keybind.hpp" +#include "ui_qt_keybind.h" +#include "qt_settings.hpp" +#include "qt_singlekeyseqedit.hpp" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +extern "C" { +#include <86box/86box.h> +#include <86box/ini.h> +#include <86box/config.h> +#include <86box/device.h> +#include <86box/midi_rtmidi.h> +#include <86box/mem.h> +#include <86box/random.h> +#include <86box/rom.h> +} + +#include "qt_filefield.hpp" +#include "qt_models_common.hpp" +#ifdef Q_OS_LINUX +# include +# include +#endif +#ifdef Q_OS_WINDOWS +#include +#endif + +KeyBinder::KeyBinder(QWidget *parent) + : QDialog(parent) + , ui(new Ui::KeyBinder) +{ + ui->setupUi(this); + singleKeySequenceEdit *seq = new singleKeySequenceEdit(); + ui->formLayout->addRow(seq); + seq->setObjectName("keySequence"); +} + +KeyBinder::~KeyBinder() +{ + delete ui; +} + + +bool KeyBinder::eventFilter(QObject *obj, QEvent *event) +{ + return QObject::eventFilter(obj, event); +} + +QKeySequence +KeyBinder::BindKey(QString CurValue) +{ + KeyBinder kb; + kb.setWindowTitle("Bind Key"); + kb.setFixedSize(kb.minimumSizeHint()); + kb.findChild()->setKeySequence(QKeySequence::fromString(CurValue)); + + if (kb.exec() == QDialog::Accepted) { + QKeySequenceEdit *seq = kb.findChild(); + return (seq->keySequence()); + } else { + return (false); + } +} \ No newline at end of file diff --git a/src/qt/qt_keybind.hpp b/src/qt/qt_keybind.hpp new file mode 100644 index 000000000..afb750794 --- /dev/null +++ b/src/qt/qt_keybind.hpp @@ -0,0 +1,32 @@ +#ifndef QT_KeyBinder_HPP +#define QT_KeyBinder_HPP + +#include + +#include "qt_settings.hpp" + +extern "C" { +struct _device_; +} + +namespace Ui { +class KeyBinder; +} + +class Settings; + +class KeyBinder : public QDialog { + Q_OBJECT + +public: + explicit KeyBinder(QWidget *parent = nullptr); + ~KeyBinder() override; + + static QKeySequence BindKey(QString CurValue); + +private: + Ui::KeyBinder *ui; + bool eventFilter(QObject *obj, QEvent *event); +}; + +#endif // QT_KeyBinder_HPP diff --git a/src/qt/qt_keybind.ui b/src/qt/qt_keybind.ui new file mode 100644 index 000000000..835e12020 --- /dev/null +++ b/src/qt/qt_keybind.ui @@ -0,0 +1,85 @@ + + + KeyBinder + + + + 0 + 0 + 400 + 103 + + + + Dialog + + + + + + + + Enter key combo: + + + Qt::AlignmentFlag::AlignCenter + + + + + + + + + Qt::Orientation::Horizontal + + + + + + + Qt::Orientation::Horizontal + + + QDialogButtonBox::StandardButton::Cancel|QDialogButtonBox::StandardButton::Ok + + + + + + + + + buttonBox + accepted() + KeyBinder + accept() + + + 248 + 254 + + + 157 + 274 + + + + + buttonBox + rejected() + KeyBinder + reject() + + + 316 + 260 + + + 286 + 274 + + + + + diff --git a/src/qt/qt_singlekeyseqedit.cpp b/src/qt/qt_singlekeyseqedit.cpp new file mode 100644 index 000000000..f17d2164f --- /dev/null +++ b/src/qt/qt_singlekeyseqedit.cpp @@ -0,0 +1,20 @@ +#include "qt_singlekeyseqedit.hpp" + +/* + This subclass of QKeySequenceEdit restricts the input to only a single + shortcut instead of an unlimited number with a fixed timeout. +*/ + +singleKeySequenceEdit::singleKeySequenceEdit(QWidget *parent) : QKeySequenceEdit(parent) {} + +void singleKeySequenceEdit::keyPressEvent(QKeyEvent *event) +{ + QKeySequenceEdit::keyPressEvent(event); + if (this->keySequence().count() > 0) { + QKeySequenceEdit::setKeySequence(this->keySequence()); + + // This could have unintended consequences since it will happen + // every single time the user presses a key. + emit editingFinished(); + } +} \ No newline at end of file diff --git a/src/qt/qt_singlekeyseqedit.hpp b/src/qt/qt_singlekeyseqedit.hpp new file mode 100644 index 000000000..43ebe70b2 --- /dev/null +++ b/src/qt/qt_singlekeyseqedit.hpp @@ -0,0 +1,16 @@ +#ifndef SINGLEKEYSEQUENCEEDIT_H +#define SINGLEKEYSEQUENCEEDIT_H + +#include +#include + +class singleKeySequenceEdit : public QKeySequenceEdit +{ + Q_OBJECT +public: + singleKeySequenceEdit(QWidget *parent = nullptr); + + void keyPressEvent(QKeyEvent *) override; +}; + +#endif // SINGLEKEYSEQUENCEEDIT_H From 34620f3246c6b31713fd0ced517dd68c2ef8b900 Mon Sep 17 00:00:00 2001 From: = Date: Sat, 19 Apr 2025 20:04:00 -0700 Subject: [PATCH 035/180] Auto-set focus on keybind dialog --- src/config.c | 2 -- src/qt/qt_keybind.cpp | 6 ++++++ src/qt/qt_keybind.hpp | 1 + src/qt/qt_mainwindow.cpp | 1 - src/qt/qt_settingsinput.cpp | 1 - 5 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/config.c b/src/config.c index d537711d9..2bea312a9 100644 --- a/src/config.c +++ b/src/config.c @@ -2558,10 +2558,8 @@ save_keybinds(void) for(int x=0;xformLayout->addRow(seq); seq->setObjectName("keySequence"); + this->setTabOrder(seq, ui->buttonBox); } KeyBinder::~KeyBinder() @@ -72,6 +73,11 @@ KeyBinder::~KeyBinder() delete ui; } +void +KeyBinder::showEvent( QShowEvent* event ) { + QWidget::showEvent( event ); + this->findChild()->setFocus(); +} bool KeyBinder::eventFilter(QObject *obj, QEvent *event) { diff --git a/src/qt/qt_keybind.hpp b/src/qt/qt_keybind.hpp index afb750794..e8e7b6e5e 100644 --- a/src/qt/qt_keybind.hpp +++ b/src/qt/qt_keybind.hpp @@ -27,6 +27,7 @@ public: private: Ui::KeyBinder *ui; bool eventFilter(QObject *obj, QEvent *event); + void showEvent( QShowEvent* event ); }; #endif // QT_KeyBinder_HPP diff --git a/src/qt/qt_mainwindow.cpp b/src/qt/qt_mainwindow.cpp index ed9bf92a7..9fa38bfb1 100644 --- a/src/qt/qt_mainwindow.cpp +++ b/src/qt/qt_mainwindow.cpp @@ -1079,7 +1079,6 @@ MainWindow::on_actionSettings_triggered() case QDialog::Accepted: settings.save(); config_changed = 2; - printf("about to try\n"); updateShortcuts(); pc_reset_hard(); break; diff --git a/src/qt/qt_settingsinput.cpp b/src/qt/qt_settingsinput.cpp index 924594083..aa232df67 100644 --- a/src/qt/qt_settingsinput.cpp +++ b/src/qt/qt_settingsinput.cpp @@ -74,7 +74,6 @@ SettingsInput::SettingsInput(QWidget *parent) // Make a working copy of acc_keys so we can check for dupes later without getting // confused - printf("Instantiating list\n"); for(int x=0;x Date: Sat, 19 Apr 2025 20:11:17 -0700 Subject: [PATCH 036/180] Fixed bug in keybind UI --- src/qt/qt_mainwindow.cpp | 1 - src/qt/qt_settingsinput.cpp | 7 ++----- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/src/qt/qt_mainwindow.cpp b/src/qt/qt_mainwindow.cpp index 9fa38bfb1..dc97c6294 100644 --- a/src/qt/qt_mainwindow.cpp +++ b/src/qt/qt_mainwindow.cpp @@ -859,7 +859,6 @@ void MainWindow::updateShortcuts() accID = FindAccelerator("fullscreen"); seq = QKeySequence::fromString(acc_keys[accID].seq); - //printf("shortcut: %s\n", qPrintable(ui->actionFullscreen->shortcut().toString())); ui->actionFullscreen->setShortcut(seq); accID = FindAccelerator("hard_reset"); diff --git a/src/qt/qt_settingsinput.cpp b/src/qt/qt_settingsinput.cpp index aa232df67..3be460a4a 100644 --- a/src/qt/qt_settingsinput.cpp +++ b/src/qt/qt_settingsinput.cpp @@ -68,9 +68,6 @@ SettingsInput::SettingsInput(QWidget *parent) keyTable->setSelectionBehavior(QAbstractItemView::SelectRows); keyTable->setSelectionMode(QAbstractItemView::SingleSelection); keyTable->setShowGrid(true); - keyTable->setStyleSheet("QTableWidget::item:hover { }"); - keyTable->setFocusPolicy(Qt::NoFocus); - keyTable->setSelectionMode(QAbstractItemView::NoSelection); // Make a working copy of acc_keys so we can check for dupes later without getting // confused @@ -224,7 +221,7 @@ SettingsInput::on_tableKeys_doubleClicked(int row, int col) // Find the correct accelerator key entry int accKeyID = FindAccelerator(qPrintable(ui->tableKeys->item(row,2)->text())); - if (!accKeyID) return; // this should never happen + if (accKeyID < 0) return; // this should never happen // Make the change cell->setText(keyseq.toString(QKeySequence::NativeText)); @@ -254,7 +251,7 @@ SettingsInput::on_pushButtonClearBind_Clicked() cell->setText(""); // Find the correct accelerator key entry int accKeyID = FindAccelerator(qPrintable(ui->tableKeys->item(cell->row(),2)->text())); - if (!accKeyID) return; // this should never happen + if (accKeyID < 0) return; // this should never happen // Make the change cell->setText(""); From 4c20994d5962c654e13285b524e40468a0cae68b Mon Sep 17 00:00:00 2001 From: = Date: Sat, 19 Apr 2025 23:50:03 -0700 Subject: [PATCH 037/180] Removed broken refs to fix -nix build --- src/config.c | 3 +-- src/include/86box/keyboard.h | 1 - src/unix/unix.c | 3 --- 3 files changed, 1 insertion(+), 6 deletions(-) diff --git a/src/config.c b/src/config.c index 2bea312a9..dcabcd922 100644 --- a/src/config.c +++ b/src/config.c @@ -1807,7 +1807,7 @@ load_keybinds(void) { p = ini_section_get_string(cat, acc_keys[x].name, "none"); // If there's no binding in the file, leave it alone. - if (p != "none") + if (strcmp(p, "none") != 0) { // It would be ideal to validate whether the user entered a // valid combo at this point, but the Qt method for testing that is @@ -2553,7 +2553,6 @@ static void save_keybinds(void) { ini_section_t cat = ini_find_or_create_section(config, "Keybinds"); - char temp[512]; for(int x=0;x Date: Sun, 20 Apr 2025 14:04:23 +0200 Subject: [PATCH 038/180] BusLogic SCSI controllers: Add a proper device reset functions, fixes POST error on Intel AMI BIOS'es after exiting AUTO-SCSI using the Esc key. --- src/scsi/scsi_buslogic.c | 57 +++++++++++++++++++++++++++++++++------- 1 file changed, 47 insertions(+), 10 deletions(-) diff --git a/src/scsi/scsi_buslogic.c b/src/scsi/scsi_buslogic.c index 9fe34380b..352232e34 100644 --- a/src/scsi/scsi_buslogic.c +++ b/src/scsi/scsi_buslogic.c @@ -256,6 +256,8 @@ buslogic_log(const char *fmt, ...) # define buslogic_log(fmt, ...) #endif +static x54x_t reset_state = { 0 }; + static char * BuslogicGetNVRFileName(buslogic_data_t *bl) { @@ -1084,7 +1086,7 @@ buslogic_interrupt_type(void *priv) } static void -buslogic_reset(void *priv) +buslogic_ven_reset(void *priv) { x54x_t *dev = (x54x_t *) priv; buslogic_data_t *bl = (buslogic_data_t *) dev->ven_data; @@ -1525,6 +1527,39 @@ BuslogicDeviceReset(void *priv) BuslogicInitializeAutoSCSIRam(dev); } +static void +buslogic_reset(void *priv) +{ + x54x_t *dev = (x54x_t *) priv; + buslogic_data_t *bl = (buslogic_data_t *) dev->ven_data; + + x54x_io_remove(dev, dev->Base, 4); + + if (bl->chip == CHIP_BUSLOGIC_PCI_958D_1995_12_30) { + x54x_mem_init(dev, 0xfffd0000); + x54x_mem_disable(dev); + } + + timer_disable(&dev->timer); + timer_disable(&dev->ResetCB); + + reset_state.mmio_mapping = dev->mmio_mapping; + + reset_state.bios.mapping = dev->bios.mapping; + reset_state.uppersck.mapping = dev->uppersck.mapping; + + reset_state.timer = dev->timer; + reset_state.ResetCB = dev->ResetCB; + + memcpy(dev, &reset_state, sizeof(x54x_t)); + + dev->timer.period = 10.0; + timer_set_delay_u64(&dev->timer, (uint64_t) (dev->timer.period * ((double) TIMER_USEC))); + + if ((dev->Base != 0) && !(dev->card_bus & DEVICE_MCA) && !(dev->card_bus & DEVICE_PCI)) + x54x_io_set(dev, dev->Base, 4); +} + static void * buslogic_init(const device_t *info) { @@ -1586,7 +1621,7 @@ buslogic_init(const device_t *info) dev->interrupt_type = buslogic_interrupt_type; dev->is_aggressive_mode = buslogic_is_aggressive_mode; dev->get_ven_data = buslogic_setup_data; - dev->ven_reset = buslogic_reset; + dev->ven_reset = buslogic_ven_reset; strcpy(dev->vendor, "BusLogic"); @@ -1774,6 +1809,8 @@ buslogic_init(const device_t *info) BuslogicInitializeAutoSCSIRam(dev); } + memcpy(&reset_state, dev, sizeof(x54x_t)); + return dev; } @@ -1876,7 +1913,7 @@ const device_t buslogic_542b_device = { .local = CHIP_BUSLOGIC_ISA_542B_1991_12_14, .init = buslogic_init, .close = x54x_close, - .reset = NULL, + .reset = buslogic_reset, .available = NULL, .speed_changed = NULL, .force_redraw = NULL, @@ -1890,7 +1927,7 @@ const device_t buslogic_545s_device = { .local = CHIP_BUSLOGIC_ISA_545S_1992_10_05, .init = buslogic_init, .close = x54x_close, - .reset = NULL, + .reset = buslogic_reset, .available = NULL, .speed_changed = NULL, .force_redraw = NULL, @@ -1904,7 +1941,7 @@ const device_t buslogic_542bh_device = { .local = CHIP_BUSLOGIC_ISA_542BH_1993_05_23, .init = buslogic_init, .close = x54x_close, - .reset = NULL, + .reset = buslogic_reset, .available = NULL, .speed_changed = NULL, .force_redraw = NULL, @@ -1918,7 +1955,7 @@ const device_t buslogic_545c_device = { .local = CHIP_BUSLOGIC_ISA_545C_1994_12_01, .init = buslogic_init, .close = x54x_close, - .reset = NULL, + .reset = buslogic_reset, .available = NULL, .speed_changed = NULL, .force_redraw = NULL, @@ -1932,7 +1969,7 @@ const device_t buslogic_640a_device = { .local = CHIP_BUSLOGIC_MCA_640A_1993_05_23, .init = buslogic_init, .close = x54x_close, - .reset = NULL, + .reset = buslogic_reset, .available = NULL, .speed_changed = NULL, .force_redraw = NULL, @@ -1946,7 +1983,7 @@ const device_t buslogic_445s_device = { .local = CHIP_BUSLOGIC_VLB_445S_1993_11_16, .init = buslogic_init, .close = x54x_close, - .reset = NULL, + .reset = buslogic_reset, .available = NULL, .speed_changed = NULL, .force_redraw = NULL, @@ -1960,7 +1997,7 @@ const device_t buslogic_445c_device = { .local = CHIP_BUSLOGIC_VLB_445C_1994_12_01, .init = buslogic_init, .close = x54x_close, - .reset = NULL, + .reset = buslogic_reset, .available = NULL, .speed_changed = NULL, .force_redraw = NULL, @@ -1974,7 +2011,7 @@ const device_t buslogic_958d_pci_device = { .local = CHIP_BUSLOGIC_PCI_958D_1995_12_30, .init = buslogic_init, .close = x54x_close, - .reset = NULL, + .reset = buslogic_reset, .available = NULL, .speed_changed = NULL, .force_redraw = NULL, From aefcdc9e01ebdd7bac314f0a2c3fabdff6b2df8e Mon Sep 17 00:00:00 2001 From: = Date: Sun, 20 Apr 2025 13:43:14 -0700 Subject: [PATCH 039/180] Merged fullscreen combos. Fixed bug when config file can't be loaded. --- src/86box.c | 30 +++++++++++++++++++++++++ src/config.c | 30 ------------------------- src/include/86box/86box.h | 3 ++- src/qt/qt_mainwindow.cpp | 46 +++++++++++++++++---------------------- 4 files changed, 52 insertions(+), 57 deletions(-) diff --git a/src/86box.c b/src/86box.c index d8c05c8bb..d650b8432 100644 --- a/src/86box.c +++ b/src/86box.c @@ -225,6 +225,28 @@ int other_scsi_present = 0; /* SCSI contro // Accelerator key array struct accelKey acc_keys[NUM_ACCELS]; +// Default accelerator key values +struct accelKey def_acc_keys[NUM_ACCELS] = { + { .name="send_ctrl_alt_del", .desc="Send Control+Alt+Del", + .seq="Ctrl+F12" }, + + { .name="send_ctrl_alt_esc", .desc="Send Control+Alt+Escape", + .seq="Ctrl+F10" }, + + { .name="fullscreen", .desc="Toggle fullscreen", + .seq="Ctrl+Alt+PgUp" }, + + { .name="screenshot", .desc="Screenshot", + .seq="Ctrl+F11" }, + + { .name="release_mouse", .desc="Release mouse pointer", + .seq="Ctrl+End" }, + + { .name="hard_reset", .desc="Hard reset", + .seq="Ctrl+Alt+F12" } +}; + + /* Statistics. */ extern int mmuflush; extern int readlnum; @@ -998,6 +1020,14 @@ usage: gdbstub_init(); + // Initialize the keyboard accelerator list with default values + for(int x=0;x= QT_VERSION_CHECK(6, 0, 0) - windowedShortcut = new QShortcut(QKeySequence(Qt::CTRL | Qt::ALT | Qt::Key_PageDown), this); -#else - windowedShortcut = new QShortcut(QKeySequence(Qt::CTRL + Qt::ALT + Qt::Key_PageDown), this); -#endif - windowedShortcut->setContext(Qt::ShortcutContext::ApplicationShortcut); - connect(windowedShortcut, &QShortcut::activated, this, [this] () { - if (video_fullscreen) - ui->actionFullscreen->trigger(); - }); - connect(this, &MainWindow::initRendererMonitor, this, &MainWindow::initRendererMonitorSlot); connect(this, &MainWindow::initRendererMonitorForNonQtThread, this, &MainWindow::initRendererMonitorSlot, Qt::BlockingQueuedConnection); connect(this, &MainWindow::destroyRendererMonitor, this, &MainWindow::destroyRendererMonitorSlot); @@ -836,10 +825,11 @@ void MainWindow::updateShortcuts() // Note that the "Release mouse" shortcut is hardcoded elsewhere // This section only applies to shortcuts anchored to UI elements + // First we need to wipe all existing accelerators, otherwise Qt will + // run into conflicts with old ones. ui->actionTake_screenshot->setShortcut(QKeySequence()); ui->actionCtrl_Alt_Del->setShortcut(QKeySequence()); ui->actionCtrl_Alt_Esc->setShortcut(QKeySequence()); - ui->actionFullscreen->setShortcut(QKeySequence()); ui->actionHard_Reset->setShortcut(QKeySequence()); int accID; @@ -857,25 +847,13 @@ void MainWindow::updateShortcuts() seq = QKeySequence::fromString(acc_keys[accID].seq); ui->actionCtrl_Alt_Esc->setShortcut(seq); - accID = FindAccelerator("fullscreen"); - seq = QKeySequence::fromString(acc_keys[accID].seq); - ui->actionFullscreen->setShortcut(seq); - accID = FindAccelerator("hard_reset"); seq = QKeySequence::fromString(acc_keys[accID].seq); ui->actionHard_Reset->setShortcut(seq); - // To rebind leave_fullscreen we have to disconnect the existing signal, - // build a new shortcut, then connect it. - accID = FindAccelerator("leave_fullscreen"); + accID = FindAccelerator("fullscreen"); seq = QKeySequence::fromString(acc_keys[accID].seq); - disconnect(windowedShortcut,0,0,0); - windowedShortcut = new QShortcut(seq, this); - windowedShortcut->setContext(Qt::ShortcutContext::ApplicationShortcut); - connect(windowedShortcut, &QShortcut::activated, this, [this] () { - if (video_fullscreen) - ui->actionFullscreen->trigger(); - }); + ui->actionFullscreen->setShortcut(seq); } void @@ -1361,6 +1339,20 @@ MainWindow::eventFilter(QObject *receiver, QEvent *event) if (event->type() == QEvent::KeyPress) { event->accept(); this->keyPressEvent((QKeyEvent *) event); + + // Detect fullscreen shortcut when menubar is hidden + int accID = FindAccelerator("fullscreen"); + QKeySequence seq = QKeySequence::fromString(acc_keys[accID].seq); + + if (event->type() == QEvent::KeyPress) + { + QKeyEvent *ke = (QKeyEvent *) event; + if ((QKeySequence)(ke->key() | ke->modifiers()) == seq && video_fullscreen != 0) + { + ui->actionFullscreen->trigger(); + } + } + return true; } if (event->type() == QEvent::KeyRelease) { @@ -1380,6 +1372,8 @@ MainWindow::eventFilter(QObject *receiver, QEvent *event) plat_pause(curdopause); } } + + return QMainWindow::eventFilter(receiver, event); } From 24a4ed445e3b1805c4f230bdd3b394b85fba0a1d Mon Sep 17 00:00:00 2001 From: = Date: Sun, 20 Apr 2025 13:59:52 -0700 Subject: [PATCH 040/180] All shortcuts now work in fullscreen --- src/qt/qt_mainwindow.cpp | 45 +++++++++++++++++++++++++++++++++------- src/qt/qt_mainwindow.hpp | 2 ++ 2 files changed, 40 insertions(+), 7 deletions(-) diff --git a/src/qt/qt_mainwindow.cpp b/src/qt/qt_mainwindow.cpp index e57c7b96f..2b3eda4af 100644 --- a/src/qt/qt_mainwindow.cpp +++ b/src/qt/qt_mainwindow.cpp @@ -1325,6 +1325,19 @@ MainWindow::getTitle(wchar_t *title) } } + +// Helper to find an accelerator key and return it's sequence +// TODO: Is there a more central place to put this? +QKeySequence +MainWindow::FindAcceleratorSeq(const char *name) +{ + int accID = FindAccelerator(name); + if(accID == -1) + return false; + + return(QKeySequence::fromString(acc_keys[accID].seq)); +} + bool MainWindow::eventFilter(QObject *receiver, QEvent *event) { @@ -1337,22 +1350,40 @@ MainWindow::eventFilter(QObject *receiver, QEvent *event) } } if (event->type() == QEvent::KeyPress) { - event->accept(); this->keyPressEvent((QKeyEvent *) event); - // Detect fullscreen shortcut when menubar is hidden - int accID = FindAccelerator("fullscreen"); - QKeySequence seq = QKeySequence::fromString(acc_keys[accID].seq); + // Detect shortcuts when menubar is hidden + // TODO: Could this be simplified by proxying the event and manually + // shoving it into the menubar? + QKeySequence accKey; - if (event->type() == QEvent::KeyPress) + if (event->type() == QEvent::KeyPress && video_fullscreen != 0) { QKeyEvent *ke = (QKeyEvent *) event; - if ((QKeySequence)(ke->key() | ke->modifiers()) == seq && video_fullscreen != 0) + + if ((QKeySequence)(ke->key() | ke->modifiers()) == FindAcceleratorSeq("screenshot")) { - ui->actionFullscreen->trigger(); + ui->actionTake_screenshot->trigger(); + } + if ((QKeySequence)(ke->key() | ke->modifiers()) == FindAcceleratorSeq("send_ctrl_alt_del")) + { + ui->actionCtrl_Alt_Del->trigger(); + } + if ((QKeySequence)(ke->key() | ke->modifiers()) == FindAcceleratorSeq("send_ctrl_alt_esc")) + { + ui->actionCtrl_Alt_Esc->trigger(); + } + if ((QKeySequence)(ke->key() | ke->modifiers()) == FindAcceleratorSeq("hard_reset")) + { + ui->actionHard_Reset->trigger(); + } + if ((QKeySequence)(ke->key() | ke->modifiers()) == FindAcceleratorSeq("fullscreen")) + { + ui->actionFullscreen->trigger(); } } + event->accept(); return true; } if (event->type() == QEvent::KeyRelease) { diff --git a/src/qt/qt_mainwindow.hpp b/src/qt/qt_mainwindow.hpp index 99b0021c2..5811ac36a 100644 --- a/src/qt/qt_mainwindow.hpp +++ b/src/qt/qt_mainwindow.hpp @@ -34,6 +34,8 @@ public: void setSendKeyboardInput(bool enabled); void reloadAllRenderers(); QShortcut *windowedShortcut; + QKeySequence FindAcceleratorSeq(const char *name); + std::array, 8> renderers; signals: From ba19b8af895fab71442dbeaf1932c0a48c2abb26 Mon Sep 17 00:00:00 2001 From: OBattler Date: Sun, 20 Apr 2025 23:19:17 +0200 Subject: [PATCH 041/180] x86_64 new recompile: fix registers clean-up on block exit. --- src/codegen_new/codegen_backend_x86-64.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/codegen_new/codegen_backend_x86-64.c b/src/codegen_new/codegen_backend_x86-64.c index 6242ea40b..20d02a8db 100644 --- a/src/codegen_new/codegen_backend_x86-64.c +++ b/src/codegen_new/codegen_backend_x86-64.c @@ -329,7 +329,7 @@ codegen_backend_init(void) host_x86_POP(block, REG_RSI); #endif host_x86_POP(block, REG_RBP); - host_x86_POP(block, REG_RDX); + host_x86_POP(block, REG_RBX); host_x86_RET(block); block_write_data = NULL; @@ -392,7 +392,7 @@ codegen_backend_epilogue(codeblock_t *block) host_x86_POP(block, REG_RSI); #endif host_x86_POP(block, REG_RBP); - host_x86_POP(block, REG_RDX); + host_x86_POP(block, REG_RBX); host_x86_RET(block); } #endif From 9febdd1510346744e0edc114054a92353117acb2 Mon Sep 17 00:00:00 2001 From: = Date: Sun, 20 Apr 2025 14:28:10 -0700 Subject: [PATCH 042/180] Added pause shortcut. --- src/86box.c | 5 +- src/include/86box/86box.h | 2 +- src/qt/qt_mainwindow.cpp | 105 ++++++++++++++++++++++---------------- 3 files changed, 66 insertions(+), 46 deletions(-) diff --git a/src/86box.c b/src/86box.c index d650b8432..e3d1e785c 100644 --- a/src/86box.c +++ b/src/86box.c @@ -243,7 +243,10 @@ struct accelKey def_acc_keys[NUM_ACCELS] = { .seq="Ctrl+End" }, { .name="hard_reset", .desc="Hard reset", - .seq="Ctrl+Alt+F12" } + .seq="Ctrl+Alt+F12" }, + + { .name="pause", .desc="Toggle pause", + .seq="Ctrl+Alt+F1" } }; diff --git a/src/include/86box/86box.h b/src/include/86box/86box.h index 4dcd521e0..51f1dbcbc 100644 --- a/src/include/86box/86box.h +++ b/src/include/86box/86box.h @@ -242,7 +242,7 @@ struct accelKey { char desc[64]; char seq[64]; }; -#define NUM_ACCELS 6 +#define NUM_ACCELS 7 extern struct accelKey acc_keys[NUM_ACCELS]; extern struct accelKey def_acc_keys[NUM_ACCELS]; extern int FindAccelerator(const char *name); diff --git a/src/qt/qt_mainwindow.cpp b/src/qt/qt_mainwindow.cpp index 2b3eda4af..ad1c0e2a0 100644 --- a/src/qt/qt_mainwindow.cpp +++ b/src/qt/qt_mainwindow.cpp @@ -821,9 +821,13 @@ MainWindow::closeEvent(QCloseEvent *event) void MainWindow::updateShortcuts() { - // Update menu shortcuts from accelerator table - // Note that the "Release mouse" shortcut is hardcoded elsewhere - // This section only applies to shortcuts anchored to UI elements + /* + Update menu shortcuts from accelerator table + Note that the "Release mouse" shortcut is hardcoded elsewhere + This section only applies to shortcuts anchored to UI elements + + MainWindow::eventFilter + */ // First we need to wipe all existing accelerators, otherwise Qt will // run into conflicts with old ones. @@ -831,6 +835,7 @@ void MainWindow::updateShortcuts() ui->actionCtrl_Alt_Del->setShortcut(QKeySequence()); ui->actionCtrl_Alt_Esc->setShortcut(QKeySequence()); ui->actionHard_Reset->setShortcut(QKeySequence()); + ui->actionPause->setShortcut(QKeySequence()); int accID; QKeySequence seq; @@ -854,6 +859,10 @@ void MainWindow::updateShortcuts() accID = FindAccelerator("fullscreen"); seq = QKeySequence::fromString(acc_keys[accID].seq); ui->actionFullscreen->setShortcut(seq); + + accID = FindAccelerator("pause"); + seq = QKeySequence::fromString(acc_keys[accID].seq); + ui->actionPause->setShortcut(seq); } void @@ -1341,6 +1350,54 @@ MainWindow::FindAcceleratorSeq(const char *name) bool MainWindow::eventFilter(QObject *receiver, QEvent *event) { + // Detect shortcuts when menubar is hidden + // TODO: Could this be simplified by proxying the event and manually + // shoving it into the menubar? + + // Note: This section should ONLY contain shortcuts that are valid + // when the emulator + if (event->type() == QEvent::KeyPress) + { + this->keyPressEvent((QKeyEvent *) event); + + if (event->type() == QEvent::KeyPress && video_fullscreen != 0) + { + QKeyEvent *ke = (QKeyEvent *) event; + + if ((QKeySequence)(ke->key() | ke->modifiers()) == FindAcceleratorSeq("release_mouse")) + { + qDebug() << ke; + plat_mouse_capture(0); + } + if ((QKeySequence)(ke->key() | ke->modifiers()) == FindAcceleratorSeq("screenshot")) + { + ui->actionTake_screenshot->trigger(); + } + if ((QKeySequence)(ke->key() | ke->modifiers()) == FindAcceleratorSeq("fullscreen")) + { + ui->actionFullscreen->trigger(); + } + if ((QKeySequence)(ke->key() | ke->modifiers()) == FindAcceleratorSeq("hard_reset")) + { + ui->actionHard_Reset->trigger(); + } + if ((QKeySequence)(ke->key() | ke->modifiers()) == FindAcceleratorSeq("send_ctrl_alt_del")) + { + ui->actionCtrl_Alt_Del->trigger(); + } + if ((QKeySequence)(ke->key() | ke->modifiers()) == FindAcceleratorSeq("send_ctrl_alt_esc")) + { + ui->actionCtrl_Alt_Esc->trigger(); + } + if ((QKeySequence)(ke->key() | ke->modifiers()) == FindAcceleratorSeq("pause")) + { + ui->actionPause->trigger(); + } + return true; + } + } + + if (!dopause) { if (event->type() == QEvent::Shortcut) { auto shortcutEvent = (QShortcutEvent *) event; @@ -1350,40 +1407,8 @@ MainWindow::eventFilter(QObject *receiver, QEvent *event) } } if (event->type() == QEvent::KeyPress) { - this->keyPressEvent((QKeyEvent *) event); - - // Detect shortcuts when menubar is hidden - // TODO: Could this be simplified by proxying the event and manually - // shoving it into the menubar? - QKeySequence accKey; - - if (event->type() == QEvent::KeyPress && video_fullscreen != 0) - { - QKeyEvent *ke = (QKeyEvent *) event; - - if ((QKeySequence)(ke->key() | ke->modifiers()) == FindAcceleratorSeq("screenshot")) - { - ui->actionTake_screenshot->trigger(); - } - if ((QKeySequence)(ke->key() | ke->modifiers()) == FindAcceleratorSeq("send_ctrl_alt_del")) - { - ui->actionCtrl_Alt_Del->trigger(); - } - if ((QKeySequence)(ke->key() | ke->modifiers()) == FindAcceleratorSeq("send_ctrl_alt_esc")) - { - ui->actionCtrl_Alt_Esc->trigger(); - } - if ((QKeySequence)(ke->key() | ke->modifiers()) == FindAcceleratorSeq("hard_reset")) - { - ui->actionHard_Reset->trigger(); - } - if ((QKeySequence)(ke->key() | ke->modifiers()) == FindAcceleratorSeq("fullscreen")) - { - ui->actionFullscreen->trigger(); - } - } - event->accept(); + return true; } if (event->type() == QEvent::KeyRelease) { @@ -1471,14 +1496,6 @@ MainWindow::keyPressEvent(QKeyEvent *event) processKeyboardInput(true, event->nativeScanCode()); #endif } - - // Check if mouse release combo has been entered - int accID = FindAccelerator("release_mouse"); - QKeySequence seq = QKeySequence::fromString(acc_keys[accID].seq); - if (seq[0] == (event->key() | event->modifiers())) - plat_mouse_capture(0); - - // TODO: Other accelerators should probably be here? event->accept(); } From fd235bcf9630eff939ccab2604a046e3b5510785 Mon Sep 17 00:00:00 2001 From: = Date: Sun, 20 Apr 2025 14:31:46 -0700 Subject: [PATCH 043/180] Added pause shortcut. --- src/86box.c | 5 ++++- src/qt/qt_mainwindow.cpp | 15 ++++++++++----- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/src/86box.c b/src/86box.c index e3d1e785c..dae2d4ba5 100644 --- a/src/86box.c +++ b/src/86box.c @@ -246,7 +246,10 @@ struct accelKey def_acc_keys[NUM_ACCELS] = { .seq="Ctrl+Alt+F12" }, { .name="pause", .desc="Toggle pause", - .seq="Ctrl+Alt+F1" } + .seq="Ctrl+Alt+F1" }, + + { .name="mute", .desc="Toggle mute", + .seq="Ctrl+Alt+M" } }; diff --git a/src/qt/qt_mainwindow.cpp b/src/qt/qt_mainwindow.cpp index ad1c0e2a0..27124b9fd 100644 --- a/src/qt/qt_mainwindow.cpp +++ b/src/qt/qt_mainwindow.cpp @@ -836,6 +836,7 @@ void MainWindow::updateShortcuts() ui->actionCtrl_Alt_Esc->setShortcut(QKeySequence()); ui->actionHard_Reset->setShortcut(QKeySequence()); ui->actionPause->setShortcut(QKeySequence()); + ui->actionMute_Unmute->setShortcut(QKeySequence()); int accID; QKeySequence seq; @@ -863,6 +864,10 @@ void MainWindow::updateShortcuts() accID = FindAccelerator("pause"); seq = QKeySequence::fromString(acc_keys[accID].seq); ui->actionPause->setShortcut(seq); + + accID = FindAccelerator("mute"); + seq = QKeySequence::fromString(acc_keys[accID].seq); + ui->actionMute_Unmute->setShortcut(seq); } void @@ -1353,9 +1358,6 @@ MainWindow::eventFilter(QObject *receiver, QEvent *event) // Detect shortcuts when menubar is hidden // TODO: Could this be simplified by proxying the event and manually // shoving it into the menubar? - - // Note: This section should ONLY contain shortcuts that are valid - // when the emulator if (event->type() == QEvent::KeyPress) { this->keyPressEvent((QKeyEvent *) event); @@ -1393,6 +1395,11 @@ MainWindow::eventFilter(QObject *receiver, QEvent *event) { ui->actionPause->trigger(); } + if ((QKeySequence)(ke->key() | ke->modifiers()) == FindAcceleratorSeq("mute")) + { + ui->actionMute_Unmute->setShortcut(seq); + } + return true; } } @@ -1429,8 +1436,6 @@ MainWindow::eventFilter(QObject *receiver, QEvent *event) } } - - return QMainWindow::eventFilter(receiver, event); } From eaff1fcd703a08b846e0fc6e6efe08e670b5c6ae Mon Sep 17 00:00:00 2001 From: = Date: Sun, 20 Apr 2025 14:33:19 -0700 Subject: [PATCH 044/180] Added mute shortcut. --- src/include/86box/86box.h | 2 +- src/qt/qt_mainwindow.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/include/86box/86box.h b/src/include/86box/86box.h index 51f1dbcbc..7f7723bba 100644 --- a/src/include/86box/86box.h +++ b/src/include/86box/86box.h @@ -242,7 +242,7 @@ struct accelKey { char desc[64]; char seq[64]; }; -#define NUM_ACCELS 7 +#define NUM_ACCELS 8 extern struct accelKey acc_keys[NUM_ACCELS]; extern struct accelKey def_acc_keys[NUM_ACCELS]; extern int FindAccelerator(const char *name); diff --git a/src/qt/qt_mainwindow.cpp b/src/qt/qt_mainwindow.cpp index 27124b9fd..568c84b36 100644 --- a/src/qt/qt_mainwindow.cpp +++ b/src/qt/qt_mainwindow.cpp @@ -1397,7 +1397,7 @@ MainWindow::eventFilter(QObject *receiver, QEvent *event) } if ((QKeySequence)(ke->key() | ke->modifiers()) == FindAcceleratorSeq("mute")) { - ui->actionMute_Unmute->setShortcut(seq); + ui->actionMute_Unmute->trigger(); } return true; From 505874f22ee33691a54774487f273d775edc0336 Mon Sep 17 00:00:00 2001 From: = Date: Sun, 20 Apr 2025 15:23:38 -0700 Subject: [PATCH 045/180] Added translation to key shortcut table, modals, and release mouse status line. --- src/qt/languages/fr-FR.po | 8 ++++---- src/qt/qt_mainwindow.cpp | 26 +++++++++++++++++--------- src/qt/qt_platform.cpp | 10 ++++++++-- src/qt/qt_settingsinput.cpp | 9 +++++---- 4 files changed, 34 insertions(+), 19 deletions(-) diff --git a/src/qt/languages/fr-FR.po b/src/qt/languages/fr-FR.po index 8456baf2f..5416f7662 100644 --- a/src/qt/languages/fr-FR.po +++ b/src/qt/languages/fr-FR.po @@ -717,11 +717,11 @@ msgstr "Autres périfériques" msgid "Click to capture mouse" msgstr "Cliquer pour capturer la souris" -msgid "Press %1 to release mouse" -msgstr "Appuyer sur %1 pour libérer la souris" +msgid "Press %s to release mouse" +msgstr "Appuyer sur %s pour libérer la souris" -msgid "Press %1 or middle button to release mouse" -msgstr "Appuyer sur %1 ou le bouton central pour libérer la souris" +msgid "Press %s or middle button to release mouse" +msgstr "Appuyer sur %s ou le bouton central pour libérer la souris" msgid "Bus" msgstr "Bus" diff --git a/src/qt/qt_mainwindow.cpp b/src/qt/qt_mainwindow.cpp index 568c84b36..d79cc1b9e 100644 --- a/src/qt/qt_mainwindow.cpp +++ b/src/qt/qt_mainwindow.cpp @@ -823,10 +823,9 @@ void MainWindow::updateShortcuts() { /* Update menu shortcuts from accelerator table - Note that the "Release mouse" shortcut is hardcoded elsewhere - This section only applies to shortcuts anchored to UI elements - MainWindow::eventFilter + Note that these only work in windowed mode. If you add any new shortcuts, + you have to go duplicate them in MainWindow::eventFilter() */ // First we need to wipe all existing accelerators, otherwise Qt will @@ -1295,7 +1294,10 @@ MainWindow::on_actionFullscreen_triggered() if (video_fullscreen_first) { bool wasCaptured = mouse_capture == 1; - QMessageBox questionbox(QMessageBox::Icon::Information, tr("Entering fullscreen mode"), tr("Press Ctrl+Alt+PgDn to return to windowed mode."), QMessageBox::Ok, this); + char strFullscreen[100]; + sprintf(strFullscreen, qPrintable(tr("To return to windowed mode, press %s")), acc_keys[FindAccelerator("fullscreen")].seq); + + QMessageBox questionbox(QMessageBox::Icon::Information, tr("Entering fullscreen mode"), QString(strFullscreen), QMessageBox::Ok, this); QCheckBox *chkbox = new QCheckBox(tr("Don't show this message again")); questionbox.setCheckBox(chkbox); chkbox->setChecked(!video_fullscreen_first); @@ -1362,15 +1364,21 @@ MainWindow::eventFilter(QObject *receiver, QEvent *event) { this->keyPressEvent((QKeyEvent *) event); + // We check for mouse release even if we aren't fullscreen, + // because it's not a menu accelerator. + if (event->type() == QEvent::KeyPress) + { + QKeyEvent *ke = (QKeyEvent *) event; + if ((QKeySequence)(ke->key() | ke->modifiers()) == FindAcceleratorSeq("release_mouse")) + { + plat_mouse_capture(0); + } + } + if (event->type() == QEvent::KeyPress && video_fullscreen != 0) { QKeyEvent *ke = (QKeyEvent *) event; - if ((QKeySequence)(ke->key() | ke->modifiers()) == FindAcceleratorSeq("release_mouse")) - { - qDebug() << ke; - plat_mouse_capture(0); - } if ((QKeySequence)(ke->key() | ke->modifiers()) == FindAcceleratorSeq("screenshot")) { ui->actionTake_screenshot->trigger(); diff --git a/src/qt/qt_platform.cpp b/src/qt/qt_platform.cpp index 0f792feda..26682528d 100644 --- a/src/qt/qt_platform.cpp +++ b/src/qt/qt_platform.cpp @@ -595,8 +595,14 @@ ProgSettings::reloadStrings() { translatedstrings.clear(); translatedstrings[STRING_MOUSE_CAPTURE] = QCoreApplication::translate("", "Click to capture mouse").toStdWString(); - translatedstrings[STRING_MOUSE_RELEASE] = QCoreApplication::translate("", "Press %1 to release mouse").arg(QCoreApplication::translate("", MOUSE_CAPTURE_KEYSEQ)).toStdWString(); - translatedstrings[STRING_MOUSE_RELEASE_MMB] = QCoreApplication::translate("", "Press %1 or middle button to release mouse").arg(QCoreApplication::translate("", MOUSE_CAPTURE_KEYSEQ)).toStdWString(); + + char mouseCaptureKeyseq[100]; + sprintf(mouseCaptureKeyseq, qPrintable(QCoreApplication::translate("", "Press %s to release mouse")), acc_keys[FindAccelerator("release_mouse")].seq); + translatedstrings[STRING_MOUSE_RELEASE] = QString(mouseCaptureKeyseq).toStdWString(); + + sprintf(mouseCaptureKeyseq, qPrintable(QCoreApplication::translate("", "Press %s or middle button to release mouse")), acc_keys[FindAccelerator("release_mouse")].seq); + translatedstrings[STRING_MOUSE_RELEASE_MMB] = QString(mouseCaptureKeyseq).toStdWString(); + translatedstrings[STRING_INVALID_CONFIG] = QCoreApplication::translate("", "Invalid configuration").toStdWString(); translatedstrings[STRING_NO_ST506_ESDI_CDROM] = QCoreApplication::translate("", "MFM/RLL or ESDI CD-ROM drives never existed").toStdWString(); translatedstrings[STRING_PCAP_ERROR_NO_DEVICES] = QCoreApplication::translate("", "No PCap devices found").toStdWString(); diff --git a/src/qt/qt_settingsinput.cpp b/src/qt/qt_settingsinput.cpp index 3be460a4a..20cb40ecd 100644 --- a/src/qt/qt_settingsinput.cpp +++ b/src/qt/qt_settingsinput.cpp @@ -51,8 +51,8 @@ SettingsInput::SettingsInput(QWidget *parent) QStringList horizontalHeader; QStringList verticalHeader; - horizontalHeader.append("Action"); - horizontalHeader.append("Keybind"); + horizontalHeader.append(tr("Action")); + horizontalHeader.append(tr("Keybind")); QTableWidget *keyTable = ui->tableKeys; keyTable->setRowCount(10); @@ -61,7 +61,7 @@ SettingsInput::SettingsInput(QWidget *parent) keyTable->setColumnWidth(0, 200); keyTable->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch); QStringList headers; - headers << "Action" << "Bound key"; + //headers << "Action" << "Bound key"; keyTable->setHorizontalHeaderLabels(headers); keyTable->verticalHeader()->setVisible(false); keyTable->setEditTriggers(QAbstractItemView::NoEditTriggers); @@ -109,6 +109,7 @@ SettingsInput::save() strcpy(acc_keys[x].desc, acc_keys_t[x].desc); strcpy(acc_keys[x].seq, acc_keys_t[x].seq); } + // ProgSettings::reloadStrings(); } void @@ -169,7 +170,7 @@ SettingsInput::refreshInputList() { for (int x=0;xtableKeys->setItem(x, 0, new QTableWidgetItem(acc_keys_t[x].desc)); + ui->tableKeys->setItem(x, 0, new QTableWidgetItem(tr(acc_keys_t[x].desc))); ui->tableKeys->setItem(x, 1, new QTableWidgetItem(acc_keys_t[x].seq)); ui->tableKeys->setItem(x, 2, new QTableWidgetItem(acc_keys_t[x].name)); } From d6b280dd29eb066fcf48c3b1df1d813dd290736e Mon Sep 17 00:00:00 2001 From: = Date: Sun, 20 Apr 2025 15:29:15 -0700 Subject: [PATCH 046/180] Status line now updates --- src/qt/qt_settingsinput.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/qt/qt_settingsinput.cpp b/src/qt/qt_settingsinput.cpp index 20cb40ecd..f87296451 100644 --- a/src/qt/qt_settingsinput.cpp +++ b/src/qt/qt_settingsinput.cpp @@ -17,6 +17,7 @@ #include "qt_settingsinput.hpp" #include "ui_qt_settingsinput.h" #include "qt_mainwindow.hpp" +#include "qt_progsettings.hpp" #include #include @@ -109,7 +110,7 @@ SettingsInput::save() strcpy(acc_keys[x].desc, acc_keys_t[x].desc); strcpy(acc_keys[x].seq, acc_keys_t[x].seq); } - // ProgSettings::reloadStrings(); + ProgSettings::reloadStrings(); } void From 30ea1eb08752cf6332b1c48a924aa7daeb80dc7e Mon Sep 17 00:00:00 2001 From: = Date: Sun, 20 Apr 2025 15:36:49 -0700 Subject: [PATCH 047/180] Updated translations --- src/qt/languages/ca-ES.po | 12 ++++++------ src/qt/languages/cs-CZ.po | 12 ++++++------ src/qt/languages/de-DE.po | 12 ++++++------ src/qt/languages/es-ES.po | 12 ++++++------ src/qt/languages/fi-FI.po | 12 ++++++------ src/qt/languages/fr-FR.po | 4 ++-- src/qt/languages/hr-HR.po | 12 ++++++------ src/qt/languages/hu-HU.po | 12 ++++++------ src/qt/languages/it-IT.po | 12 ++++++------ src/qt/languages/ja-JP.po | 12 ++++++------ src/qt/languages/ko-KR.po | 12 ++++++------ src/qt/languages/nl-NL.po | 12 ++++++------ src/qt/languages/pl-PL.po | 12 ++++++------ src/qt/languages/pt-BR.po | 12 ++++++------ src/qt/languages/pt-PT.po | 12 ++++++------ src/qt/languages/ru-RU.po | 12 ++++++------ src/qt/languages/sk-SK.po | 12 ++++++------ src/qt/languages/sl-SI.po | 12 ++++++------ src/qt/languages/sv-SE.po | 12 ++++++------ src/qt/languages/tr-TR.po | 12 ++++++------ src/qt/languages/uk-UA.po | 12 ++++++------ src/qt/languages/vi-VN.po | 12 ++++++------ src/qt/languages/zh-CN.po | 8 ++++---- src/qt/languages/zh-TW.po | 8 ++++---- src/qt/qt_mainwindow.cpp | 2 +- 25 files changed, 137 insertions(+), 137 deletions(-) diff --git a/src/qt/languages/ca-ES.po b/src/qt/languages/ca-ES.po index 847cc0138..4851106cd 100644 --- a/src/qt/languages/ca-ES.po +++ b/src/qt/languages/ca-ES.po @@ -630,8 +630,8 @@ msgstr "Error fatal" msgid " - PAUSED" msgstr " - EN PAUSA" -msgid "Press Ctrl+Alt+PgDn to return to windowed mode." -msgstr "Premeu Ctrl+Alt+PgDn per tornar al mode de finestra." +msgid "Press %s to return to windowed mode." +msgstr "Premeu %s per tornar al mode de finestra." msgid "Speed" msgstr "Velocitat" @@ -717,11 +717,11 @@ msgstr "Altres perifèrics" msgid "Click to capture mouse" msgstr "Feu clic per capturar el ratolí" -msgid "Press %1 to release mouse" -msgstr "Premeu %1 per alliberar el ratolí" +msgid "Press %s to release mouse" +msgstr "Premeu %s per alliberar el ratolí" -msgid "Press %1 or middle button to release mouse" -msgstr "Premeu %1 o el botó central per alliberar el ratolí" +msgid "Press %s or middle button to release mouse" +msgstr "Premeu %s o el botó central per alliberar el ratolí" msgid "Bus" msgstr "Bus" diff --git a/src/qt/languages/cs-CZ.po b/src/qt/languages/cs-CZ.po index ea492f0b6..352fafc31 100644 --- a/src/qt/languages/cs-CZ.po +++ b/src/qt/languages/cs-CZ.po @@ -630,8 +630,8 @@ msgstr "Kritická chyba" msgid " - PAUSED" msgstr " - POZASTAVENO" -msgid "Press Ctrl+Alt+PgDn to return to windowed mode." -msgstr "Stiskněte Ctrl+Alt+PgDn pro návrat z režimu celé obrazovky." +msgid "Press %s to return to windowed mode." +msgstr "Stiskněte %s pro návrat z režimu celé obrazovky." msgid "Speed" msgstr "Rychlost" @@ -717,11 +717,11 @@ msgstr "Jiné příslušenství" msgid "Click to capture mouse" msgstr "Klikněte pro zabraní myši" -msgid "Press %1 to release mouse" -msgstr "Stiskněte %1 pro uvolnění myši" +msgid "Press %s to release mouse" +msgstr "Stiskněte %s pro uvolnění myši" -msgid "Press %1 or middle button to release mouse" -msgstr "Stiskněte %1 nebo prostřední tlačítko pro uvolnění myši" +msgid "Press %s or middle button to release mouse" +msgstr "Stiskněte %s nebo prostřední tlačítko pro uvolnění myši" msgid "Bus" msgstr "Sběrnice" diff --git a/src/qt/languages/de-DE.po b/src/qt/languages/de-DE.po index 95d1b0249..ce7d52d55 100644 --- a/src/qt/languages/de-DE.po +++ b/src/qt/languages/de-DE.po @@ -630,8 +630,8 @@ msgstr "Fataler Fehler" msgid " - PAUSED" msgstr " - PAUSIERT" -msgid "Press Ctrl+Alt+PgDn to return to windowed mode." -msgstr "Strg+Alt+Bild ab, zur Rückkehr in den Fenstermodus." +msgid "Press %s to return to windowed mode." +msgstr "%s ab, zur Rückkehr in den Fenstermodus." msgid "Speed" msgstr "Geschwindigkeit" @@ -717,11 +717,11 @@ msgstr "Andere Peripheriegeräte" msgid "Click to capture mouse" msgstr "Klicken zum Einfangen des Mauszeigers" -msgid "Press %1 to release mouse" -msgstr "Drücke %1 zur Mausfreigabe" +msgid "Press %s to release mouse" +msgstr "Drücke %s zur Mausfreigabe" -msgid "Press %1 or middle button to release mouse" -msgstr "Drücke %1 oder die mittlere Maustaste zur Mausfreigabe" +msgid "Press %s or middle button to release mouse" +msgstr "Drücke %s oder die mittlere Maustaste zur Mausfreigabe" msgid "Ctrl+End" msgstr "Strg+Ende" diff --git a/src/qt/languages/es-ES.po b/src/qt/languages/es-ES.po index 57474ae53..177d08d18 100644 --- a/src/qt/languages/es-ES.po +++ b/src/qt/languages/es-ES.po @@ -630,8 +630,8 @@ msgstr "Error fatal" msgid " - PAUSED" msgstr " - EN PAUSA" -msgid "Press Ctrl+Alt+PgDn to return to windowed mode." -msgstr "Pulsa Ctrl+Alt+PgDn para volver a modo ventana." +msgid "Press %s to return to windowed mode." +msgstr "Pulsa %s para volver a modo ventana." msgid "Speed" msgstr "Velocidad" @@ -717,11 +717,11 @@ msgstr "Otros periféricos" msgid "Click to capture mouse" msgstr "Haga click para capturar el ratón" -msgid "Press %1 to release mouse" -msgstr "Pulse %1 para liberar el ratón" +msgid "Press %s to release mouse" +msgstr "Pulse %s para liberar el ratón" -msgid "Press %1 or middle button to release mouse" -msgstr "Pulse %1 o el botón central para liberar el ratón" +msgid "Press %s or middle button to release mouse" +msgstr "Pulse %s o el botón central para liberar el ratón" msgid "Bus" msgstr "Bus" diff --git a/src/qt/languages/fi-FI.po b/src/qt/languages/fi-FI.po index 187a423f6..a77b3f6ef 100644 --- a/src/qt/languages/fi-FI.po +++ b/src/qt/languages/fi-FI.po @@ -630,8 +630,8 @@ msgstr "Vakava virhe" msgid " - PAUSED" msgstr " - TAUKO" -msgid "Press Ctrl+Alt+PgDn to return to windowed mode." -msgstr "Paina Ctrl+Alt+PgDn palataksesi ikkunoituun tilaan." +msgid "Press %s to return to windowed mode." +msgstr "Paina %s palataksesi ikkunoituun tilaan." msgid "Speed" msgstr "Nopeus" @@ -717,11 +717,11 @@ msgstr "Muut oheislaitteet" msgid "Click to capture mouse" msgstr "Kaappaa hiiri klikkaamalla" -msgid "Press %1 to release mouse" -msgstr "Paina %1 vapauttaaksesi hiiren" +msgid "Press %s to release mouse" +msgstr "Paina %s vapauttaaksesi hiiren" -msgid "Press %1 or middle button to release mouse" -msgstr "Paina %1 tai keskipainiketta vapauttaaksesi hiiren" +msgid "Press %s or middle button to release mouse" +msgstr "Paina %s tai keskipainiketta vapauttaaksesi hiiren" msgid "Bus" msgstr "Väylä" diff --git a/src/qt/languages/fr-FR.po b/src/qt/languages/fr-FR.po index 5416f7662..fe3dc4bb4 100644 --- a/src/qt/languages/fr-FR.po +++ b/src/qt/languages/fr-FR.po @@ -630,8 +630,8 @@ msgstr "Erreur fatale" msgid " - PAUSED" msgstr " - EN PAUSE" -msgid "Press Ctrl+Alt+PgDn to return to windowed mode." -msgstr "Appuyez sur Ctrl+Alt+PgDn pour revenir au mode fenêtré." +msgid "Press %s to return to windowed mode." +msgstr "Appuyez sur %s pour revenir au mode fenêtré." msgid "Speed" msgstr "Vitesse" diff --git a/src/qt/languages/hr-HR.po b/src/qt/languages/hr-HR.po index 0fd342f88..1eecaa2d0 100644 --- a/src/qt/languages/hr-HR.po +++ b/src/qt/languages/hr-HR.po @@ -630,8 +630,8 @@ msgstr "Fatalna greška" msgid " - PAUSED" msgstr " - ZASTAO" -msgid "Press Ctrl+Alt+PgDn to return to windowed mode." -msgstr "Pritisnite Ctrl+Alt+PgDn za povratak u prozorski način rada." +msgid "Press %s to return to windowed mode." +msgstr "Pritisnite %s za povratak u prozorski način rada." msgid "Speed" msgstr "Brzina" @@ -717,11 +717,11 @@ msgstr "Ostali periferni uređaji" msgid "Click to capture mouse" msgstr "Kliknite da uhvatite miš" -msgid "Press %1 to release mouse" -msgstr "Pritisnite %1 za otpustanje miša" +msgid "Press %s to release mouse" +msgstr "Pritisnite %s za otpustanje miša" -msgid "Press %1 or middle button to release mouse" -msgstr "Pritisnite %1 ili srednji gumb miša za otpuštanje miša" +msgid "Press %s or middle button to release mouse" +msgstr "Pritisnite %s ili srednji gumb miša za otpuštanje miša" msgid "Bus" msgstr "Bus" diff --git a/src/qt/languages/hu-HU.po b/src/qt/languages/hu-HU.po index cbb753890..43a1fd9ba 100644 --- a/src/qt/languages/hu-HU.po +++ b/src/qt/languages/hu-HU.po @@ -630,8 +630,8 @@ msgstr "Végzetes hiba" msgid " - PAUSED" msgstr " - SZÜNETELT" -msgid "Press Ctrl+Alt+PgDn to return to windowed mode." -msgstr "Használja a Ctrl+Alt+PgDn gombokat az ablakhoz való visszatéréshez." +msgid "Press %s to return to windowed mode." +msgstr "Használja a %s gombokat az ablakhoz való visszatéréshez." msgid "Speed" msgstr "Sebesség" @@ -717,11 +717,11 @@ msgstr "Egyéb perifériák" msgid "Click to capture mouse" msgstr "Kattintson az egér elfogásához" -msgid "Press %1 to release mouse" -msgstr "Nyomja meg az %1-t az egér elengédéséhez" +msgid "Press %s to release mouse" +msgstr "Nyomja meg az %s-t az egér elengédéséhez" -msgid "Press %1 or middle button to release mouse" -msgstr "Nyomja meg az %1-t vagy a középső gombot az egér elengédéséhez" +msgid "Press %s or middle button to release mouse" +msgstr "Nyomja meg az %s-t vagy a középső gombot az egér elengédéséhez" msgid "Bus" msgstr "Busz" diff --git a/src/qt/languages/it-IT.po b/src/qt/languages/it-IT.po index c505b9eaa..b8ded74de 100644 --- a/src/qt/languages/it-IT.po +++ b/src/qt/languages/it-IT.po @@ -630,8 +630,8 @@ msgstr "Errore fatale" msgid " - PAUSED" msgstr " - IN PAUSA" -msgid "Press Ctrl+Alt+PgDn to return to windowed mode." -msgstr "Usa Ctrl+Alt+PgDn per tornare alla modalità finestra." +msgid "Press %s to return to windowed mode." +msgstr "Usa %s per tornare alla modalità finestra." msgid "Speed" msgstr "Velocità" @@ -717,11 +717,11 @@ msgstr "Altre periferiche" msgid "Click to capture mouse" msgstr "Fare clic per catturare mouse" -msgid "Press %1 to release mouse" -msgstr "Premi %1 per rilasciare il mouse" +msgid "Press %s to release mouse" +msgstr "Premi %s per rilasciare il mouse" -msgid "Press %1 or middle button to release mouse" -msgstr "Premi %1 o pulsante centrale per rilasciare il mouse" +msgid "Press %s or middle button to release mouse" +msgstr "Premi %s o pulsante centrale per rilasciare il mouse" msgid "Bus" msgstr "Bus" diff --git a/src/qt/languages/ja-JP.po b/src/qt/languages/ja-JP.po index cff667239..dc000b175 100644 --- a/src/qt/languages/ja-JP.po +++ b/src/qt/languages/ja-JP.po @@ -630,8 +630,8 @@ msgstr "致命的なエラー" msgid " - PAUSED" msgstr " - 一時停止" -msgid "Press Ctrl+Alt+PgDn to return to windowed mode." -msgstr "Ctrl+Alt+PgDnでウィンドウ モードに戻ります。" +msgid "Press %s to return to windowed mode." +msgstr "%sでウィンドウ モードに戻ります。" msgid "Speed" msgstr "速度" @@ -717,11 +717,11 @@ msgstr "他の周辺デバイス" msgid "Click to capture mouse" msgstr "左クリックでマウスをキャプチャします" -msgid "Press %1 to release mouse" -msgstr "%1キーでマウスを解放します" +msgid "Press %s to release mouse" +msgstr "%sキーでマウスを解放します" -msgid "Press %1 or middle button to release mouse" -msgstr "%1キーまたは中クリックでマウスを解放します" +msgid "Press %s or middle button to release mouse" +msgstr "%sキーまたは中クリックでマウスを解放します" msgid "Bus" msgstr "バス" diff --git a/src/qt/languages/ko-KR.po b/src/qt/languages/ko-KR.po index 55f47be27..3ef901789 100644 --- a/src/qt/languages/ko-KR.po +++ b/src/qt/languages/ko-KR.po @@ -630,8 +630,8 @@ msgstr "치명적인 오류" msgid " - PAUSED" msgstr " - 일시 중지됨" -msgid "Press Ctrl+Alt+PgDn to return to windowed mode." -msgstr "Ctrl+Alt+PgDn 키를 누르면 창 모드로 전환합니다." +msgid "Press %s to return to windowed mode." +msgstr "%s 키를 누르면 창 모드로 전환합니다." msgid "Speed" msgstr "속도" @@ -717,11 +717,11 @@ msgstr "기타 주변기기" msgid "Click to capture mouse" msgstr "이 창을 클릭하면 마우스를 사용합니다" -msgid "Press %1 to release mouse" -msgstr "%1키를 누르면 마우스를 해제합니다" +msgid "Press %s to release mouse" +msgstr "%s키를 누르면 마우스를 해제합니다" -msgid "Press %1 or middle button to release mouse" -msgstr "%1키 또는 가운데 버튼을 클릭하면 마우스를 해제합니다" +msgid "Press %s or middle button to release mouse" +msgstr "%s키 또는 가운데 버튼을 클릭하면 마우스를 해제합니다" msgid "Bus" msgstr "버스" diff --git a/src/qt/languages/nl-NL.po b/src/qt/languages/nl-NL.po index e854ea3f3..8ee391957 100644 --- a/src/qt/languages/nl-NL.po +++ b/src/qt/languages/nl-NL.po @@ -630,8 +630,8 @@ msgstr "Fatale fout" msgid " - PAUSED" msgstr " - GEPAUZEERD" -msgid "Press Ctrl+Alt+PgDn to return to windowed mode." -msgstr "Druk op Ctrl+Alt+PgDn om terug te gaan naar de venstermodus." +msgid "Press %s to return to windowed mode." +msgstr "Druk op %s om terug te gaan naar de venstermodus." msgid "Speed" msgstr "Snelheid" @@ -717,11 +717,11 @@ msgstr "Andere randapparatuur" msgid "Click to capture mouse" msgstr "Klik om muis vast te leggen" -msgid "Press %1 to release mouse" -msgstr "Druk op %1 om de muis los te laten" +msgid "Press %s to release mouse" +msgstr "Druk op %s om de muis los te laten" -msgid "Press %1 or middle button to release mouse" -msgstr "Druk op %1 of middelste knop om de muis los te laten" +msgid "Press %s or middle button to release mouse" +msgstr "Druk op %s of middelste knop om de muis los te laten" msgid "Bus" msgstr "Bus" diff --git a/src/qt/languages/pl-PL.po b/src/qt/languages/pl-PL.po index 3fc731e5f..d5b5ec3ea 100644 --- a/src/qt/languages/pl-PL.po +++ b/src/qt/languages/pl-PL.po @@ -630,8 +630,8 @@ msgstr "Fatalny błąd" msgid " - PAUSED" msgstr " - PAUSED" -msgid "Press Ctrl+Alt+PgDn to return to windowed mode." -msgstr "Naciśnij klawisze Ctrl+Alt+PgDn aby wrócić to trybu okna." +msgid "Press %s to return to windowed mode." +msgstr "Naciśnij klawisze %s aby wrócić to trybu okna." msgid "Speed" msgstr "Szybkość" @@ -717,11 +717,11 @@ msgstr "Inne urządzenia peryferyjne" msgid "Click to capture mouse" msgstr "Kliknij w celu przechwycenia myszy" -msgid "Press %1 to release mouse" -msgstr "Naciśnij klawisze %1 w celu uwolnienia myszy" +msgid "Press %s to release mouse" +msgstr "Naciśnij klawisze %s w celu uwolnienia myszy" -msgid "Press %1 or middle button to release mouse" -msgstr "Naciśnij klawisze %1 lub środkowy przycisk w celu uwolnienia myszy" +msgid "Press %s or middle button to release mouse" +msgstr "Naciśnij klawisze %s lub środkowy przycisk w celu uwolnienia myszy" msgid "Bus" msgstr "Magistrala" diff --git a/src/qt/languages/pt-BR.po b/src/qt/languages/pt-BR.po index 02abe2321..8961f11b8 100644 --- a/src/qt/languages/pt-BR.po +++ b/src/qt/languages/pt-BR.po @@ -630,8 +630,8 @@ msgstr "Erro fatal" msgid " - PAUSED" msgstr " - PAUSADO" -msgid "Press Ctrl+Alt+PgDn to return to windowed mode." -msgstr "Use Ctrl+Alt+PgDn para retornar ao modo janela" +msgid "Press %s to return to windowed mode." +msgstr "Use %s para retornar ao modo janela" msgid "Speed" msgstr "Velocidade" @@ -717,11 +717,11 @@ msgstr "Outros periféricos" msgid "Click to capture mouse" msgstr "Clique para capturar o mouse" -msgid "Press %1 to release mouse" -msgstr "Aperte %1 para liberar o mouse" +msgid "Press %s to release mouse" +msgstr "Aperte %s para liberar o mouse" -msgid "Press %1 or middle button to release mouse" -msgstr "Aperte %1 ou botão do meio para liberar o mouse" +msgid "Press %s or middle button to release mouse" +msgstr "Aperte %s ou botão do meio para liberar o mouse" msgid "Bus" msgstr "Barramento" diff --git a/src/qt/languages/pt-PT.po b/src/qt/languages/pt-PT.po index 42550a266..ba1c6976c 100644 --- a/src/qt/languages/pt-PT.po +++ b/src/qt/languages/pt-PT.po @@ -630,8 +630,8 @@ msgstr "Erro fatal" msgid " - PAUSED" msgstr " - EM PAUSA" -msgid "Press Ctrl+Alt+PgDn to return to windowed mode." -msgstr "Pressione Ctrl+Alt+PgDn para voltar ao modo de janela." +msgid "Press %s to return to windowed mode." +msgstr "Pressione %s para voltar ao modo de janela." msgid "Speed" msgstr "Velocidade" @@ -717,11 +717,11 @@ msgstr "Outros dispositivos" msgid "Click to capture mouse" msgstr "Clique para capturar o rato" -msgid "Press %1 to release mouse" -msgstr "Pressione %1 para soltar o rato" +msgid "Press %s to release mouse" +msgstr "Pressione %s para soltar o rato" -msgid "Press %1 or middle button to release mouse" -msgstr "Pressione %1 ou tecla média para soltar o rato" +msgid "Press %s or middle button to release mouse" +msgstr "Pressione %s ou tecla média para soltar o rato" msgid "Bus" msgstr "Barramento" diff --git a/src/qt/languages/ru-RU.po b/src/qt/languages/ru-RU.po index dde5387a7..baf1035ea 100644 --- a/src/qt/languages/ru-RU.po +++ b/src/qt/languages/ru-RU.po @@ -630,8 +630,8 @@ msgstr "Неустранимая ошибка" msgid " - PAUSED" msgstr " - ПАУЗА" -msgid "Press Ctrl+Alt+PgDn to return to windowed mode." -msgstr "Нажмите Ctrl+Alt+PgDn для возврата в оконный режим." +msgid "Press %s to return to windowed mode." +msgstr "Нажмите %s для возврата в оконный режим." msgid "Speed" msgstr "Скорость" @@ -717,11 +717,11 @@ msgstr "Другая периферия" msgid "Click to capture mouse" msgstr "Щёлкните мышью для захвата курсора" -msgid "Press %1 to release mouse" -msgstr "Нажмите %1, чтобы освободить курсор" +msgid "Press %s to release mouse" +msgstr "Нажмите %s, чтобы освободить курсор" -msgid "Press %1 or middle button to release mouse" -msgstr "Нажмите %1 или среднюю кнопку мыши, чтобы освободить курсор" +msgid "Press %s or middle button to release mouse" +msgstr "Нажмите %s или среднюю кнопку мыши, чтобы освободить курсор" msgid "Bus" msgstr "Шина" diff --git a/src/qt/languages/sk-SK.po b/src/qt/languages/sk-SK.po index 6039adedc..f11f335d4 100644 --- a/src/qt/languages/sk-SK.po +++ b/src/qt/languages/sk-SK.po @@ -630,8 +630,8 @@ msgstr "Kritická chyba" msgid " - PAUSED" msgstr " - POZASTAVENÝ" -msgid "Press Ctrl+Alt+PgDn to return to windowed mode." -msgstr "Stlačte Ctrl+Alt+PgDn pre návrat z režimu celej obrazovky." +msgid "Press %s to return to windowed mode." +msgstr "Stlačte %s pre návrat z režimu celej obrazovky." msgid "Speed" msgstr "Rýchlosť" @@ -717,11 +717,11 @@ msgstr "Iné príslušenstvo" msgid "Click to capture mouse" msgstr "Kliknite pre zabráni myši" -msgid "Press %1 to release mouse" -msgstr "Stlačte %1 pre uvoľnenie myši" +msgid "Press %s to release mouse" +msgstr "Stlačte %s pre uvoľnenie myši" -msgid "Press %1 or middle button to release mouse" -msgstr "Stlačte %1 alebo prostredné tlačidlo na uvoľnenie myši" +msgid "Press %s or middle button to release mouse" +msgstr "Stlačte %s alebo prostredné tlačidlo na uvoľnenie myši" msgid "Bus" msgstr "Zbernica" diff --git a/src/qt/languages/sl-SI.po b/src/qt/languages/sl-SI.po index b6641f8a1..7c2b36650 100644 --- a/src/qt/languages/sl-SI.po +++ b/src/qt/languages/sl-SI.po @@ -630,8 +630,8 @@ msgstr "Kritična napaka" msgid " - PAUSED" msgstr " - ZAUSTAVLJEN" -msgid "Press Ctrl+Alt+PgDn to return to windowed mode." -msgstr "Pritisnite Ctrl+Alt+PgDn za povratek iz celozaslonskega načina." +msgid "Press %s to return to windowed mode." +msgstr "Pritisnite %s za povratek iz celozaslonskega načina." msgid "Speed" msgstr "Hitrost" @@ -717,11 +717,11 @@ msgstr "Druga periferija" msgid "Click to capture mouse" msgstr "Kliknite za zajem miške" -msgid "Press %1 to release mouse" -msgstr "Pritisnite %1 za izpust miške" +msgid "Press %s to release mouse" +msgstr "Pritisnite %s za izpust miške" -msgid "Press %1 or middle button to release mouse" -msgstr "Pritisnite %1 ali srednji gumb za izpust miške" +msgid "Press %s or middle button to release mouse" +msgstr "Pritisnite %s ali srednji gumb za izpust miške" msgid "Bus" msgstr "Vodilo" diff --git a/src/qt/languages/sv-SE.po b/src/qt/languages/sv-SE.po index a47997225..61152c663 100644 --- a/src/qt/languages/sv-SE.po +++ b/src/qt/languages/sv-SE.po @@ -630,8 +630,8 @@ msgstr "Allvarligt fel" msgid " - PAUSED" msgstr " - PAUSAD" -msgid "Press Ctrl+Alt+PgDn to return to windowed mode." -msgstr "Tryck på Ctrl+Alt+PgDn för att återvända till fönsterläge." +msgid "Press %s to return to windowed mode." +msgstr "Tryck på %s för att återvända till fönsterläge." msgid "Speed" msgstr "Hastighet" @@ -717,11 +717,11 @@ msgstr "Andra tillbehör" msgid "Click to capture mouse" msgstr "Klicka för att fånga upp musen" -msgid "Press %1 to release mouse" -msgstr "Tryck på %1 för att släppa musen" +msgid "Press %s to release mouse" +msgstr "Tryck på %s för att släppa musen" -msgid "Press %1 or middle button to release mouse" -msgstr "Tryck på %1 eller mellersta musknappen för att släppa musen" +msgid "Press %s or middle button to release mouse" +msgstr "Tryck på %s eller mellersta musknappen för att släppa musen" msgid "Bus" msgstr "Buss" diff --git a/src/qt/languages/tr-TR.po b/src/qt/languages/tr-TR.po index e9a42a896..de111c59b 100644 --- a/src/qt/languages/tr-TR.po +++ b/src/qt/languages/tr-TR.po @@ -630,8 +630,8 @@ msgstr "Kritik hata" msgid " - PAUSED" msgstr " - DURAKLATILDI" -msgid "Press Ctrl+Alt+PgDn to return to windowed mode." -msgstr "Pencere moduna geri dönmek için Ctrl+Alt+PgDn tuşlarına basın." +msgid "Press %s to return to windowed mode." +msgstr "Pencere moduna geri dönmek için %s tuşlarına basın." msgid "Speed" msgstr "Hız" @@ -717,11 +717,11 @@ msgstr "Diğer cihazlar" msgid "Click to capture mouse" msgstr "Farenin yakalanması için tıklayın" -msgid "Press %1 to release mouse" -msgstr "Farenin bırakılması için %1 tuşlarına basın" +msgid "Press %s to release mouse" +msgstr "Farenin bırakılması için %s tuşlarına basın" -msgid "Press %1 or middle button to release mouse" -msgstr "Farenin bırakılması için %1 tuşlarına veya tekerlek tuşuna basın" +msgid "Press %s or middle button to release mouse" +msgstr "Farenin bırakılması için %s tuşlarına veya tekerlek tuşuna basın" msgid "Bus" msgstr "Veri yolu" diff --git a/src/qt/languages/uk-UA.po b/src/qt/languages/uk-UA.po index bceb7bea5..db9b73491 100644 --- a/src/qt/languages/uk-UA.po +++ b/src/qt/languages/uk-UA.po @@ -630,8 +630,8 @@ msgstr "Непереробна помилка" msgid " - PAUSED" msgstr " - ПРИЗУПИНЕННЯ" -msgid "Press Ctrl+Alt+PgDn to return to windowed mode." -msgstr "Натисніть Ctrl+Alt+PgDn для повернення у віконний режим." +msgid "Press %s to return to windowed mode." +msgstr "Натисніть %s для повернення у віконний режим." msgid "Speed" msgstr "Швидкість" @@ -717,11 +717,11 @@ msgstr "Інша периферія" msgid "Click to capture mouse" msgstr "Клацніть мишею для захвату курсора" -msgid "Press %1 to release mouse" -msgstr "Натисніть %1, щоб звільнити курсор" +msgid "Press %s to release mouse" +msgstr "Натисніть %s, щоб звільнити курсор" -msgid "Press %1 or middle button to release mouse" -msgstr "Натисніть %1 або середню кнопку миші, щоб звільнити курсор" +msgid "Press %s or middle button to release mouse" +msgstr "Натисніть %s або середню кнопку миші, щоб звільнити курсор" msgid "Bus" msgstr "Шина" diff --git a/src/qt/languages/vi-VN.po b/src/qt/languages/vi-VN.po index e14386bf8..e21466a18 100644 --- a/src/qt/languages/vi-VN.po +++ b/src/qt/languages/vi-VN.po @@ -630,8 +630,8 @@ msgstr "Lỗi nghiêm trọng" msgid " - PAUSED" msgstr " - TẠM DỪNG" -msgid "Press Ctrl+Alt+PgDn to return to windowed mode." -msgstr "Bấm Ctrl+Alt+PgDn để quay lại chế độ cửa sổ." +msgid "Press %s to return to windowed mode." +msgstr "Bấm %s để quay lại chế độ cửa sổ." msgid "Speed" msgstr "Vận tốc" @@ -717,11 +717,11 @@ msgstr "Thiết bị ngoại vi khác" msgid "Click to capture mouse" msgstr "Nhấp vào khung hình để 'nhốt' chuột vào" -msgid "Press %1 to release mouse" -msgstr "Nhấn %1 để thả chuột" +msgid "Press %s to release mouse" +msgstr "Nhấn %s để thả chuột" -msgid "Press %1 or middle button to release mouse" -msgstr "Nhấn %1 hoặc nhấp chuột giữa để thả chuột" +msgid "Press %s or middle button to release mouse" +msgstr "Nhấn %s hoặc nhấp chuột giữa để thả chuột" msgid "Bus" msgstr "Bus" diff --git a/src/qt/languages/zh-CN.po b/src/qt/languages/zh-CN.po index 9f6cc0328..c29e40dfb 100644 --- a/src/qt/languages/zh-CN.po +++ b/src/qt/languages/zh-CN.po @@ -717,11 +717,11 @@ msgstr "其他外围设备" msgid "Click to capture mouse" msgstr "单击窗口捕捉鼠标" -msgid "Press %1 to release mouse" -msgstr "按下 %1 释放鼠标" +msgid "Press %s to release mouse" +msgstr "按下 %s 释放鼠标" -msgid "Press %1 or middle button to release mouse" -msgstr "按下 %1 或鼠标中键释放鼠标" +msgid "Press %s or middle button to release mouse" +msgstr "按下 %s 或鼠标中键释放鼠标" msgid "Bus" msgstr "总线" diff --git a/src/qt/languages/zh-TW.po b/src/qt/languages/zh-TW.po index aefa89d5f..7de6f8cd3 100644 --- a/src/qt/languages/zh-TW.po +++ b/src/qt/languages/zh-TW.po @@ -717,11 +717,11 @@ msgstr "其他周邊裝置" msgid "Click to capture mouse" msgstr "點擊視窗捕捉滑鼠" -msgid "Press %1 to release mouse" -msgstr "按下 %1 釋放滑鼠" +msgid "Press %s to release mouse" +msgstr "按下 %s 釋放滑鼠" -msgid "Press %1 or middle button to release mouse" -msgstr "按下 %1 或滑鼠中鍵釋放滑鼠" +msgid "Press %s or middle button to release mouse" +msgstr "按下 %s 或滑鼠中鍵釋放滑鼠" msgid "Bus" msgstr "匯流排" diff --git a/src/qt/qt_mainwindow.cpp b/src/qt/qt_mainwindow.cpp index d79cc1b9e..1fb9b3fb5 100644 --- a/src/qt/qt_mainwindow.cpp +++ b/src/qt/qt_mainwindow.cpp @@ -1295,7 +1295,7 @@ MainWindow::on_actionFullscreen_triggered() bool wasCaptured = mouse_capture == 1; char strFullscreen[100]; - sprintf(strFullscreen, qPrintable(tr("To return to windowed mode, press %s")), acc_keys[FindAccelerator("fullscreen")].seq); + sprintf(strFullscreen, qPrintable(tr("Press %s to return to windowed mode.")), acc_keys[FindAccelerator("fullscreen")].seq); QMessageBox questionbox(QMessageBox::Icon::Information, tr("Entering fullscreen mode"), QString(strFullscreen), QMessageBox::Ok, this); QCheckBox *chkbox = new QCheckBox(tr("Don't show this message again")); From a0f90f7c98830bd826d74e7e5c4d926c1683dfa6 Mon Sep 17 00:00:00 2001 From: snake-4 <18491360+snake-4@users.noreply.github.com> Date: Mon, 21 Apr 2025 03:29:00 +0200 Subject: [PATCH 048/180] Fixed stack overflow in CharPointer::operator= --- src/qt/qt_platform.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/qt/qt_platform.cpp b/src/qt/qt_platform.cpp index 26682528d..be40452fd 100644 --- a/src/qt/qt_platform.cpp +++ b/src/qt/qt_platform.cpp @@ -87,13 +87,13 @@ public: CharPointer &operator=(const QByteArray &ba) { if (s > 0) { + // If the size is known, copy up to s - 1 bytes + // and null-terminate the string. strncpy(b, ba.data(), s - 1); - b[s] = 0; - } else { - // if we haven't been told the length of b, just assume enough - // because we didn't get it from emulator code + b[s - 1] = 0; + } else if (ba.size() > 0) { + // If the size is unknown, copy the whole QByteArray strcpy(b, ba.data()); - b[ba.size()] = 0; } return *this; } From 46546f203289ed0a7f2e59f202c28786ed667133 Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Mon, 21 Apr 2025 14:46:21 +0600 Subject: [PATCH 049/180] Keybind UI fixes 1. Don't clear the description text cell if selected; clear the actual keybind text instead. 2. Header texts are now correct. 3. Make the keybind dialog model and usable with dark mode --- src/qt/qt_keybind.cpp | 13 +++++++------ src/qt/qt_keybind.hpp | 2 +- src/qt/qt_settingsinput.cpp | 6 +++--- 3 files changed, 11 insertions(+), 10 deletions(-) diff --git a/src/qt/qt_keybind.cpp b/src/qt/qt_keybind.cpp index e8cbbf5b6..8b0f52eab 100644 --- a/src/qt/qt_keybind.cpp +++ b/src/qt/qt_keybind.cpp @@ -6,15 +6,15 @@ * * This file is part of the 86Box distribution. * - * Device configuration UI code. + * Keybind dialog * * * - * Authors: Joakim L. Gilje + * Authors: Cathode Ray Dude * Cacodemon345 * - * Copyright 2021 Joakim L. Gilje - * Copyright 2022 Cacodemon345 + * Copyright 2025 Cathode Ray Dude + * Copyright 2025 Cacodemon345 */ #include "qt_keybind.hpp" #include "ui_qt_keybind.h" @@ -85,12 +85,13 @@ bool KeyBinder::eventFilter(QObject *obj, QEvent *event) } QKeySequence -KeyBinder::BindKey(QString CurValue) +KeyBinder::BindKey(QWidget* widget, QString CurValue) { - KeyBinder kb; + KeyBinder kb(widget); kb.setWindowTitle("Bind Key"); kb.setFixedSize(kb.minimumSizeHint()); kb.findChild()->setKeySequence(QKeySequence::fromString(CurValue)); + kb.setEnabled(true); if (kb.exec() == QDialog::Accepted) { QKeySequenceEdit *seq = kb.findChild(); diff --git a/src/qt/qt_keybind.hpp b/src/qt/qt_keybind.hpp index e8e7b6e5e..393ee0f5c 100644 --- a/src/qt/qt_keybind.hpp +++ b/src/qt/qt_keybind.hpp @@ -22,7 +22,7 @@ public: explicit KeyBinder(QWidget *parent = nullptr); ~KeyBinder() override; - static QKeySequence BindKey(QString CurValue); + static QKeySequence BindKey(QWidget* widget, QString CurValue); private: Ui::KeyBinder *ui; diff --git a/src/qt/qt_settingsinput.cpp b/src/qt/qt_settingsinput.cpp index f87296451..bf5035110 100644 --- a/src/qt/qt_settingsinput.cpp +++ b/src/qt/qt_settingsinput.cpp @@ -63,7 +63,7 @@ SettingsInput::SettingsInput(QWidget *parent) keyTable->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch); QStringList headers; //headers << "Action" << "Bound key"; - keyTable->setHorizontalHeaderLabels(headers); + keyTable->setHorizontalHeaderLabels(horizontalHeader); keyTable->verticalHeader()->setVisible(false); keyTable->setEditTriggers(QAbstractItemView::NoEditTriggers); keyTable->setSelectionBehavior(QAbstractItemView::SelectRows); @@ -201,7 +201,7 @@ SettingsInput::on_tableKeys_doubleClicked(int row, int col) QTableWidgetItem *cell = ui->tableKeys->item(row,1); if (!cell) return; - QKeySequence keyseq = KeyBinder::BindKey(cell->text()); + QKeySequence keyseq = KeyBinder::BindKey(this, cell->text()); if (keyseq != false) { // If no change was made, don't change anything. if (keyseq.toString(QKeySequence::NativeText) == cell->text()) return; @@ -247,7 +247,7 @@ void SettingsInput::on_pushButtonClearBind_Clicked() { // Wipe bind - QTableWidgetItem *cell = ui->tableKeys->currentItem(); + QTableWidgetItem *cell = ui->tableKeys->item(ui->tableKeys->currentRow(), 1); if (!cell) return; cell->setText(""); From 0e634a3b7fa9eec1aa61c29d70fff6051d221fad Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Mon, 21 Apr 2025 16:13:11 +0600 Subject: [PATCH 050/180] HDD tooltips now list paths of disk images, CHS and their sizes --- src/qt/qt_machinestatus.cpp | 48 +++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/src/qt/qt_machinestatus.cpp b/src/qt/qt_machinestatus.cpp index d86dae7b9..c8f089749 100644 --- a/src/qt/qt_machinestatus.cpp +++ b/src/qt/qt_machinestatus.cpp @@ -640,6 +640,14 @@ MachineStatus::refresh(QStatusBar *sbar) d->hdds[HDD_BUS_MFM].setActive(false); d->hdds[HDD_BUS_MFM].refresh(); d->hdds[HDD_BUS_MFM].label->setToolTip(tr("Hard disk (%1)").arg("MFM/RLL")); + auto tooltip = d->hdds[HDD_BUS_MFM].label->toolTip(); + tooltip.append("\n"); + for (int i = 0; i < HDD_NUM; i++) { + if (hdd[i].bus_type == HDD_BUS_MFM && hdd[i].fn[0] != 0) { + tooltip.append(QString("\n%5:%6: %1 (C:H:S = %2:%3:%4, %7 MB)").arg(QString::fromUtf8(hdd[i].fn), QString::number(hdd[i].tracks), QString::number(hdd[i].hpc), QString::number(hdd[i].spt), QString::number(hdd[i].channel >> 1), QString::number(hdd[i].channel & 1), QString::number((((qulonglong)hdd[i].hpc * (qulonglong)hdd[i].spt * (qulonglong)hdd[i].tracks) * 512ull) / 1048576ull))); + } + } + d->hdds[HDD_BUS_MFM].label->setToolTip(tooltip); sbar->addWidget(d->hdds[HDD_BUS_MFM].label.get()); } if ((has_esdi || (hdc_name.left(4) == QStringLiteral("esdi"))) && (c_esdi > 0)) { @@ -647,6 +655,14 @@ MachineStatus::refresh(QStatusBar *sbar) d->hdds[HDD_BUS_ESDI].setActive(false); d->hdds[HDD_BUS_ESDI].refresh(); d->hdds[HDD_BUS_ESDI].label->setToolTip(tr("Hard disk (%1)").arg("ESDI")); + auto tooltip = d->hdds[HDD_BUS_ESDI].label->toolTip(); + tooltip.append("\n"); + for (int i = 0; i < HDD_NUM; i++) { + if (hdd[i].bus_type == HDD_BUS_ESDI && hdd[i].fn[0] != 0) { + tooltip.append(QString("\n%5:%6: %1 (C:H:S = %2:%3:%4, %7 MB)").arg(QString::fromUtf8(hdd[i].fn), QString::number(hdd[i].tracks), QString::number(hdd[i].hpc), QString::number(hdd[i].spt), QString::number(hdd[i].channel >> 1), QString::number(hdd[i].channel & 1), QString::number((((qulonglong)hdd[i].hpc * (qulonglong)hdd[i].spt * (qulonglong)hdd[i].tracks) * 512ull) / 1048576ull))); + } + } + d->hdds[HDD_BUS_ESDI].label->setToolTip(tooltip); sbar->addWidget(d->hdds[HDD_BUS_ESDI].label.get()); } if ((has_xta || (hdc_name.left(3) == QStringLiteral("xta"))) && (c_xta > 0)) { @@ -654,6 +670,14 @@ MachineStatus::refresh(QStatusBar *sbar) d->hdds[HDD_BUS_XTA].setActive(false); d->hdds[HDD_BUS_XTA].refresh(); d->hdds[HDD_BUS_XTA].label->setToolTip(tr("Hard disk (%1)").arg("XTA")); + auto tooltip = d->hdds[HDD_BUS_XTA].label->toolTip(); + tooltip.append("\n"); + for (int i = 0; i < HDD_NUM; i++) { + if (hdd[i].bus_type == HDD_BUS_XTA && hdd[i].fn[0] != 0) { + tooltip.append(QString("\n%5:%6: %1 (C:H:S = %2:%3:%4, %7 MB)").arg(QString::fromUtf8(hdd[i].fn), QString::number(hdd[i].tracks), QString::number(hdd[i].hpc), QString::number(hdd[i].spt), QString::number(hdd[i].channel >> 1), QString::number(hdd[i].channel & 1), QString::number((((qulonglong)hdd[i].hpc * (qulonglong)hdd[i].spt * (qulonglong)hdd[i].tracks) * 512ull) / 1048576ull))); + } + } + d->hdds[HDD_BUS_XTA].label->setToolTip(tooltip); sbar->addWidget(d->hdds[HDD_BUS_XTA].label.get()); } if (hasIDE() || (hdc_name.left(5) == QStringLiteral("xtide")) || @@ -664,6 +688,14 @@ MachineStatus::refresh(QStatusBar *sbar) d->hdds[HDD_BUS_IDE].setActive(false); d->hdds[HDD_BUS_IDE].refresh(); d->hdds[HDD_BUS_IDE].label->setToolTip(tr("Hard disk (%1)").arg("IDE")); + auto tooltip = d->hdds[HDD_BUS_IDE].label->toolTip(); + tooltip.append("\n"); + for (int i = 0; i < HDD_NUM; i++) { + if (hdd[i].bus_type == HDD_BUS_IDE && hdd[i].fn[0] != 0) { + tooltip.append(QString("\n%5:%6: %1 (C:H:S = %2:%3:%4, %7 MB)").arg(QString::fromUtf8(hdd[i].fn), QString::number(hdd[i].tracks), QString::number(hdd[i].hpc), QString::number(hdd[i].spt), QString::number(hdd[i].channel >> 1), QString::number(hdd[i].channel & 1), QString::number((((qulonglong)hdd[i].hpc * (qulonglong)hdd[i].spt * (qulonglong)hdd[i].tracks) * 512ull) / 1048576ull))); + } + } + d->hdds[HDD_BUS_IDE].label->setToolTip(tooltip); sbar->addWidget(d->hdds[HDD_BUS_IDE].label.get()); } if (c_atapi > 0) { @@ -671,6 +703,14 @@ MachineStatus::refresh(QStatusBar *sbar) d->hdds[HDD_BUS_ATAPI].setActive(false); d->hdds[HDD_BUS_ATAPI].refresh(); d->hdds[HDD_BUS_ATAPI].label->setToolTip(tr("Hard disk (%1)").arg("ATAPI")); + auto tooltip = d->hdds[HDD_BUS_ATAPI].label->toolTip(); + tooltip.append("\n"); + for (int i = 0; i < HDD_NUM; i++) { + if (hdd[i].bus_type == HDD_BUS_ATAPI && hdd[i].fn[0] != 0) { + tooltip.append(QString("\n%5:%6: %1 (C:H:S = %2:%3:%4, %7 MB)").arg(QString::fromUtf8(hdd[i].fn), QString::number(hdd[i].tracks), QString::number(hdd[i].hpc), QString::number(hdd[i].spt), QString::number(hdd[i].channel >> 1), QString::number(hdd[i].channel & 1), QString::number((((qulonglong)hdd[i].hpc * (qulonglong)hdd[i].spt * (qulonglong)hdd[i].tracks) * 512ull) / 1048576ull))); + } + } + d->hdds[HDD_BUS_ATAPI].label->setToolTip(tooltip); sbar->addWidget(d->hdds[HDD_BUS_ATAPI].label.get()); } } @@ -682,6 +722,14 @@ MachineStatus::refresh(QStatusBar *sbar) d->hdds[HDD_BUS_SCSI].setActive(false); d->hdds[HDD_BUS_SCSI].refresh(); d->hdds[HDD_BUS_SCSI].label->setToolTip(tr("Hard disk (%1)").arg("SCSI")); + auto tooltip = d->hdds[HDD_BUS_SCSI].label->toolTip(); + tooltip.append("\n"); + for (int i = 0; i < HDD_NUM; i++) { + if (hdd[i].bus_type == HDD_BUS_SCSI && hdd[i].fn[0] != 0) { + tooltip.append(QString("\n%5:%6: %1 (C:H:S = %2:%3:%4, %7 MB)").arg(QString::fromUtf8(hdd[i].fn), QString::number(hdd[i].tracks), QString::number(hdd[i].hpc), QString::number(hdd[i].spt), QString::number(hdd[i].channel >> 4), QString::asprintf("%02d", hdd[i].channel & 15), QString::number((((qulonglong)hdd[i].hpc * (qulonglong)hdd[i].spt * (qulonglong)hdd[i].tracks) * 512ull) / 1048576ull))); + } + } + d->hdds[HDD_BUS_SCSI].label->setToolTip(tooltip); sbar->addWidget(d->hdds[HDD_BUS_SCSI].label.get()); } From c7db5122b76ca68cf99e22dcea76715c0847863d Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Mon, 21 Apr 2025 17:25:12 +0600 Subject: [PATCH 051/180] Make `MB` in HDD tooltips translated --- src/qt/qt_machinestatus.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/qt/qt_machinestatus.cpp b/src/qt/qt_machinestatus.cpp index c8f089749..f93734887 100644 --- a/src/qt/qt_machinestatus.cpp +++ b/src/qt/qt_machinestatus.cpp @@ -644,7 +644,7 @@ MachineStatus::refresh(QStatusBar *sbar) tooltip.append("\n"); for (int i = 0; i < HDD_NUM; i++) { if (hdd[i].bus_type == HDD_BUS_MFM && hdd[i].fn[0] != 0) { - tooltip.append(QString("\n%5:%6: %1 (C:H:S = %2:%3:%4, %7 MB)").arg(QString::fromUtf8(hdd[i].fn), QString::number(hdd[i].tracks), QString::number(hdd[i].hpc), QString::number(hdd[i].spt), QString::number(hdd[i].channel >> 1), QString::number(hdd[i].channel & 1), QString::number((((qulonglong)hdd[i].hpc * (qulonglong)hdd[i].spt * (qulonglong)hdd[i].tracks) * 512ull) / 1048576ull))); + tooltip.append(QString("\n%5:%6: %1 (C:H:S = %2:%3:%4, %7 %8)").arg(QString::fromUtf8(hdd[i].fn), QString::number(hdd[i].tracks), QString::number(hdd[i].hpc), QString::number(hdd[i].spt), QString::number(hdd[i].channel >> 1), QString::number(hdd[i].channel & 1), QString::number((((qulonglong)hdd[i].hpc * (qulonglong)hdd[i].spt * (qulonglong)hdd[i].tracks) * 512ull) / 1048576ull), tr("MB"))); } } d->hdds[HDD_BUS_MFM].label->setToolTip(tooltip); @@ -659,7 +659,7 @@ MachineStatus::refresh(QStatusBar *sbar) tooltip.append("\n"); for (int i = 0; i < HDD_NUM; i++) { if (hdd[i].bus_type == HDD_BUS_ESDI && hdd[i].fn[0] != 0) { - tooltip.append(QString("\n%5:%6: %1 (C:H:S = %2:%3:%4, %7 MB)").arg(QString::fromUtf8(hdd[i].fn), QString::number(hdd[i].tracks), QString::number(hdd[i].hpc), QString::number(hdd[i].spt), QString::number(hdd[i].channel >> 1), QString::number(hdd[i].channel & 1), QString::number((((qulonglong)hdd[i].hpc * (qulonglong)hdd[i].spt * (qulonglong)hdd[i].tracks) * 512ull) / 1048576ull))); + tooltip.append(QString("\n%5:%6: %1 (C:H:S = %2:%3:%4, %7 %8)").arg(QString::fromUtf8(hdd[i].fn), QString::number(hdd[i].tracks), QString::number(hdd[i].hpc), QString::number(hdd[i].spt), QString::number(hdd[i].channel >> 1), QString::number(hdd[i].channel & 1), QString::number((((qulonglong)hdd[i].hpc * (qulonglong)hdd[i].spt * (qulonglong)hdd[i].tracks) * 512ull) / 1048576ull), tr("MB"))); } } d->hdds[HDD_BUS_ESDI].label->setToolTip(tooltip); @@ -674,7 +674,7 @@ MachineStatus::refresh(QStatusBar *sbar) tooltip.append("\n"); for (int i = 0; i < HDD_NUM; i++) { if (hdd[i].bus_type == HDD_BUS_XTA && hdd[i].fn[0] != 0) { - tooltip.append(QString("\n%5:%6: %1 (C:H:S = %2:%3:%4, %7 MB)").arg(QString::fromUtf8(hdd[i].fn), QString::number(hdd[i].tracks), QString::number(hdd[i].hpc), QString::number(hdd[i].spt), QString::number(hdd[i].channel >> 1), QString::number(hdd[i].channel & 1), QString::number((((qulonglong)hdd[i].hpc * (qulonglong)hdd[i].spt * (qulonglong)hdd[i].tracks) * 512ull) / 1048576ull))); + tooltip.append(QString("\n%5:%6: %1 (C:H:S = %2:%3:%4, %7 %8)").arg(QString::fromUtf8(hdd[i].fn), QString::number(hdd[i].tracks), QString::number(hdd[i].hpc), QString::number(hdd[i].spt), QString::number(hdd[i].channel >> 1), QString::number(hdd[i].channel & 1), QString::number((((qulonglong)hdd[i].hpc * (qulonglong)hdd[i].spt * (qulonglong)hdd[i].tracks) * 512ull) / 1048576ull), tr("MB"))); } } d->hdds[HDD_BUS_XTA].label->setToolTip(tooltip); @@ -692,7 +692,7 @@ MachineStatus::refresh(QStatusBar *sbar) tooltip.append("\n"); for (int i = 0; i < HDD_NUM; i++) { if (hdd[i].bus_type == HDD_BUS_IDE && hdd[i].fn[0] != 0) { - tooltip.append(QString("\n%5:%6: %1 (C:H:S = %2:%3:%4, %7 MB)").arg(QString::fromUtf8(hdd[i].fn), QString::number(hdd[i].tracks), QString::number(hdd[i].hpc), QString::number(hdd[i].spt), QString::number(hdd[i].channel >> 1), QString::number(hdd[i].channel & 1), QString::number((((qulonglong)hdd[i].hpc * (qulonglong)hdd[i].spt * (qulonglong)hdd[i].tracks) * 512ull) / 1048576ull))); + tooltip.append(QString("\n%5:%6: %1 (C:H:S = %2:%3:%4, %7 %8)").arg(QString::fromUtf8(hdd[i].fn), QString::number(hdd[i].tracks), QString::number(hdd[i].hpc), QString::number(hdd[i].spt), QString::number(hdd[i].channel >> 1), QString::number(hdd[i].channel & 1), QString::number((((qulonglong)hdd[i].hpc * (qulonglong)hdd[i].spt * (qulonglong)hdd[i].tracks) * 512ull) / 1048576ull), tr("MB"))); } } d->hdds[HDD_BUS_IDE].label->setToolTip(tooltip); @@ -707,7 +707,7 @@ MachineStatus::refresh(QStatusBar *sbar) tooltip.append("\n"); for (int i = 0; i < HDD_NUM; i++) { if (hdd[i].bus_type == HDD_BUS_ATAPI && hdd[i].fn[0] != 0) { - tooltip.append(QString("\n%5:%6: %1 (C:H:S = %2:%3:%4, %7 MB)").arg(QString::fromUtf8(hdd[i].fn), QString::number(hdd[i].tracks), QString::number(hdd[i].hpc), QString::number(hdd[i].spt), QString::number(hdd[i].channel >> 1), QString::number(hdd[i].channel & 1), QString::number((((qulonglong)hdd[i].hpc * (qulonglong)hdd[i].spt * (qulonglong)hdd[i].tracks) * 512ull) / 1048576ull))); + tooltip.append(QString("\n%5:%6: %1 (C:H:S = %2:%3:%4, %7 %8)").arg(QString::fromUtf8(hdd[i].fn), QString::number(hdd[i].tracks), QString::number(hdd[i].hpc), QString::number(hdd[i].spt), QString::number(hdd[i].channel >> 1), QString::number(hdd[i].channel & 1), QString::number((((qulonglong)hdd[i].hpc * (qulonglong)hdd[i].spt * (qulonglong)hdd[i].tracks) * 512ull) / 1048576ull), tr("MB"))); } } d->hdds[HDD_BUS_ATAPI].label->setToolTip(tooltip); @@ -726,7 +726,7 @@ MachineStatus::refresh(QStatusBar *sbar) tooltip.append("\n"); for (int i = 0; i < HDD_NUM; i++) { if (hdd[i].bus_type == HDD_BUS_SCSI && hdd[i].fn[0] != 0) { - tooltip.append(QString("\n%5:%6: %1 (C:H:S = %2:%3:%4, %7 MB)").arg(QString::fromUtf8(hdd[i].fn), QString::number(hdd[i].tracks), QString::number(hdd[i].hpc), QString::number(hdd[i].spt), QString::number(hdd[i].channel >> 4), QString::asprintf("%02d", hdd[i].channel & 15), QString::number((((qulonglong)hdd[i].hpc * (qulonglong)hdd[i].spt * (qulonglong)hdd[i].tracks) * 512ull) / 1048576ull))); + tooltip.append(QString("\n%5:%6: %1 (C:H:S = %2:%3:%4, %7 %8)").arg(QString::fromUtf8(hdd[i].fn), QString::number(hdd[i].tracks), QString::number(hdd[i].hpc), QString::number(hdd[i].spt), QString::number(hdd[i].channel >> 4), QString::asprintf("%02d", hdd[i].channel & 15), QString::number((((qulonglong)hdd[i].hpc * (qulonglong)hdd[i].spt * (qulonglong)hdd[i].tracks) * 512ull) / 1048576ull), tr("MB"))); } } d->hdds[HDD_BUS_SCSI].label->setToolTip(tooltip); From 11a55708fb66e8fa1a65117741cbbab2eb4abfe8 Mon Sep 17 00:00:00 2001 From: OBattler Date: Mon, 21 Apr 2025 13:41:58 +0200 Subject: [PATCH 052/180] Made it compile as GUI again on Windows and made the help message a message box. --- CMakeLists.txt | 2 +- src/86box.c | 52 ++++++++++++++++++++++++++---------------------- src/qt/qt_ui.cpp | 9 ++++++++- 3 files changed, 37 insertions(+), 26 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index a6ffa89e5..007c1ffd8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -73,7 +73,7 @@ if(WIN32) # Default value for the `WIN32` target property, which specifies whether # to build the application for the Windows GUI or console subsystem - option(CMAKE_WIN32_EXECUTABLE "Build a Windows GUI executable" OFF) + option(CMAKE_WIN32_EXECUTABLE "Build a Windows GUI executable" ON) else() # Prefer dynamic builds everywhere else set(PREFER_STATIC OFF) diff --git a/src/86box.c b/src/86box.c index dae2d4ba5..cde98f5d8 100644 --- a/src/86box.c +++ b/src/86box.c @@ -666,40 +666,44 @@ usage: } } - printf("\nUsage: 86box [options] [cfg-file]\n\n"); - printf("Valid options are:\n\n"); - printf("-? or --help - show this information\n"); - printf("-C or --config path - set 'path' to be config file\n"); + ui_msgbox(MBX_INFO, L"\nUsage: 86box [options] [cfg-file]\n\n" + "Valid options are:\n\n" + "-? or --help\t\t\t- show this information\n" + "-C or --config path\t\t- set 'path' to be config file\n" #ifdef _WIN32 - printf("-D or --debug - force debug output logging\n"); + "-D or --debug\t\t\t- force debug output logging\n" #endif #if 0 - printf("-E or --nographic - forces the old behavior\n"); + "-E or --nographic\t\t- forces the old behavior\n" #endif - printf("-F or --fullscreen - start in fullscreen mode\n"); - printf("-G or --lang langid - start with specified language (e.g. en-US, or system)\n"); + "-F or --fullscreen\t\t- start in fullscreen mode\n" + "-G or --lang langid\t\t- start with specified language\n" + "\t\t\t\t (e.g. en-US, or system)\n" #ifdef _WIN32 - printf("-H or --hwnd id,hwnd - sends back the main dialog's hwnd\n"); + "-H or --hwnd id,hwnd\t\t- sends back the main dialog's hwnd\n" #endif - printf("-I or --image d:path - load 'path' as floppy image on drive d\n"); + "-I or --image d:path\t\t- load 'path' as floppy image on drive d\n" #ifdef USE_INSTRUMENT - printf("-J or --instrument name - set 'name' to be the profiling instrument\n"); + "-J or --instrument name\t- set 'name' to be the profiling instrument\n" #endif - printf("-L or --logfile path - set 'path' to be the logfile\n"); - printf("-M or --missing - dump missing machines and video cards\n"); - printf("-N or --noconfirm - do not ask for confirmation on quit\n"); - printf("-P or --vmpath path - set 'path' to be root for vm\n"); - printf("-R or --rompath path - set 'path' to be ROM path\n"); + "-L or --logfile pat\t\t- set 'path' to be the logfile\n" + "-M or --missing\t\t- dump missing machines and video cards\n" + "-N or --noconfirm\t\t- do not ask for confirmation on quit\n" + "-P or --vmpath path\t\t- set 'path' to be root for vm\n" + "-R or --rompath path\t\t- set 'path' to be ROM path\n" #ifndef USE_SDL_UI - printf("-S or --settings - show only the settings dialog\n"); + "-S or --settings\t\t\t- show only the settings dialog\n" #endif - printf("-T or --testmode - test mode: execute the test mode entry point on init/hard reset\n"); - printf("-V or --vmname name - overrides the name of the running VM\n"); - printf("-W or --nohook - disables keyboard hook (compatibility-only outside Windows)\n"); - printf("-X or --clear what - clears the 'what' (cmos/flash/both)\n"); - printf("-Y or --donothing - do not show any UI or run the emulation\n"); - printf("-Z or --lastvmpath - the last parameter is VM path rather than config\n"); - printf("\nA config file can be specified. If none is, the default file will be used.\n"); + "-T or --testmode\t\t- test mode: execute the test mode entry\n" + "\t\t\t\t point on init/hard reset\n" + "-V or --vmname name\t\t- overrides the name of the running VM\n" + "-W or --nohook\t\t- disables keyboard hook\n" + "\t\t\t\t (compatibility-only outside Windows)\n" + "-X or --clear what\t\t- clears the 'what' (cmos/flash/both)\n" + "-Y or --donothing\t\t- do not show any UI or run the emulation\n" + "-Z or --lastvmpath\t\t- the last parameter is VM path rather\n" + "\t\t\t\t than config\n" + "\nA config file can be specified. If none is, the default file will be used.\n"); return 0; } else if (!strcasecmp(argv[c], "--lastvmpath") || !strcasecmp(argv[c], "-Z")) { lvmp = 1; diff --git a/src/qt/qt_ui.cpp b/src/qt/qt_ui.cpp index 57f8001dc..b4e8a5486 100644 --- a/src/qt/qt_ui.cpp +++ b/src/qt/qt_ui.cpp @@ -141,7 +141,14 @@ ui_msgbox_header(int flags, void *header, void *message) // any error in early init if (main_window == nullptr) { - QMessageBox msgBox(QMessageBox::Icon::Critical, hdr, msg); + auto msgicon = QMessageBox::Icon::Critical; + if (flags & MBX_INFO) + msgicon = QMessageBox::Icon::Information; + else if (flags & MBX_QUESTION) + msgicon = QMessageBox::Icon::Question; + else if (flags & MBX_WARNING) + msgicon = QMessageBox::Icon::Warning; + QMessageBox msgBox(msgicon, hdr, msg); msgBox.exec(); } else { // else scope it to main_window From ac25b87e48ce723f3d7896089634fe2e0b603148 Mon Sep 17 00:00:00 2001 From: OBattler Date: Mon, 21 Apr 2025 13:42:28 +0200 Subject: [PATCH 053/180] Fix a warning in QT. --- src/qt/qt_settingsinput.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/qt/qt_settingsinput.cpp b/src/qt/qt_settingsinput.cpp index bf5035110..79225cb91 100644 --- a/src/qt/qt_settingsinput.cpp +++ b/src/qt/qt_settingsinput.cpp @@ -48,7 +48,6 @@ SettingsInput::SettingsInput(QWidget *parent) { ui->setupUi(this); - QStandardItemModel *model; QStringList horizontalHeader; QStringList verticalHeader; From 5d33bc0dc23be9bfa95567b5121c0a02ff3a7c49 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miran=20Gr=C4=8Da?= Date: Mon, 21 Apr 2025 14:20:57 +0200 Subject: [PATCH 054/180] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index c01a852b5..ee0e1e7f1 100644 --- a/README.md +++ b/README.md @@ -30,9 +30,9 @@ Performance may vary depending on both host and guest configuration. Most emulat It is also recommended to use a manager application with 86Box for easier handling of multiple virtual machines. +* [Avalonia 86](https://github.com/notBald/Avalonia86) by [notBald](https://github.com/notBald) (Windows and Linux) * [86Box Manager](https://github.com/86Box/86BoxManager) by [Overdoze](https://github.com/daviunic) (Windows only) * [86Box Manager X](https://github.com/RetBox/86BoxManagerX) by [xafero](https://github.com/xafero) (Cross platform Port of 86Box Manager using Avalonia) -* [Avalonia 86](https://github.com/notBald/Avalonia86) by [notBald](https://github.com/notBald) (Windows and Linux) * [sl86](https://github.com/DDXofficial/sl86) by [DDX](https://github.com/DDXofficial) (Command-line 86Box machine manager written in Python) * [Linbox-qt5](https://github.com/Dungeonseeker/linbox-qt5) by [Dungeonseeker](https://github.com/Dungeonseeker/) (Linux focused, should work on Windows though untested) * [MacBox for 86Box](https://github.com/Moonif/MacBox) by [Moonif](https://github.com/Moonif) (MacOS only) From 369167dd9be5aa9fe4f54c9d5f1a2a8fa1728e9f Mon Sep 17 00:00:00 2001 From: richardg867 Date: Mon, 21 Apr 2025 21:05:54 -0300 Subject: [PATCH 055/180] Update Jenkinsfile Jenkins: Fix the branch build manifest change (note: new Windows build node starts here) --- .ci/Jenkinsfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.ci/Jenkinsfile b/.ci/Jenkinsfile index 04b0bc350..530349ced 100644 --- a/.ci/Jenkinsfile +++ b/.ci/Jenkinsfile @@ -20,7 +20,7 @@ def repository = ['https://github.com/86Box/86Box.git', scm.userRemoteConfigs[0] def commitBrowser = ['https://github.com/86Box/86Box/commit/%s', null] def branch = ['master', scm.branches[0].name] def buildType = ['beta', 'alpha'] -def tarballFlags = ['', '-s'] +def tarballFlags = ['', '-t'] def buildBranch = env.JOB_BASE_NAME.contains('-') ? 1 : 0 def osArchs = [ From 8790395a055578f29c2d1cac65178ecfa39301e6 Mon Sep 17 00:00:00 2001 From: OBattler Date: Tue, 22 Apr 2025 09:13:38 +0200 Subject: [PATCH 056/180] Fix the FXSAVE/FXRSTOR instructions. --- src/codegen/codegen_x86-64.c | 13 +++++++++ src/codegen/codegen_x86.c | 13 +++++++++ src/codegen_new/codegen.c | 12 +++++++++ src/codegen_new/codegen_reg.c | 1 + src/codegen_new/codegen_reg.h | 3 ++- src/cpu/386_common.c | 2 ++ src/cpu/cpu.h | 2 ++ src/cpu/x86_ops_fpu.h | 16 +++++++++++ src/cpu/x86_ops_fpu_2386.h | 16 +++++++++++ src/cpu/x86_ops_i686.h | 50 ++++++++++++++++++++++++----------- 10 files changed, 111 insertions(+), 17 deletions(-) diff --git a/src/codegen/codegen_x86-64.c b/src/codegen/codegen_x86-64.c index 00db630a3..adb97169d 100644 --- a/src/codegen/codegen_x86-64.c +++ b/src/codegen/codegen_x86-64.c @@ -819,6 +819,7 @@ codegen_generate_call(uint8_t opcode, OpFn op, uint32_t fetchdat, uint32_t new_p int pc_off = 0; int test_modrm = 1; int c; + uint16_t op87 = 0x0000; op_ea_seg = &cpu_state.seg_ds; op_ssegs = 0; @@ -872,6 +873,7 @@ codegen_generate_call(uint8_t opcode, OpFn op, uint32_t fetchdat, uint32_t new_p break; case 0xd8: + op87 = (op87 & 0xf800) | ((opcode & 0x07) << 8) | (fetchdat & 0xff); op_table = (op_32 & 0x200) ? x86_dynarec_opcodes_d8_a32 : x86_dynarec_opcodes_d8_a16; recomp_op_table = fpu_softfloat ? NULL : recomp_opcodes_d8; opcode_shift = 3; @@ -882,6 +884,7 @@ codegen_generate_call(uint8_t opcode, OpFn op, uint32_t fetchdat, uint32_t new_p block->flags |= CODEBLOCK_HAS_FPU; break; case 0xd9: + op87 = (op87 & 0xf800) | ((opcode & 0x07) << 8) | (fetchdat & 0xff); op_table = (op_32 & 0x200) ? x86_dynarec_opcodes_d9_a32 : x86_dynarec_opcodes_d9_a16; recomp_op_table = fpu_softfloat ? NULL : recomp_opcodes_d9; opcode_mask = 0xff; @@ -891,6 +894,7 @@ codegen_generate_call(uint8_t opcode, OpFn op, uint32_t fetchdat, uint32_t new_p block->flags |= CODEBLOCK_HAS_FPU; break; case 0xda: + op87 = (op87 & 0xf800) | ((opcode & 0x07) << 8) | (fetchdat & 0xff); op_table = (op_32 & 0x200) ? x86_dynarec_opcodes_da_a32 : x86_dynarec_opcodes_da_a16; recomp_op_table = fpu_softfloat ? NULL : recomp_opcodes_da; opcode_mask = 0xff; @@ -900,6 +904,7 @@ codegen_generate_call(uint8_t opcode, OpFn op, uint32_t fetchdat, uint32_t new_p block->flags |= CODEBLOCK_HAS_FPU; break; case 0xdb: + op87 = (op87 & 0xf800) | ((opcode & 0x07) << 8) | (fetchdat & 0xff); op_table = (op_32 & 0x200) ? x86_dynarec_opcodes_db_a32 : x86_dynarec_opcodes_db_a16; recomp_op_table = fpu_softfloat ? NULL : recomp_opcodes_db; opcode_mask = 0xff; @@ -909,6 +914,7 @@ codegen_generate_call(uint8_t opcode, OpFn op, uint32_t fetchdat, uint32_t new_p block->flags |= CODEBLOCK_HAS_FPU; break; case 0xdc: + op87 = (op87 & 0xf800) | ((opcode & 0x07) << 8) | (fetchdat & 0xff); op_table = (op_32 & 0x200) ? x86_dynarec_opcodes_dc_a32 : x86_dynarec_opcodes_dc_a16; recomp_op_table = fpu_softfloat ? NULL : recomp_opcodes_dc; opcode_shift = 3; @@ -919,6 +925,7 @@ codegen_generate_call(uint8_t opcode, OpFn op, uint32_t fetchdat, uint32_t new_p block->flags |= CODEBLOCK_HAS_FPU; break; case 0xdd: + op87 = (op87 & 0xf800) | ((opcode & 0x07) << 8) | (fetchdat & 0xff); op_table = (op_32 & 0x200) ? x86_dynarec_opcodes_dd_a32 : x86_dynarec_opcodes_dd_a16; recomp_op_table = fpu_softfloat ? NULL : recomp_opcodes_dd; opcode_mask = 0xff; @@ -928,6 +935,7 @@ codegen_generate_call(uint8_t opcode, OpFn op, uint32_t fetchdat, uint32_t new_p block->flags |= CODEBLOCK_HAS_FPU; break; case 0xde: + op87 = (op87 & 0xf800) | ((opcode & 0x07) << 8) | (fetchdat & 0xff); op_table = (op_32 & 0x200) ? x86_dynarec_opcodes_de_a32 : x86_dynarec_opcodes_de_a16; recomp_op_table = fpu_softfloat ? NULL : recomp_opcodes_de; opcode_mask = 0xff; @@ -937,6 +945,7 @@ codegen_generate_call(uint8_t opcode, OpFn op, uint32_t fetchdat, uint32_t new_p block->flags |= CODEBLOCK_HAS_FPU; break; case 0xdf: + op87 = (op87 & 0xf800) | ((opcode & 0x07) << 8) | (fetchdat & 0xff); op_table = (op_32 & 0x200) ? x86_dynarec_opcodes_df_a32 : x86_dynarec_opcodes_df_a16; recomp_op_table = fpu_softfloat ? NULL : recomp_opcodes_df; opcode_mask = 0xff; @@ -1000,6 +1009,10 @@ generate_call: recomp_op_table = recomp_opcodes; } + if (op87 != 0x0000) { + STORE_IMM_ADDR_W((uintptr_t) &x87_op, op87); + } + if (recomp_op_table && recomp_op_table[(opcode | op_32) & 0x1ff]) { uint32_t new_pc = recomp_op_table[(opcode | op_32) & 0x1ff](opcode, fetchdat, op_32, op_pc, block); if (new_pc) { diff --git a/src/codegen/codegen_x86.c b/src/codegen/codegen_x86.c index 935e2bab6..cb635d4f1 100644 --- a/src/codegen/codegen_x86.c +++ b/src/codegen/codegen_x86.c @@ -1858,6 +1858,7 @@ codegen_generate_call(uint8_t opcode, OpFn op, uint32_t fetchdat, uint32_t new_p int pc_off = 0; int test_modrm = 1; int c; + uint16_t op87 = 0x0000; op_ea_seg = &cpu_state.seg_ds; op_ssegs = 0; @@ -1912,6 +1913,7 @@ codegen_generate_call(uint8_t opcode, OpFn op, uint32_t fetchdat, uint32_t new_p break; case 0xd8: + op87 = (op87 & 0xf800) | ((opcode & 0x07) << 8) | (fetchdat & 0xff); op_table = (op_32 & 0x200) ? x86_dynarec_opcodes_d8_a32 : x86_dynarec_opcodes_d8_a16; recomp_op_table = fpu_softfloat ? NULL : recomp_opcodes_d8; opcode_shift = 3; @@ -1922,6 +1924,7 @@ codegen_generate_call(uint8_t opcode, OpFn op, uint32_t fetchdat, uint32_t new_p block->flags |= CODEBLOCK_HAS_FPU; break; case 0xd9: + op87 = (op87 & 0xf800) | ((opcode & 0x07) << 8) | (fetchdat & 0xff); op_table = (op_32 & 0x200) ? x86_dynarec_opcodes_d9_a32 : x86_dynarec_opcodes_d9_a16; recomp_op_table = fpu_softfloat ? NULL : recomp_opcodes_d9; opcode_mask = 0xff; @@ -1931,6 +1934,7 @@ codegen_generate_call(uint8_t opcode, OpFn op, uint32_t fetchdat, uint32_t new_p block->flags |= CODEBLOCK_HAS_FPU; break; case 0xda: + op87 = (op87 & 0xf800) | ((opcode & 0x07) << 8) | (fetchdat & 0xff); op_table = (op_32 & 0x200) ? x86_dynarec_opcodes_da_a32 : x86_dynarec_opcodes_da_a16; recomp_op_table = fpu_softfloat ? NULL : recomp_opcodes_da; opcode_mask = 0xff; @@ -1940,6 +1944,7 @@ codegen_generate_call(uint8_t opcode, OpFn op, uint32_t fetchdat, uint32_t new_p block->flags |= CODEBLOCK_HAS_FPU; break; case 0xdb: + op87 = (op87 & 0xf800) | ((opcode & 0x07) << 8) | (fetchdat & 0xff); op_table = (op_32 & 0x200) ? x86_dynarec_opcodes_db_a32 : x86_dynarec_opcodes_db_a16; recomp_op_table = fpu_softfloat ? NULL : recomp_opcodes_db; opcode_mask = 0xff; @@ -1949,6 +1954,7 @@ codegen_generate_call(uint8_t opcode, OpFn op, uint32_t fetchdat, uint32_t new_p block->flags |= CODEBLOCK_HAS_FPU; break; case 0xdc: + op87 = (op87 & 0xf800) | ((opcode & 0x07) << 8) | (fetchdat & 0xff); op_table = (op_32 & 0x200) ? x86_dynarec_opcodes_dc_a32 : x86_dynarec_opcodes_dc_a16; recomp_op_table = fpu_softfloat ? NULL : recomp_opcodes_dc; opcode_shift = 3; @@ -1959,6 +1965,7 @@ codegen_generate_call(uint8_t opcode, OpFn op, uint32_t fetchdat, uint32_t new_p block->flags |= CODEBLOCK_HAS_FPU; break; case 0xdd: + op87 = (op87 & 0xf800) | ((opcode & 0x07) << 8) | (fetchdat & 0xff); op_table = (op_32 & 0x200) ? x86_dynarec_opcodes_dd_a32 : x86_dynarec_opcodes_dd_a16; recomp_op_table = fpu_softfloat ? NULL : recomp_opcodes_dd; opcode_mask = 0xff; @@ -1968,6 +1975,7 @@ codegen_generate_call(uint8_t opcode, OpFn op, uint32_t fetchdat, uint32_t new_p block->flags |= CODEBLOCK_HAS_FPU; break; case 0xde: + op87 = (op87 & 0xf800) | ((opcode & 0x07) << 8) | (fetchdat & 0xff); op_table = (op_32 & 0x200) ? x86_dynarec_opcodes_de_a32 : x86_dynarec_opcodes_de_a16; recomp_op_table = fpu_softfloat ? NULL : recomp_opcodes_de; opcode_mask = 0xff; @@ -1977,6 +1985,7 @@ codegen_generate_call(uint8_t opcode, OpFn op, uint32_t fetchdat, uint32_t new_p block->flags |= CODEBLOCK_HAS_FPU; break; case 0xdf: + op87 = (op87 & 0xf800) | ((opcode & 0x07) << 8) | (fetchdat & 0xff); op_table = (op_32 & 0x200) ? x86_dynarec_opcodes_df_a32 : x86_dynarec_opcodes_df_a16; recomp_op_table = fpu_softfloat ? NULL : recomp_opcodes_df; opcode_mask = 0xff; @@ -2041,6 +2050,10 @@ generate_call: recomp_op_table = recomp_opcodes; } + if (op87 != 0x0000) { + STORE_IMM_ADDR_W((uintptr_t) &x87_op, op87); + } + if (recomp_op_table && recomp_op_table[(opcode | op_32) & 0x1ff]) { uint32_t new_pc = recomp_op_table[(opcode | op_32) & 0x1ff](opcode, fetchdat, op_32, op_pc, block); if (new_pc) { diff --git a/src/codegen_new/codegen.c b/src/codegen_new/codegen.c index 82f6cd037..44dd408ab 100644 --- a/src/codegen_new/codegen.c +++ b/src/codegen_new/codegen.c @@ -396,6 +396,7 @@ codegen_generate_call(uint8_t opcode, OpFn op, uint32_t fetchdat, uint32_t new_p int test_modrm = 1; int pc_off = 0; uint32_t next_pc = 0; + uint16_t op87 = 0x0000; #ifdef DEBUG_EXTRA uint8_t last_prefix = 0; #endif @@ -451,6 +452,7 @@ codegen_generate_call(uint8_t opcode, OpFn op, uint32_t fetchdat, uint32_t new_p #ifdef DEBUG_EXTRA last_prefix = 0xd8; #endif + op87 = (op87 & 0xf800) | ((opcode & 0x07) << 8) | (fetchdat & 0xff); op_table = (op_32 & 0x200) ? x86_dynarec_opcodes_d8_a32 : x86_dynarec_opcodes_d8_a16; recomp_op_table = fpu_softfloat ? NULL : recomp_opcodes_d8; opcode_shift = 3; @@ -464,6 +466,7 @@ codegen_generate_call(uint8_t opcode, OpFn op, uint32_t fetchdat, uint32_t new_p #ifdef DEBUG_EXTRA last_prefix = 0xd9; #endif + op87 = (op87 & 0xf800) | ((opcode & 0x07) << 8) | (fetchdat & 0xff); op_table = (op_32 & 0x200) ? x86_dynarec_opcodes_d9_a32 : x86_dynarec_opcodes_d9_a16; recomp_op_table = fpu_softfloat ? NULL : recomp_opcodes_d9; opcode_mask = 0xff; @@ -476,6 +479,7 @@ codegen_generate_call(uint8_t opcode, OpFn op, uint32_t fetchdat, uint32_t new_p #ifdef DEBUG_EXTRA last_prefix = 0xda; #endif + op87 = (op87 & 0xf800) | ((opcode & 0x07) << 8) | (fetchdat & 0xff); op_table = (op_32 & 0x200) ? x86_dynarec_opcodes_da_a32 : x86_dynarec_opcodes_da_a16; recomp_op_table = fpu_softfloat ? NULL : recomp_opcodes_da; opcode_mask = 0xff; @@ -488,6 +492,7 @@ codegen_generate_call(uint8_t opcode, OpFn op, uint32_t fetchdat, uint32_t new_p #ifdef DEBUG_EXTRA last_prefix = 0xdb; #endif + op87 = (op87 & 0xf800) | ((opcode & 0x07) << 8) | (fetchdat & 0xff); op_table = (op_32 & 0x200) ? x86_dynarec_opcodes_db_a32 : x86_dynarec_opcodes_db_a16; recomp_op_table = fpu_softfloat ? NULL : recomp_opcodes_db; opcode_mask = 0xff; @@ -500,6 +505,7 @@ codegen_generate_call(uint8_t opcode, OpFn op, uint32_t fetchdat, uint32_t new_p #ifdef DEBUG_EXTRA last_prefix = 0xdc; #endif + op87 = (op87 & 0xf800) | ((opcode & 0x07) << 8) | (fetchdat & 0xff); op_table = (op_32 & 0x200) ? x86_dynarec_opcodes_dc_a32 : x86_dynarec_opcodes_dc_a16; recomp_op_table = fpu_softfloat ? NULL : recomp_opcodes_dc; opcode_shift = 3; @@ -513,6 +519,7 @@ codegen_generate_call(uint8_t opcode, OpFn op, uint32_t fetchdat, uint32_t new_p #ifdef DEBUG_EXTRA last_prefix = 0xdd; #endif + op87 = (op87 & 0xf800) | ((opcode & 0x07) << 8) | (fetchdat & 0xff); op_table = (op_32 & 0x200) ? x86_dynarec_opcodes_dd_a32 : x86_dynarec_opcodes_dd_a16; recomp_op_table = fpu_softfloat ? NULL : recomp_opcodes_dd; opcode_mask = 0xff; @@ -525,6 +532,7 @@ codegen_generate_call(uint8_t opcode, OpFn op, uint32_t fetchdat, uint32_t new_p #ifdef DEBUG_EXTRA last_prefix = 0xde; #endif + op87 = (op87 & 0xf800) | ((opcode & 0x07) << 8) | (fetchdat & 0xff); op_table = (op_32 & 0x200) ? x86_dynarec_opcodes_de_a32 : x86_dynarec_opcodes_de_a16; recomp_op_table = fpu_softfloat ? NULL : recomp_opcodes_de; opcode_mask = 0xff; @@ -537,6 +545,7 @@ codegen_generate_call(uint8_t opcode, OpFn op, uint32_t fetchdat, uint32_t new_p #ifdef DEBUG_EXTRA last_prefix = 0xdf; #endif + op87 = (op87 & 0xf800) | ((opcode & 0x07) << 8) | (fetchdat & 0xff); op_table = (op_32 & 0x200) ? x86_dynarec_opcodes_df_a32 : x86_dynarec_opcodes_df_a16; recomp_op_table = fpu_softfloat ? NULL : recomp_opcodes_df; opcode_mask = 0xff; @@ -657,6 +666,9 @@ generate_call: } } codegen_mark_code_present(block, cs + old_pc, (op_pc - old_pc) - pc_off); + if (op87 != 0x0000) { + uop_MOV_IMM(ir, IREG_x87_op, op87); + } /* It is apparently a prefixed instruction. */ #if 0 if ((recomp_op_table == recomp_opcodes) && (opcode == 0x48)) diff --git a/src/codegen_new/codegen_reg.c b/src/codegen_new/codegen_reg.c index de67fde5a..ba60ab038 100644 --- a/src/codegen_new/codegen_reg.c +++ b/src/codegen_new/codegen_reg.c @@ -170,6 +170,7 @@ struct [IREG_SS_limit_high] = { REG_DWORD, &cpu_state.seg_ss.limit_high, REG_INTEGER, REG_PERMANENT}, [IREG_eaa16] = { REG_WORD, &cpu_state.eaaddr, REG_INTEGER, REG_PERMANENT}, + [IREG_x87_op] = { REG_WORD, &x87_op, REG_INTEGER, REG_PERMANENT}, /*Temporary registers are stored on the stack, and are not guaranteed to be preserved across uOPs. They will not be written back if they will diff --git a/src/codegen_new/codegen_reg.h b/src/codegen_new/codegen_reg.h index fd3cf279a..2185fde45 100644 --- a/src/codegen_new/codegen_reg.h +++ b/src/codegen_new/codegen_reg.h @@ -133,8 +133,9 @@ enum { IREG_SS_limit_high = 87, IREG_eaa16 = 88, + IREG_x87_op = 89, - IREG_COUNT = 89, + IREG_COUNT = 90, IREG_INVALID = 255, diff --git a/src/cpu/386_common.c b/src/cpu/386_common.c index 2853e3c9a..ecd83966c 100644 --- a/src/cpu/386_common.c +++ b/src/cpu/386_common.c @@ -113,6 +113,8 @@ uint8_t is_smint = 0; uint16_t io_port = 0x0000; uint32_t io_val = 0x00000000; +uint16_t x87_op = 0x0000; + int opcode_has_modrm[256] = { 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, /*00*/ 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, /*10*/ diff --git a/src/cpu/cpu.h b/src/cpu/cpu.h index 0e49704fd..63b831d84 100644 --- a/src/cpu/cpu.h +++ b/src/cpu/cpu.h @@ -784,6 +784,8 @@ typedef struct { uint32_t smhr; } cyrix_t; +extern uint16_t x87_op; + extern uint32_t addr64; extern uint32_t addr64_2; extern uint32_t addr64a[8]; diff --git a/src/cpu/x86_ops_fpu.h b/src/cpu/x86_ops_fpu.h index 3434c4a73..afc79dd42 100644 --- a/src/cpu/x86_ops_fpu.h +++ b/src/cpu/x86_ops_fpu.h @@ -4,88 +4,104 @@ static int opESCAPE_d8_a16(uint32_t fetchdat) { + x87_op = ((opcode & 0x07) << 8) | (fetchdat & 0xff); return x86_opcodes_d8_a16[(fetchdat >> 3) & 0x1f](fetchdat); } static int opESCAPE_d8_a32(uint32_t fetchdat) { + x87_op = ((opcode & 0x07) << 8) | (fetchdat & 0xff); return x86_opcodes_d8_a32[(fetchdat >> 3) & 0x1f](fetchdat); } static int opESCAPE_d9_a16(uint32_t fetchdat) { + x87_op = ((opcode & 0x07) << 8) | (fetchdat & 0xff); return x86_opcodes_d9_a16[fetchdat & 0xff](fetchdat); } static int opESCAPE_d9_a32(uint32_t fetchdat) { + x87_op = ((opcode & 0x07) << 8) | (fetchdat & 0xff); return x86_opcodes_d9_a32[fetchdat & 0xff](fetchdat); } static int opESCAPE_da_a16(uint32_t fetchdat) { + x87_op = ((opcode & 0x07) << 8) | (fetchdat & 0xff); return x86_opcodes_da_a16[fetchdat & 0xff](fetchdat); } static int opESCAPE_da_a32(uint32_t fetchdat) { + x87_op = ((opcode & 0x07) << 8) | (fetchdat & 0xff); return x86_opcodes_da_a32[fetchdat & 0xff](fetchdat); } static int opESCAPE_db_a16(uint32_t fetchdat) { + x87_op = ((opcode & 0x07) << 8) | (fetchdat & 0xff); return x86_opcodes_db_a16[fetchdat & 0xff](fetchdat); } static int opESCAPE_db_a32(uint32_t fetchdat) { + x87_op = ((opcode & 0x07) << 8) | (fetchdat & 0xff); return x86_opcodes_db_a32[fetchdat & 0xff](fetchdat); } static int opESCAPE_dc_a16(uint32_t fetchdat) { + x87_op = ((opcode & 0x07) << 8) | (fetchdat & 0xff); return x86_opcodes_dc_a16[(fetchdat >> 3) & 0x1f](fetchdat); } static int opESCAPE_dc_a32(uint32_t fetchdat) { + x87_op = ((opcode & 0x07) << 8) | (fetchdat & 0xff); return x86_opcodes_dc_a32[(fetchdat >> 3) & 0x1f](fetchdat); } static int opESCAPE_dd_a16(uint32_t fetchdat) { + x87_op = ((opcode & 0x07) << 8) | (fetchdat & 0xff); return x86_opcodes_dd_a16[fetchdat & 0xff](fetchdat); } static int opESCAPE_dd_a32(uint32_t fetchdat) { + x87_op = ((opcode & 0x07) << 8) | (fetchdat & 0xff); return x86_opcodes_dd_a32[fetchdat & 0xff](fetchdat); } static int opESCAPE_de_a16(uint32_t fetchdat) { + x87_op = ((opcode & 0x07) << 8) | (fetchdat & 0xff); return x86_opcodes_de_a16[fetchdat & 0xff](fetchdat); } static int opESCAPE_de_a32(uint32_t fetchdat) { + x87_op = ((opcode & 0x07) << 8) | (fetchdat & 0xff); return x86_opcodes_de_a32[fetchdat & 0xff](fetchdat); } static int opESCAPE_df_a16(uint32_t fetchdat) { + x87_op = ((opcode & 0x07) << 8) | (fetchdat & 0xff); return x86_opcodes_df_a16[fetchdat & 0xff](fetchdat); } static int opESCAPE_df_a32(uint32_t fetchdat) { + x87_op = ((opcode & 0x07) << 8) | (fetchdat & 0xff); return x86_opcodes_df_a32[fetchdat & 0xff](fetchdat); } diff --git a/src/cpu/x86_ops_fpu_2386.h b/src/cpu/x86_ops_fpu_2386.h index c2252af12..7488a3d85 100644 --- a/src/cpu/x86_ops_fpu_2386.h +++ b/src/cpu/x86_ops_fpu_2386.h @@ -4,88 +4,104 @@ static int opESCAPE_d8_a16(uint32_t fetchdat) { + x87_op = ((opcode & 0x07) << 8) | (fetchdat & 0xff); return x86_2386_opcodes_d8_a16[(fetchdat >> 3) & 0x1f](fetchdat); } static int opESCAPE_d8_a32(uint32_t fetchdat) { + x87_op = ((opcode & 0x07) << 8) | (fetchdat & 0xff); return x86_2386_opcodes_d8_a32[(fetchdat >> 3) & 0x1f](fetchdat); } static int opESCAPE_d9_a16(uint32_t fetchdat) { + x87_op = ((opcode & 0x07) << 8) | (fetchdat & 0xff); return x86_2386_opcodes_d9_a16[fetchdat & 0xff](fetchdat); } static int opESCAPE_d9_a32(uint32_t fetchdat) { + x87_op = ((opcode & 0x07) << 8) | (fetchdat & 0xff); return x86_2386_opcodes_d9_a32[fetchdat & 0xff](fetchdat); } static int opESCAPE_da_a16(uint32_t fetchdat) { + x87_op = ((opcode & 0x07) << 8) | (fetchdat & 0xff); return x86_2386_opcodes_da_a16[fetchdat & 0xff](fetchdat); } static int opESCAPE_da_a32(uint32_t fetchdat) { + x87_op = ((opcode & 0x07) << 8) | (fetchdat & 0xff); return x86_2386_opcodes_da_a32[fetchdat & 0xff](fetchdat); } static int opESCAPE_db_a16(uint32_t fetchdat) { + x87_op = ((opcode & 0x07) << 8) | (fetchdat & 0xff); return x86_2386_opcodes_db_a16[fetchdat & 0xff](fetchdat); } static int opESCAPE_db_a32(uint32_t fetchdat) { + x87_op = ((opcode & 0x07) << 8) | (fetchdat & 0xff); return x86_2386_opcodes_db_a32[fetchdat & 0xff](fetchdat); } static int opESCAPE_dc_a16(uint32_t fetchdat) { + x87_op = ((opcode & 0x07) << 8) | (fetchdat & 0xff); return x86_2386_opcodes_dc_a16[(fetchdat >> 3) & 0x1f](fetchdat); } static int opESCAPE_dc_a32(uint32_t fetchdat) { + x87_op = ((opcode & 0x07) << 8) | (fetchdat & 0xff); return x86_2386_opcodes_dc_a32[(fetchdat >> 3) & 0x1f](fetchdat); } static int opESCAPE_dd_a16(uint32_t fetchdat) { + x87_op = ((opcode & 0x07) << 8) | (fetchdat & 0xff); return x86_2386_opcodes_dd_a16[fetchdat & 0xff](fetchdat); } static int opESCAPE_dd_a32(uint32_t fetchdat) { + x87_op = ((opcode & 0x07) << 8) | (fetchdat & 0xff); return x86_2386_opcodes_dd_a32[fetchdat & 0xff](fetchdat); } static int opESCAPE_de_a16(uint32_t fetchdat) { + x87_op = ((opcode & 0x07) << 8) | (fetchdat & 0xff); return x86_2386_opcodes_de_a16[fetchdat & 0xff](fetchdat); } static int opESCAPE_de_a32(uint32_t fetchdat) { + x87_op = ((opcode & 0x07) << 8) | (fetchdat & 0xff); return x86_2386_opcodes_de_a32[fetchdat & 0xff](fetchdat); } static int opESCAPE_df_a16(uint32_t fetchdat) { + x87_op = ((opcode & 0x07) << 8) | (fetchdat & 0xff); return x86_2386_opcodes_df_a16[fetchdat & 0xff](fetchdat); } static int opESCAPE_df_a32(uint32_t fetchdat) { + x87_op = ((opcode & 0x07) << 8) | (fetchdat & 0xff); return x86_2386_opcodes_df_a32[fetchdat & 0xff](fetchdat); } diff --git a/src/cpu/x86_ops_i686.h b/src/cpu/x86_ops_i686.h index a67571875..0809fac74 100644 --- a/src/cpu/x86_ops_i686.h +++ b/src/cpu/x86_ops_i686.h @@ -46,8 +46,6 @@ sf_fx_save_stor_common(uint32_t fetchdat, int bits) if (CPUID < 0x650) return ILLEGAL(fetchdat); - FP_ENTER(); - if (bits == 32) { fetch_ea_32(fetchdat); } else { @@ -82,12 +80,18 @@ sf_fx_save_stor_common(uint32_t fetchdat, int bits) /* The lower 11 bits contain the FPU opcode, upper 5 bits are reserved */ fpu_state.foo = readmemw(easeg, cpu_state.eaaddr + 6) & 0x7FF; - fpu_state.fip = readmeml(easeg, cpu_state.eaaddr + 8); + if (bits == 32) + fpu_state.fip = readmeml(easeg, cpu_state.eaaddr + 8); + else + fpu_state.fip = readmemw(easeg, cpu_state.eaaddr + 8); fpu_state.fcs = readmemw(easeg, cpu_state.eaaddr + 12); tag_byte = readmemb(easeg, cpu_state.eaaddr + 4); - fpu_state.fdp = readmeml(easeg, cpu_state.eaaddr + 16); + if (bits == 32) + fpu_state.fdp = readmeml(easeg, cpu_state.eaaddr + 16); + else + fpu_state.fdp = readmemw(easeg, cpu_state.eaaddr + 16); fpu_state.fds = readmemw(easeg, cpu_state.eaaddr + 20); /* load i387 register file */ @@ -110,7 +114,6 @@ sf_fx_save_stor_common(uint32_t fetchdat, int bits) fpu_state.swd &= ~(FPU_SW_Summary | FPU_SW_Backward); } - // CLOCK_CYCLES((cr0 & 1) ? 34 : 44); CLOCK_CYCLES(1); } else { /* FXSAVE */ @@ -132,7 +135,10 @@ sf_fx_save_stor_common(uint32_t fetchdat, int bits) * x87 CS FPU IP Selector * + 16 bit, in 16/32 bit mode only */ - writememl(easeg, cpu_state.eaaddr + 8, fpu_state.fip); + if (bits == 32) + writememl(easeg, cpu_state.eaaddr + 8, fpu_state.fip); + else + writememl(easeg, cpu_state.eaaddr + 8, fpu_state.fip & 0xffff); writememl(easeg, cpu_state.eaaddr + 12, fpu_state.fcs); /* @@ -145,7 +151,10 @@ sf_fx_save_stor_common(uint32_t fetchdat, int bits) * x87 DS FPU Instruction Operand (Data) Pointer Selector * + 16 bit, in 16/32 bit mode only */ - writememl(easeg, cpu_state.eaaddr + 16, fpu_state.fdp); + if (bits == 32) + writememl(easeg, cpu_state.eaaddr + 16, fpu_state.fdp); + else + writememl(easeg, cpu_state.eaaddr + 16, fpu_state.fdp & 0xffff); writememl(easeg, cpu_state.eaaddr + 20, fpu_state.fds); /* store i387 register file */ @@ -256,8 +265,6 @@ fx_save_stor_common(uint32_t fetchdat, int bits) return cpu_state.abrt; } - FP_ENTER(); - old_eaaddr = cpu_state.eaaddr; if (fxinst == 1) { @@ -269,13 +276,19 @@ fx_save_stor_common(uint32_t fetchdat, int bits) cpu_state.TOP = (fpus >> 11) & 7; cpu_state.npxs &= fpus & ~0x3800; - x87_pc_off = readmeml(easeg, cpu_state.eaaddr + 8); + if (bits == 32) + x87_pc_off = readmeml(easeg, cpu_state.eaaddr + 8); + else + x87_pc_off = readmemw(easeg, cpu_state.eaaddr + 8); x87_pc_seg = readmemw(easeg, cpu_state.eaaddr + 12); ftwb = readmemb(easeg, cpu_state.eaaddr + 4); + x87_op = readmemw(easeg, cpu_state.eaaddr + 6) & 0x07ff; - x87_op_off = readmeml(easeg, cpu_state.eaaddr + 16); - x87_op_off |= (readmemw(easeg, cpu_state.eaaddr + 6) >> 12) << 16; + if (bits == 32) + x87_op_off = readmeml(easeg, cpu_state.eaaddr + 16); + else + x87_op_off = readmemw(easeg, cpu_state.eaaddr +16); x87_op_seg = readmemw(easeg, cpu_state.eaaddr + 20); for (i = 0; i <= 7; i++) { @@ -320,7 +333,6 @@ fx_save_stor_common(uint32_t fetchdat, int bits) } } - // CLOCK_CYCLES((cr0 & 1) ? 34 : 44); CLOCK_CYCLES(1); } else { /* FXSAVE */ @@ -345,11 +357,17 @@ fx_save_stor_common(uint32_t fetchdat, int bits) writememw(easeg, cpu_state.eaaddr + 2, cpu_state.npxs); writememb(easeg, cpu_state.eaaddr + 4, ftwb); - writememw(easeg, cpu_state.eaaddr + 6, (x87_op_off >> 16) << 12); - writememl(easeg, cpu_state.eaaddr + 8, x87_pc_off); + writememw(easeg, cpu_state.eaaddr + 6, x87_op); + if (bits == 32) + writememl(easeg, cpu_state.eaaddr + 8, x87_pc_off); + else + writememl(easeg, cpu_state.eaaddr + 8, x87_pc_off & 0xffff); writememw(easeg, cpu_state.eaaddr + 12, x87_pc_seg); - writememl(easeg, cpu_state.eaaddr + 16, x87_op_off); + if (bits == 32) + writememl(easeg, cpu_state.eaaddr + 16, x87_op_off); + else + writememl(easeg, cpu_state.eaaddr + 16, x87_op_off & 0xffff); writememw(easeg, cpu_state.eaaddr + 20, x87_op_seg); if (cpu_state.ismmx) { From b15f25ffa46ed7c2bc189fcf34fef2dd546dd6a4 Mon Sep 17 00:00:00 2001 From: OBattler Date: Tue, 22 Apr 2025 09:46:58 +0200 Subject: [PATCH 057/180] Fixed old recompiler compiling in a kludgy way because it appears there's no STORE_IMM_ADDR_W. --- src/codegen/codegen_x86-64.c | 4 ++-- src/codegen/codegen_x86.c | 4 ++-- src/cpu/386_common.c | 2 +- src/cpu/cpu.h | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/codegen/codegen_x86-64.c b/src/codegen/codegen_x86-64.c index adb97169d..c424cf8c5 100644 --- a/src/codegen/codegen_x86-64.c +++ b/src/codegen/codegen_x86-64.c @@ -819,7 +819,7 @@ codegen_generate_call(uint8_t opcode, OpFn op, uint32_t fetchdat, uint32_t new_p int pc_off = 0; int test_modrm = 1; int c; - uint16_t op87 = 0x0000; + uint32_t op87 = 0x00000000; op_ea_seg = &cpu_state.seg_ds; op_ssegs = 0; @@ -1010,7 +1010,7 @@ generate_call: } if (op87 != 0x0000) { - STORE_IMM_ADDR_W((uintptr_t) &x87_op, op87); + STORE_IMM_ADDR_L((uintptr_t) &x87_op, op87); } if (recomp_op_table && recomp_op_table[(opcode | op_32) & 0x1ff]) { diff --git a/src/codegen/codegen_x86.c b/src/codegen/codegen_x86.c index cb635d4f1..bf34c2de8 100644 --- a/src/codegen/codegen_x86.c +++ b/src/codegen/codegen_x86.c @@ -1858,7 +1858,7 @@ codegen_generate_call(uint8_t opcode, OpFn op, uint32_t fetchdat, uint32_t new_p int pc_off = 0; int test_modrm = 1; int c; - uint16_t op87 = 0x0000; + uint32_t op87 = 0x00000000; op_ea_seg = &cpu_state.seg_ds; op_ssegs = 0; @@ -2051,7 +2051,7 @@ generate_call: } if (op87 != 0x0000) { - STORE_IMM_ADDR_W((uintptr_t) &x87_op, op87); + STORE_IMM_ADDR_L((uintptr_t) &x87_op, op87); } if (recomp_op_table && recomp_op_table[(opcode | op_32) & 0x1ff]) { diff --git a/src/cpu/386_common.c b/src/cpu/386_common.c index ecd83966c..c6a759d36 100644 --- a/src/cpu/386_common.c +++ b/src/cpu/386_common.c @@ -113,7 +113,7 @@ uint8_t is_smint = 0; uint16_t io_port = 0x0000; uint32_t io_val = 0x00000000; -uint16_t x87_op = 0x0000; +uint32_t x87_op = 0x00000000; int opcode_has_modrm[256] = { 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, /*00*/ diff --git a/src/cpu/cpu.h b/src/cpu/cpu.h index 63b831d84..b76e2d622 100644 --- a/src/cpu/cpu.h +++ b/src/cpu/cpu.h @@ -784,7 +784,7 @@ typedef struct { uint32_t smhr; } cyrix_t; -extern uint16_t x87_op; +extern uint32_t x87_op; extern uint32_t addr64; extern uint32_t addr64_2; From e703ac760b6c0cf0cac3bfa0b196688178c5a099 Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Tue, 22 Apr 2025 17:37:00 +0600 Subject: [PATCH 058/180] Write indicators (except for floppy drives) --- src/disk/hdc_esdi_at.c | 24 ++++-- src/disk/hdc_esdi_mca.c | 9 ++ src/disk/hdc_ide.c | 12 +-- src/disk/hdc_st506_at.c | 9 +- src/disk/hdc_st506_xt.c | 18 ++-- src/disk/hdc_xta.c | 10 +-- src/disk/mo.c | 6 +- src/disk/zip.c | 6 +- src/include/86box/machine_status.h | 2 + src/include/86box/ui.h | 1 + src/machine/m_ps1_hdc.c | 13 +-- src/network/network.c | 4 +- src/qt/icons/write_active.ico | Bin 0 -> 6950 bytes src/qt/qt_iconindicators.cpp | 8 +- src/qt/qt_iconindicators.hpp | 2 + src/qt/qt_machinestatus.cpp | 131 ++++++++++++++++++++++++----- src/qt/qt_ui.cpp | 37 ++++++++ src/qt_resources.qrc | 1 + src/scsi/scsi_disk.c | 5 +- src/sound/CMakeLists.txt | 2 +- 20 files changed, 232 insertions(+), 68 deletions(-) create mode 100644 src/qt/icons/write_active.ico diff --git a/src/disk/hdc_esdi_at.c b/src/disk/hdc_esdi_at.c index ab24aa6fa..64d292250 100644 --- a/src/disk/hdc_esdi_at.c +++ b/src/disk/hdc_esdi_at.c @@ -395,7 +395,7 @@ esdi_write(uint16_t port, uint8_t val, void *priv) fatal("Write with ECC\n"); esdi->status = STAT_READY | STAT_DRQ | STAT_DSC; esdi->pos = 0; - ui_sb_update_icon(SB_HDD | HDD_BUS_ESDI, 1); + ui_sb_update_icon_write(SB_HDD | HDD_BUS_ESDI, 1); break; case CMD_VERIFY: @@ -412,7 +412,7 @@ esdi_write(uint16_t port, uint8_t val, void *priv) case CMD_FORMAT: esdi->status = STAT_DRQ; esdi->pos = 0; - ui_sb_update_icon(SB_HDD | HDD_BUS_ESDI, 1); + ui_sb_update_icon_write(SB_HDD | HDD_BUS_ESDI, 1); break; case CMD_SET_PARAMETERS: /* Initialize Drive Parameters */ @@ -593,6 +593,7 @@ esdi_callback(void *priv) esdi->reset = 0; ui_sb_update_icon(SB_HDD | HDD_BUS_ESDI, 0); + ui_sb_update_icon_write(SB_HDD | HDD_BUS_ESDI, 0); return; } @@ -650,7 +651,7 @@ read_error: esdi->status = STAT_READY | STAT_ERR | STAT_DSC; esdi->error = ERR_ABRT; irq_raise(esdi); - ui_sb_update_icon(SB_HDD | HDD_BUS_ESDI, 0); + ui_sb_update_icon_write(SB_HDD | HDD_BUS_ESDI, 0); break; } else { if (get_sector(esdi, &addr)) { @@ -658,7 +659,7 @@ read_error: write_error: esdi->status = STAT_READY | STAT_DSC | STAT_ERR; irq_raise(esdi); - ui_sb_update_icon(SB_HDD | HDD_BUS_ESDI, 0); + ui_sb_update_icon_write(SB_HDD | HDD_BUS_ESDI, 0); break; } @@ -672,10 +673,10 @@ write_error: esdi->status = STAT_DRQ | STAT_READY | STAT_DSC; esdi->pos = 0; next_sector(esdi); - ui_sb_update_icon(SB_HDD | HDD_BUS_ESDI, 1); + ui_sb_update_icon_write(SB_HDD | HDD_BUS_ESDI, 1); } else { esdi->status = STAT_READY | STAT_DSC; - ui_sb_update_icon(SB_HDD | HDD_BUS_ESDI, 0); + ui_sb_update_icon_write(SB_HDD | HDD_BUS_ESDI, 0); } } break; @@ -718,7 +719,7 @@ verify_error: break; case CMD_FORMAT: - ui_sb_update_icon(SB_HDD | HDD_BUS_ESDI, 0); + ui_sb_update_icon_write(SB_HDD | HDD_BUS_ESDI, 0); if (!drive->present) { esdi->status = STAT_READY | STAT_ERR | STAT_DSC; esdi->error = ERR_ABRT; @@ -752,10 +753,12 @@ format_error: esdi->status = STAT_READY | STAT_DSC; irq_raise(esdi); ui_sb_update_icon(SB_HDD | HDD_BUS_ESDI, 0); + ui_sb_update_icon_write(SB_HDD | HDD_BUS_ESDI, 0); break; case CMD_SET_PARAMETERS: /* Initialize Drive Parameters */ ui_sb_update_icon(SB_HDD | HDD_BUS_ESDI, 0); + ui_sb_update_icon_write(SB_HDD | HDD_BUS_ESDI, 0); if (!drive->present) { esdi->status = STAT_READY | STAT_ERR | STAT_DSC; esdi->error = ERR_ABRT; @@ -778,10 +781,12 @@ format_error: esdi->error = ERR_ABRT; irq_raise(esdi); ui_sb_update_icon(SB_HDD | HDD_BUS_ESDI, 0); + ui_sb_update_icon_write(SB_HDD | HDD_BUS_ESDI, 0); break; case 0xe0: ui_sb_update_icon(SB_HDD | HDD_BUS_ESDI, 0); + ui_sb_update_icon_write(SB_HDD | HDD_BUS_ESDI, 0); if (!drive->present) { esdi->status = STAT_READY | STAT_ERR | STAT_DSC; esdi->error = ERR_ABRT; @@ -825,6 +830,7 @@ format_error: } irq_raise(esdi); ui_sb_update_icon(SB_HDD | HDD_BUS_ESDI, 0); + ui_sb_update_icon_write(SB_HDD | HDD_BUS_ESDI, 0); break; case CMD_READ_PARAMETERS: @@ -869,6 +875,7 @@ format_error: irq_raise(esdi); } ui_sb_update_icon(SB_HDD | HDD_BUS_ESDI, 0); + ui_sb_update_icon_write(SB_HDD | HDD_BUS_ESDI, 0); break; default: @@ -880,6 +887,7 @@ format_error: esdi->error = ERR_ABRT; irq_raise(esdi); ui_sb_update_icon(SB_HDD | HDD_BUS_ESDI, 0); + ui_sb_update_icon_write(SB_HDD | HDD_BUS_ESDI, 0); break; } } @@ -954,6 +962,7 @@ wd1007vse1_init(UNUSED(const device_t *info)) timer_add(&esdi->callback_timer, esdi_callback, esdi, 0); ui_sb_update_icon(SB_HDD | HDD_BUS_ESDI, 0); + ui_sb_update_icon_write(SB_HDD | HDD_BUS_ESDI, 0); return esdi; } @@ -973,6 +982,7 @@ wd1007vse1_close(void *priv) free(esdi); ui_sb_update_icon(SB_HDD | HDD_BUS_ESDI, 0); + ui_sb_update_icon_write(SB_HDD | HDD_BUS_ESDI, 0); } static int diff --git a/src/disk/hdc_esdi_mca.c b/src/disk/hdc_esdi_mca.c index 8f1def137..e59ae981d 100644 --- a/src/disk/hdc_esdi_mca.c +++ b/src/disk/hdc_esdi_mca.c @@ -288,6 +288,7 @@ cmd_unsupported(esdi_t *dev) dev->irq_in_progress = 1; set_irq(dev); ui_sb_update_icon(SB_HDD | HDD_BUS_ESDI, 0); + ui_sb_update_icon_write(SB_HDD | HDD_BUS_ESDI, 0); } static void @@ -309,6 +310,7 @@ device_not_present(esdi_t *dev) dev->irq_in_progress = 1; set_irq(dev); ui_sb_update_icon(SB_HDD | HDD_BUS_ESDI, 0); + ui_sb_update_icon_write(SB_HDD | HDD_BUS_ESDI, 0); } static void @@ -330,6 +332,7 @@ rba_out_of_range(esdi_t *dev) dev->irq_in_progress = 1; set_irq(dev); ui_sb_update_icon(SB_HDD | HDD_BUS_ESDI, 0); + ui_sb_update_icon_write(SB_HDD | HDD_BUS_ESDI, 0); } static void @@ -351,6 +354,7 @@ defective_block(esdi_t *dev) dev->irq_in_progress = 1; set_irq(dev); ui_sb_update_icon(SB_HDD | HDD_BUS_ESDI, 0); + ui_sb_update_icon_write(SB_HDD | HDD_BUS_ESDI, 0); } static void @@ -368,6 +372,7 @@ complete_command_status(esdi_t *dev) dev->status_data[5] = (dev->rba - 1) >> 8; dev->status_data[6] = 0; /*Number of blocks requiring error recovery*/ ui_sb_update_icon(SB_HDD | HDD_BUS_ESDI, 0); + ui_sb_update_icon_write(SB_HDD | HDD_BUS_ESDI, 0); } #define ESDI_ADAPTER_ONLY() \ @@ -696,6 +701,7 @@ esdi_callback(void *priv) dev->irq_in_progress = 1; set_irq(dev); ui_sb_update_icon(SB_HDD | HDD_BUS_ESDI, 0); + ui_sb_update_icon_write(SB_HDD | HDD_BUS_ESDI, 0); break; case CMD_GET_DEV_CONFIG: @@ -744,6 +750,7 @@ esdi_callback(void *priv) dev->irq_in_progress = 1; set_irq(dev); ui_sb_update_icon(SB_HDD | HDD_BUS_ESDI, 0); + ui_sb_update_icon_write(SB_HDD | HDD_BUS_ESDI, 0); break; case CMD_GET_POS_INFO: @@ -764,6 +771,7 @@ esdi_callback(void *priv) dev->irq_in_progress = 1; set_irq(dev); ui_sb_update_icon(SB_HDD | HDD_BUS_ESDI, 0); + ui_sb_update_icon_write(SB_HDD | HDD_BUS_ESDI, 0); break; case 0x10: @@ -817,6 +825,7 @@ esdi_callback(void *priv) dev->irq_in_progress = 1; set_irq(dev); ui_sb_update_icon(SB_HDD | HDD_BUS_ESDI, 0); + ui_sb_update_icon_write(SB_HDD | HDD_BUS_ESDI, 0); break; default: diff --git a/src/disk/hdc_ide.c b/src/disk/hdc_ide.c index 04e580e72..fe48bba6d 100644 --- a/src/disk/hdc_ide.c +++ b/src/disk/hdc_ide.c @@ -1827,7 +1827,7 @@ ide_writeb(uint16_t addr, uint8_t val, void *priv) ide->blockcount = 0; /* Turn on the activity indicator *here* so that it gets turned on less times. */ - ui_sb_update_icon(SB_HDD | hdd[ide->hdd_num].bus_type, 1); + ui_sb_update_icon_write(SB_HDD | hdd[ide->hdd_num].bus_type, 1); fallthrough; case WIN_WRITE: @@ -2479,10 +2479,10 @@ ide_callback(void *priv) ide->tf->atastat = DRQ_STAT | DRDY_STAT | DSC_STAT; ide->tf->pos = 0; ide_next_sector(ide); - ui_sb_update_icon(SB_HDD | hdd[ide->hdd_num].bus_type, 1); + ui_sb_update_icon_write(SB_HDD | hdd[ide->hdd_num].bus_type, 1); } else { ide->tf->atastat = DRDY_STAT | DSC_STAT; - ui_sb_update_icon(SB_HDD | hdd[ide->hdd_num].bus_type, 0); + ui_sb_update_icon_write(SB_HDD | hdd[ide->hdd_num].bus_type, 0); } if (ret < 0) err = UNC_ERR; @@ -2524,7 +2524,7 @@ ide_callback(void *priv) err = UNC_ERR; ide_irq_raise(ide); - ui_sb_update_icon(SB_HDD | hdd[ide->hdd_num].bus_type, 0); + ui_sb_update_icon_write(SB_HDD | hdd[ide->hdd_num].bus_type, 0); } else { /* Bus master DMA error, abort the command. */ ide_log("IDE %i: DMA read aborted (failed)\n", ide->channel); @@ -2562,7 +2562,7 @@ ide_callback(void *priv) ide_next_sector(ide); } else { ide->tf->atastat = DRDY_STAT | DSC_STAT; - ui_sb_update_icon(SB_HDD | hdd[ide->hdd_num].bus_type, 0); + ui_sb_update_icon_write(SB_HDD | hdd[ide->hdd_num].bus_type, 0); } if (ret < 0) err = UNC_ERR; @@ -2596,7 +2596,7 @@ ide_callback(void *priv) err = UNC_ERR; ide_irq_raise(ide); - ui_sb_update_icon(SB_HDD | hdd[ide->hdd_num].bus_type, 1); + ui_sb_update_icon_write(SB_HDD | hdd[ide->hdd_num].bus_type, 1); } break; diff --git a/src/disk/hdc_st506_at.c b/src/disk/hdc_st506_at.c index 07c57b2ca..ed7b29d1f 100644 --- a/src/disk/hdc_st506_at.c +++ b/src/disk/hdc_st506_at.c @@ -557,6 +557,7 @@ do_callback(void *priv) mfm->reset = 0; ui_sb_update_icon(SB_HDD | HDD_BUS_MFM, 0); + ui_sb_update_icon_write(SB_HDD | HDD_BUS_MFM, 0); return; } @@ -627,9 +628,9 @@ write_error: mfm->status |= STAT_DRQ; mfm->pos = 0; next_sector(mfm); - ui_sb_update_icon(SB_HDD | HDD_BUS_MFM, 1); + ui_sb_update_icon_write(SB_HDD | HDD_BUS_MFM, 1); } else - ui_sb_update_icon(SB_HDD | HDD_BUS_MFM, 0); + ui_sb_update_icon_write(SB_HDD | HDD_BUS_MFM, 0); break; case CMD_VERIFY: @@ -657,7 +658,7 @@ write_error: mfm->status = STAT_READY | STAT_DSC; irq_raise(mfm); - ui_sb_update_icon(SB_HDD | HDD_BUS_MFM, 1); + ui_sb_update_icon_write(SB_HDD | HDD_BUS_MFM, 1); break; case CMD_DIAGNOSE: @@ -772,6 +773,7 @@ mfm_init(UNUSED(const device_t *info)) timer_add(&mfm->callback_timer, do_callback, mfm, 0); ui_sb_update_icon(SB_HDD | HDD_BUS_MFM, 0); + ui_sb_update_icon_write(SB_HDD | HDD_BUS_MFM, 0); return mfm; } @@ -790,6 +792,7 @@ mfm_close(void *priv) free(mfm); ui_sb_update_icon(SB_HDD | HDD_BUS_MFM, 0); + ui_sb_update_icon_write(SB_HDD | HDD_BUS_MFM, 0); } const device_t st506_at_wd1003_device = { diff --git a/src/disk/hdc_st506_xt.c b/src/disk/hdc_st506_xt.c index 536fd76c0..b3a07fa5a 100644 --- a/src/disk/hdc_st506_xt.c +++ b/src/disk/hdc_st506_xt.c @@ -580,14 +580,14 @@ st506_callback(void *priv) (void) get_chs(dev, drive); st506_xt_log("ST506: FORMAT_DRIVE(%i) interleave=%i\n", dev->drive_sel, dev->command[4]); - ui_sb_update_icon(SB_HDD | HDD_BUS_MFM, 1); + ui_sb_update_icon_write(SB_HDD | HDD_BUS_MFM, 1); timer_advance_u64(&dev->timer, ST506_TIME); dev->state = STATE_SEND_DATA; break; case STATE_SEND_DATA: /* wrong, but works */ if (!get_sector(dev, drive, &addr)) { - ui_sb_update_icon(SB_HDD | HDD_BUS_MFM, 0); + ui_sb_update_icon_write(SB_HDD | HDD_BUS_MFM, 0); st506_error(dev, dev->error); st506_complete(dev); return; @@ -604,7 +604,7 @@ st506_callback(void *priv) break; case STATE_SENT_DATA: - ui_sb_update_icon(SB_HDD | HDD_BUS_MFM, 0); + ui_sb_update_icon_write(SB_HDD | HDD_BUS_MFM, 0); st506_complete(dev); break; @@ -663,14 +663,14 @@ st506_callback(void *priv) st506_xt_log("ST506: FORMAT_%sTRACK(%i, %i/%i)\n", (dev->command[0] == CMD_FORMAT_BAD_TRACK) ? "BAD_" : "", dev->drive_sel, dev->cylinder, dev->head); - ui_sb_update_icon(SB_HDD | HDD_BUS_MFM, 1); + ui_sb_update_icon_write(SB_HDD | HDD_BUS_MFM, 1); timer_advance_u64(&dev->timer, ST506_TIME); dev->state = STATE_SEND_DATA; break; case STATE_SEND_DATA: /* wrong, but works */ if (!get_sector(dev, drive, &addr)) { - ui_sb_update_icon(SB_HDD | HDD_BUS_MFM, 0); + ui_sb_update_icon_write(SB_HDD | HDD_BUS_MFM, 0); st506_error(dev, dev->error); st506_complete(dev); return; @@ -686,7 +686,7 @@ st506_callback(void *priv) break; case STATE_SENT_DATA: - ui_sb_update_icon(SB_HDD | HDD_BUS_MFM, 0); + ui_sb_update_icon_write(SB_HDD | HDD_BUS_MFM, 0); st506_complete(dev); break; @@ -828,7 +828,7 @@ read_error_sent: return; } - ui_sb_update_icon(SB_HDD | HDD_BUS_MFM, 1); + ui_sb_update_icon_write(SB_HDD | HDD_BUS_MFM, 1); /* Set up the data transfer. */ dev->buff_pos = 0; @@ -865,7 +865,7 @@ read_error_sent: case STATE_RECEIVED_DATA: if (!get_sector(dev, drive, &addr)) { write_error: - ui_sb_update_icon(SB_HDD | HDD_BUS_MFM, 0); + ui_sb_update_icon_write(SB_HDD | HDD_BUS_MFM, 0); st506_error(dev, dev->error); st506_complete(dev); return; @@ -879,7 +879,7 @@ write_error: } if (--dev->count == 0) { - ui_sb_update_icon(SB_HDD | HDD_BUS_MFM, 0); + ui_sb_update_icon_write(SB_HDD | HDD_BUS_MFM, 0); st506_complete(dev); break; } diff --git a/src/disk/hdc_xta.c b/src/disk/hdc_xta.c index b01d80c61..85581af2d 100644 --- a/src/disk/hdc_xta.c +++ b/src/disk/hdc_xta.c @@ -385,7 +385,7 @@ do_format(hdc_t *dev, drive_t *drive, dcb_t *dcb) dev->sector = 0; /* Activate the status icon. */ - ui_sb_update_icon(SB_HDD | HDD_BUS_XTA, 1); + ui_sb_update_icon_write(SB_HDD | HDD_BUS_XTA, 1); do_fmt: /* @@ -426,7 +426,7 @@ do_fmt: } /* De-activate the status icon. */ - ui_sb_update_icon(SB_HDD | HDD_BUS_XTA, 0); + ui_sb_update_icon_write(SB_HDD | HDD_BUS_XTA, 0); } /* Execute the DCB we just received. */ @@ -631,7 +631,7 @@ read_error: case STATE_RECV: /* Activate the status icon. */ - ui_sb_update_icon(SB_HDD | HDD_BUS_XTA, 1); + ui_sb_update_icon_write(SB_HDD | HDD_BUS_XTA, 1); do_recv: /* Ready to transfer the data in. */ dev->state = STATE_RDATA; @@ -680,7 +680,7 @@ do_recv: if (get_sector(dev, drive, &addr)) { write_error: /* De-activate the status icon. */ - ui_sb_update_icon(SB_HDD | HDD_BUS_XTA, 0); + ui_sb_update_icon_write(SB_HDD | HDD_BUS_XTA, 0); dev->comp |= COMP_ERR; set_intr(dev); @@ -697,7 +697,7 @@ write_error: dev->buf_idx = 0; if (--dev->count == 0) { /* De-activate the status icon. */ - ui_sb_update_icon(SB_HDD | HDD_BUS_XTA, 0); + ui_sb_update_icon_write(SB_HDD | HDD_BUS_XTA, 0); set_intr(dev); return; diff --git a/src/disk/mo.c b/src/disk/mo.c index a20333404..1a2db0443 100644 --- a/src/disk/mo.c +++ b/src/disk/mo.c @@ -628,6 +628,7 @@ mo_cmd_error(mo_t *dev) dev->callback = 50.0 * MO_TIME; mo_set_callback(dev); ui_sb_update_icon(SB_MO | dev->id, 0); + ui_sb_update_icon_write(SB_MO | dev->id, 0); mo_log(dev->log, "[%02X] ERROR: %02X/%02X/%02X\n", dev->current_cdb[0], mo_sense_key, mo_asc, mo_ascq); } @@ -644,6 +645,7 @@ mo_unit_attention(mo_t *dev) dev->callback = 50.0 * MO_TIME; mo_set_callback(dev); ui_sb_update_icon(SB_MO | dev->id, 0); + ui_sb_update_icon_write(SB_MO | dev->id, 0); mo_log(dev->log, "UNIT ATTENTION\n"); } @@ -1462,7 +1464,7 @@ mo_command(scsi_common_t *sc, const uint8_t *cdb) mo_data_command_finish(dev, dev->packet_len, dev->drv->sector_size, dev->packet_len, 1); - ui_sb_update_icon(SB_MO | dev->id, + ui_sb_update_icon_write(SB_MO | dev->id, dev->packet_status != PHASE_COMPLETE); } else { mo_set_phase(dev, SCSI_PHASE_STATUS); @@ -1501,7 +1503,7 @@ mo_command(scsi_common_t *sc, const uint8_t *cdb) dev->drv->sector_size, alloc_length, 1); - ui_sb_update_icon(SB_MO | dev->id, + ui_sb_update_icon_write(SB_MO | dev->id, dev->packet_status != PHASE_COMPLETE); } else { mo_set_phase(dev, SCSI_PHASE_STATUS); diff --git a/src/disk/zip.c b/src/disk/zip.c index 7a407c5fe..55cf901a4 100644 --- a/src/disk/zip.c +++ b/src/disk/zip.c @@ -709,6 +709,7 @@ zip_cmd_error(zip_t *dev) dev->callback = 50.0 * ZIP_TIME; zip_set_callback(dev); ui_sb_update_icon(SB_ZIP | dev->id, 0); + ui_sb_update_icon_write(SB_ZIP | dev->id, 0); zip_log(dev->log, "[%02X] ERROR: %02X/%02X/%02X\n", dev->current_cdb[0], zip_sense_key, zip_asc, zip_ascq); } @@ -725,6 +726,7 @@ zip_unit_attention(zip_t *dev) dev->callback = 50.0 * ZIP_TIME; zip_set_callback(dev); ui_sb_update_icon(SB_ZIP | dev->id, 0); + ui_sb_update_icon_write(SB_ZIP | dev->id, 0); zip_log(dev->log, "UNIT ATTENTION\n", dev->id); } @@ -1485,7 +1487,7 @@ zip_command(scsi_common_t *sc, const uint8_t *cdb) zip_data_command_finish(dev, dev->packet_len, 512, dev->packet_len, 1); - ui_sb_update_icon(SB_ZIP | dev->id, + ui_sb_update_icon_write(SB_ZIP | dev->id, dev->packet_status != PHASE_COMPLETE); } else { zip_set_phase(dev, SCSI_PHASE_STATUS); @@ -1526,7 +1528,7 @@ zip_command(scsi_common_t *sc, const uint8_t *cdb) zip_data_command_finish(dev, 512, 512, alloc_length, 1); - ui_sb_update_icon(SB_ZIP | dev->id, + ui_sb_update_icon_write(SB_ZIP | dev->id, dev->packet_status != PHASE_COMPLETE); } else { zip_set_phase(dev, SCSI_PHASE_STATUS); diff --git a/src/include/86box/machine_status.h b/src/include/86box/machine_status.h index e7c57881b..e6e9e6acd 100644 --- a/src/include/86box/machine_status.h +++ b/src/include/86box/machine_status.h @@ -4,10 +4,12 @@ typedef struct dev_status_empty_active_t { atomic_bool_t empty; atomic_bool_t active; + atomic_bool_t write_active; } dev_status_empty_active_t; typedef struct dev_status_active_t { atomic_bool_t active; + atomic_bool_t write_active; } dev_status_active_t; typedef struct dev_status_empty_t { diff --git a/src/include/86box/ui.h b/src/include/86box/ui.h index c12eb73a0..783400ebc 100644 --- a/src/include/86box/ui.h +++ b/src/include/86box/ui.h @@ -65,6 +65,7 @@ extern void ui_sb_update_panes(void); extern void ui_sb_update_text(void); extern void ui_sb_update_tip(int meaning); extern void ui_sb_update_icon(int tag, int active); +extern void ui_sb_update_icon_write(int tag, int write); extern void ui_sb_update_icon_state(int tag, int state); extern void ui_sb_set_text_w(wchar_t *wstr); extern void ui_sb_set_text(char *str); diff --git a/src/machine/m_ps1_hdc.c b/src/machine/m_ps1_hdc.c index 18792ded7..ea71c918b 100644 --- a/src/machine/m_ps1_hdc.c +++ b/src/machine/m_ps1_hdc.c @@ -653,7 +653,7 @@ do_format(hdc_t *dev, drive_t *drive, ccb_t *ccb) case STATE_FINIT: do_fmt: /* Activate the status icon. */ - ui_sb_update_icon(SB_HDD | HDD_BUS_XTA, 1); + ui_sb_update_icon_write(SB_HDD | HDD_BUS_XTA, 1); /* Seek to cylinder. */ if (do_seek(dev, drive, start_cyl)) { @@ -691,7 +691,7 @@ do_fmt: } /* De-activate the status icon. */ - ui_sb_update_icon(SB_HDD | HDD_BUS_XTA, 0); + ui_sb_update_icon_write(SB_HDD | HDD_BUS_XTA, 0); /* This saves us a LOT of code. */ dev->state = STATE_FINIT; @@ -705,6 +705,7 @@ do_fmt: if (intr) { /* De-activate the status icon. */ ui_sb_update_icon(SB_HDD | HDD_BUS_XTA, 0); + ui_sb_update_icon_write(SB_HDD | HDD_BUS_XTA, 0); do_finish(dev); } @@ -970,7 +971,7 @@ do_send: case STATE_RECV: /* Activate the status icon. */ - ui_sb_update_icon(SB_HDD | HDD_BUS_XTA, 1); + ui_sb_update_icon_write(SB_HDD | HDD_BUS_XTA, 1); do_recv: /* Ready to transfer the data in. */ dev->state = STATE_RDATA; @@ -1000,7 +1001,7 @@ do_recv: ps1_hdc_log("HDC: CMD_WRITE_SECTORS out of data (idx=%d, len=%d)!\n", dev->buf_idx, dev->buf_len); /* De-activate the status icon. */ - ui_sb_update_icon(SB_HDD | HDD_BUS_XTA, 0); + ui_sb_update_icon_write(SB_HDD | HDD_BUS_XTA, 0); dev->intstat |= ISR_EQUIP_CHECK; dev->ssb.need_reset = 1; @@ -1025,7 +1026,7 @@ do_recv: /* Get address of sector to write. */ if (get_sector(dev, drive, &addr)) { /* De-activate the status icon. */ - ui_sb_update_icon(SB_HDD | HDD_BUS_XTA, 0); + ui_sb_update_icon_write(SB_HDD | HDD_BUS_XTA, 0); do_finish(dev); return; @@ -1038,7 +1039,7 @@ do_recv: dev->buf_idx = 0; if (--dev->count == 0) { /* De-activate the status icon. */ - ui_sb_update_icon(SB_HDD | HDD_BUS_XTA, 0); + ui_sb_update_icon_write(SB_HDD | HDD_BUS_XTA, 0); if (!(dev->ctrl & ACR_DMA_EN)) dev->status &= ~ASR_DATA_REQ; diff --git a/src/network/network.c b/src/network/network.c index 52b686c7e..239178a5d 100644 --- a/src/network/network.c +++ b/src/network/network.c @@ -432,7 +432,8 @@ network_rx_queue(void *priv) bool activity = rx_bytes || tx_bytes; bool led_on = card->led_timer & 0x80000000; if ((activity && !led_on) || (card->led_timer & 0x7fffffff) >= 150000) { - ui_sb_update_icon(SB_NETWORK | card->card_num, activity); + ui_sb_update_icon(SB_NETWORK | card->card_num, !!(rx_bytes)); + ui_sb_update_icon_write(SB_NETWORK | card->card_num, !!(tx_bytes)); card->led_timer = 0 | (activity << 31); } @@ -577,6 +578,7 @@ void network_reset(void) { ui_sb_update_icon(SB_NETWORK, 0); + ui_sb_update_icon_write(SB_NETWORK, 0); #ifdef ENABLE_NETWORK_LOG network_dump_mutex = thread_create_mutex(); diff --git a/src/qt/icons/write_active.ico b/src/qt/icons/write_active.ico new file mode 100644 index 0000000000000000000000000000000000000000..d1ebdb22498d6dbdfeae87c7d21969948c5cc868 GIT binary patch literal 6950 zcmZQzU}RunkdRa-s|j8Vn2!AR`PIK<06PBpDo-z!ZdF1WSO~|NsAI@bLK0(AW1L%pWC2Ltr!n zMs^4=Apzu&U}9v30p!wzVd#i6!T_rKarhV6@1txiA;A8hfq?`Js%uEWpn42c^*Mm6 zD@Z-Yz=GtC(RvIiFh-f9Aut*O*g^oQcn34l)gaYhp!yA^ZUCtrl?Me29Md3tVAV31 z#xx%sYX|}qC!=^Y1P~!m|DS<@eEgq60BWazy5yj?3L^uwodRl`z#Ir-gD?XF1E~Eo z+TVr+%qTq?0wXsBpfwsi03huQMD<5HA5?!L>4#VVH-Eqxpdm&)`2T-U`G^~X%307* zCy0iXvlF1@D%fuzHV89-3}OJ0V8g)XGW=&aaNq#L{~sS1uD|}paOHnJSpJcA7lW48 zQt%ik3kwSa2L}guEL2cXkU>mLj6p_5hCxY5i9u6Slfl^7n8DK0lEKNziNV*`mmxGX zlp!G@fgvp|jiI2RfT5wGfuX0ThhfT;DGW1b&SY4!WC_EXHES5QZQBO6`^=d$3|FpP zVYqec7Q=%F4;bFOdBgDI#}9_zzkh@41!D#VhBO8ShM5cu3}--f1;|sz3=GD`3=C<; z3=A`k85qtOGcf#zDl|@GU`R`2V3?W4z;Gswf#E+?v++y@hP0Us3^QjkFr1mm!0;bx zpz#?7hO{#b3^UI#Fq}EV!0;bxiSd61hP3|-3^V^TFq{De9Vm_%jKMIC!I)ttgE7My z24jZ*3=qep85=XqG&W{9V{FXuAL=;cG-HOeG-HODX~qm^(u^7YLmg~9)0iP`rZL0J znZ^ufW*Rg6hkC;Jj4?yn8DoZ-XN(!noH1tj5A~Swe`AKU|Hce6{~I%$`EShdAL?0S zhBPpo$&kiyh9QmNKPaS((-@46(-_i>(->wNr!kx{PGk5F4HV@|j`7Ty3~4iGGMt$?li~l&nGB3)W-=I`naPlLW+ubTGcy^^ zoSDh+9~yzi|7S9!{h!G&^Z!hSGyi8Y{D(#=C}uz*GLzv982$&P9OE+##>QtD(u~hA z%rrj3aK`uy!+&Vx8>gLNNJ~4zFf;88!;&oHF@Kf^Hd{~3le|IaY|hbAOY3IW9oC`8UM{0Bn@ z label; PixmapSetActive *pixmaps = nullptr; bool active = false; + bool write_active = false; void setActive(bool b) { @@ -115,11 +122,23 @@ struct StateActive { refresh(); } + void setWriteActive(bool b) + { + if (!label || b == write_active) + return; + + write_active = b; + refresh(); + } + void refresh() { if (!label) return; - label->setPixmap(active ? pixmaps->active : pixmaps->normal); + if (active && write_active) + label->setPixmap(pixmaps->read_write_active); + else + label->setPixmap(write_active ? pixmaps->write_active : (active ? pixmaps->active : pixmaps->normal)); } }; struct StateEmpty { @@ -145,9 +164,10 @@ struct StateEmpty { }; struct StateEmptyActive { std::unique_ptr label; - PixmapSetEmptyActive *pixmaps = nullptr; - bool empty = false; - bool active = false; + PixmapSetEmptyActive *pixmaps = nullptr; + bool empty = false; + bool active = false; + bool write_active = false; void setActive(bool b) { @@ -157,6 +177,14 @@ struct StateEmptyActive { active = b; refresh(); } + void setWriteActive(bool b) + { + if (!label || b == write_active) + return; + + write_active = b; + refresh(); + } void setEmpty(bool b) { if (!label || b == empty) @@ -170,9 +198,15 @@ struct StateEmptyActive { if (!label) return; if (empty) { - label->setPixmap(active ? pixmaps->empty_active : pixmaps->empty); + if (active && write_active) + label->setPixmap(pixmaps->empty_read_write_active); + else + label->setPixmap(write_active ? pixmaps->empty_write_active : (active ? pixmaps->empty_active : pixmaps->empty)); } else { - label->setPixmap(active ? pixmaps->active : pixmaps->normal); + if (active && write_active) + label->setPixmap(pixmaps->read_write_active); + else + label->setPixmap(write_active ? pixmaps->write_active : (active ? pixmaps->active : pixmaps->normal)); } } }; @@ -191,6 +225,9 @@ PixmapSetActive::load(const QIcon &icon) { normal = getIconWithIndicator(icon, pixmap_size, QIcon::Normal, None); active = getIconWithIndicator(icon, pixmap_size, QIcon::Normal, Active); + + write_active = getIconWithIndicator(icon, pixmap_size, QIcon::Normal, WriteActive); + read_write_active = getIconWithIndicator(icon, pixmap_size, QIcon::Normal, ReadWriteActive); } void @@ -203,10 +240,14 @@ PixmapSetDisabled::load(const QIcon &icon) void PixmapSetEmptyActive::load(const QIcon &icon) { - normal = getIconWithIndicator(icon, pixmap_size, QIcon::Normal, None); - active = getIconWithIndicator(icon, pixmap_size, QIcon::Normal, Active); - empty = getIconWithIndicator(icon, pixmap_size, QIcon::Disabled, None); - empty_active = getIconWithIndicator(icon, pixmap_size, QIcon::Disabled, Active); + normal = getIconWithIndicator(icon, pixmap_size, QIcon::Normal, None); + active = getIconWithIndicator(icon, pixmap_size, QIcon::Normal, Active); + write_active = getIconWithIndicator(icon, pixmap_size, QIcon::Normal, WriteActive); + read_write_active = getIconWithIndicator(icon, pixmap_size, QIcon::Normal, ReadWriteActive); + empty = getIconWithIndicator(icon, pixmap_size, QIcon::Disabled, None); + empty_active = getIconWithIndicator(icon, pixmap_size, QIcon::Disabled, Active); + empty_write_active = getIconWithIndicator(icon, pixmap_size, QIcon::Disabled, WriteActive); + empty_read_write_active = getIconWithIndicator(icon, pixmap_size, QIcon::Disabled, ReadWriteActive); } } @@ -217,10 +258,13 @@ struct MachineStatus::States { { pixmaps.cartridge.load(QIcon(":/settings/qt/icons/cartridge.ico")); pixmaps.cassette.load(QIcon(":/settings/qt/icons/cassette.ico")); - pixmaps.floppy_disabled.normal = QIcon(":/settings/qt/icons/floppy_disabled.ico").pixmap(pixmap_size); - pixmaps.floppy_disabled.active = pixmaps.floppy_disabled.normal; - pixmaps.floppy_disabled.empty = pixmaps.floppy_disabled.normal; - pixmaps.floppy_disabled.empty_active = pixmaps.floppy_disabled.normal; + pixmaps.floppy_disabled.normal = QIcon(":/settings/qt/icons/floppy_disabled.ico").pixmap(pixmap_size); + pixmaps.floppy_disabled.active = pixmaps.floppy_disabled.normal; + pixmaps.floppy_disabled.read_write_active = pixmaps.floppy_disabled.normal; + pixmaps.floppy_disabled.empty = pixmaps.floppy_disabled.normal; + pixmaps.floppy_disabled.empty_active = pixmaps.floppy_disabled.normal; + pixmaps.floppy_disabled.empty_write_active = pixmaps.floppy_disabled.normal; + pixmaps.floppy_disabled.empty_read_write_active = pixmaps.floppy_disabled.normal; pixmaps.floppy_525.load(QIcon(":/settings/qt/icons/floppy_525.ico")); pixmaps.floppy_35.load(QIcon(":/settings/qt/icons/floppy_35.ico")); pixmaps.cdrom.load(QIcon(":/settings/qt/icons/cdrom.ico")); @@ -435,49 +479,79 @@ MachineStatus::refreshIcons() if (!update_icons) return; - for (size_t i = 0; i < FDD_NUM; ++i) + for (size_t i = 0; i < FDD_NUM; ++i) { d->fdd[i].setActive(machine_status.fdd[i].active); + d->fdd[i].setWriteActive(machine_status.fdd[i].write_active); + } for (size_t i = 0; i < CDROM_NUM; ++i) { d->cdrom[i].setActive(machine_status.cdrom[i].active); - if (machine_status.cdrom[i].active) + d->cdrom[i].setWriteActive(machine_status.cdrom[i].write_active); + if (machine_status.cdrom[i].active) { ui_sb_update_icon(SB_CDROM | i, 0); + } + if (machine_status.cdrom[i].write_active) { + ui_sb_update_icon_write(SB_CDROM | i, 0); + } } for (size_t i = 0; i < ZIP_NUM; i++) { d->zip[i].setActive(machine_status.zip[i].active); + d->zip[i].setWriteActive(machine_status.zip[i].write_active); if (machine_status.zip[i].active) ui_sb_update_icon(SB_ZIP | i, 0); + if (machine_status.zip[i].write_active) + ui_sb_update_icon_write(SB_ZIP | i, 0); } for (size_t i = 0; i < MO_NUM; i++) { d->mo[i].setActive(machine_status.mo[i].active); + d->mo[i].setWriteActive(machine_status.mo[i].write_active); if (machine_status.mo[i].active) ui_sb_update_icon(SB_MO | i, 0); + if (machine_status.mo[i].write_active) + ui_sb_update_icon_write(SB_MO | i, 0); } for (size_t i = 0; i < HDD_BUS_USB; i++) { d->hdds[i].setActive(machine_status.hdd[i].active); + d->hdds[i].setWriteActive(machine_status.hdd[i].write_active); if (machine_status.hdd[i].active) ui_sb_update_icon(SB_HDD | i, 0); + if (machine_status.hdd[i].write_active) + ui_sb_update_icon_write(SB_HDD | i, 0); } - for (size_t i = 0; i < NET_CARD_MAX; i++) + for (size_t i = 0; i < NET_CARD_MAX; i++) { d->net[i].setActive(machine_status.net[i].active); + d->net[i].setWriteActive(machine_status.net[i].write_active); + } } void MachineStatus::clearActivity() { - for (auto &fdd : d->fdd) + for (auto &fdd : d->fdd) { fdd.setActive(false); - for (auto &cdrom : d->cdrom) + fdd.setWriteActive(false); + } + for (auto &cdrom : d->cdrom) { cdrom.setActive(false); - for (auto &zip : d->zip) + cdrom.setWriteActive(false); + } + for (auto &zip : d->zip) { zip.setActive(false); - for (auto &mo : d->mo) + zip.setWriteActive(false); + } + for (auto &mo : d->mo) { mo.setActive(false); - for (auto &hdd : d->hdds) + mo.setWriteActive(false); + } + for (auto &hdd : d->hdds) { hdd.setActive(false); - for (auto &net : d->net) + hdd.setWriteActive(false); + } + for (auto &net : d->net) { net.setActive(false); + net.setWriteActive(false); + } } void @@ -562,6 +636,7 @@ MachineStatus::refresh(QStatusBar *sbar) d->fdd[i].label = std::make_unique(); d->fdd[i].setEmpty(QString(floppyfns[i]).isEmpty()); d->fdd[i].setActive(false); + d->fdd[i].setWriteActive(false); d->fdd[i].refresh(); connect((ClickableLabel *) d->fdd[i].label.get(), &ClickableLabel::clicked, [i](QPoint pos) { MediaMenu::ptr->floppyMenus[i]->popup(pos - QPoint(0, MediaMenu::ptr->floppyMenus[i]->sizeHint().height())); @@ -578,6 +653,7 @@ MachineStatus::refresh(QStatusBar *sbar) d->cdrom[i].label = std::make_unique(); d->cdrom[i].setEmpty(QString(cdrom[i].image_path).isEmpty()); d->cdrom[i].setActive(false); + d->cdrom[i].setWriteActive(false); d->cdrom[i].refresh(); connect((ClickableLabel *) d->cdrom[i].label.get(), &ClickableLabel::clicked, [i](QPoint pos) { MediaMenu::ptr->cdromMenus[i]->popup(pos - QPoint(0, MediaMenu::ptr->cdromMenus[i]->sizeHint().height())); @@ -594,6 +670,7 @@ MachineStatus::refresh(QStatusBar *sbar) d->zip[i].label = std::make_unique(); d->zip[i].setEmpty(QString(zip_drives[i].image_path).isEmpty()); d->zip[i].setActive(false); + d->zip[i].setWriteActive(false); d->zip[i].refresh(); connect((ClickableLabel *) d->zip[i].label.get(), &ClickableLabel::clicked, [i](QPoint pos) { MediaMenu::ptr->zipMenus[i]->popup(pos - QPoint(0, MediaMenu::ptr->zipMenus[i]->sizeHint().height())); @@ -610,6 +687,7 @@ MachineStatus::refresh(QStatusBar *sbar) d->mo[i].label = std::make_unique(); d->mo[i].setEmpty(QString(mo_drives[i].image_path).isEmpty()); d->mo[i].setActive(false); + d->mo[i].setWriteActive(false); d->mo[i].refresh(); connect((ClickableLabel *) d->mo[i].label.get(), &ClickableLabel::clicked, [i](QPoint pos) { MediaMenu::ptr->moMenus[i]->popup(pos - QPoint(0, MediaMenu::ptr->moMenus[i]->sizeHint().height())); @@ -626,6 +704,7 @@ MachineStatus::refresh(QStatusBar *sbar) d->net[i].label = std::make_unique(); d->net[i].setEmpty(!network_is_connected(i)); d->net[i].setActive(false); + d->net[i].setWriteActive(false); d->net[i].refresh(); d->net[i].label->setToolTip(MediaMenu::ptr->netMenus[i]->title()); connect((ClickableLabel *) d->net[i].label.get(), &ClickableLabel::clicked, [i](QPoint pos) { @@ -638,6 +717,7 @@ MachineStatus::refresh(QStatusBar *sbar) if ((has_mfm || (hdc_name.left(5) == QStringLiteral("st506"))) && (c_mfm > 0)) { d->hdds[HDD_BUS_MFM].label = std::make_unique(); d->hdds[HDD_BUS_MFM].setActive(false); + d->hdds[HDD_BUS_MFM].setWriteActive(false); d->hdds[HDD_BUS_MFM].refresh(); d->hdds[HDD_BUS_MFM].label->setToolTip(tr("Hard disk (%1)").arg("MFM/RLL")); auto tooltip = d->hdds[HDD_BUS_MFM].label->toolTip(); @@ -653,6 +733,7 @@ MachineStatus::refresh(QStatusBar *sbar) if ((has_esdi || (hdc_name.left(4) == QStringLiteral("esdi"))) && (c_esdi > 0)) { d->hdds[HDD_BUS_ESDI].label = std::make_unique(); d->hdds[HDD_BUS_ESDI].setActive(false); + d->hdds[HDD_BUS_ESDI].setWriteActive(false); d->hdds[HDD_BUS_ESDI].refresh(); d->hdds[HDD_BUS_ESDI].label->setToolTip(tr("Hard disk (%1)").arg("ESDI")); auto tooltip = d->hdds[HDD_BUS_ESDI].label->toolTip(); @@ -668,6 +749,7 @@ MachineStatus::refresh(QStatusBar *sbar) if ((has_xta || (hdc_name.left(3) == QStringLiteral("xta"))) && (c_xta > 0)) { d->hdds[HDD_BUS_XTA].label = std::make_unique(); d->hdds[HDD_BUS_XTA].setActive(false); + d->hdds[HDD_BUS_XTA].setWriteActive(false); d->hdds[HDD_BUS_XTA].refresh(); d->hdds[HDD_BUS_XTA].label->setToolTip(tr("Hard disk (%1)").arg("XTA")); auto tooltip = d->hdds[HDD_BUS_XTA].label->toolTip(); @@ -686,6 +768,7 @@ MachineStatus::refresh(QStatusBar *sbar) if (c_ide > 0) { d->hdds[HDD_BUS_IDE].label = std::make_unique(); d->hdds[HDD_BUS_IDE].setActive(false); + d->hdds[HDD_BUS_IDE].setWriteActive(false); d->hdds[HDD_BUS_IDE].refresh(); d->hdds[HDD_BUS_IDE].label->setToolTip(tr("Hard disk (%1)").arg("IDE")); auto tooltip = d->hdds[HDD_BUS_IDE].label->toolTip(); @@ -701,6 +784,7 @@ MachineStatus::refresh(QStatusBar *sbar) if (c_atapi > 0) { d->hdds[HDD_BUS_ATAPI].label = std::make_unique(); d->hdds[HDD_BUS_ATAPI].setActive(false); + d->hdds[HDD_BUS_ATAPI].setWriteActive(false); d->hdds[HDD_BUS_ATAPI].refresh(); d->hdds[HDD_BUS_ATAPI].label->setToolTip(tr("Hard disk (%1)").arg("ATAPI")); auto tooltip = d->hdds[HDD_BUS_ATAPI].label->toolTip(); @@ -720,6 +804,7 @@ MachineStatus::refresh(QStatusBar *sbar) (c_scsi > 0)) { d->hdds[HDD_BUS_SCSI].label = std::make_unique(); d->hdds[HDD_BUS_SCSI].setActive(false); + d->hdds[HDD_BUS_SCSI].setWriteActive(false); d->hdds[HDD_BUS_SCSI].refresh(); d->hdds[HDD_BUS_SCSI].label->setToolTip(tr("Hard disk (%1)").arg("SCSI")); auto tooltip = d->hdds[HDD_BUS_SCSI].label->toolTip(); diff --git a/src/qt/qt_ui.cpp b/src/qt/qt_ui.cpp index b4e8a5486..5a6bda852 100644 --- a/src/qt/qt_ui.cpp +++ b/src/qt/qt_ui.cpp @@ -314,4 +314,41 @@ ui_sb_update_icon(int tag, int active) break; } } + +void +ui_sb_update_icon_write(int tag, int write) +{ + const auto temp = static_cast(tag); + const int category = static_cast(temp & 0xfffffff0); + const int item = tag & 0xf; + + switch (category) { + default: + case SB_CASSETTE: + case SB_CARTRIDGE: + break; + case SB_FLOPPY: + machine_status.fdd[item].write_active = write > 0 ? true : false; + break; + case SB_CDROM: + machine_status.cdrom[item].write_active = write > 0 ? true : false; + break; + case SB_ZIP: + machine_status.zip[item].write_active = write > 0 ? true : false; + break; + case SB_MO: + machine_status.mo[item].write_active = write > 0 ? true : false; + break; + case SB_HDD: + machine_status.hdd[item].write_active = write > 0 ? true : false; + break; + case SB_NETWORK: + machine_status.net[item].write_active = write > 0 ? true : false; + break; + case SB_SOUND: + case SB_TEXT: + break; + } +} + } diff --git a/src/qt_resources.qrc b/src/qt_resources.qrc index dc8db2c06..bc553ac61 100644 --- a/src/qt_resources.qrc +++ b/src/qt_resources.qrc @@ -28,6 +28,7 @@ qt/icons/zip.ico qt/icons/zip_disabled.ico qt/icons/active.ico + qt/icons/write_active.ico qt/icons/disabled.ico qt/icons/86Box-gray.ico qt/icons/86Box-green.ico diff --git a/src/scsi/scsi_disk.c b/src/scsi/scsi_disk.c index 0a035a23d..8c09a30a1 100644 --- a/src/scsi/scsi_disk.c +++ b/src/scsi/scsi_disk.c @@ -614,6 +614,7 @@ scsi_disk_cmd_error(scsi_disk_t *dev) dev->callback = 50.0 * SCSI_TIME; scsi_disk_set_callback(dev); ui_sb_update_icon(SB_HDD | dev->drv->bus_type, 0); + ui_sb_update_icon_write(SB_HDD | dev->drv->bus_type, 0); scsi_disk_log(dev->log, "ERROR: %02X/%02X/%02X\n", scsi_disk_sense_key, scsi_disk_asc, scsi_disk_ascq); } @@ -1208,7 +1209,7 @@ scsi_disk_command(scsi_common_t *sc, const uint8_t *cdb) scsi_disk_data_command_finish(dev, dev->packet_len, 512, dev->packet_len, 1); - ui_sb_update_icon(SB_HDD | dev->drv->bus_type, dev->packet_status != PHASE_COMPLETE); + ui_sb_update_icon_write(SB_HDD | dev->drv->bus_type, dev->packet_status != PHASE_COMPLETE); } else { scsi_disk_set_phase(dev, SCSI_PHASE_STATUS); scsi_disk_log(dev->log, "All done - callback set\n"); @@ -1243,7 +1244,7 @@ scsi_disk_command(scsi_common_t *sc, const uint8_t *cdb) scsi_disk_data_command_finish(dev, 512, 512, alloc_length, 1); - ui_sb_update_icon(SB_HDD | dev->drv->bus_type, + ui_sb_update_icon_write(SB_HDD | dev->drv->bus_type, dev->packet_status != PHASE_COMPLETE); } else { scsi_disk_set_phase(dev, SCSI_PHASE_STATUS); diff --git a/src/sound/CMakeLists.txt b/src/sound/CMakeLists.txt index d575717a0..0bbeb2af5 100644 --- a/src/sound/CMakeLists.txt +++ b/src/sound/CMakeLists.txt @@ -146,7 +146,7 @@ if(FLUIDSYNTH) pkg_check_modules(FLUIDSYNTH REQUIRED IMPORTED_TARGET fluidsynth) target_link_libraries(86Box PkgConfig::FLUIDSYNTH) if(STATIC_BUILD) - target_link_libraries(86Box -static ${FLUIDSYNTH_STATIC_LIBRARIES} -fopenmp) + target_link_libraries(86Box -static ${FLUIDSYNTH_STATIC_LIBRARIES} -fopenmp -lgomp) if(WIN32) add_compile_definitions(FLUIDSYNTH_NOT_A_DLL) From 7901842c429a650278de5e0039cee30c01e9465b Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Tue, 22 Apr 2025 22:08:52 +0600 Subject: [PATCH 059/180] Write indicator for floppy drives Write indicator is also properly contrasted on 5.25 floppy drives --- src/floppy/fdc.c | 27 +++++++++++++++++++++------ src/qt/icons/write_active.ico | Bin 6950 -> 6950 bytes src/sound/CMakeLists.txt | 2 +- 3 files changed, 22 insertions(+), 7 deletions(-) diff --git a/src/floppy/fdc.c b/src/floppy/fdc.c index 1f49b192a..c32b1f442 100644 --- a/src/floppy/fdc.c +++ b/src/floppy/fdc.c @@ -615,7 +615,10 @@ fdc_io_command_phase1(fdc_t *fdc, int out) } } - ui_sb_update_icon(SB_FLOPPY | real_drive(fdc, fdc->drive), 1); + if (fdc->processed_cmd == 0x05 || fdc->processed_cmd == 0x09) + ui_sb_update_icon_write(SB_FLOPPY | real_drive(fdc, fdc->drive), 1); + else + ui_sb_update_icon(SB_FLOPPY | real_drive(fdc, fdc->drive), 1); fdc->stat = out ? 0x10 : 0x50; if ((fdc->flags & FDC_FLAG_PCJR) || !fdc->dma) { fdc->stat |= 0x20; @@ -671,8 +674,10 @@ fdc_soft_reset(fdc_t *fdc) fdc->perp &= 0xfc; - for (int i = 0; i < FDD_NUM; i++) - ui_sb_update_icon(SB_FLOPPY | i, 0); + for (int i = 0; i < FDD_NUM; i++) { + ui_sb_update_icon(SB_FLOPPY | i, 0); + ui_sb_update_icon_write(SB_FLOPPY | i, 0); + } fdc_ctrl_reset(fdc); } @@ -706,6 +711,7 @@ fdc_write(uint16_t addr, uint8_t val, void *priv) timer_set_delay_u64(&fdc->timer, 8 * TIMER_USEC); fdc->interrupt = -1; ui_sb_update_icon(SB_FLOPPY | 0, 0); + ui_sb_update_icon_write(SB_FLOPPY | 0, 0); fdc_ctrl_reset(fdc); } if (!fdd_get_flags(0)) @@ -1502,6 +1508,7 @@ fdc_poll_common_finish(fdc_t *fdc, int compare, int st5) fdc->res[10] = fdc->params[4]; fdc_log("Read/write finish (%02X %02X %02X %02X %02X %02X %02X)\n", fdc->res[4], fdc->res[5], fdc->res[6], fdc->res[7], fdc->res[8], fdc->res[9], fdc->res[10]); ui_sb_update_icon(SB_FLOPPY | real_drive(fdc, fdc->drive), 0); + ui_sb_update_icon_write(SB_FLOPPY | real_drive(fdc, fdc->drive), 0); fdc->paramstogo = 7; dma_set_drq(fdc->dma_ch, 0); } @@ -1545,8 +1552,10 @@ fdc_callback(void *priv) case -5: /*Reset in power down mode */ fdc->perp &= 0xfc; - for (uint8_t i = 0; i < FDD_NUM; i++) + for (uint8_t i = 0; i < FDD_NUM; i++) { ui_sb_update_icon(SB_FLOPPY | i, 0); + ui_sb_update_icon_write(SB_FLOPPY | i, 0); + } fdc_ctrl_reset(fdc); @@ -1694,7 +1703,10 @@ fdc_callback(void *priv) fdc->sector++; else if (fdc->params[5] == 0) fdc->sector++; - ui_sb_update_icon(SB_FLOPPY | real_drive(fdc, fdc->drive), 1); + if (fdc->interrupt == 0x05 || fdc->interrupt == 0x09) + ui_sb_update_icon_write(SB_FLOPPY | real_drive(fdc, fdc->drive), 1); + else + ui_sb_update_icon(SB_FLOPPY | real_drive(fdc, fdc->drive), 1); switch (fdc->interrupt) { case 5: case 9: @@ -1885,6 +1897,7 @@ fdc_error(fdc_t *fdc, int st5, int st6) break; } ui_sb_update_icon(SB_FLOPPY | real_drive(fdc, fdc->drive), 0); + ui_sb_update_icon_write(SB_FLOPPY | real_drive(fdc, fdc->drive), 0); fdc->paramstogo = 7; } @@ -2333,8 +2346,10 @@ fdc_reset(void *priv) current_drive = 0; - for (uint8_t i = 0; i < FDD_NUM; i++) + for (uint8_t i = 0; i < FDD_NUM; i++) { ui_sb_update_icon(SB_FLOPPY | i, 0); + ui_sb_update_icon_write(SB_FLOPPY | i, 0); + } fdc->power_down = 0; } diff --git a/src/qt/icons/write_active.ico b/src/qt/icons/write_active.ico index d1ebdb22498d6dbdfeae87c7d21969948c5cc868..9cbf6e74b659ca410b87ec4501534d187c76f82f 100644 GIT binary patch delta 1081 zcmZ2xw#;lo1LOaVjq)t@EHJ>tfCQKrVZto56*pob*@Df1tlt?yu4iSLIDupGJ7M<8 zvE0%KkAPf`;%Jb+kUT^i`Fcc%(Z&J-=GW8Qhxi?^`76(BCdU683;!~sMg{zvkkvhb0^Z4jQb#8%Nbyd-CKUhxV4ypk delta 933 zcmZ2xw#;lo!{!hC@0ce}keJ-YB2~`}156A^fQb<%%uHKxBW98<*c{0Eoe}B>g~?&u zN(euI9F5{$ke87BLL2#dL}1az0s`jO)7*#n9kBT;&ugZM1p?4G5lCQy08rqAF~og{ zh#{TN$jHcu&_7w8cjDy7BGQw8iS#h_^={zvkk!E*I9X8Y=wt;c-pSXb0sv_`bx!~Q diff --git a/src/sound/CMakeLists.txt b/src/sound/CMakeLists.txt index 0bbeb2af5..d575717a0 100644 --- a/src/sound/CMakeLists.txt +++ b/src/sound/CMakeLists.txt @@ -146,7 +146,7 @@ if(FLUIDSYNTH) pkg_check_modules(FLUIDSYNTH REQUIRED IMPORTED_TARGET fluidsynth) target_link_libraries(86Box PkgConfig::FLUIDSYNTH) if(STATIC_BUILD) - target_link_libraries(86Box -static ${FLUIDSYNTH_STATIC_LIBRARIES} -fopenmp -lgomp) + target_link_libraries(86Box -static ${FLUIDSYNTH_STATIC_LIBRARIES} -fopenmp) if(WIN32) add_compile_definitions(FLUIDSYNTH_NOT_A_DLL) From c23f33b65e9cf64239c2bd3ddb3032e371ba01fd Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Tue, 22 Apr 2025 22:12:15 +0600 Subject: [PATCH 060/180] Fix SDL compiles --- src/unix/unix.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/unix/unix.c b/src/unix/unix.c index 8e44cc26a..2e92a90d3 100644 --- a/src/unix/unix.c +++ b/src/unix/unix.c @@ -471,6 +471,12 @@ ui_sb_update_icon(UNUSED(int tag), UNUSED(int active)) /* No-op. */ } +void +ui_sb_update_icon_write(UNUSED(int tag), UNUSED(int active)) +{ + /* No-op. */ +} + void plat_delay_ms(uint32_t count) { From e1cdf1b288aeffd759112e7bdd21a8c7206b9a27 Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Tue, 22 Apr 2025 22:31:58 +0600 Subject: [PATCH 061/180] 20x20 icon made consistent with other sizes --- src/qt/icons/write_active.ico | Bin 6950 -> 6950 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/src/qt/icons/write_active.ico b/src/qt/icons/write_active.ico index 9cbf6e74b659ca410b87ec4501534d187c76f82f..babf8c86c0f94585cf9e00cd60d17c682fcf7c34 100644 GIT binary patch delta 155 xcmZ2xw#;lpo@6~QI|Bsp^1%Up#MnWAnVp??a)6}VWNE40lNF?RCts5a005JK4IBUf delta 171 ycmZ2xw#;lpo@D(Kb_NLG<%0wIh_Qo!I6FJC#ZRDsce0?=(a8!@ypyj<1poj5RvMH5 From 592e5c6a79e6f700e7e9de6036450d28c2955871 Mon Sep 17 00:00:00 2001 From: OBattler Date: Tue, 22 Apr 2025 21:10:06 +0200 Subject: [PATCH 062/180] Cirrus Logic: Implement proper VLB addressing, closes #5337. --- src/video/vid_cl54xx.c | 95 +++++++++++++++++++++++++++++++++++++++--- 1 file changed, 89 insertions(+), 6 deletions(-) diff --git a/src/video/vid_cl54xx.c b/src/video/vid_cl54xx.c index 21d9b21d8..b60f9bdca 100644 --- a/src/video/vid_cl54xx.c +++ b/src/video/vid_cl54xx.c @@ -260,6 +260,8 @@ typedef struct gd54xx_t { uint8_t pos_regs[8]; + uint32_t vlb_lfb_base; + uint32_t lfb_base; uint32_t vgablt_base; @@ -1750,7 +1752,8 @@ gd543x_recalc_mapping(gd54xx_t *gd54xx) } else mem_mapping_disable(&gd54xx->mmio_mapping); } else { - if ((svga->crtc[0x27] <= CIRRUS_ID_CLGD5429) || (!gd54xx->pci && !gd54xx->vlb)) { + if ((svga->crtc[0x27] <= CIRRUS_ID_CLGD5429) || + (!gd54xx->pci && !gd54xx->vlb)) { if (svga->gdcreg[0x0b] & CIRRUS_BANKING_GRANULARITY_16K) { base = (svga->seqregs[0x07] & 0xf0) << 16; size = 1 * 1024 * 1024; @@ -1770,7 +1773,10 @@ gd543x_recalc_mapping(gd54xx_t *gd54xx) else size = 4 * 1024 * 1024; } else { /*VLB/ISA/MCA*/ - base = 128 * 1024 * 1024; + if (gd54xx->vlb_lfb_base != 0x00000000) + base = gd54xx->vlb_lfb_base; + else + base = 128 * 1024 * 1024; if (svga->crtc[0x27] >= CIRRUS_ID_CLGD5436) size = 16 * 1024 * 1024; else @@ -4224,6 +4230,12 @@ gd54xx_init(const device_t *info) gd54xx->id = id; + if (gd54xx->vlb && ((gd54xx->id == CIRRUS_ID_CLGD5430) || + (gd54xx->id == CIRRUS_ID_CLGD5434) || + (gd54xx->id == CIRRUS_ID_CLGD5434_4) || + (gd54xx->id == CIRRUS_ID_CLGD5440))) + gd54xx->vlb_lfb_base = device_get_config_int("lfb_base") << 20; + switch (id) { case CIRRUS_ID_CLGD5401: romfn = BIOS_GD5401_PATH; @@ -4777,6 +4789,41 @@ static const device_config_t gd5429_config[] = { { .name = "", .description = "", .type = CONFIG_END } }; +static const device_config_t gd5430_vlb_config[] = { + { + .name = "memory", + .description = "Memory size", + .type = CONFIG_SELECTION, + .default_string = NULL, + .default_int = 2, + .file_filter = NULL, + .spinner = { 0 }, + .selection = { + { .description = "1 MB", .value = 1 }, + { .description = "2 MB", .value = 2 }, + { .description = "" } + }, + .bios = { { 0 } } + }, + { + .name = "lfb_base", + .description = "Linear framebuffer base", + .type = CONFIG_SELECTION, + .default_string = NULL, + .default_int = 2, + .file_filter = NULL, + .spinner = { 0 }, + .selection = { + { .description = "32 MB", .value = 32 }, + { .description = "64 MB", .value = 64 }, + { .description = "2048 MB", .value = 2048 }, + { .description = "" } + }, + .bios = { { 0 } } + }, + { .name = "", .description = "", .type = CONFIG_END } +}; + static const device_config_t gd5440_onboard_config[] = { { .name = "memory", @@ -4816,6 +4863,42 @@ static const device_config_t gd5434_config[] = { { .name = "", .description = "", .type = CONFIG_END } }; +static const device_config_t gd5434_vlb_config[] = { + { + .name = "memory", + .description = "Memory size", + .type = CONFIG_SELECTION, + .default_string = NULL, + .default_int = 4, + .file_filter = NULL, + .spinner = { 0 }, + .selection = { + { .description = "1 MB", .value = 1 }, + { .description = "2 MB", .value = 2 }, + { .description = "4 MB", .value = 4 }, + { .description = "" } + }, + .bios = { { 0 } } + }, + { + .name = "lfb_base", + .description = "Linear framebuffer base", + .type = CONFIG_SELECTION, + .default_string = NULL, + .default_int = 2, + .file_filter = NULL, + .spinner = { 0 }, + .selection = { + { .description = "32 MB", .value = 32 }, + { .description = "64 MB", .value = 64 }, + { .description = "2048 MB", .value = 2048 }, + { .description = "" } + }, + .bios = { { 0 } } + }, + { .name = "", .description = "", .type = CONFIG_END } +}; + static const device_config_t gd5434_onboard_config[] = { { .name = "memory", @@ -5150,7 +5233,7 @@ const device_t gd5430_diamond_speedstar_pro_se_a8_vlb_device = { .available = gd5430_diamond_a8_available, .speed_changed = gd54xx_speed_changed, .force_redraw = gd54xx_force_redraw, - .config = gd5429_config + .config = gd5430_vlb_config }; const device_t gd5430_vlb_device = { @@ -5164,7 +5247,7 @@ const device_t gd5430_vlb_device = { .available = gd5430_orchid_vlb_available, .speed_changed = gd54xx_speed_changed, .force_redraw = gd54xx_force_redraw, - .config = gd5429_config + .config = gd5430_vlb_config }; const device_t gd5430_onboard_vlb_device = { @@ -5178,7 +5261,7 @@ const device_t gd5430_onboard_vlb_device = { .available = NULL, .speed_changed = gd54xx_speed_changed, .force_redraw = gd54xx_force_redraw, - .config = gd5429_config + .config = gd5430_vlb_config }; const device_t gd5430_pci_device = { @@ -5263,7 +5346,7 @@ const device_t gd5434_vlb_device = { .available = gd5430_orchid_vlb_available, .speed_changed = gd54xx_speed_changed, .force_redraw = gd54xx_force_redraw, - .config = gd5434_config + .config = gd5434_vlb_config }; const device_t gd5434_pci_device = { From 14ef3b75ac810a9b65500ac61b6c108576c01033 Mon Sep 17 00:00:00 2001 From: TC1995 Date: Tue, 22 Apr 2025 21:15:05 +0200 Subject: [PATCH 063/180] Vast fixes to the Mach8/32/8514/A compatible side (April 22nd 2025) 1. As tiring as it seems, XOR properly the passthrough bits for mode changes. Fixes everything tested as of now (Mach8/32). 2. Implemented separate destination and source GE pitch and offsets. Fixes Windows 3.1 mach8/32 drivers using devicebitmap enabled (or dmp=1). 3. Properly fixed high and true color patterns so that the aforementioned patterns are drawn correctly in various stuff. 4. Implemented in the best possible way the CRT offset (currently in on conjunction with the GE offset). 5. On ScanToX with bpp set to 24 and dpconfig 0x6211, optmize the SRC/CUR X-Y coordinates at the end of the blit. 6. For mode changes, don't call the mode change recalctimings function if we aren't in the appropriate bits of the respective ports. 7. Separate 8514/A compatible and Extended foreground/background selection implemented, fixes Windows 3.x ATI Ultra drivers from 1992 without hacks. 8. Clear the busy flags when needed without stalling the entire guests (but not the emulator itself) (Mach8/32). 9. The MMIO regs should be enabled only when the VGA aperture has reached a graphics mode (0xA000). This fixes NT 3.x mach drivers in true color mode and making Win3.1 drivers working without a hitch at the same time. 10. Actually implement the hardware 4bpp cursor properly on Mach32. 11. Cosmetic cleanups. --- src/include/86box/vid_8514a.h | 17 +- src/include/86box/vid_ati_mach8.h | 14 +- src/include/86box/vid_svga.h | 4 +- src/video/vid_8514a.c | 236 ++--- src/video/vid_ati_mach8.c | 1344 +++++++++++++++-------------- src/video/vid_svga.c | 6 +- 6 files changed, 803 insertions(+), 818 deletions(-) diff --git a/src/include/86box/vid_8514a.h b/src/include/86box/vid_8514a.h index 7694a028a..696b640bc 100644 --- a/src/include/86box/vid_8514a.h +++ b/src/include/86box/vid_8514a.h @@ -90,6 +90,7 @@ typedef struct ibm8514_t { uint16_t subsys_cntl; uint16_t setup_md; uint16_t advfunc_cntl; + uint16_t advfunc_cntl_old; uint16_t cur_y; uint16_t cur_x; int16_t destx; @@ -107,8 +108,10 @@ typedef struct ibm8514_t { uint16_t wrt_mask; uint16_t rd_mask; uint16_t color_cmp; - uint16_t bkgd_mix; - uint16_t frgd_mix; + uint8_t bkgd_mix; + uint8_t frgd_mix; + uint8_t bkgd_sel; + uint8_t frgd_sel; uint16_t multifunc_cntl; uint16_t multifunc[16]; uint16_t clip_right; @@ -159,6 +162,14 @@ typedef struct ibm8514_t { int ydir; int linedraw; uint32_t ge_offset; + uint32_t src_ge_offset; + uint32_t dst_ge_offset; + uint16_t src_pitch; + uint16_t dst_pitch; + int64_t cur_x_24bpp; + int64_t cur_y_24bpp; + int64_t dest_x_24bpp; + int64_t dest_y_24bpp; } accel; uint16_t test; @@ -240,6 +251,8 @@ typedef struct ibm8514_t { uint32_t vram_amount; int vram_512k_8514; int vendor_mode; + int _8514on; + int _8514crt; PALETTE _8514pal; latch8514_t latch; diff --git a/src/include/86box/vid_ati_mach8.h b/src/include/86box/vid_ati_mach8.h index 8ed1dbc74..d5e80d0c8 100644 --- a/src/include/86box/vid_ati_mach8.h +++ b/src/include/86box/vid_ati_mach8.h @@ -77,8 +77,9 @@ typedef struct mach_t { uint8_t overscan_g_col_24; uint8_t overscan_r_col_24; uint16_t fifo_test_data[17]; - int port_len; - int crt_resolution; + uint8_t old_on1; + uint8_t old_on2; + int crt_resolution; struct { uint8_t line_idx; @@ -99,12 +100,13 @@ typedef struct mach_t { uint16_t src_x_end; uint16_t src_x_start; uint16_t src_x; - uint16_t r_src_x; uint16_t src_y; int16_t bres_count; uint16_t clock_sel; uint16_t crt_pitch; uint16_t ge_pitch; + uint16_t src_pitch; + uint16_t dst_pitch; uint16_t dest_cmp_fn; uint16_t dp_config; uint16_t ext_ge_config; @@ -158,14 +160,18 @@ typedef struct mach_t { int src_stepx; uint8_t mono_pattern_normal[16]; uint8_t color_pattern[32]; + uint16_t color_pattern_hicol[8]; int mono_pattern[8][8]; - uint32_t ge_offset; + uint32_t src_ge_offset; + uint32_t dst_ge_offset; uint32_t crt_offset; uint32_t patt_len_reg; int poly_fill; uint16_t dst_clr_cmp_mask; int clip_overrun; int color_pattern_idx; + int64_t src_x_scan; + int64_t src_y_scan; } accel; atomic_int force_busy; diff --git a/src/include/86box/vid_svga.h b/src/include/86box/vid_svga.h index 068774eac..932aa718a 100644 --- a/src/include/86box/vid_svga.h +++ b/src/include/86box/vid_svga.h @@ -171,11 +171,11 @@ typedef struct svga_t { latch_t latch; pc_timer_t timer; - pc_timer_t timer8514; + pc_timer_t timer_8514; pc_timer_t timer_xga; double clock; - double clock8514; + double clock_8514; double clock_xga; double multiplier; diff --git a/src/video/vid_8514a.c b/src/video/vid_8514a.c index 8925f01da..533ec8fa9 100644 --- a/src/video/vid_8514a.c +++ b/src/video/vid_8514a.c @@ -124,7 +124,7 @@ CLAMP(int16_t in, int16_t min, int16_t max) #define MIX(mixmode, dest_dat, src_dat) \ { \ - switch ((mixmode) ? (dev->accel.frgd_mix & 0x1f) : (dev->accel.bkgd_mix & 0x1f)) { \ + switch ((mixmode) ? dev->accel.frgd_mix : dev->accel.bkgd_mix) { \ case 0x00: \ dest_dat = ~dest_dat; \ break; \ @@ -268,8 +268,8 @@ ibm8514_accel_out_pixtrans(svga_t *svga, UNUSED(uint16_t port), uint32_t val, in uint32_t monoxfer = 0xffffffff; int pixcnt = 0; int pixcntl = (dev->accel.multifunc[0x0a] >> 6) & 3; - int frgd_mix = (dev->accel.frgd_mix >> 5) & 3; - int bkgd_mix = (dev->accel.bkgd_mix >> 5) & 3; + int frgd_mix = dev->accel.frgd_sel; + int bkgd_mix = dev->accel.bkgd_sel; int cmd = dev->accel.cmd >> 13; if (!dev->accel.cmd_back) { @@ -351,13 +351,12 @@ ibm8514_accel_out_fifo(svga_t *svga, uint16_t port, uint32_t val, int len) case 0x6e8: /*In preparation to switch from VGA to 8514/A mode*/ WRITE8(port, dev->hdisped, val); - dev->hdisp = (dev->hdisped + 1) << 3; ibm8514_log("[%04X:%08X]: IBM 8514/A: (0x%04x): hdisp=0x%02x.\n", CS, cpu_state.pc, port, val); svga_recalctimings(svga); break; case 0x6e9: - WRITE8(port, dev->htotal, val); + WRITE8(port - 1, dev->htotal, val); ibm8514_log("IBM 8514/A compatible: (0x%04x): htotal=0x%02x.\n", port, val); svga_recalctimings(svga); break; @@ -379,10 +378,6 @@ ibm8514_accel_out_fifo(svga_t *svga, uint16_t port, uint32_t val, int len) if (len == 2) { dev->v_total_reg = val; dev->v_total_reg &= 0x1fff; - dev->v_total = dev->v_total_reg + 1; - if (dev->interlace) - dev->v_total >>= 1; - ibm8514_log("IBM 8514/A compatible: (0x%04x): vtotal=0x%02x.\n", port, val); svga_recalctimings(svga); } else { @@ -392,12 +387,8 @@ ibm8514_accel_out_fifo(svga_t *svga, uint16_t port, uint32_t val, int len) case 0x12e9: /*In preparation to switch from VGA to 8514/A mode*/ if (len == 1) { - WRITE8(port, dev->v_total_reg, val); + WRITE8(port, dev->v_total_reg, val >> 8); dev->v_total_reg &= 0x1fff; - dev->v_total = dev->v_total_reg + 1; - if (dev->interlace) - dev->v_total >>= 1; - ibm8514_log("IBM 8514/A compatible: (0x%04x): vtotal=0x%02x.\n", port, val); svga_recalctimings(svga); } @@ -408,7 +399,6 @@ ibm8514_accel_out_fifo(svga_t *svga, uint16_t port, uint32_t val, int len) if (len == 2) { dev->v_disp = val; dev->v_disp &= 0x1fff; - dev->vdisp = (dev->v_disp + 1) >> 1; ibm8514_log("IBM 8514/A: V_DISP write 16E8 = %d\n", dev->v_disp); ibm8514_log("IBM 8514/A: (0x%04x): vdisp=0x%02x.\n", port, val); svga_recalctimings(svga); @@ -419,9 +409,8 @@ ibm8514_accel_out_fifo(svga_t *svga, uint16_t port, uint32_t val, int len) case 0x16e9: /*In preparation to switch from VGA to 8514/A mode*/ if (len == 1) { - WRITE8(port, dev->v_disp, val); + WRITE8(port, dev->v_disp, val >> 8); dev->v_disp &= 0x1fff; - dev->vdisp = (dev->v_disp + 1) >> 1; ibm8514_log("IBM 8514/A: V_DISP write 16E8 = %d\n", dev->v_disp); ibm8514_log("IBM 8514/A: (0x%04x): vdisp=0x%02x.\n", port, val); svga_recalctimings(svga); @@ -433,10 +422,6 @@ ibm8514_accel_out_fifo(svga_t *svga, uint16_t port, uint32_t val, int len) if (len == 2) { dev->v_sync_start = val; dev->v_sync_start &= 0x1fff; - dev->v_syncstart = dev->v_sync_start + 1; - if (dev->interlace) - dev->v_syncstart >>= 1; - ibm8514_log("IBM 8514/A compatible: V_SYNCSTART write 1AE8 = %d\n", dev->v_syncstart); ibm8514_log("IBM 8514/A compatible: (0x%04x): vsyncstart=0x%02x.\n", port, val); svga_recalctimings(svga); @@ -447,7 +432,7 @@ ibm8514_accel_out_fifo(svga_t *svga, uint16_t port, uint32_t val, int len) case 0x1ae9: /*In preparation to switch from VGA to 8514/A mode*/ if (len == 1) { - WRITE8(port, dev->v_sync_start, val); + WRITE8(port, dev->v_sync_start, val >> 8); dev->v_sync_start &= 0x1fff; dev->v_syncstart = dev->v_sync_start + 1; if (dev->interlace) @@ -639,11 +624,15 @@ ibm8514_accel_out_fifo(svga_t *svga, uint16_t port, uint32_t val, int len) break; case 0xb6e8: - dev->accel.bkgd_mix = val & 0xff; + dev->accel.bkgd_mix = val & 0x1f; + dev->accel.bkgd_sel = (val >> 5) & 3; + ibm8514_log("Background Mix reg=%02x.\n", val); break; case 0xbae8: - dev->accel.frgd_mix = val & 0xff; + dev->accel.frgd_mix = val & 0x1f; + dev->accel.frgd_sel = (val >> 5) & 3; + ibm8514_log("Foreground Mix reg=%02x.\n", val); break; case 0xbee8: @@ -667,7 +656,6 @@ ibm8514_accel_out_fifo(svga_t *svga, uint16_t port, uint32_t val, int len) if ((dev->accel.multifunc_cntl >> 12) == 4) dev->accel.clip_right = dev->accel.multifunc[4] & 0x7ff; - } break; @@ -821,8 +809,22 @@ ibm8514_accel_in_fifo(svga_t *svga, uint16_t port, int len) if (dev->fifo_idx > 0) dev->fifo_idx--; - if (dev->force_busy) + if (dev->force_busy) { temp |= 0x0200; /*Hardware busy*/ + switch (dev->accel.cmd >> 13) { + case 2: + case 3: + case 4: + case 6: + if (dev->accel.sy < 0) + dev->force_busy = 0; + break; + default: + if (!dev->accel.sy) + dev->force_busy = 0; + break; + } + } if (dev->data_available) { temp |= 0x0100; /*Read Data available*/ @@ -1066,8 +1068,8 @@ ibm8514_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat rd_mask_polygon &= 0xff; } - frgd_mix = (dev->accel.frgd_mix >> 5) & 3; - bkgd_mix = (dev->accel.bkgd_mix >> 5) & 3; + frgd_mix = dev->accel.frgd_sel; + bkgd_mix = dev->accel.bkgd_sel; if (cpu_input) { if ((dev->accel.cmd & 0x02) || (pixcntl == 2)) { @@ -1821,12 +1823,7 @@ ibm8514_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat dev->accel.sx = dev->accel.maj_axis_pcnt & 0x7ff; dev->accel.sy = dev->accel.multifunc[0] & 0x7ff; - if ((dev->accel_bpp == 24) || (dev->accel_bpp <= 8)) - dev->accel.dest = (dev->accel.ge_offset << 2) + (dev->accel.cy * dev->pitch); - else if (dev->bpp) - dev->accel.dest = (dev->accel.ge_offset << 1) + (dev->accel.cy * dev->pitch); - else - dev->accel.dest = (dev->accel.ge_offset << 2) + (dev->accel.cy * dev->pitch); + dev->accel.dest = dev->accel.ge_offset + (dev->accel.cy * dev->pitch); if (cmd == 4) dev->accel.cmd |= 0x02; @@ -2030,12 +2027,7 @@ skip_vector_rect_write: break; } - if ((dev->accel_bpp == 24) || (dev->accel_bpp <= 8)) - dev->accel.dest = (dev->accel.ge_offset << 2) + (dev->accel.cy * dev->pitch); - else if (dev->bpp) - dev->accel.dest = (dev->accel.ge_offset << 1) + (dev->accel.cy * dev->pitch); - else - dev->accel.dest = (dev->accel.ge_offset << 2) + (dev->accel.cy * dev->pitch); + dev->accel.dest = dev->accel.ge_offset + (dev->accel.cy * dev->pitch); dev->accel.sy--; dev->accel.x_count = 0; @@ -2194,12 +2186,7 @@ skip_nibble_rect_write: else dev->accel.cy--; - if ((dev->accel_bpp == 24) || (dev->accel_bpp <= 8)) - dev->accel.dest = (dev->accel.ge_offset << 2) + (dev->accel.cy * dev->pitch); - else if (dev->bpp) - dev->accel.dest = (dev->accel.ge_offset << 1) + (dev->accel.cy * dev->pitch); - else - dev->accel.dest = (dev->accel.ge_offset << 2) + (dev->accel.cy * dev->pitch); + dev->accel.dest = dev->accel.ge_offset + (dev->accel.cy * dev->pitch); dev->accel.sy--; dev->accel.x_count = 0; @@ -2285,12 +2272,7 @@ skip_nibble_rect_write: else dev->accel.cy--; - if ((dev->accel_bpp == 24) || (dev->accel_bpp <= 8)) - dev->accel.dest = (dev->accel.ge_offset << 2) + (dev->accel.cy * dev->pitch); - else if (dev->bpp) - dev->accel.dest = (dev->accel.ge_offset << 1) + (dev->accel.cy * dev->pitch); - else - dev->accel.dest = (dev->accel.ge_offset << 2) + (dev->accel.cy * dev->pitch); + dev->accel.dest = dev->accel.ge_offset + (dev->accel.cy * dev->pitch); dev->accel.sy--; @@ -2367,12 +2349,7 @@ skip_nibble_rect_write: else dev->accel.cy--; - if ((dev->accel_bpp == 24) || (dev->accel_bpp <= 8)) - dev->accel.dest = (dev->accel.ge_offset << 2) + (dev->accel.cy * dev->pitch); - else if (dev->bpp) - dev->accel.dest = (dev->accel.ge_offset << 1) + (dev->accel.cy * dev->pitch); - else - dev->accel.dest = (dev->accel.ge_offset << 2) + (dev->accel.cy * dev->pitch); + dev->accel.dest = dev->accel.ge_offset + (dev->accel.cy * dev->pitch); dev->accel.sy--; @@ -2482,12 +2459,7 @@ skip_nibble_rect_write: else dev->accel.cy--; - if ((dev->accel_bpp == 24) || (dev->accel_bpp <= 8)) - dev->accel.dest = (dev->accel.ge_offset << 2) + (dev->accel.cy * dev->pitch); - else if (dev->bpp) - dev->accel.dest = (dev->accel.ge_offset << 1) + (dev->accel.cy * dev->pitch); - else - dev->accel.dest = (dev->accel.ge_offset << 2) + (dev->accel.cy * dev->pitch); + dev->accel.dest = dev->accel.ge_offset + (dev->accel.cy * dev->pitch); dev->accel.sy--; @@ -2512,8 +2484,6 @@ skip_nibble_rect_write: switch ((mix_dat & mix_mask) ? frgd_mix : bkgd_mix) { case 0: src_dat = bkgd_color; - if (!bkgd_mix && (dev->accel.cmd & 0x40) && ((dev->accel.frgd_mix & 0x1f) == 7) && ((dev->accel.bkgd_mix & 0x1f) == 3) && !dev->bpp && (bkgd_color == 0x00)) /*For some reason, the September 1992 Mach8/32 drivers for Win3.x don't set the background colors properly.*/ - src_dat = frgd_color; break; case 1: src_dat = frgd_color; @@ -2570,12 +2540,7 @@ skip_nibble_rect_write: else dev->accel.cy--; - if ((dev->accel_bpp == 24) || (dev->accel_bpp <= 8)) - dev->accel.dest = (dev->accel.ge_offset << 2) + (dev->accel.cy * dev->pitch); - else if (dev->bpp) - dev->accel.dest = (dev->accel.ge_offset << 1) + (dev->accel.cy * dev->pitch); - else - dev->accel.dest = (dev->accel.ge_offset << 2) + (dev->accel.cy * dev->pitch); + dev->accel.dest = dev->accel.ge_offset + (dev->accel.cy * dev->pitch); dev->accel.sy--; if (dev->accel.sy < 0) { @@ -2870,16 +2835,8 @@ skip_nibble_rect_write: dev->accel.sx = dev->accel.maj_axis_pcnt & 0x7ff; dev->accel.sy = dev->accel.multifunc[0] & 0x7ff; - if ((dev->accel_bpp == 24) || (dev->accel_bpp <= 8)) { - dev->accel.src = (dev->accel.ge_offset << 2) + (dev->accel.cy * dev->pitch); - dev->accel.dest = (dev->accel.ge_offset << 2) + (dev->accel.dy * dev->pitch); - } else if (dev->bpp) { - dev->accel.src = (dev->accel.ge_offset << 1) + (dev->accel.cy * dev->pitch); - dev->accel.dest = (dev->accel.ge_offset << 1) + (dev->accel.dy * dev->pitch); - } else { - dev->accel.src = (dev->accel.ge_offset << 2) + (dev->accel.cy * dev->pitch); - dev->accel.dest = (dev->accel.ge_offset << 2) + (dev->accel.dy * dev->pitch); - } + dev->accel.src = dev->accel.ge_offset + (dev->accel.cy * dev->pitch); + dev->accel.dest = dev->accel.ge_offset + (dev->accel.dy * dev->pitch); dev->accel.fill_state = 0; if (ibm8514_cpu_src(svga)) { @@ -3051,16 +3008,8 @@ skip_nibble_bitblt_write: dev->accel.cy--; } - if ((dev->accel_bpp == 24) || (dev->accel_bpp <= 8)) { - dev->accel.src = (dev->accel.ge_offset << 2) + (dev->accel.cy * dev->pitch); - dev->accel.dest = (dev->accel.ge_offset << 2) + (dev->accel.dy * dev->pitch); - } else if (dev->bpp) { - dev->accel.src = (dev->accel.ge_offset << 1) + (dev->accel.cy * dev->pitch); - dev->accel.dest = (dev->accel.ge_offset << 1) + (dev->accel.dy * dev->pitch); - } else { - dev->accel.src = (dev->accel.ge_offset << 2) + (dev->accel.cy * dev->pitch); - dev->accel.dest = (dev->accel.ge_offset << 2) + (dev->accel.dy * dev->pitch); - } + dev->accel.src = dev->accel.ge_offset + (dev->accel.cy * dev->pitch); + dev->accel.dest = dev->accel.ge_offset + (dev->accel.dy * dev->pitch); dev->accel.sy--; dev->accel.x_count = 0; @@ -3156,16 +3105,8 @@ skip_nibble_bitblt_write: dev->accel.cy--; } - if ((dev->accel_bpp == 24) || (dev->accel_bpp <= 8)) { - dev->accel.src = (dev->accel.ge_offset << 2) + (dev->accel.cy * dev->pitch); - dev->accel.dest = (dev->accel.ge_offset << 2) + (dev->accel.dy * dev->pitch); - } else if (dev->bpp) { - dev->accel.src = (dev->accel.ge_offset << 1) + (dev->accel.cy * dev->pitch); - dev->accel.dest = (dev->accel.ge_offset << 1) + (dev->accel.dy * dev->pitch); - } else { - dev->accel.src = (dev->accel.ge_offset << 2) + (dev->accel.cy * dev->pitch); - dev->accel.dest = (dev->accel.ge_offset << 2) + (dev->accel.dy * dev->pitch); - } + dev->accel.src = dev->accel.ge_offset + (dev->accel.cy * dev->pitch); + dev->accel.dest = dev->accel.ge_offset + (dev->accel.dy * dev->pitch); dev->accel.sy--; @@ -3252,16 +3193,9 @@ skip_nibble_bitblt_write: dev->accel.cy--; } - if ((dev->accel_bpp == 24) || (dev->accel_bpp <= 8)) { - dev->accel.src = (dev->accel.ge_offset << 2) + (dev->accel.cy * dev->pitch); - dev->accel.dest = (dev->accel.ge_offset << 2) + (dev->accel.dy * dev->pitch); - } else if (dev->bpp) { - dev->accel.src = (dev->accel.ge_offset << 1) + (dev->accel.cy * dev->pitch); - dev->accel.dest = (dev->accel.ge_offset << 1) + (dev->accel.dy * dev->pitch); - } else { - dev->accel.src = (dev->accel.ge_offset << 2) + (dev->accel.cy * dev->pitch); - dev->accel.dest = (dev->accel.ge_offset << 2) + (dev->accel.dy * dev->pitch); - } + dev->accel.src = dev->accel.ge_offset + (dev->accel.cy * dev->pitch); + dev->accel.dest = dev->accel.ge_offset + (dev->accel.dy * dev->pitch); + dev->accel.sy--; if (dev->accel.sy < 0) { @@ -3282,29 +3216,14 @@ skip_nibble_bitblt_write: cx = (int64_t) dev->accel.cx; dx = (int64_t) dev->accel.dx; + dev->accel.src = dev->accel.src_ge_offset + (dev->accel.cy * dev->accel.src_pitch); + dev->accel.dest = dev->accel.dst_ge_offset + (dev->accel.dy * dev->accel.dst_pitch); + while (1) { if ((dx >= (((int64_t)clip_l) * 3)) && (dx <= (((uint64_t)clip_r) * 3)) && (dev->accel.dy >= (clip_t << 1)) && (dev->accel.dy <= (clip_b << 1))) { - switch ((mix_dat & mix_mask) ? frgd_mix : bkgd_mix) { - case 0: - src_dat = bkgd_color; - break; - case 1: - src_dat = frgd_color; - break; - case 2: - src_dat = 0; - break; - case 3: - READ(dev->accel.src + cx, src_dat); - break; - - default: - break; - } - READ(dev->accel.src + cx, src_dat); READ(dev->accel.dest + dx, dest_dat); old_dest_dat = dest_dat; @@ -3411,16 +3330,9 @@ skip_nibble_bitblt_write: dev->accel.cy--; } - if ((dev->accel_bpp == 24) || (dev->accel_bpp <= 8)) { - dev->accel.src = (dev->accel.ge_offset << 2) + (dev->accel.cy * dev->pitch); - dev->accel.dest = (dev->accel.ge_offset << 2) + (dev->accel.dy * dev->pitch); - } else if (dev->bpp) { - dev->accel.src = (dev->accel.ge_offset << 1) + (dev->accel.cy * dev->pitch); - dev->accel.dest = (dev->accel.ge_offset << 1) + (dev->accel.dy * dev->pitch); - } else { - dev->accel.src = (dev->accel.ge_offset << 2) + (dev->accel.cy * dev->pitch); - dev->accel.dest = (dev->accel.ge_offset << 2) + (dev->accel.dy * dev->pitch); - } + dev->accel.src = dev->accel.ge_offset + (dev->accel.cy * dev->pitch); + dev->accel.dest = dev->accel.ge_offset + (dev->accel.dy * dev->pitch); + dev->accel.sy--; if (dev->accel.sy < 0) { @@ -3804,7 +3716,7 @@ ibm8514_poll(void *priv) if ((svga->cgastat & 8) && ((dev->displine & 0x0f) == (svga->crtc[0x11] & 0x0f)) && svga->vslines) svga->cgastat &= ~8; svga->vslines++; - if (dev->displine > 1500) + if (dev->displine > 2000) dev->displine = 0; } else { timer_advance_u64(&svga->timer, dev->dispontime); @@ -3871,9 +3783,9 @@ ibm8514_poll(void *priv) svga->vslines = 0; if (dev->interlace && dev->oddeven) - dev->ma = dev->maback = dev->ma_latch + (dev->rowoffset << 1); + dev->ma = dev->maback = (dev->rowoffset << 1); else - dev->ma = dev->maback = dev->ma_latch; + dev->ma = dev->maback = 0; dev->ma = (dev->ma << 2); dev->maback = (dev->maback << 2); @@ -3904,26 +3816,43 @@ ibm8514_recalctimings(svga_t *svga) ati8514_recalctimings(svga); } else { if (dev->on) { + dev->hdisp = (dev->hdisped + 1) << 3; dev->h_total = dev->htotal + 1; + + if (dev->h_total == 1) /*Default to 1024x768 87hz 8514/A htotal timings if it goes to 0.*/ + dev->h_total = 0x9e; + + dev->vdisp = (dev->v_disp + 1) >> 1; + if ((dev->vdisp == 478) || (dev->vdisp == 766)) + dev->vdisp += 2; + + dev->v_total = dev->v_total_reg + 1; + if (dev->interlace) + dev->v_total >>= 1; + + dev->v_syncstart = dev->v_sync_start + 1; + if (dev->interlace) + dev->v_syncstart >>= 1; + dev->rowcount = !!(dev->disp_cntl & 0x08); - if (dev->accel.advfunc_cntl & 0x01) { + if ((dev->hdisp != 640) && (dev->hdisp != 1024)) { if (dev->accel.advfunc_cntl & 0x04) { - dev->h_disp = dev->hdisp; - dev->dispend = dev->vdisp; + dev->hdisp = 1024; + dev->vdisp = 768; } else { - dev->h_disp = 640; - dev->dispend = 480; + dev->hdisp = 640; + dev->vdisp = 480; } - } else { - dev->h_disp = dev->hdisp; - dev->dispend = dev->vdisp; } + dev->h_disp = dev->hdisp; + dev->dispend = dev->vdisp; + if (dev->accel.advfunc_cntl & 0x04) - svga->clock8514 = (cpuclock * (double) (1ULL << 32)) / 44900000.0; + svga->clock_8514 = (cpuclock * (double) (1ULL << 32)) / 44900000.0; else - svga->clock8514 = (cpuclock * (double) (1ULL << 32)) / 25175000.0; + svga->clock_8514 = (cpuclock * (double) (1ULL << 32)) / 25175000.0; if ((dev->dispend == 478) || (dev->dispend == 766)) dev->dispend += 2; @@ -4026,6 +3955,7 @@ ibm8514_init(const device_t *info) dev->map8 = dev->pallook; dev->local = 0; dev->accel_bpp = 8; + dev->on = 0; dev->type = info->flags; dev->bpp = 0; diff --git a/src/video/vid_ati_mach8.c b/src/video/vid_ati_mach8.c index 9f92ebde1..3bcde5b0c 100644 --- a/src/video/vid_ati_mach8.c +++ b/src/video/vid_ati_mach8.c @@ -15,6 +15,7 @@ * * Copyright 2022-2024 TheCollector1995. */ +#include #include #include #include @@ -142,10 +143,10 @@ mach_log(const char *fmt, ...) } \ } else if ((mach->accel.cmd_type == 3) || (mach->accel.cmd_type == 4)) { \ if (dev->bpp) \ - temp = vram_w[((mach->accel.ge_offset << 1) + ((dev->accel.cy) * (dev->pitch)) + (cx) + (n)) & (dev->vram_mask >> 1)]; \ + temp = vram_w[(mach->accel.dst_ge_offset + ((dev->accel.cy) * (mach->accel.dst_pitch)) + (cx) + (n)) & (dev->vram_mask >> 1)]; \ else { \ - temp = dev->vram[((mach->accel.ge_offset << 2) + ((dev->accel.cy) * (dev->pitch)) + (cx) + (n)) & dev->vram_mask]; \ - temp |= (dev->vram[((mach->accel.ge_offset << 2) + ((dev->accel.cy) * (dev->pitch)) + (cx) + (n + 1)) & dev->vram_mask] << 8); \ + temp = dev->vram[(mach->accel.dst_ge_offset + ((dev->accel.cy) * (mach->accel.dst_pitch)) + (cx) + (n)) & dev->vram_mask]; \ + temp |= (dev->vram[(mach->accel.dst_ge_offset + ((dev->accel.cy) * (mach->accel.dst_pitch)) + (cx) + (n + 1)) & dev->vram_mask] << 8); \ } \ } @@ -160,7 +161,7 @@ mach_log(const char *fmt, ...) #define MIX(mixmode, dest_dat, src_dat) \ { \ - switch ((mixmode) ? (dev->accel.frgd_mix & 0x1f) : (dev->accel.bkgd_mix & 0x1f)) { \ + switch ((mixmode) ? dev->accel.frgd_mix : dev->accel.bkgd_mix) { \ case 0x00: \ dest_dat = ~dest_dat; \ break; \ @@ -334,7 +335,7 @@ mach_accel_start(int cmd_type, int cpu_input, int count, uint32_t mix_dat, uint3 } } - mach_log("cmd_type = %i, frgd_sel = %i, bkgd_sel = %i, mono_src = %i, dpconfig = %04x, cur_x = %d, cur_y = %d.\n", cmd_type, frgd_sel, bkgd_sel, mono_src, mach->accel.dp_config, dev->accel.cur_x, dev->accel.cur_y); + mach_log("cmd_type = %i, frgd_sel = %i, bkgd_sel = %i, mono_src = %i, dpconfig = %04x, cur_x = %d, cur_y = %d, cl = %d, cr = %d, ct = %d, cb = %d, accel_bpp = %d, pitch = %d, hicolbpp = %d, pattlen = %d.\n", cmd_type, frgd_sel, bkgd_sel, mono_src, mach->accel.dp_config, dev->accel.cur_x, dev->accel.cur_y, clip_l, clip_r, clip_t, clip_b, dev->accel_bpp, dev->pitch, dev->bpp, mach->accel.patt_len); switch (cmd_type) { case 1: /*Extended Raw Linedraw from bres_count register (0x96ee)*/ @@ -368,6 +369,7 @@ mach_accel_start(int cmd_type, int cpu_input, int count, uint32_t mix_dat, uint3 if (!dev->accel.cmd_back) { if (mach_pixel_write(mach)) { + mach_log("Extended Bresenham Write pixtrans.\n"); dev->force_busy = 1; dev->force_busy2 = 1; mach->force_busy = 1; @@ -375,6 +377,7 @@ mach_accel_start(int cmd_type, int cpu_input, int count, uint32_t mix_dat, uint3 dev->data_available2 = 0; return; } else if (mach_pixel_read(mach)) { + mach_log("Extended Bresenham Read pixtrans.\n"); dev->force_busy = 1; dev->force_busy2 = 1; mach->force_busy = 1; @@ -423,11 +426,7 @@ mach_accel_start(int cmd_type, int cpu_input, int count, uint32_t mix_dat, uint3 } break; case 3: - if (dev->bpp) { - READ((mach->accel.ge_offset << 1) + ((dev->accel.cy) * (dev->pitch)) + (dev->accel.cx), mix); - } else { - READ((mach->accel.ge_offset << 2) + ((dev->accel.cy) * (dev->pitch)) + (dev->accel.cx), mix); - } + READ(mach->accel.src_ge_offset + (dev->accel.cy * mach->accel.src_pitch) + dev->accel.cx, mix); mix = (mix & rd_mask) == rd_mask; break; @@ -439,6 +438,7 @@ mach_accel_start(int cmd_type, int cpu_input, int count, uint32_t mix_dat, uint3 (dev->accel.dx <= clip_r) && (dev->accel.dy >= clip_t) && (dev->accel.dy <= clip_b)) { + dev->subsys_stat |= INT_GE_BSY; switch (mix ? frgd_sel : bkgd_sel) { case 0: src_dat = bkgd_color; @@ -453,19 +453,16 @@ mach_accel_start(int cmd_type, int cpu_input, int count, uint32_t mix_dat, uint3 if (mach_pixel_read(mach)) src_dat = cpu_dat; else { - if (dev->bpp) { - READ((mach->accel.ge_offset << 1) + (dev->accel.cy * dev->pitch) + dev->accel.cx, src_dat); - } else { - READ((mach->accel.ge_offset << 2) + (dev->accel.cy * dev->pitch) + dev->accel.cx, src_dat); - } + READ(mach->accel.src_ge_offset + (dev->accel.cy * mach->accel.src_pitch) + dev->accel.cx, src_dat); if (mono_src == 3) src_dat = (src_dat & rd_mask) == rd_mask; } break; case 5: - src_dat = mach->accel.color_pattern[mach->accel.color_pattern_idx]; if (dev->bpp) - src_dat |= (mach->accel.color_pattern[mach->accel.color_pattern_idx + 1] << 8); + src_dat = mach->accel.color_pattern_hicol[mach->accel.color_pattern_idx]; + else + src_dat = mach->accel.color_pattern[mach->accel.color_pattern_idx]; break; default: @@ -473,22 +470,14 @@ mach_accel_start(int cmd_type, int cpu_input, int count, uint32_t mix_dat, uint3 } if (mach->accel.linedraw_opt & 0x02) { - if (dev->bpp) { - READ((mach->accel.ge_offset << 1) + ((dev->accel.cy) * (dev->pitch)) + (dev->accel.cx), poly_src); - } else { - READ((mach->accel.ge_offset << 2) + ((dev->accel.cy) * (dev->pitch)) + (dev->accel.cx), poly_src); - } + READ(mach->accel.src_ge_offset + (dev->accel.cy * mach->accel.src_pitch) + dev->accel.cx, poly_src); poly_src = ((poly_src & rd_mask) == rd_mask); if (poly_src) mach->accel.poly_fill = !mach->accel.poly_fill; } if (mach->accel.poly_fill || !(mach->accel.linedraw_opt & 0x02)) { - if (dev->bpp) { - READ((mach->accel.ge_offset << 1) + ((dev->accel.dy) * (dev->pitch)) + (dev->accel.dx), dest_dat); - } else { - READ((mach->accel.ge_offset << 2) + ((dev->accel.dy) * (dev->pitch)) + (dev->accel.dx), dest_dat); - } + READ(mach->accel.dst_ge_offset + (dev->accel.dy * mach->accel.dst_pitch) + dev->accel.dx, dest_dat); switch (compare_mode) { case 1: @@ -528,18 +517,10 @@ mach_accel_start(int cmd_type, int cpu_input, int count, uint32_t mix_dat, uint3 if (mach->accel.dp_config & 0x10) { if (mach->accel.linedraw_opt & 0x04) { if (((mono_src != 1) && (dev->accel.sx < mach->accel.width)) || ((mono_src == 1) && count)) { - if (dev->bpp) { - WRITE((mach->accel.ge_offset << 1) + ((dev->accel.dy) * (dev->pitch)) + (dev->accel.dx), dest_dat); - } else { - WRITE((mach->accel.ge_offset << 2) + ((dev->accel.dy) * (dev->pitch)) + (dev->accel.dx), dest_dat); - } + WRITE(mach->accel.dst_ge_offset + (dev->accel.dy * mach->accel.dst_pitch) + dev->accel.dx, dest_dat); } } else { - if (dev->bpp) { - WRITE((mach->accel.ge_offset << 1) + ((dev->accel.dy) * (dev->pitch)) + (dev->accel.dx), dest_dat); - } else { - WRITE((mach->accel.ge_offset << 2) + ((dev->accel.dy) * (dev->pitch)) + (dev->accel.dx), dest_dat); - } + WRITE(mach->accel.dst_ge_offset + (dev->accel.dy * mach->accel.dst_pitch) + dev->accel.dx, dest_dat); } } } @@ -570,10 +551,7 @@ mach_accel_start(int cmd_type, int cpu_input, int count, uint32_t mix_dat, uint3 else cpu_dat >>= 8; - if (dev->bpp) - mach->accel.color_pattern_idx += 2; - else - mach->accel.color_pattern_idx++; + mach->accel.color_pattern_idx++; if (mach->accel.color_pattern_idx > mach->accel.patt_len) mach->accel.color_pattern_idx = 0; @@ -658,11 +636,7 @@ mach_accel_start(int cmd_type, int cpu_input, int count, uint32_t mix_dat, uint3 } break; case 3: - if (dev->bpp) { - READ((mach->accel.ge_offset << 1) + ((dev->accel.cy) * (dev->pitch)) + (dev->accel.cx), mix); - } else { - READ((mach->accel.ge_offset << 2) + ((dev->accel.cy) * (dev->pitch)) + (dev->accel.cx), mix); - } + READ(mach->accel.src_ge_offset + (dev->accel.cy * mach->accel.src_pitch) + dev->accel.cx, mix); mix = (mix & rd_mask) == rd_mask; break; @@ -689,20 +663,17 @@ mach_accel_start(int cmd_type, int cpu_input, int count, uint32_t mix_dat, uint3 if (mach_pixel_read(mach)) src_dat = cpu_dat; else { - if (dev->bpp) { - READ((mach->accel.ge_offset << 1) + ((dev->accel.cy) * (dev->pitch)) + (dev->accel.cx), src_dat); - } else { - READ((mach->accel.ge_offset << 2) + ((dev->accel.cy) * (dev->pitch)) + (dev->accel.cx), src_dat); - } + READ(mach->accel.src_ge_offset + (dev->accel.cy * mach->accel.src_pitch) + dev->accel.cx, src_dat); if (mono_src == 3) { src_dat = (src_dat & rd_mask) == rd_mask; } } break; case 5: - src_dat = mach->accel.color_pattern[mach->accel.color_pattern_idx]; if (dev->bpp) - src_dat |= (mach->accel.color_pattern[mach->accel.color_pattern_idx + 1] << 8); + src_dat = mach->accel.color_pattern_hicol[mach->accel.color_pattern_idx]; + else + src_dat = mach->accel.color_pattern[mach->accel.color_pattern_idx]; break; default: @@ -710,22 +681,14 @@ mach_accel_start(int cmd_type, int cpu_input, int count, uint32_t mix_dat, uint3 } if (mach->accel.linedraw_opt & 0x02) { - if (dev->bpp) { - READ((mach->accel.ge_offset << 1) + ((dev->accel.cy) * (dev->pitch)) + (dev->accel.cx), poly_src); - } else { - READ((mach->accel.ge_offset << 2) + ((dev->accel.cy) * (dev->pitch)) + (dev->accel.cx), poly_src); - } + READ(mach->accel.src_ge_offset + (dev->accel.cy * mach->accel.src_pitch) + dev->accel.cx, poly_src); poly_src = ((poly_src & rd_mask) == rd_mask); if (poly_src) mach->accel.poly_fill = !mach->accel.poly_fill; } if (mach->accel.poly_fill || !(mach->accel.linedraw_opt & 0x02)) { - if (dev->bpp) { - READ((mach->accel.ge_offset << 1) + ((dev->accel.dy) * (dev->pitch)) + (dev->accel.dx), dest_dat); - } else { - READ((mach->accel.ge_offset << 2) + ((dev->accel.dy) * (dev->pitch)) + (dev->accel.dx), dest_dat); - } + READ(mach->accel.dst_ge_offset + (dev->accel.dy * mach->accel.dst_pitch) + dev->accel.dx, dest_dat); switch (compare_mode) { case 1: @@ -765,18 +728,10 @@ mach_accel_start(int cmd_type, int cpu_input, int count, uint32_t mix_dat, uint3 if (mach->accel.dp_config & 0x10) { if (mach->accel.linedraw_opt & 0x04) { if (((mono_src != 1) && (dev->accel.sx < mach->accel.width)) || ((mono_src == 1) && count)) { - if (dev->bpp) { - WRITE((mach->accel.ge_offset << 1) + ((dev->accel.dy) * (dev->pitch)) + (dev->accel.dx), dest_dat); - } else { - WRITE((mach->accel.ge_offset << 2) + ((dev->accel.dy) * (dev->pitch)) + (dev->accel.dx), dest_dat); - } + WRITE(mach->accel.dst_ge_offset + (dev->accel.dy * mach->accel.dst_pitch) + dev->accel.dx, dest_dat); } } else { - if (dev->bpp) { - WRITE((mach->accel.ge_offset << 1) + ((dev->accel.dy) * (dev->pitch)) + (dev->accel.dx), dest_dat); - } else { - WRITE((mach->accel.ge_offset << 2) + ((dev->accel.dy) * (dev->pitch)) + (dev->accel.dx), dest_dat); - } + WRITE(mach->accel.dst_ge_offset + (dev->accel.dy * mach->accel.dst_pitch) + dev->accel.dx, dest_dat); } } } @@ -807,10 +762,7 @@ mach_accel_start(int cmd_type, int cpu_input, int count, uint32_t mix_dat, uint3 else cpu_dat >>= 8; - if (dev->bpp) - mach->accel.color_pattern_idx += 2; - else - mach->accel.color_pattern_idx++; + mach->accel.color_pattern_idx++; if (mach->accel.color_pattern_idx > mach->accel.patt_len) mach->accel.color_pattern_idx = 0; @@ -869,7 +821,6 @@ mach_accel_start(int cmd_type, int cpu_input, int count, uint32_t mix_dat, uint3 if (mach->accel.dest_x_start >= 0x600) mach->accel.dx_start |= ~0x5ff; - mach_log("DXStart=%d, CURX=%d.\n", mach->accel.dx_start, dev->accel.dx); mach->accel.dx_end = mach->accel.dest_x_end; if (mach->accel.dest_x_end >= 0x600) mach->accel.dx_end |= ~0x5ff; @@ -916,10 +867,7 @@ mach_accel_start(int cmd_type, int cpu_input, int count, uint32_t mix_dat, uint3 } dev->accel.sy = 0; - if (dev->bpp) - dev->accel.dest = (mach->accel.ge_offset << 1) + (dev->accel.dy * dev->pitch); - else - dev->accel.dest = (mach->accel.ge_offset << 2) + (dev->accel.dy * dev->pitch); + dev->accel.dest = mach->accel.dst_ge_offset + (dev->accel.dy * mach->accel.dst_pitch); mach->accel.src_stepx = 0; /*Source Width*/ @@ -961,15 +909,12 @@ mach_accel_start(int cmd_type, int cpu_input, int count, uint32_t mix_dat, uint3 mach->accel.dp_config, mach->accel.src_width & 1); } mach->accel.sx = 0; - if (mach->accel.patt_data_idx < 16) + if (mach->accel.patt_data_idx < 0x10) mach->accel.color_pattern_idx = mach->accel.patt_idx; else mach->accel.color_pattern_idx = 0; - if (dev->bpp) - dev->accel.src = (mach->accel.ge_offset << 1) + (dev->accel.cy * dev->pitch); - else - dev->accel.src = (mach->accel.ge_offset << 2) + (dev->accel.cy * dev->pitch); + dev->accel.src = mach->accel.src_ge_offset + (dev->accel.cy * mach->accel.src_pitch); if (mono_src == 1) { if (mach->accel.mono_pattern_enable || mach->accel.block_write_mono_pattern_enable) { @@ -982,7 +927,7 @@ mach_accel_start(int cmd_type, int cpu_input, int count, uint32_t mix_dat, uint3 mono_dat1 |= (mach->accel.mono_pattern_normal[6] << 16); mono_dat1 |= (mach->accel.mono_pattern_normal[7] << 24); - mach_log("MonoData0=%x, MonoData1=%x.\n", mono_dat0, mono_dat1); + mach_log("MonoData0=%x, MonoData1=%x, enable mono pattern=%x, dpconfig=%04x.\n", mono_dat0, mono_dat1, mach->accel.mono_pattern_enable, mach->accel.dp_config); for (uint8_t y = 0; y < 8; y++) { for (uint8_t x = 0; x < 8; x++) { uint32_t temp = (y & 4) ? mono_dat1 : mono_dat0; @@ -994,6 +939,7 @@ mach_accel_start(int cmd_type, int cpu_input, int count, uint32_t mix_dat, uint3 if (!dev->accel.cmd_back) { if (mach_pixel_write(mach)) { + mach_log("Non-Conforming BitBLT Write pixtrans.\n"); dev->force_busy = 1; dev->force_busy2 = 1; mach->force_busy = 1; @@ -1001,6 +947,7 @@ mach_accel_start(int cmd_type, int cpu_input, int count, uint32_t mix_dat, uint3 dev->data_available2 = 0; return; } else if (mach_pixel_read(mach)) { + mach_log("Non-Conforming BitBLT Read pixtrans.\n"); dev->force_busy = 1; dev->force_busy2 = 1; mach->force_busy = 1; @@ -1140,9 +1087,10 @@ mach_accel_start(int cmd_type, int cpu_input, int count, uint32_t mix_dat, uint3 } break; case 5: - src_dat = mach->accel.color_pattern[mach->accel.color_pattern_idx]; if (dev->bpp) - src_dat |= (mach->accel.color_pattern[mach->accel.color_pattern_idx + 1] << 8); + src_dat = mach->accel.color_pattern_hicol[mach->accel.color_pattern_idx]; + else + src_dat = mach->accel.color_pattern[mach->accel.color_pattern_idx]; break; default: @@ -1151,7 +1099,7 @@ mach_accel_start(int cmd_type, int cpu_input, int count, uint32_t mix_dat, uint3 if ((dev->accel_bpp == 24) && (mono_src == 1) && (frgd_sel == 5) && !mach->accel.mono_pattern_enable) { if (dev->accel.sy & 1) { - READ(dev->accel.dest + dev->accel.dx - dev->pitch, dest_dat); + READ(dev->accel.dest + dev->accel.dx - mach->accel.dst_pitch, dest_dat); } else { READ(dev->accel.dest + dev->accel.dx, dest_dat); } @@ -1197,7 +1145,7 @@ mach_accel_start(int cmd_type, int cpu_input, int count, uint32_t mix_dat, uint3 if (mach->accel.dp_config & 0x10) { if ((dev->accel_bpp == 24) && (mono_src == 1) && (frgd_sel == 5) && !mach->accel.mono_pattern_enable) { if (dev->accel.sy & 1) { - WRITE(dev->accel.dest + dev->accel.dx - dev->pitch, dest_dat); + WRITE(dev->accel.dest + dev->accel.dx - mach->accel.dst_pitch, dest_dat); } else { WRITE(dev->accel.dest + dev->accel.dx, dest_dat); } @@ -1213,11 +1161,11 @@ mach_accel_start(int cmd_type, int cpu_input, int count, uint32_t mix_dat, uint3 else cpu_dat >>= 8; - if (mach->accel.dp_config == 0x2071 || (mach->accel.dp_config == 0x2011)) - mach_log("FontBlit: SX=%d, C(%d,%d), SRCWidth=%d, frgdmix=%d, bkgdmix=%d, rdmask=%04x, D(%d,%d), geoffset=%x, addr=%08x,.\n", + if (mach->accel.dp_config == 0x2071) + mach_log("FontBlit: SX=%d, C(%d,%d), SRCWidth=%d, frgdmix=%d, bkgdmix=%d, rdmask=%04x, D(%d,%d), geoffset=%x, addr=%08x, 8bppdata=%02x, 16bppdata=%04x, vgabase=%06x.\n", mach->accel.sx, dev->accel.cx, dev->accel.cy, mach->accel.src_width, dev->accel.frgd_mix & 0x1f, dev->accel.bkgd_mix & 0x1f, rd_mask, dev->accel.dx, dev->accel.dy, dev->accel.ge_offset, - (dev->accel.src + dev->accel.cx) & dev->vram_mask); + (dev->accel.src + dev->accel.cx) & dev->vram_mask, dev->vram[(dev->accel.src + dev->accel.cx) & dev->vram_mask], vram_w[(dev->accel.src + dev->accel.cx) & (dev->vram_mask >> 1)], svga->mapping.base); if ((mono_src == 3) || (frgd_sel == 3) || (bkgd_sel == 3) || (mach->accel.dp_config & 0x02)) { dev->accel.cx += mach->accel.src_stepx; @@ -1230,17 +1178,11 @@ mach_accel_start(int cmd_type, int cpu_input, int count, uint32_t mix_dat, uint3 dev->accel.cx -= mach->accel.src_width; dev->accel.cy += (mach->accel.src_y_dir ? 1 : -1); - if (dev->bpp) - dev->accel.src = (mach->accel.ge_offset << 1) + (dev->accel.cy * dev->pitch); - else - dev->accel.src = (mach->accel.ge_offset << 2) + (dev->accel.cy * dev->pitch); + dev->accel.src = mach->accel.src_ge_offset + (dev->accel.cy * mach->accel.src_pitch); } } - if (dev->bpp) - mach->accel.color_pattern_idx += 2; - else - mach->accel.color_pattern_idx++; + mach->accel.color_pattern_idx++; if ((mono_src == 1) && !mach->accel.mono_pattern_enable && !mach->accel.block_write_mono_pattern_enable && (frgd_sel == 5) && (dev->accel_bpp == 24)) { if (mach->accel.color_pattern_idx > 2) @@ -1263,14 +1205,7 @@ mach_accel_start(int cmd_type, int cpu_input, int count, uint32_t mix_dat, uint3 dev->accel.sy++; mach->accel.poly_fill = 0; - if (mach->accel.dp_config & 0x02) - dev->accel.dest = (dev->accel.dy * dev->pitch); - else { - if (dev->bpp) - dev->accel.dest = (mach->accel.ge_offset << 1) + (dev->accel.dy * dev->pitch); - else - dev->accel.dest = (mach->accel.ge_offset << 2) + (dev->accel.dy * dev->pitch); - } + dev->accel.dest = mach->accel.dst_ge_offset + (dev->accel.dy * mach->accel.dst_pitch); if (dev->accel.sy >= mach->accel.height) { if (cpu_input) { @@ -1321,7 +1256,7 @@ mach_accel_start(int cmd_type, int cpu_input, int count, uint32_t mix_dat, uint3 if (!dev->accel.cmd_back) { if (mach_pixel_write(mach)) { - mach_log("Write PIXTRANS.\n"); + mach_log("Direct Linedraw Write pixtrans.\n"); dev->force_busy = 1; dev->force_busy2 = 1; mach->force_busy = 1; @@ -1329,7 +1264,7 @@ mach_accel_start(int cmd_type, int cpu_input, int count, uint32_t mix_dat, uint3 dev->data_available2 = 0; return; } else if (mach_pixel_read(mach)) { - mach_log("Read PIXTRANS.\n"); + mach_log("Direct Linedraw Read pixtrans.\n"); dev->force_busy = 1; dev->force_busy2 = 1; mach->force_busy = 1; @@ -1384,20 +1319,17 @@ mach_accel_start(int cmd_type, int cpu_input, int count, uint32_t mix_dat, uint3 src_dat = 0; break; case 5: - src_dat = mach->accel.color_pattern[mach->accel.color_pattern_idx]; if (dev->bpp) - src_dat |= (mach->accel.color_pattern[mach->accel.color_pattern_idx + 1] << 8); + src_dat = mach->accel.color_pattern_hicol[mach->accel.color_pattern_idx]; + else + src_dat = mach->accel.color_pattern[mach->accel.color_pattern_idx]; break; default: break; } - if (dev->bpp) { - READ((mach->accel.ge_offset << 1) + ((dev->accel.cy) * (dev->pitch)) + (dev->accel.cx), dest_dat); - } else { - READ((mach->accel.ge_offset << 2) + ((dev->accel.cy) * (dev->pitch)) + (dev->accel.cx), dest_dat); - } + READ(mach->accel.dst_ge_offset + (dev->accel.cy * mach->accel.dst_pitch) + dev->accel.cx, dest_dat); switch (compare_mode) { case 1: @@ -1434,11 +1366,7 @@ mach_accel_start(int cmd_type, int cpu_input, int count, uint32_t mix_dat, uint3 } } if ((mach->accel.dp_config & 0x10) && (cmd_type == 3)) { - if (dev->bpp) { - WRITE((mach->accel.ge_offset << 1) + ((dev->accel.cy) * (dev->pitch)) + (dev->accel.cx), dest_dat); - } else { - WRITE((mach->accel.ge_offset << 2) + ((dev->accel.cy) * (dev->pitch)) + (dev->accel.cx), dest_dat); - } + WRITE(mach->accel.dst_ge_offset + (dev->accel.cy * mach->accel.dst_pitch) + dev->accel.cx, dest_dat); } } else mach->accel.clip_overrun = ((mach->accel.clip_overrun + 1) & 0x0f); @@ -1459,10 +1387,7 @@ mach_accel_start(int cmd_type, int cpu_input, int count, uint32_t mix_dat, uint3 else cpu_dat >>= 8; - if (dev->bpp) - mach->accel.color_pattern_idx += 2; - else - mach->accel.color_pattern_idx++; + mach->accel.color_pattern_idx++; if (mach->accel.color_pattern_idx > mach->accel.patt_len) mach->accel.color_pattern_idx = 0; @@ -1508,11 +1433,7 @@ mach_accel_start(int cmd_type, int cpu_input, int count, uint32_t mix_dat, uint3 dev->subsys_stat |= INT_GE_BSY; mach->accel.clip_overrun = 0; if (mach->accel.linedraw_opt & 0x02) { - if (dev->bpp) { - READ((mach->accel.ge_offset << 1) + ((dev->accel.cy) * (dev->pitch)) + (dev->accel.cx), poly_src); - } else { - READ((mach->accel.ge_offset << 2) + ((dev->accel.cy) * (dev->pitch)) + (dev->accel.cx), poly_src); - } + READ(mach->accel.src_ge_offset + (dev->accel.cy * mach->accel.src_pitch) + dev->accel.cx, poly_src); if (poly_src) mach->accel.poly_fill ^= 1; } @@ -1535,24 +1456,17 @@ mach_accel_start(int cmd_type, int cpu_input, int count, uint32_t mix_dat, uint3 } break; case 5: - src_dat = mach->accel.color_pattern[mach->accel.color_pattern_idx]; if (dev->bpp) - src_dat |= (mach->accel.color_pattern[mach->accel.color_pattern_idx + 1] << 8); + src_dat = mach->accel.color_pattern_hicol[mach->accel.color_pattern_idx]; + else + src_dat = mach->accel.color_pattern[mach->accel.color_pattern_idx]; break; default: break; } - if (mach->accel.linedraw_opt & 0x02) { - if (dev->bpp) { - READ((mach->accel.ge_offset << 1) + ((dev->accel.cy) * (dev->pitch)) + (dev->accel.cx), dest_dat); - } else { - READ((mach->accel.ge_offset << 2) + ((dev->accel.cy) * (dev->pitch)) + (dev->accel.cx), dest_dat); - } - } else { - READ(((dev->accel.cy) * (dev->pitch)) + (dev->accel.cx), dest_dat); - } + READ(mach->accel.dst_ge_offset + (dev->accel.cy * mach->accel.dst_pitch) + dev->accel.cx, dest_dat); switch (compare_mode) { case 1: @@ -1594,26 +1508,10 @@ mach_accel_start(int cmd_type, int cpu_input, int count, uint32_t mix_dat, uint3 if ((mach->accel.dp_config & 0x10) && (cmd_type == 3)) { if (mach->accel.linedraw_opt & 0x04) { if (dev->accel.sx < mach->accel.width) { - if (mach->accel.linedraw_opt & 0x02) { - if (dev->bpp) { - WRITE((mach->accel.ge_offset << 1) + ((dev->accel.cy) * (dev->pitch)) + (dev->accel.cx), dest_dat); - } else { - WRITE((mach->accel.ge_offset << 2) + ((dev->accel.cy) * (dev->pitch)) + (dev->accel.cx), dest_dat); - } - } else { - WRITE(((dev->accel.cy) * (dev->pitch)) + (dev->accel.cx), dest_dat); - } + WRITE(mach->accel.dst_ge_offset + (dev->accel.cy * mach->accel.dst_pitch) + dev->accel.cx, dest_dat); } } else { - if (mach->accel.linedraw_opt & 0x02) { - if (dev->bpp) { - WRITE((mach->accel.ge_offset << 1) + ((dev->accel.cy) * (dev->pitch)) + (dev->accel.cx), dest_dat); - } else { - WRITE((mach->accel.ge_offset << 2) + ((dev->accel.cy) * (dev->pitch)) + (dev->accel.cx), dest_dat); - } - } else { - WRITE(((dev->accel.cy) * (dev->pitch)) + (dev->accel.cx), dest_dat); - } + WRITE(mach->accel.dst_ge_offset + (dev->accel.cy * mach->accel.dst_pitch) + dev->accel.cx, dest_dat); } } } else @@ -1635,10 +1533,7 @@ mach_accel_start(int cmd_type, int cpu_input, int count, uint32_t mix_dat, uint3 else cpu_dat >>= 8; - if (dev->bpp) - mach->accel.color_pattern_idx += 2; - else - mach->accel.color_pattern_idx++; + mach->accel.color_pattern_idx++; if (mach->accel.color_pattern_idx > mach->accel.patt_len) mach->accel.color_pattern_idx = 0; @@ -1690,20 +1585,18 @@ mach_accel_start(int cmd_type, int cpu_input, int count, uint32_t mix_dat, uint3 } break; case 5: - src_dat = mach->accel.color_pattern[mach->accel.color_pattern_idx]; if (dev->bpp) - src_dat |= (mach->accel.color_pattern[mach->accel.color_pattern_idx + 1] << 8); + src_dat = mach->accel.color_pattern_hicol[mach->accel.color_pattern_idx]; + else + src_dat = mach->accel.color_pattern[mach->accel.color_pattern_idx]; break; default: break; } - if (dev->bpp) { - READ((mach->accel.ge_offset << 1) + ((dev->accel.cy) * (dev->pitch)) + (dev->accel.cx), dest_dat); - } else { - READ((mach->accel.ge_offset << 2) + ((dev->accel.cy) * (dev->pitch)) + (dev->accel.cx), dest_dat); - } + READ(mach->accel.dst_ge_offset + (dev->accel.cy * mach->accel.dst_pitch) + dev->accel.cx, dest_dat); + switch (compare_mode) { case 1: compare = 1; @@ -1740,11 +1633,7 @@ mach_accel_start(int cmd_type, int cpu_input, int count, uint32_t mix_dat, uint3 } if ((mach->accel.dp_config & 0x10) && (cmd_type == 3)) { - if (dev->bpp) { - WRITE((mach->accel.ge_offset << 1) + ((dev->accel.cy) * (dev->pitch)) + (dev->accel.cx), dest_dat); - } else { - WRITE((mach->accel.ge_offset << 2) + ((dev->accel.cy) * (dev->pitch)) + (dev->accel.cx), dest_dat); - } + WRITE(mach->accel.dst_ge_offset + (dev->accel.cy * mach->accel.dst_pitch) + dev->accel.cx, dest_dat); } } else mach->accel.clip_overrun = ((mach->accel.clip_overrun + 1) & 0x0f); @@ -1765,10 +1654,7 @@ mach_accel_start(int cmd_type, int cpu_input, int count, uint32_t mix_dat, uint3 else cpu_dat >>= 8; - if (dev->bpp) - mach->accel.color_pattern_idx += 2; - else - mach->accel.color_pattern_idx++; + mach->accel.color_pattern_idx++; if (mach->accel.color_pattern_idx > mach->accel.patt_len) mach->accel.color_pattern_idx = 0; @@ -1831,24 +1717,17 @@ mach_accel_start(int cmd_type, int cpu_input, int count, uint32_t mix_dat, uint3 } break; case 5: - src_dat = mach->accel.color_pattern[mach->accel.color_pattern_idx]; if (dev->bpp) - src_dat |= (mach->accel.color_pattern[mach->accel.color_pattern_idx + 1] << 8); + src_dat = mach->accel.color_pattern_hicol[mach->accel.color_pattern_idx]; + else + src_dat = mach->accel.color_pattern[mach->accel.color_pattern_idx]; break; default: break; } - if (mach->accel.linedraw_opt & 0x02) { - if (dev->bpp) { - READ((mach->accel.ge_offset << 1) + ((dev->accel.cy) * (dev->pitch)) + (dev->accel.cx), dest_dat); - } else { - READ((mach->accel.ge_offset << 2) + ((dev->accel.cy) * (dev->pitch)) + (dev->accel.cx), dest_dat); - } - } else { - READ(((dev->accel.cy) * (dev->pitch)) + (dev->accel.cx), dest_dat); - } + READ(mach->accel.dst_ge_offset + (dev->accel.cy * mach->accel.dst_pitch) + dev->accel.cx, dest_dat); switch (compare_mode) { case 1: @@ -1888,26 +1767,10 @@ mach_accel_start(int cmd_type, int cpu_input, int count, uint32_t mix_dat, uint3 if ((mach->accel.dp_config & 0x10) && (cmd_type == 3)) { if (mach->accel.linedraw_opt & 0x04) { if (dev->accel.sx < mach->accel.width) { - if (mach->accel.linedraw_opt & 0x02) { - if (dev->bpp) { - WRITE((mach->accel.ge_offset << 1) + ((dev->accel.cy) * (dev->pitch)) + (dev->accel.cx), dest_dat); - } else { - WRITE((mach->accel.ge_offset << 2) + ((dev->accel.cy) * (dev->pitch)) + (dev->accel.cx), dest_dat); - } - } else { - WRITE((dev->accel.cy * dev->pitch) + dev->accel.cx, dest_dat); - } + WRITE(mach->accel.dst_ge_offset + (dev->accel.cy * mach->accel.dst_pitch) + dev->accel.cx, dest_dat); } } else { - if (mach->accel.linedraw_opt & 0x02) { - if (dev->bpp) { - WRITE((mach->accel.ge_offset << 1) + ((dev->accel.cy) * (dev->pitch)) + (dev->accel.cx), dest_dat); - } else { - WRITE((mach->accel.ge_offset << 2) + ((dev->accel.cy) * (dev->pitch)) + (dev->accel.cx), dest_dat); - } - } else { - WRITE(((dev->accel.cy) * (dev->pitch)) + (dev->accel.cx), dest_dat); - } + WRITE(mach->accel.dst_ge_offset + (dev->accel.cy * mach->accel.dst_pitch) + dev->accel.cx, dest_dat); } } } else @@ -1929,10 +1792,7 @@ mach_accel_start(int cmd_type, int cpu_input, int count, uint32_t mix_dat, uint3 else cpu_dat >>= 8; - if (dev->bpp) - mach->accel.color_pattern_idx += 2; - else - mach->accel.color_pattern_idx++; + mach->accel.color_pattern_idx++; if (mach->accel.color_pattern_idx > mach->accel.patt_len) mach->accel.color_pattern_idx = 0; @@ -2010,11 +1870,7 @@ mach_accel_start(int cmd_type, int cpu_input, int count, uint32_t mix_dat, uint3 dev->accel.sy = 0; } - if (dev->bpp) - dev->accel.dest = (mach->accel.ge_offset << 1) + (dev->accel.dy * (dev->pitch)); - else - dev->accel.dest = (mach->accel.ge_offset << 2) + (dev->accel.dy * (dev->pitch)); - + dev->accel.dest = mach->accel.dst_ge_offset + (dev->accel.dy * mach->accel.dst_pitch); mach->accel.src_stepx = 0; /*Source Width*/ @@ -2047,33 +1903,14 @@ mach_accel_start(int cmd_type, int cpu_input, int count, uint32_t mix_dat, uint3 } mach->accel.sx = 0; - if (dev->bpp) - dev->accel.src = (mach->accel.ge_offset << 1) + (dev->accel.cy * (dev->pitch)); - else - dev->accel.src = (mach->accel.ge_offset << 2) + (dev->accel.cy * (dev->pitch)); + dev->accel.src = mach->accel.src_ge_offset + (dev->accel.cy * mach->accel.src_pitch); - if ((dev->accel_bpp >= 24) && (frgd_sel == 5)) { - if (mach->accel.patt_len == 0x17) - mach->accel.color_pattern_idx = 0; - - dev->accel.x1 = dev->accel.dx + mach->accel.width; - if (dev->accel.x1 == dev->pitch) - dev->accel.x2 = mach->accel.width & 1; - else if ((dev->accel.x1 == mach->accel.width) && (dev->accel.dy & 1) && !dev->accel.y1 && dev->accel.x2) { - if (mach->accel.patt_len == 0x17) - mach->accel.color_pattern_idx = 3; - - dev->accel.x3 = 1; - } else - dev->accel.x3 = 0; - } - dev->accel.y1 = 0; - - mach_log("ScanToX: Parameters=%04x: xbit=%d, ybit=%d, widthbit=%d, DX=%d, DY=%d, CX=%d, CY=%d, dstwidth=%d, srcwidth=%d, height=%d, frmix=%02x.\n", - mach->accel.dp_config, dev->accel.dx & 1, dev->accel.dy & 1, mach->accel.width & 1, dev->accel.dx, dev->accel.dy, dev->accel.cx, dev->accel.cy, mach->accel.width, mach->accel.src_width, dev->accel.sy, dev->accel.frgd_mix & 0x1f); + mach_log("ScanToX: Parameters=%04x: xbit=%d, ybit=%d, widthbit=%d, DX=%d, DY=%d, CX=%d, CY=%d, dstwidth=%d, srcwidth=%d, height=%d, frmix=%02x, colpatidx=%d, srcpitch=%d, dstpitch=%d, scantox=%d.\n", + mach->accel.dp_config, dev->accel.dx & 1, dev->accel.dy & 1, mach->accel.width & 1, dev->accel.dx, dev->accel.dy, dev->accel.cx, dev->accel.cy, mach->accel.width, mach->accel.src_width, dev->accel.sy, dev->accel.frgd_mix & 0x1f, mach->accel.color_pattern_idx, mach->accel.src_pitch, mach->accel.dst_pitch, mach->accel.scan_to_x); if (!dev->accel.cmd_back) { if (mach_pixel_write(mach)) { + mach_log("Scan To X Write pixtrans.\n"); dev->force_busy = 1; dev->force_busy2 = 1; mach->force_busy = 1; @@ -2081,6 +1918,7 @@ mach_accel_start(int cmd_type, int cpu_input, int count, uint32_t mix_dat, uint3 dev->data_available2 = 0; return; } else if (mach_pixel_read(mach)) { + mach_log("Scan To X Read pixtrans.\n"); dev->force_busy = 1; dev->force_busy2 = 1; mach->force_busy = 1; @@ -2091,6 +1929,110 @@ mach_accel_start(int cmd_type, int cpu_input, int count, uint32_t mix_dat, uint3 } } + if ((dev->accel_bpp == 24) && (mach->accel.dp_config == 0x6211)) { + int64_t cx; + int64_t cy; + + cx = mach->accel.src_x_scan; + cy = mach->accel.src_y_scan; + + if (mach->accel.src_stepx == -1) { + if (cx > 0) + cx--; + } + + dev->accel.src = mach->accel.src_ge_offset + (cy * mach->accel.src_pitch); + + while (1) { + mix = 1; + + if ((dev->accel.dx >= clip_l) && + (dev->accel.dx <= clip_r) && + (dev->accel.dy >= clip_t) && + (dev->accel.dy <= clip_b)) { + dev->subsys_stat |= INT_GE_BSY; + READ(dev->accel.src + cx, src_dat); + READ(dev->accel.dest + dev->accel.dx, dest_dat); + + switch (compare_mode) { + case 1: + compare = 1; + break; + case 2: + compare = (dest_dat >= dest_cmp_clr) ? 0 : 1; + break; + case 3: + compare = (dest_dat < dest_cmp_clr) ? 0 : 1; + break; + case 4: + compare = (dest_dat != dest_cmp_clr) ? 0 : 1; + break; + case 5: + compare = (dest_dat == dest_cmp_clr) ? 0 : 1; + break; + case 6: + compare = (dest_dat <= dest_cmp_clr) ? 0 : 1; + break; + case 7: + compare = (dest_dat > dest_cmp_clr) ? 0 : 1; + break; + + default: + break; + } + + if (!compare) { + old_dest_dat = dest_dat; + MIX(mix, dest_dat, src_dat); + dest_dat = (dest_dat & wrt_mask) | (old_dest_dat & ~wrt_mask); + } + + WRITE(dev->accel.dest + dev->accel.dx, dest_dat); + } + + cx += mach->accel.src_stepx; + mach->accel.sx++; + if (mach->accel.sx >= mach->accel.src_width) { + mach->accel.sx = 0; + cx = mach->accel.src_x_scan; + if (mach->accel.src_stepx == -1) { + if (cx > 0) + cx--; + } + + cy += (mach->accel.src_y_dir ? 1 : -1); + dev->accel.src = mach->accel.src_ge_offset + (cy * mach->accel.src_pitch); + } + + dev->accel.dx += mach->accel.stepx; + dev->accel.sx++; + if (dev->accel.sx >= mach->accel.width) { + dev->accel.sx = 0; + dev->accel.dy += mach->accel.stepy; + dev->accel.dest = mach->accel.dst_ge_offset + (dev->accel.dy * mach->accel.dst_pitch); + + if (mach->accel.line_idx == 2) { + mach->accel.line_array[0] = dev->accel.dx; + mach->accel.line_array[4] = dev->accel.dx; + } + if (dev->accel.sy >= 0) + dev->accel.sy--; + + dev->fifo_idx = 0; + dev->force_busy = 0; + dev->force_busy2 = 0; + mach->force_busy = 0; + dev->accel.cmd_back = 1; + dev->accel.cur_x = dev->accel.dx; + dev->accel.cur_y = dev->accel.dy; + mach->accel.src_x_scan = cx; + mach->accel.src_y_scan = cy; + return; + } + } + return; + } + if (mono_src == 1) { count = mach->accel.width; mix_dat = mach->accel.mono_pattern_normal[0]; @@ -2128,7 +2070,7 @@ mach_accel_start(int cmd_type, int cpu_input, int count, uint32_t mix_dat, uint3 } break; case 3: - READ(dev->accel.src + (dev->accel.cx), mix); + READ(dev->accel.src + dev->accel.cx, mix); mix = (mix & rd_mask) == rd_mask; break; @@ -2161,9 +2103,10 @@ mach_accel_start(int cmd_type, int cpu_input, int count, uint32_t mix_dat, uint3 } break; case 5: - src_dat = mach->accel.color_pattern[mach->accel.color_pattern_idx]; if (dev->bpp) - src_dat |= (mach->accel.color_pattern[mach->accel.color_pattern_idx + 1] << 8); + src_dat = mach->accel.color_pattern_hicol[mach->accel.color_pattern_idx]; + else + src_dat = mach->accel.color_pattern[mach->accel.color_pattern_idx]; break; default: @@ -2209,7 +2152,6 @@ mach_accel_start(int cmd_type, int cpu_input, int count, uint32_t mix_dat, uint3 if (mach->accel.dp_config & 0x10) { WRITE(dev->accel.dest + dev->accel.dx, dest_dat); - mach_log("ScanToX: DXS=%d, DYS=%d, dest data=%02x, lineidx=%d.\n", dev->accel.dx, dev->accel.dy, dest_dat, mach->accel.line_idx); } } @@ -2228,40 +2170,21 @@ mach_accel_start(int cmd_type, int cpu_input, int count, uint32_t mix_dat, uint3 dev->accel.cx -= mach->accel.src_width; dev->accel.cy += (mach->accel.src_y_dir ? 1 : -1); - if (dev->bpp) - dev->accel.src = (mach->accel.ge_offset << 1) + (dev->accel.cy * (dev->pitch)); - else - dev->accel.src = (mach->accel.ge_offset << 2) + (dev->accel.cy * (dev->pitch)); + dev->accel.src = mach->accel.src_ge_offset + (dev->accel.cy * mach->accel.src_pitch); } - mach_log("ColorIdx=%d, data=%02x, DestX=%d, DestY=%d.\n", mach->accel.color_pattern_idx, mach->accel.color_pattern[mach->accel.color_pattern_idx], dev->accel.dx, dev->accel.dy & 1); - if (dev->bpp) - mach->accel.color_pattern_idx += 2; - else - mach->accel.color_pattern_idx++; + mach->accel.color_pattern_idx++; - if ((dev->accel_bpp >= 24) && (frgd_sel == 5) && (mach->accel.patt_len == 0x17)) { - if (dev->accel.x3) { - if (mach->accel.color_pattern_idx == 9) - mach->accel.color_pattern_idx = 3; - } else { - if (mach->accel.color_pattern_idx == 6) - mach->accel.color_pattern_idx = 0; - } - } else { - if (mach->accel.color_pattern_idx > mach->accel.patt_len) - mach->accel.color_pattern_idx = 0; - } + if (mach->accel.color_pattern_idx > mach->accel.patt_len) + mach->accel.color_pattern_idx = 0; dev->accel.dx += mach->accel.stepx; dev->accel.sx++; if (dev->accel.sx >= mach->accel.width) { dev->accel.sx = 0; dev->accel.dy += mach->accel.stepy; - if (dev->bpp) - dev->accel.dest = (mach->accel.ge_offset << 1) + (dev->accel.dy * dev->pitch); - else - dev->accel.dest = (mach->accel.ge_offset << 2) + (dev->accel.dy * dev->pitch); + dev->accel.dest = mach->accel.dst_ge_offset + (dev->accel.dy * mach->accel.dst_pitch); + if (mach->accel.line_idx == 2) { mach->accel.line_array[0] = dev->accel.dx; mach->accel.line_array[4] = dev->accel.dx; @@ -2348,13 +2271,12 @@ mach_out(uint16_t addr, uint8_t val, void *priv) if (((addr & 0xFFF0) == 0x3D0 || (addr & 0xFFF0) == 0x3B0) && !(svga->miscout & 1)) addr ^= 0x60; - if (((dev->disp_cntl & 0x60) == 0x20) && ATI_MACH32) { - if ((addr >= 0x3c6) && (addr <= 0x3c9)) { - mach_log("VGA DAC write regs=%03x, on=%d, display control=%02x, on1=%x, clocksel=%02x.\n", - addr, dev->on, dev->disp_cntl & 0x60, dev->accel.advfunc_cntl & 0x01, mach->accel.clock_sel & 0x01); - } else if ((addr >= 0x2ea) && (addr <= 0x2ed)) - mach_log("8514/A DAC write regs=%03x, on=%d, display control=%02x, on1=%x, clocksel=%02x.\n", - addr, dev->on, dev->disp_cntl & 0x60, dev->accel.advfunc_cntl & 0x01, mach->accel.clock_sel & 0x01); + if ((addr >= 0x3c6) && (addr <= 0x3c9)) { + mach_log("VGA DAC write regs=%03x, on=%d, display control=%02x, on1=%x, clocksel=%02x.\n", + addr, dev->on, dev->disp_cntl & 0x60, dev->accel.advfunc_cntl & 0x01, mach->accel.clock_sel & 0x01); + } else if ((addr >= 0x2ea) && (addr <= 0x2ed)) { + mach_log("8514/A DAC write regs=%03x, on=%d, display control=%02x, on1=%x, clocksel=%02x.\n", + addr, dev->on, dev->disp_cntl & 0x60, dev->accel.advfunc_cntl & 0x01, mach->accel.clock_sel & 0x01); } switch (addr) { @@ -2364,7 +2286,7 @@ mach_out(uint16_t addr, uint8_t val, void *priv) case 0x1cf: old = mach->regs[mach->index]; mach->regs[mach->index] = val; - mach_log("ATI VGA write reg=%02x, val=%02x.\n", mach->index, val); + mach_log("ATI VGA write reg=%02x, val=%02x, old=%02x.\n", mach->index, val, old); switch (mach->index) { case 0xa3: if ((old ^ val) & 0x10) { @@ -2388,8 +2310,25 @@ mach_out(uint16_t addr, uint8_t val, void *priv) break; case 0xb0: if ((old ^ val) & 0x60) { - mach_log("ATI B0 bits 5-6: old=%02x, val=%02x.\n", old & 0x60, val & 0x60); - svga_recalctimings(svga); + if (dev->_8514crt) { + if (!(mach->accel.clock_sel & 0x01)) { + if ((val & 0x20) && !(old & 0x20)) { + dev->on = 1; + dev->vendor_mode = !!(ATI_MACH32); + mach_set_resolution(mach, svga); + mach32_updatemapping(mach, svga); + } else if (!(val & 0x20) && (old & 0x20)) { + dev->on = 0; + dev->vendor_mode = 0; + mach_set_resolution(mach, svga); + mach32_updatemapping(mach, svga); + } + } + } else + svga_recalctimings(svga); + + mach_log("ATI B0 bits 5-6: old=%02x, val=%02x, on=%d, bpp=%d, hires=%x, vgahires=%02x, base=%05x.\n", + old & 0x60, val & 0x60, dev->on, dev->accel_bpp, dev->accel.advfunc_cntl & 0x04, svga->gdcreg[5] & 0x60, svga->mapping.base); } break; case 0xae: @@ -2464,23 +2403,12 @@ mach_out(uint16_t addr, uint8_t val, void *priv) case 0x2ed: rs2 = !!(mach->accel.ext_ge_config & 0x1000); rs3 = !!(mach->accel.ext_ge_config & 0x2000); - mach_log("8514/A RS2=%d, RS3=%d, addr=%03x.\n", rs2, rs3, addr); - if (ATI_MACH32) { - if (mach->regs[0xb0] & 0x20) { /*ATI extended 8514/A mode.*/ - mach_log("Extended 8514/A mode.\n"); - dev->vendor_mode = 1; - dev->on |= 0x01; - mach_set_resolution(mach, svga); - mach32_updatemapping(mach, svga); - } - if (dev->on) - svga_out(addr, val, svga); - else { - if (mach->pci_bus && !mach->ramdac_type) - ati68860_ramdac_out((addr & 0x03) | (rs2 << 2) | (rs3 << 3), val, svga->ramdac, svga); - else - ati68875_ramdac_out(addr, rs2, rs3, val, svga->ramdac, svga); - } + mach_log("8514/A Extended mode=%02x.\n", mach->regs[0xb0] & 0x20); + if (ATI_MACH32 && !dev->on) { + if (mach->pci_bus && !mach->ramdac_type) + ati68860_ramdac_out((addr & 0x03) | (rs2 << 2) | (rs3 << 3), val, svga->ramdac, svga); + else + ati68875_ramdac_out(addr, rs2, rs3, val, svga->ramdac, svga); } else svga_out(addr, val, svga); return; @@ -2491,23 +2419,12 @@ mach_out(uint16_t addr, uint8_t val, void *priv) case 0x3C9: rs2 = !!(mach->regs[0xa0] & 0x20); rs3 = !!(mach->regs[0xa0] & 0x40); - mach_log("VGA RS2=%d, RS3=%d, addr=%03x.\n", rs2, rs3, addr); - if (ATI_MACH32) { - if (svga->attrregs[0x10] & 0x40) { - mach_log("VGA mode.\n"); - dev->vendor_mode = 0; - dev->on &= ~0x01; - mach_set_resolution(mach, svga); - mach32_updatemapping(mach, svga); - } - if (dev->on) - svga_out(addr, val, svga); - else { - if (mach->pci_bus && !mach->ramdac_type) - ati68860_ramdac_out((addr & 0x03) | (rs2 << 2) | (rs3 << 3), val, svga->ramdac, svga); - else - ati68875_ramdac_out(addr, rs2, rs3, val, svga->ramdac, svga); - } + mach_log("VGA Extended mode=%02x.\n", mach->regs[0xb0] & 0x20); + if (ATI_MACH32 && !dev->on) { + if (mach->pci_bus && !mach->ramdac_type) + ati68860_ramdac_out((addr & 0x03) | (rs2 << 2) | (rs3 << 3), val, svga->ramdac, svga); + else + ati68875_ramdac_out(addr, rs2, rs3, val, svga->ramdac, svga); } else svga_out(addr, val, svga); return; @@ -2622,15 +2539,11 @@ mach_in(uint16_t addr, void *priv) case 0x2ed: rs2 = !!(mach->accel.ext_ge_config & 0x1000); rs3 = !!(mach->accel.ext_ge_config & 0x2000); - if (ATI_MACH32) { - if (dev->on) - temp = svga_in(addr, svga); - else { - if (mach->pci_bus && !mach->ramdac_type) - temp = ati68860_ramdac_in((addr & 3) | (rs2 << 2) | (rs3 << 3), svga->ramdac, svga); - else - temp = ati68875_ramdac_in(addr, rs2, rs3, svga->ramdac, svga); - } + if (ATI_MACH32 && !dev->on) { + if (mach->pci_bus && !mach->ramdac_type) + temp = ati68860_ramdac_in((addr & 3) | (rs2 << 2) | (rs3 << 3), svga->ramdac, svga); + else + temp = ati68875_ramdac_in(addr, rs2, rs3, svga->ramdac, svga); } else temp = svga_in(addr, svga); break; @@ -2770,13 +2683,15 @@ static void mach_set_resolution(mach_t *mach, svga_t *svga) { ibm8514_t *dev = (ibm8514_t *) svga->dev8514; + int ret = 0; - dev->hdisp = (dev->hdisped + 1) << 3; dev->h_total = dev->htotal + 1; if (dev->h_total == 1) /*Default to 1024x768 87hz 8514/A htotal timings if it goes to 0.*/ dev->h_total = 0x9e; + dev->hdisp = (dev->hdisped + 1) << 3; + dev->vdisp = (dev->v_disp + 1) >> 1; if ((dev->vdisp == 478) || (dev->vdisp == 598) || (dev->vdisp == 766) || (dev->vdisp == 1022)) dev->vdisp += 2; @@ -2789,70 +2704,53 @@ mach_set_resolution(mach_t *mach, svga_t *svga) if (dev->interlace) dev->v_syncstart >>= 1; - mach_log("Shadow set ATI=%x, shadow set 8514/A=%x, resolution h=%d, v=%d, vtotal=%d, vsyncstart=%d.\n", mach->shadow_set & 0x03, dev->accel.advfunc_cntl & 0x04, dev->hdisp, dev->vdisp, dev->v_total, dev->v_syncstart); - switch (mach->shadow_set & 0x03) { - case 0x00: /*Primary CRT Register set*/ - if (dev->on) { - if (mach->crt_resolution == 0x01) { - if (ATI_8514A_ULTRA) { + if ((mach->accel.clock_sel & 0x01) && !(mach->old_on2 & 0x01) && + !(dev->accel.advfunc_cntl & 0x01)) + ret = 2; + else if ((dev->accel.advfunc_cntl & 0x01) && !(mach->old_on1 & 0x01) && + !(mach->accel.clock_sel & 0x01)) + ret = 1; + else if ((!(dev->accel.advfunc_cntl & 0x01) && (mach->old_on1 & 0x01)) || + (!(mach->accel.clock_sel & 0x01) && (mach->old_on2 & 0x01))) + ret = 0; + + if (ret) { + if (ret == 2) + svga_recalctimings(svga); + else { + switch (mach->shadow_set & 0x03) { + case 0x00: + if (mach->crt_resolution) + svga_recalctimings(svga); + else { if (dev->accel.advfunc_cntl & 0x04) { if (dev->hdisp == 640) { dev->hdisp = 1024; dev->vdisp = 768; - svga_recalctimings(svga); } } else { if (dev->hdisp == 1024) { dev->hdisp = 640; dev->vdisp = 480; - svga_recalctimings(svga); } } - } else svga_recalctimings(svga); - } else if (mach->crt_resolution == 0x02) { - if (dev->accel.advfunc_cntl & 0x04) { - if (dev->hdisp == 640) { - dev->hdisp = 1024; - dev->vdisp = 768; - svga_recalctimings(svga); - } - } else { - if (dev->hdisp == 1024) { - dev->hdisp = 640; - dev->vdisp = 480; - svga_recalctimings(svga); - } } - } else - svga_recalctimings(svga); + break; + case 0x01: + mach->crt_resolution = 0x01; + break; + case 0x02: + mach->crt_resolution = 0x02; + break; + default: + break; } - break; - case 0x01: /*Shadow 640x480 CRT register set*/ - if (dev->on) { - if (!(dev->accel.advfunc_cntl & 0x04)) { - if (dev->hdisp == 1024) { - dev->hdisp = 640; - dev->vdisp = 480; - } - } - svga_recalctimings(svga); - } - break; - case 0x02: /*Shadow 1024x768 CRT register set*/ - if (dev->on) { - if (dev->accel.advfunc_cntl & 0x04) { - if (dev->hdisp == 640) { - dev->hdisp = 1024; - dev->vdisp = 768; - } - } - svga_recalctimings(svga); - } - break; - default: - break; - } + } + } else + svga_recalctimings(svga); + + mach_log("Shadow set ATI=%x, shadow set 8514/A and on1=%x, on2=%x, resolution h=%d, v=%d, vtotal=%d, vsyncstart=%d, crtres=%d, ret=%d, actual passthrough=%x.\n", mach->shadow_set & 0x03, dev->accel.advfunc_cntl & 0x05, mach->accel.clock_sel & 0x01, dev->hdisp, dev->vdisp, dev->v_total, dev->v_syncstart, mach->crt_resolution, ret, dev->on); } void @@ -2864,42 +2762,52 @@ ati8514_recalctimings(svga_t *svga) mach_log("ON=%d, vgahdisp=%d.\n", dev->on, svga->hdisp); if (dev->on) { mach_log("8514/A ON.\n"); - dev->pitch = dev->ext_pitch; + dev->pitch = ((mach->accel.ge_pitch & 0xff) << 3); + dev->interlace = !!(dev->disp_cntl & 0x10); dev->rowoffset = dev->ext_crt_pitch; dev->rowcount = !!(dev->disp_cntl & 0x08); - dev->accel.ge_offset = (mach->accel.ge_offset_lo | (mach->accel.ge_offset_hi << 16)); - mach->accel.ge_offset = dev->accel.ge_offset; + dev->accel.ge_offset = (mach->accel.ge_offset_lo | (mach->accel.ge_offset_hi << 16)) << 2; + mach->accel.crt_offset = (mach->accel.crt_offset_lo | (mach->accel.crt_offset_hi << 16)) << 2; + dev->accel.ge_offset -= mach->accel.crt_offset; mach_log("HDISP=%d, VDISP=%d, shadowset=%x, 8514/A mode=%x, clocksel=%02x.\n", dev->hdisp, dev->vdisp, mach->shadow_set & 0x03, dev->accel.advfunc_cntl & 0x05, mach->accel.clock_sel & 0x01); + mach->accel.src_pitch = ((mach->accel.ge_pitch & 0xff) << 3); + mach->accel.dst_pitch = ((mach->accel.ge_pitch & 0xff) << 3); + mach->accel.src_ge_offset = (mach->accel.ge_offset_lo | (mach->accel.ge_offset_hi << 16)) << 2; + mach->accel.dst_ge_offset = (mach->accel.ge_offset_lo | (mach->accel.ge_offset_hi << 16)) << 2; + mach->accel.src_ge_offset -= mach->accel.crt_offset; + mach->accel.dst_ge_offset -= mach->accel.crt_offset; + dev->h_disp = dev->hdisp; dev->dispend = dev->vdisp; + if (dev->dispend == 600) + dev->h_disp = 800; + else if (dev->h_disp == 640) + dev->dispend = 480; if (dev->accel.advfunc_cntl & 0x04) - svga->clock8514 = (cpuclock * (double) (1ULL << 32)) / 44900000.0; + svga->clock_8514 = (cpuclock * (double) (1ULL << 32)) / 44900000.0; else - svga->clock8514 = (cpuclock * (double) (1ULL << 32)) / 25175000.0; + svga->clock_8514 = (cpuclock * (double) (1ULL << 32)) / 25175000.0; if (dev->interlace) dev->dispend >>= 1; - mach->crt_resolution = 0x00; mach_log("cntl=%d, hv(%d,%d), pitch=%d, rowoffset=%d, gextconfig=%03x, shadow=%x interlace=%d.\n", dev->accel.advfunc_cntl & 0x04, dev->h_disp, dev->dispend, dev->pitch, dev->rowoffset, mach->accel.ext_ge_config & 0xcec0, mach->shadow_set & 3, dev->interlace); if (dev->vram_512k_8514) { - if (dev->h_disp == 640) { - dev->ext_pitch = 640; - dev->pitch = dev->ext_pitch; - } else { - dev->ext_pitch = 1024; - dev->pitch = dev->ext_pitch; - } + if (dev->h_disp == 640) + dev->pitch = 640; + else + dev->pitch = 1024; } dev->accel_bpp = 8; svga->render8514 = ibm8514_render_8bpp; - } + } else + mach->crt_resolution = 0; } static void @@ -2956,13 +2864,29 @@ mach_recalctimings(svga_t *svga) mach_log("ON=%d, override=%d, gelo=%04x, gehi=%04x, vgahdisp=%d.\n", dev->on, svga->override, mach->accel.ge_offset_lo, mach->accel.ge_offset_hi, svga->hdisp); if (dev->on) { dev->ma_latch = 0; /*(mach->accel.crt_offset_lo | (mach->accel.crt_offset_hi << 16)) << 2;*/ - dev->pitch = dev->ext_pitch; + dev->interlace = !!(dev->disp_cntl & 0x10); + dev->pitch = ((mach->accel.ge_pitch & 0xff) << 3); dev->rowoffset = dev->ext_crt_pitch; dev->rowcount = !!(dev->disp_cntl & 0x08); dev->accel.ge_offset = (mach->accel.ge_offset_lo | (mach->accel.ge_offset_hi << 16)); - mach->accel.ge_offset = dev->accel.ge_offset; - mach_log("8514/A ON, extpitch=%d, geoffset=%x, 8514malatch=%x, vgamalatch=%x.\n", dev->ext_pitch, mach->accel.ge_offset, dev->ma_latch, svga->ma_latch); + mach->accel.crt_offset = (mach->accel.crt_offset_lo | (mach->accel.crt_offset_hi << 16)); + if (dev->bpp) { + dev->accel.ge_offset <<= 1; + mach->accel.crt_offset <<= 1; + } else { + dev->accel.ge_offset <<= 2; + mach->accel.crt_offset <<= 2; + } + + if (ATI_MACH32 && !dev->vram_512k_8514 && ((mach->accel.ext_ge_config & 0x30) == 0x00)) { + dev->accel.ge_offset <<= 1; + mach->accel.crt_offset <<= 1; + } + + dev->accel.ge_offset -= mach->accel.crt_offset; + + mach_log("RowCount=%x, rowoffset=%x, pitch=%d, geoffset=%x, crtoffset=%x.\n", dev->rowcount, dev->rowoffset, dev->pitch, dev->accel.ge_offset, mach->accel.crt_offset); mach_log("HDISP=%d, VDISP=%d, shadowset=%x, 8514/A mode=%x, clocksel=%02x, interlace=%x.\n", dev->hdisp, dev->vdisp, mach->shadow_set & 0x03, dev->accel.advfunc_cntl & 0x04, mach->accel.clock_sel & 0xfe, dev->interlace); @@ -2972,59 +2896,94 @@ mach_recalctimings(svga_t *svga) if (dev->dispend == 959) { /*FIXME: vertical resolution mess on EEPROM tests on Mach8*/ dev->dispend >>= 1; dev->dispend++; - } + } else if (dev->dispend == 600) + dev->h_disp = 800; + else if (dev->h_disp == 640) + dev->dispend = 480; - svga->clock8514 = (cpuclock * (double) (1ULL << 32)) / svga->getclock((mach->accel.clock_sel >> 2) & 0x0f, svga->clock_gen); + svga->clock_8514 = (cpuclock * (double) (1ULL << 32)) / svga->getclock((mach->accel.clock_sel >> 2) & 0x0f, svga->clock_gen); if (mach->accel.clock_sel & 0x40) - svga->clock8514 *= 2; + svga->clock_8514 *= 2; if (dev->interlace) dev->dispend >>= 1; - mach->crt_resolution = 0x00; if (ATI_MACH32) { + switch ((mach->shadow_set >> 8) & 0x03) { + case 0x00: + mach->accel.src_pitch = ((mach->accel.ge_pitch & 0xff) << 3); + mach->accel.dst_pitch = ((mach->accel.ge_pitch & 0xff) << 3); + mach->accel.src_ge_offset = (mach->accel.ge_offset_lo | (mach->accel.ge_offset_hi << 16)); + mach->accel.dst_ge_offset = (mach->accel.ge_offset_lo | (mach->accel.ge_offset_hi << 16)); + if (dev->bpp) { + mach->accel.src_ge_offset <<= 1; + mach->accel.dst_ge_offset <<= 1; + } else { + mach->accel.src_ge_offset <<= 2; + mach->accel.dst_ge_offset <<= 2; + } + if (!dev->vram_512k_8514 && ((mach->accel.ext_ge_config & 0x30) == 0x00)) { + mach->accel.src_ge_offset <<= 1; + mach->accel.dst_ge_offset <<= 1; + } + mach->accel.src_ge_offset -= mach->accel.crt_offset; + mach->accel.dst_ge_offset -= mach->accel.crt_offset; + dev->accel.src_pitch = mach->accel.src_pitch; + dev->accel.dst_pitch = mach->accel.dst_pitch; + dev->accel.src_ge_offset = mach->accel.src_ge_offset; + dev->accel.dst_ge_offset = mach->accel.dst_ge_offset; + break; + case 0x01: + mach->accel.dst_pitch = ((mach->accel.ge_pitch & 0xff) << 3); + mach->accel.dst_ge_offset = (mach->accel.ge_offset_lo | (mach->accel.ge_offset_hi << 16)); + if (dev->bpp) + mach->accel.dst_ge_offset <<= 1; + else + mach->accel.dst_ge_offset <<= 2; + + if (!dev->vram_512k_8514 && ((mach->accel.ext_ge_config & 0x30) == 0x00)) + mach->accel.dst_ge_offset <<= 1; + + mach->accel.dst_ge_offset -= mach->accel.crt_offset; + dev->accel.dst_pitch = mach->accel.dst_pitch; + dev->accel.dst_ge_offset = mach->accel.dst_ge_offset; + break; + case 0x02: + mach->accel.src_pitch = ((mach->accel.ge_pitch & 0xff) << 3); + mach->accel.src_ge_offset = (mach->accel.ge_offset_lo | (mach->accel.ge_offset_hi << 16)); + if (dev->bpp) + mach->accel.src_ge_offset <<= 1; + else + mach->accel.src_ge_offset <<= 2; + + if (!dev->vram_512k_8514 && ((mach->accel.ext_ge_config & 0x30) == 0x00)) + mach->accel.src_ge_offset <<= 1; + + mach->accel.src_ge_offset -= mach->accel.crt_offset; + dev->accel.src_pitch = mach->accel.src_pitch; + dev->accel.src_ge_offset = mach->accel.src_ge_offset; + break; + default: + break; + } mach_log("cntl=%d, clksel=%x, hv(%d,%d), pitch=%d, rowoffset=%d, gextconfig=%03x, shadow=%x interlace=%d, vgahdisp=%d.\n", dev->accel.advfunc_cntl & 0x04, mach->accel.clock_sel & 0x01, dev->h_disp, dev->dispend, dev->pitch, dev->rowoffset, mach->accel.ext_ge_config & 0xcec0, mach->shadow_set & 3, dev->interlace, svga->hdisp); if ((mach->accel.ext_ge_config & 0x800) || (!(mach->accel.ext_ge_config & 0x8000) && !(mach->accel.ext_ge_config & 0x800))) { - if ((mach->accel.ext_ge_config & 0x30) == 0x20) { - if ((mach->accel.ext_ge_config & 0xc0) == 0x40) { - dev->accel_bpp = 16; - svga->overscan_color = video_16to32[((mach->overscan_r_col_24 << 16) | (mach->overscan_g_col_24 << 8) | mach->overscan_b_col_24) & 0xffff]; - } else { - dev->accel_bpp = 15; - svga->overscan_color = video_15to32[((mach->overscan_r_col_24 << 16) | (mach->overscan_g_col_24 << 8) | mach->overscan_b_col_24) & 0xffff]; - } - } else if ((mach->accel.ext_ge_config & 0x30) == 0x30) { - if (mach->accel.ext_ge_config & 0x200) - dev->accel_bpp = 32; - else - dev->accel_bpp = 24; - - svga->overscan_color = ((mach->overscan_r_col_24 << 16) | (mach->overscan_g_col_24 << 8) | mach->overscan_b_col_24); - } else if ((mach->accel.ext_ge_config & 0x30) == 0x10) { - dev->accel_bpp = 8; - svga->overscan_color = dev->pallook[mach->overscan_col_8]; - } else { - if (dev->vram_512k_8514) { - if (dev->h_disp == 640) { - dev->ext_pitch = 640; - dev->pitch = dev->ext_pitch; - } else { - dev->ext_pitch = 1024; - dev->pitch = dev->ext_pitch; - } - } - dev->accel_bpp = 8; - svga->overscan_color = dev->pallook[mach->overscan_col_8]; - } - - mach_log("hv(%d,%d), pitch=%d, rowoffset=%d, gextconfig=%03x, bpp=%d, shadow=%x, vgahdisp=%d.\n", + mach_log("hv=%d,%d, pitch=%d, rowoffset=%d, gextconfig=%03x, bpp=%d, shadow=%x, vgahdisp=%d.\n", dev->h_disp, dev->dispend, dev->pitch, dev->ext_crt_pitch, mach->accel.ext_ge_config & 0xcec0, - dev->accel_bpp, mach->shadow_set & 3, svga->hdisp); + dev->accel_bpp, mach->shadow_set & 0x03, svga->hdisp); switch (dev->accel_bpp) { case 8: + if ((mach->accel.ext_ge_config & 0x30) == 0x00) { + if (dev->vram_512k_8514) { + if (dev->h_disp == 640) + dev->pitch = 640; + else + dev->pitch = 1024; + } + } svga->render8514 = ibm8514_render_8bpp; break; case 15: @@ -3047,22 +3006,34 @@ mach_recalctimings(svga_t *svga) } } } else { + mach->accel.src_pitch = ((mach->accel.ge_pitch & 0xff) << 3); + mach->accel.dst_pitch = ((mach->accel.ge_pitch & 0xff) << 3); + mach->accel.src_ge_offset = (mach->accel.ge_offset_lo | (mach->accel.ge_offset_hi << 16)); + mach->accel.dst_ge_offset = (mach->accel.ge_offset_lo | (mach->accel.ge_offset_hi << 16)); + if (dev->bpp) { + mach->accel.src_ge_offset <<= 1; + mach->accel.dst_ge_offset <<= 1; + } else { + mach->accel.src_ge_offset <<= 2; + mach->accel.dst_ge_offset <<= 2; + } + mach->accel.src_ge_offset -= mach->accel.crt_offset; + mach->accel.dst_ge_offset -= mach->accel.crt_offset; + mach_log("cntl=%d, clksel=%x, hv(%d,%d), pitch=%d, rowoffset=%d, gextconfig=%03x, shadow=%x interlace=%d, vgahdisp=%d.\n", dev->accel.advfunc_cntl & 0x04, mach->accel.clock_sel & 0x01, dev->h_disp, dev->dispend, dev->pitch, dev->rowoffset, - mach->accel.ext_ge_config & 0xcec0, mach->shadow_set & 3, dev->interlace, svga->hdisp); + mach->accel.ext_ge_config & 0xcec0, mach->shadow_set & 0x03, dev->interlace, svga->hdisp); if (dev->vram_512k_8514) { - if (dev->h_disp == 640) { - dev->ext_pitch = 640; - dev->pitch = dev->ext_pitch; - } else { - dev->ext_pitch = 1024; - dev->pitch = dev->ext_pitch; - } + if (dev->h_disp == 640) + dev->pitch = 640; + else + dev->pitch = 1024; } dev->accel_bpp = 8; svga->render8514 = ibm8514_render_8bpp; } } else { + mach->crt_resolution = 0; if (!svga->scrblank && (svga->crtc[0x17] & 0x80) && svga->attr_palette_enable) { mach_log("GDCREG5=%02x, ATTR10=%02x, ATI B0 bit 5=%02x, ON=%d.\n", svga->gdcreg[5] & 0x60, svga->attrregs[0x10] & 0x40, mach->regs[0xb0] & 0x20, dev->on); @@ -3129,9 +3100,8 @@ mach_accel_out_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, u if ((mach->accel.clock_sel & 0x01) || (!(mach->accel.clock_sel & 0x01) && (mach->shadow_set & 0x03))) { /*For 8514/A mode, take the shadow sets into account.*/ if (!(mach->shadow_cntl & 0x04)) dev->htotal = val; - - mach_set_resolution(mach, svga); } + svga_recalctimings(svga); break; case 0xae8: @@ -3139,8 +3109,8 @@ mach_accel_out_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, u if (!(mach->shadow_cntl & 0x04)) { WRITE8(port, dev->hsync_start, val); } - mach_set_resolution(mach, svga); } + svga_recalctimings(svga); break; case 0xee8: @@ -3148,14 +3118,8 @@ mach_accel_out_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, u if (!(mach->shadow_cntl & 0x04)) { WRITE8(port, dev->hsync_width, val); } - mach_set_resolution(mach, svga); } - break; - - case 0x1ee8: - case 0x1ee9: - if ((mach->accel.clock_sel & 0x01) || (!(mach->accel.clock_sel & 0x01) && (mach->shadow_set & 0x03))) /*For 8514/A mode, take the shadow sets into account.*/ - mach_set_resolution(mach, svga); + svga_recalctimings(svga); break; case 0x6e8: @@ -3166,52 +3130,45 @@ mach_accel_out_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, u dev->htotal = (val >> 8) & 0xff; if (!(mach->shadow_cntl & 0x08)) { - if (dev->htotal || (mach->accel.clock_sel & 0x01)) { + if ((dev->htotal || (mach->accel.clock_sel & 0x01)) && (val & 0xff)) { WRITE8(port, dev->hdisped, val); } } - - if (dev->htotal || (mach->accel.clock_sel & 0x01)) - mach_set_resolution(mach, svga); } } else { mach_log("HDISP and HTOTAL=%02x, len=%d, set=%x, ATI mode bit=%x.\n", val, len, mach->shadow_set & 0x03, mach->accel.clock_sel & 0x01); if ((mach->accel.clock_sel & 0x01) || (!(mach->accel.clock_sel & 0x01) && (mach->shadow_set & 0x03))) { /*For 8514/A mode, take the shadow sets into account.*/ if (!(mach->shadow_cntl & 0x08)) { - WRITE8(port, dev->hdisped, val); + if ((dev->htotal || (mach->accel.clock_sel & 0x01)) && (val & 0xff)) { + WRITE8(port, dev->hdisped, val); + } } - mach_set_resolution(mach, svga); - } else if (!(mach->accel.clock_sel & 0x01) && ((mach->shadow_set & 0x03) == 0x00) && dev->on) { /*Still write the parameter even after going to 8514/A mode if needed*/ - if (!(mach->shadow_cntl & 0x08)) { - WRITE8(port, dev->hdisped, val); - } - mach_set_resolution(mach, svga); } } mach_log("[%04X:%08X]: ATI 8514/A: (0x%04x): hdisp=0x%02x, shadowcntl=%02x, shadowset=%02x.\n", CS, cpu_state.pc, port, val, mach->shadow_cntl & 0x08, mach->shadow_set & 0x03); + svga_recalctimings(svga); break; case 0x6e9: if (len == 1) { mach_log("HDISP and HTOTAL+1=%02x, len=%d, set=%x, ATI mode bit=%x.\n", val, len, mach->shadow_set & 0x03, mach->accel.clock_sel & 0x01); if ((mach->accel.clock_sel & 0x01) || (!(mach->accel.clock_sel & 0x01) && (mach->shadow_set & 0x03))) { /*For 8514/A mode, take the shadow sets into account.*/ - if (!(mach->shadow_cntl & 0x04)) + if (!(mach->shadow_cntl & 0x04)) { dev->htotal = val; - - mach_set_resolution(mach, svga); + } } } + svga_recalctimings(svga); break; case 0x12e8: if (len == 2) { if ((mach->accel.clock_sel & 0x01) || (!(mach->accel.clock_sel & 0x01) && (mach->shadow_set & 0x03))) { /*For 8514/A mode, take the shadow sets into account.*/ - if (!(mach->shadow_cntl & 0x10)) { + if (!(mach->shadow_cntl & 0x10) && val) { dev->v_total_reg = val; dev->v_total_reg &= 0x1fff; } - mach_set_resolution(mach, svga); } } else { if ((mach->accel.clock_sel & 0x01) || (!(mach->accel.clock_sel & 0x01) && (mach->shadow_set & 0x03))) { /*For 8514/A mode, take the shadow sets into account.*/ @@ -3219,39 +3176,32 @@ mach_accel_out_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, u WRITE8(port, dev->v_total_reg, val); dev->v_total_reg &= 0x1fff; } - mach_set_resolution(mach, svga); } } mach_log("[%04X:%08X]: ATI 8514/A: (0x%04x): hdisp=0x%02x.\n", CS, cpu_state.pc, port, val); + svga_recalctimings(svga); break; case 0x12e9: if (len == 1) { if ((mach->accel.clock_sel & 0x01) || (!(mach->accel.clock_sel & 0x01) && (mach->shadow_set & 0x03))) { if (!(mach->shadow_cntl & 0x10)) { /*For 8514/A mode, take the shadow sets into account.*/ - WRITE8(port, dev->v_total_reg, val); + WRITE8(port, dev->v_total_reg, val >> 8); dev->v_total_reg &= 0x1fff; } - mach_set_resolution(mach, svga); } mach_log("[%04X:%08X]: ATI 8514/A: (0x%04x): hdisp=0x%02x.\n", CS, cpu_state.pc, port, val); } + svga_recalctimings(svga); break; case 0x16e8: if (len == 2) { if ((mach->accel.clock_sel & 0x01) || (!(mach->accel.clock_sel & 0x01) && (mach->shadow_set & 0x03))) { /*For 8514/A mode, take the shadow sets into account.*/ - if (!(mach->shadow_cntl & 0x20)) { + if (!(mach->shadow_cntl & 0x20) && val) { dev->v_disp = val; dev->v_disp &= 0x1fff; } - mach_set_resolution(mach, svga); - } else if (!(mach->accel.clock_sel & 0x01) && ((mach->shadow_set & 0x03) == 0x00) && dev->on) { /*Still write the parameter even after going to 8514/A mode if needed*/ - if (!(mach->shadow_cntl & 0x20)) { - dev->v_disp = val; - dev->v_disp &= 0x1fff; - } - mach_set_resolution(mach, svga); } mach_log("ATI 8514/A: V_DISP write 16E8=%d, vdisp2=%d.\n", dev->v_disp, dev->v_disp2); mach_log("ATI 8514/A: (0x%04x): vdisp=0x%02x.\n", port, val); @@ -3261,9 +3211,9 @@ mach_accel_out_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, u WRITE8(port, dev->v_disp, val); dev->v_disp &= 0x1fff; } - mach_set_resolution(mach, svga); } } + svga_recalctimings(svga); break; case 0x16e9: if (len == 1) { @@ -3272,21 +3222,20 @@ mach_accel_out_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, u WRITE8(port, dev->v_disp, val); dev->v_disp &= 0x1fff; } - mach_set_resolution(mach, svga); } mach_log("ATI 8514/A: V_DISP write 16E8=%d, vdisp2=%d.\n", dev->v_disp, dev->v_disp2); mach_log("ATI 8514/A: (0x%04x): vdisp=0x%02x.\n", port, val); } + svga_recalctimings(svga); break; case 0x1ae8: if (len == 2) { if ((mach->accel.clock_sel & 0x01) || (!(mach->accel.clock_sel & 0x01) && (mach->shadow_set & 0x03))) { /*For 8514/A mode, take the shadow sets into account.*/ - if (!(mach->shadow_cntl & 0x10)) { + if (!(mach->shadow_cntl & 0x10) && val) { dev->v_sync_start = val; dev->v_sync_start &= 0x1fff; } - mach_set_resolution(mach, svga); } mach_log("ATI 8514/A: V_SYNCSTART write 1AE8 = %d\n", dev->v_syncstart); mach_log("ATI 8514/A: (0x%04x): vsyncstart=0x%02x.\n", port, val); @@ -3296,9 +3245,9 @@ mach_accel_out_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, u WRITE8(port, dev->v_sync_start, val); dev->v_sync_start &= 0x1fff; } - mach_set_resolution(mach, svga); } } + svga_recalctimings(svga); break; case 0x1ae9: if (len == 1) { @@ -3307,18 +3256,22 @@ mach_accel_out_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, u WRITE8(port, dev->v_sync_start, val); dev->v_sync_start &= 0x1fff; } - mach_set_resolution(mach, svga); } mach_log("ATI 8514/A: V_SYNCSTART write 1AE8 = %d\n", dev->v_syncstart); mach_log("ATI 8514/A: (0x%04x): vsyncstart=0x%02x.\n", port, val); } + svga_recalctimings(svga); + break; + + case 0x1ee8: + case 0x1ee9: + svga_recalctimings(svga); break; case 0x22e8: - if ((mach->shadow_cntl & 0x03) == 0x00) { + if ((mach->shadow_cntl & 0x03) == 0x00) dev->disp_cntl = val; - dev->interlace = !!(dev->disp_cntl & 0x10); - } + mach_log("ATI 8514/A: DISP_CNTL write %04x=%02x, written=%02x, interlace=%d.\n", port, val & 0x70, dev->disp_cntl & 0x70, dev->interlace); svga_recalctimings(svga); @@ -3346,17 +3299,25 @@ mach_accel_out_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, u break; case 0x4ae8: - dev->accel.advfunc_cntl = val; - dev->on = val & 0x01; + case 0x4ae9: + mach->old_on1 = dev->accel.advfunc_cntl & 0x01; + WRITE8(port, dev->accel.advfunc_cntl, val); + if (len == 2) { + WRITE8(port + 1, dev->accel.advfunc_cntl, val >> 8); + } + dev->on = dev->accel.advfunc_cntl & 0x01; dev->vendor_mode = 0; - mach_log("[%04X:%08X]: ATI 8514/A: (0x%04x): ON=%d, shadow crt=%x, hdisp=%d, vdisp=%d, extmode=%02x.\n", - CS, cpu_state.pc, port, val & 0x01, dev->accel.advfunc_cntl & 0x04, dev->hdisp, dev->vdisp, mach->regs[0xb0] & 0x20); + if (dev->_8514crt) { + if (mach->regs[0xb0] & 0x20) { + dev->on = 1; + dev->vendor_mode = !!(ATI_MACH32); + } + } + + mach_log("[%04X:%08X]: ATI 8514/A: (0x%04x): ON=%d, valxor=%x, shadow crt=%x, hdisp=%d, vdisp=%d, extmode=%02x, accelbpp=%d, crt=%d, crtres=%d.\n", + CS, cpu_state.pc, port, val & 0x01, dev->on, dev->accel.advfunc_cntl & 0x04, dev->hdisp, dev->vdisp, mach->regs[0xb0] & 0x20, dev->accel_bpp, dev->_8514crt, mach->crt_resolution); if (ATI_MACH32) { - if ((mach->regs[0xb0] & 0x20) || (dev->accel_bpp >= 15)) { /*Account for the extended ATI 8514/A mode here too*/ - dev->on |= 0x01; - dev->vendor_mode = 1; - } mach_set_resolution(mach, svga); mach32_updatemapping(mach, svga); } else { @@ -3367,23 +3328,30 @@ mach_accel_out_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, u break; case 0x82e8: + ibm8514_accel_out_fifo(svga, port, val, len); + mach_log("DSTY=%04x, len=%d.\n", val & 0x07ff, len); + break; + case 0x86e8: ibm8514_accel_out_fifo(svga, port, val, len); + mach_log("DSTX=%04x, len=%d.\n", val & 0x07ff, len); break; case 0x8ae8: ibm8514_accel_out_fifo(svga, port, val, len); + mach_log("SRCY=%04x, len=%d.\n", val & 0x07ff, len); if (len == 2) { - mach_log("SRCY=%d.\n", val & 0x07ff); mach->accel.src_y = val & 0x07ff; + mach->accel.src_y_scan = ((int64_t)(val & 0x07ff)); } break; case 0x8ee8: ibm8514_accel_out_fifo(svga, port, val, len); + mach_log("SRCX=%04x, len=%d.\n", val & 0x07ff, len); if (len == 2) { - mach_log("SRCX=%d.\n", val & 0x07ff); mach->accel.src_x = val & 0x07ff; + mach->accel.src_x_scan = ((int64_t)(val & 0x07ff)); } break; @@ -3409,7 +3377,7 @@ mach_accel_out_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, u case 0xa2e8: case 0xe2e8: if (port == 0xe2e8) { - mach_log("%04X: Background Color=%04x.\n", port, val); + mach_log("%04X: Background Color=%04x, pix=%d, len=%d.\n", port, val, dev->accel.cmd_back, len); if (len == 2) { if (!dev->accel.cmd_back) { if (mach->accel.cmd_type >= 0) { @@ -3430,7 +3398,7 @@ mach_accel_out_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, u mach_log("%04X: CMDBack BKGDCOLOR, sy=%d, height=%d, cmdtype=%d, val=%04x.\n", port, dev->accel.sy, mach->accel.height, mach->accel.cmd_type, val); } } else { - if (dev->accel.cmd & 0x100) { + if (!dev->accel.cmd_back) { if (mach->accel.cmd_type >= 0) { if (mach_pixel_read(mach)) break; @@ -3450,7 +3418,7 @@ mach_accel_out_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, u case 0xa6e8: case 0xe6e8: if (port == 0xe6e8) { - mach_log("%04X: Foreground Color=%04x.\n", port, val); + mach_log("%04X: Foreground Color=%04x, pix=%d, len=%d.\n", port, val, dev->accel.cmd_back, len); if (len == 2) { if (!dev->accel.cmd_back) { if (mach->accel.cmd_type >= 0) { @@ -3533,6 +3501,9 @@ mach_accel_out_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, u break; case 0xaae8: + if (len == 2) + mach->accel.dst_clr_cmp_mask = val; + fallthrough; case 0xaee8: case 0xb2e8: case 0xb6e8: @@ -3580,65 +3551,63 @@ mach_accel_out_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, u case 0xaee: case 0xaef: - if (len == 2) - mach->cursor_offset_lo_reg = val; - else { - WRITE8(port, mach->cursor_offset_lo_reg, val); + WRITE8(port, mach->cursor_offset_lo_reg, val); + if (len == 2) { + WRITE8(port + 1, mach->cursor_offset_lo_reg, val >> 8); } mach->cursor_offset_lo = mach->cursor_offset_lo_reg; dev->hwcursor.addr = ((mach->cursor_offset_lo | (mach->cursor_offset_hi << 16)) << 2); + if (!dev->vram_512k_8514 && ((mach->accel.ext_ge_config & 0x30) == 0x00)) + dev->hwcursor.addr <<= 1; break; case 0xeee: case 0xeef: - if (len == 2) - mach->cursor_offset_hi_reg = val; - else { - WRITE8(port, mach->cursor_offset_hi_reg, val); + WRITE8(port, mach->cursor_offset_hi_reg, val); + if (len == 2) { + WRITE8(port + 1, mach->cursor_offset_hi_reg, val >> 8); } dev->hwcursor.ena = !!(mach->cursor_offset_hi_reg & 0x8000); mach->cursor_offset_hi = mach->cursor_offset_hi_reg & 0x0f; dev->hwcursor.addr = ((mach->cursor_offset_lo | (mach->cursor_offset_hi << 16)) << 2); - mach_log("HWCursorEnabled=%x.\n", dev->hwcursor.ena); + if (!dev->vram_512k_8514 && ((mach->accel.ext_ge_config & 0x30) == 0x00)) + dev->hwcursor.addr <<= 1; break; case 0x12ee: case 0x12ef: - if (len == 2) - mach->cursor_x = val; - else { - WRITE8(port, mach->cursor_x, val); + WRITE8(port, mach->cursor_x, val); + if (len == 2) { + WRITE8(port + 1, mach->cursor_x, val >> 8); } dev->hwcursor.x = mach->cursor_x & 0x7ff; break; case 0x16ee: case 0x16ef: - if (len == 2) - mach->cursor_y = val; - else { - WRITE8(port, mach->cursor_y, val); + WRITE8(port, mach->cursor_y, val); + if (len == 2) { + WRITE8(port + 1, mach->cursor_y, val >> 8); } dev->hwcursor.y = mach->cursor_y & 0xfff; break; case 0x1aee: case 0x1aef: - if (len == 2) - mach->cursor_col_b = val; - else { - WRITE8(port, mach->cursor_col_b, val); + WRITE8(port, mach->cursor_col_b, val); + if (len == 2) { + WRITE8(port + 1, mach->cursor_col_b, val >> 8); } mach->cursor_col_0 = mach->cursor_col_b & 0xff; mach->cursor_col_1 = (mach->cursor_col_b >> 8) & 0xff; + mach_log("ATI 8514/A: (0x%04x) Cursor Color B, val=0x%02x, len=%d, extended 8514/A mode bpp=%d.\n", port, val, len, dev->accel_bpp); break; case 0x1eee: case 0x1eef: - if (len == 2) - mach->cursor_vh_offset = val; - else { - WRITE8(port, mach->cursor_vh_offset, val); + WRITE8(port, mach->cursor_vh_offset, val); + if (len == 2) { + WRITE8(port + 1, mach->cursor_vh_offset, val >> 8); } dev->hwcursor.xoff = mach->cursor_vh_offset & 0x3f; dev->hwcursor.yoff = (mach->cursor_vh_offset >> 8) & 0x3f; @@ -3654,45 +3623,52 @@ mach_accel_out_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, u case 0x26ee: case 0x26ef: - if (len == 2) - mach->accel.crt_pitch = val; - else { - WRITE8(port, mach->accel.crt_pitch, val); + WRITE8(port, mach->accel.crt_pitch, val); + if (len == 2) { + WRITE8(port + 1, mach->accel.crt_pitch, val >> 8); } + dev->ext_crt_pitch = mach->accel.crt_pitch & 0xff; + if (dev->accel_bpp > 8) { - if (dev->accel_bpp == 24) + if (dev->accel_bpp == 24) { dev->ext_crt_pitch *= 3; - else if (dev->accel_bpp == 32) + } else if (dev->accel_bpp == 32) dev->ext_crt_pitch <<= 2; else dev->ext_crt_pitch <<= 1; } - if (ATI_MACH32) { - dev->on |= 0x01; - dev->vendor_mode = 1; - } - svga_recalctimings(svga); + + if (len == 2) { + dev->_8514crt = 0; + if (!(dev->accel.advfunc_cntl & 0x01)) { + dev->on = 1; + dev->vendor_mode = !!ATI_MACH32; + } + } else + dev->_8514crt = 1; + + mach_set_resolution(mach, svga); if (ATI_GRAPHICS_ULTRA || ATI_MACH32) mach32_updatemapping(mach, svga); - mach_log("ATI 8514/A: (0x%04x) CRT Pitch, val=0x%02x, crtpitch=%x, len=%d, extended 8514/A mode=%02x.\n", port, val, dev->ext_crt_pitch, len, mach->regs[0xb0] & 0x20); + mach_log("ATI 8514/A: (0x%04x) CRT Pitch, val=0x%02x, crtpitch=%x, len=%d, extended 8514/A mode bpp=%d.\n", port, val, dev->ext_crt_pitch, len, dev->accel_bpp); break; case 0x2aee: case 0x2aef: - if (len == 2) { + if (len == 2) mach->accel.crt_offset_lo = val; - } else { + else { WRITE8(port, mach->accel.crt_offset_lo, val); } - svga_recalctimings(svga); + mach_log("ATI 8514/A: (0x%04x) CRT Offset Low val=0x%02x, len=%d.\n", port, val, len); break; case 0x2eee: case 0x2eef: mach->accel.crt_offset_hi = val & 0x0f; - svga_recalctimings(svga); + mach_log("ATI 8514/A: (0x%04x) CRT Offset High val=0x%02x, len=%d.\n", port, val, len); break; case 0x32ee: @@ -3727,6 +3703,7 @@ mach_accel_out_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, u } mach->ext_cur_col_0_g = mach->cursor_col_0_rg & 0xff; mach->ext_cur_col_0_r = (mach->cursor_col_0_rg >> 8) & 0xff; + mach_log("ATI 8514/A: (0x%04x) Cursor Color 0 RG, val=0x%02x, len=%d, extended 8514/A mode bpp=%d.\n", port, val, len, dev->accel_bpp); break; case 0x3eee: @@ -3738,6 +3715,7 @@ mach_accel_out_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, u } mach->ext_cur_col_1_g = mach->cursor_col_1_rg & 0xff; mach->ext_cur_col_1_r = (mach->cursor_col_1_rg >> 8) & 0xff; + mach_log("ATI 8514/A: (0x%04x) Cursor Color 1 RG, val=0x%02x, len=%d, extended 8514/A mode bpp=%d.\n", port, val, len, dev->accel_bpp); break; case 0x42ee: @@ -3763,18 +3741,20 @@ mach_accel_out_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, u case 0x4aee: case 0x4aef: - if (len == 2) - mach->accel.clock_sel = val; - else { - WRITE8(port, mach->accel.clock_sel, val); + mach->old_on2 = mach->accel.clock_sel & 0x01; + WRITE8(port, mach->accel.clock_sel, val); + if (len == 2) { + WRITE8(port + 1, mach->accel.clock_sel, val >> 8); } dev->on = mach->accel.clock_sel & 0x01; dev->vendor_mode = 1; - mach_log("ATI 8514/A: (0x%04x): ON=%d, val=%04x, hdisp=%d, vdisp=%d.\n", - port, mach->accel.clock_sel & 0x01, val, dev->hdisp, dev->vdisp); + + mach_log("[%04X:%08X]: ATI 8514/A: (0x%04x): ON=%d, val=%04x, xor=%d, hdisp=%d, vdisp=%d, accelbpp=%d.\n", + CS, cpu_state.pc, port, mach->accel.clock_sel & 0x01, val, dev->on, dev->hdisp, dev->vdisp, dev->accel_bpp); mach_log("Vendor ATI mode set %s resolution.\n", (dev->accel.advfunc_cntl & 0x04) ? "2: 1024x768" : "1: 640x480"); - svga_recalctimings(svga); + + mach_set_resolution(mach, svga); if (ATI_GRAPHICS_ULTRA || ATI_MACH32) mach32_updatemapping(mach, svga); break; @@ -3801,29 +3781,17 @@ mach_accel_out_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, u case 0x5aee: case 0x5aef: - if (len == 2) - mach->shadow_set = val; - else { - WRITE8(port, mach->shadow_set, val); + WRITE8(port, mach->shadow_set, val); + if (len == 2) { + WRITE8(port + 1, mach->shadow_set, val >> 8); } - mach_log("ATI 8514/A: (0x%04x) val=0x%02x.\n", port, val); + mach_log("ATI 8514/A: (0x%04x) val=0x%02x, len=%d.\n", port, val, len); if ((mach->shadow_set & 0x03) == 0x00) mach_log("Primary CRT register set.\n"); - else if ((mach->shadow_set & 0x03) == 0x01) { - mach->crt_resolution = 0x01; + else if ((mach->shadow_set & 0x03) == 0x01) mach_log("CRT Shadow Set 1: 640x480.\n"); - } else if ((mach->shadow_set & 0x03) == 0x02) { - mach->crt_resolution = 0x02; + else if ((mach->shadow_set & 0x03) == 0x02) mach_log("CRT Shadow Set 2: 1024x768.\n"); - } - - if (ATI_MACH32) { - mach_log("Load both SRC/DST GE Offset/Pitch=%03x, offset=%08x.\n", mach->shadow_set & 0x300, dev->accel.ge_offset); - if ((mach->shadow_set & 0x300) == 0x000) { - mach->accel.ge_offset_lo = 0x0000; - mach->accel.ge_offset_hi = 0x0000; - } - } break; case 0x5eee: @@ -3857,8 +3825,8 @@ mach_accel_out_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, u else { WRITE8(port, mach->accel.ge_offset_lo, val); } + mach_log("ATI 8514/A: (0x%04x) GE Offset Low val=0x%02x, geoffset=%04x, len=%d.\n", port, val, dev->accel.ge_offset, len); svga_recalctimings(svga); - mach_log("ATI 8514/A: (0x%04x) val=0x%02x, geoffset=%04x.\n", port, val, dev->accel.ge_offset); break; case 0x72ee: @@ -3868,8 +3836,8 @@ mach_accel_out_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, u else { WRITE8(port, mach->accel.ge_offset_hi, val); } + mach_log("ATI 8514/A: (0x%04x) GE Offset High val=0x%02x, geoffset=%04x, len=%d.\n", port, val, dev->accel.ge_offset, len); svga_recalctimings(svga); - mach_log("ATI 8514/A: (0x%04x) val=0x%02x, geoffset=%04x.\n", port, val, dev->accel.ge_offset); break; case 0x76ee: @@ -3879,18 +3847,17 @@ mach_accel_out_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, u else { WRITE8(port, mach->accel.ge_pitch, val); } - dev->ext_pitch = ((mach->accel.ge_pitch & 0xff) << 3); - mach_log("ATI 8514/A: (0x%04x) val=0x%02x, extpitch=%d.\n", port, val, dev->ext_pitch); + mach_log("ATI 8514/A: (0x%04x) GE Pitch val=0x%02x.\n", port, val); svga_recalctimings(svga); break; case 0x7aee: case 0x7aef: - if (len == 2) - mach->accel.ext_ge_config = val; - else { - WRITE8(port, mach->accel.ext_ge_config, val); + WRITE8(port, mach->accel.ext_ge_config, val); + if (len == 2) { + WRITE8(port + 1, mach->accel.ext_ge_config, val >> 8); } + if (ATI_MACH32) { if (mach->accel.crt_pitch & 0xff) dev->ext_crt_pitch = mach->accel.crt_pitch & 0xff; @@ -3899,25 +3866,40 @@ mach_accel_out_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, u case 0x00: case 0x10: dev->bpp = 0; + dev->accel_bpp = 8; break; case 0x20: dev->bpp = 1; dev->ext_crt_pitch <<= 1; + switch (mach->accel.ext_ge_config & 0xc0) { + case 0x00: + dev->accel_bpp = 15; + break; + case 0x40: + dev->accel_bpp = 16; + break; + default: /*TODO: 655RGB and 664RGB*/ + break; + } break; case 0x30: dev->bpp = 0; - if (mach->accel.ext_ge_config & 0x200) + if (mach->accel.ext_ge_config & 0x200) { dev->ext_crt_pitch <<= 2; - else + dev->accel_bpp = 32; + } else { dev->ext_crt_pitch *= 3; + dev->accel_bpp = 24; + } break; default: break; } svga_set_ramdac_type(svga, !!(mach->accel.ext_ge_config & 0x4000)); - mach_log("ATI 8514/A: (0x%04x) val=%02x.\n", port, val); - svga_recalctimings(svga); + mach_log("ATI 8514/A: (0x%04x) Extended Configuration=%04x, val=%04x.\n", port, mach->accel.ext_ge_config, val); + mach_set_resolution(mach, svga); + mach32_updatemapping(mach, svga); } else ati_eeprom_write(&mach->eeprom, !!(mach->accel.ext_ge_config & 0x04), !!(mach->accel.ext_ge_config & 0x02), !!(mach->accel.ext_ge_config & 0x01)); break; @@ -3936,30 +3918,33 @@ mach_accel_out_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, u mach->accel.patt_data_idx_reg = val & 0x1f; mach->accel.patt_data_idx = mach->accel.patt_data_idx_reg; + mach_log("Write Port 82ee: Pattern Data Index=%d, idx for color=%d.\n", val & 0x1f, mach->accel.color_pattern_idx); + if (mach->accel.patt_data_idx_reg < 0x10) mach->accel.color_pattern_idx = mach->accel.patt_idx; else mach->accel.color_pattern_idx = 0; - - mach_log("Write Port 82ee: Pattern Data Index=%d.\n", val & 0x1f); break; case 0x8eee: if (len == 2) { - frgd_sel = (mach->accel.dp_config >> 13) & 7; - if (mach->accel.patt_data_idx_reg < 0x10) { - mach->accel.color_pattern[mach->accel.patt_data_idx] = val & 0xff; - mach->accel.color_pattern[mach->accel.patt_data_idx + 1] = (val >> 8) & 0xff; - mach_log("Write Port 8eee: Color Pattern Word Data[%d]=%04x.\n", mach->accel.patt_data_idx, val); - if ((dev->accel_bpp >= 24) && (frgd_sel == 5) && (mach->accel.patt_len == 0x17)) - dev->accel.y1 = 1; + if (dev->bpp) { + mach->accel.color_pattern_hicol[mach->accel.patt_data_idx] = val; + mach_log("Write Port 8eee: Color Pattern Word Data[%d]=%04x.\n", mach->accel.patt_data_idx, val); + mach->accel.patt_data_idx++; + } else { + mach->accel.color_pattern[mach->accel.patt_data_idx] = val & 0xff; + mach->accel.color_pattern[mach->accel.patt_data_idx + 1] = (val >> 8) & 0xff; + mach_log("Write Port 8eee: Color Pattern Word Data[%d]=%04x.\n", mach->accel.patt_data_idx, val); + mach->accel.patt_data_idx += 2; + } } else { mach->accel.mono_pattern_normal[mach->accel.patt_data_idx - 0x10] = val & 0xff; mach->accel.mono_pattern_normal[(mach->accel.patt_data_idx + 1) - 0x10] = (val >> 8) & 0xff; mach_log("Write Port 8eee: Mono Pattern Word Data[%d]=%04x.\n", mach->accel.patt_data_idx - 0x10, val); + mach->accel.patt_data_idx += 2; } - mach->accel.patt_data_idx += 2; } break; @@ -4026,7 +4011,7 @@ mach_accel_out_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, u } dev->data_available = 0; dev->data_available2 = 0; - mach_log("BitBLT=%04x.\n", mach->accel.dp_config); + mach_log("BitBLT=%04x, pattidx=%d.\n", mach->accel.dp_config, mach->accel.patt_idx); mach_log(".\n"); mach->accel.cmd_type = 2; /*Non-conforming BitBLT from dest_y_end register (0xaeee)*/ @@ -4048,11 +4033,13 @@ mach_accel_out_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, u break; case 0xb6ee: - dev->accel.bkgd_mix = val & 0xff; + dev->accel.bkgd_mix = val & 0x1f; + dev->accel.bkgd_sel = (mach->accel.dp_config >> 7) & 3; break; case 0xbaee: - dev->accel.frgd_mix = val & 0xff; + dev->accel.frgd_mix = val & 0x1f; + dev->accel.frgd_sel = (mach->accel.dp_config >> 13) & 3; break; case 0xbeee: @@ -4088,6 +4075,7 @@ mach_accel_out_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, u dev->data_available = 0; dev->data_available2 = 0; mach->accel.cmd_type = 5; /*Horizontal Raster Draw from scan_to_x register (0xcaee)*/ + mach_log("ScanToX len=%d.\n", val); mach_log(".\n"); frgd_sel = (mach->accel.dp_config >> 13) & 7; @@ -4104,7 +4092,7 @@ mach_accel_out_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, u break; case 0xceee: - mach_log("Data Path Configuration (%04x) write val=%04x.\n", port, val); + mach_log("Data Path Configuration (%04x) write val=%04x, len=%d.\n", port, val, len); if (len == 2) { dev->data_available = 0; dev->data_available2 = 0; @@ -4124,6 +4112,11 @@ mach_accel_out_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, u case 0xd6ee: mach->accel.patt_idx = val & 0x1f; + frgd_sel = (mach->accel.dp_config >> 13) & 7; + + if ((frgd_sel == 5) && (dev->accel_bpp >= 24) && (mach->accel.patt_len == 0x17)) + mach->accel.color_pattern_idx = 0; + mach_log("Write Port d6ee: Pattern Index=%d.\n", val & 0x1f); break; @@ -4169,12 +4162,13 @@ mach_accel_out_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, u break; case 0xeeee: + mach_log("EEEE val=%04x, len=%d.\n", val, len); if (len == 2) mach->accel.dest_cmp_fn = val; break; case 0xf2ee: - mach_log("F2EE.\n"); + mach_log("F2EE val=%04x, len=%d.\n", val, len); if (len == 2) mach->accel.dst_clr_cmp_mask = val; break; @@ -4259,8 +4253,39 @@ mach_accel_in_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, in if (dev->fifo_idx > 0) dev->fifo_idx--; - if (dev->force_busy) + if (dev->force_busy) { temp |= 0x0200; /*Hardware busy*/ + if (mach->accel.cmd_type >= 0) { + switch (mach->accel.cmd_type) { + case 2: + if (dev->accel.sy >= mach->accel.height) + dev->force_busy = 0; + break; + case 5: + if (dev->accel.sx >= mach->accel.width) + dev->force_busy = 0; + break; + default: + if (dev->accel.sy < 0) + dev->force_busy = 0; + break; + } + } else { + switch (dev->accel.cmd >> 13) { + case 2: + case 3: + case 4: + case 6: + if (dev->accel.sy < 0) + dev->force_busy = 0; + break; + default: + if (!dev->accel.sy) + dev->force_busy = 0; + break; + } + } + } if (dev->data_available) { temp |= 0x0100; /*Read Data available*/ @@ -4837,6 +4862,7 @@ mach_accel_in_call(uint16_t port, mach_t *mach, svga_t *svga, ibm8514_t *dev) case 0x56ee: case 0x56ef: READ8(port, mach->accel.scratch1); + mach_log("ScratchPad1=%x.\n", mach->accel.scratch1); break; case 0x5eee: @@ -4855,6 +4881,8 @@ mach_accel_in_call(uint16_t port, mach_t *mach, svga_t *svga, ibm8514_t *dev) if (mach->force_busy) temp |= 0x20; + mach->force_busy = 0; + if (ati_eeprom_read(&mach->eeprom)) temp |= 0x40; @@ -5425,6 +5453,7 @@ mach32_svga_write(uint32_t addr, uint8_t val, void *priv) xga_write_test(addr, val, svga); addr = svga_decode_addr(svga, addr, 1); + if (addr == 0xffffffff) { mach_log("WriteCommon Over.\n"); return; @@ -5465,7 +5494,7 @@ mach32_svga_write(uint32_t addr, uint8_t val, void *priv) count = 4; - switch (svga->writemode) { + switch (svga->writemode) { case 0: val = ((val >> (svga->gdcreg[3] & 7)) | (val << (8 - (svga->gdcreg[3] & 7)))); if ((svga->gdcreg[8] == 0xff) && !(svga->gdcreg[3] & 0x18) && (!svga->gdcreg[1] || svga->set_reset_disabled)) { @@ -5696,17 +5725,17 @@ mach32_read_common(uint32_t addr, int linear, mach_t *mach, svga_t *svga) addr &= dev->vram_mask; if (!dev->vram_512k_8514 && ((mach->accel.ext_ge_config & 0x30) == 0x00)) { - switch (addr & 0x06) { + switch ((addr & 0x06) >> 1) { case 0x00: - case 0x06: + case 0x03: ret = dev->vram[addr] & 0x0f; ret |= (dev->vram[addr + 1] << 4); break; - case 0x02: + case 0x01: ret = dev->vram[addr + 2] & 0x0f; ret |= (dev->vram[addr + 3] << 4); break; - case 0x04: + case 0x02: ret = dev->vram[addr - 2] & 0x0f; ret |= (dev->vram[addr - 1] << 4); break; @@ -5800,24 +5829,24 @@ mach32_read(uint32_t addr, void *priv) mach_t *mach = (mach_t *) priv; svga_t *svga = &mach->svga; ibm8514_t *dev = (ibm8514_t *) svga->dev8514; - uint8_t ret = 0x00; + uint8_t ret; (void) xga_read_test(addr, svga); addr = (addr & svga->banked_mask) + svga->read_bank; if ((ATI_MACH32 && !dev->vram_512k_8514) && ((mach->accel.ext_ge_config & 0x30) == 0x00)) { addr <<= 1; - switch (addr & 0x06) { + switch ((addr & 0x06) >> 1) { case 0x00: - case 0x06: + case 0x03: ret = mach32_read_common(addr, 0, mach, svga) & 0x0f; ret |= (mach32_read_common(addr + 1, 0, mach, svga) << 4); break; - case 0x02: + case 0x01: ret = mach32_read_common(addr + 2, 0, mach, svga) & 0x0f; ret |= (mach32_read_common(addr + 3, 0, mach, svga) << 4); break; - case 0x04: + case 0x02: ret = mach32_read_common(addr - 2, 0, mach, svga) & 0x0f; ret |= (mach32_read_common(addr - 1, 0, mach, svga) << 4); break; @@ -5958,7 +5987,8 @@ mach32_ap_writeb(uint32_t addr, uint8_t val, void *priv) uint16_t actual_port_ext = 0x02ee + (addr & 1) + (port_dword << 8); if (((mach->local_cntl & 0x20) || (mach->pci_cntl_reg & 0x80)) && - (((addr - mach->linear_base) >= ((mach->ap_size << 20) - 0x200)) && ((addr - mach->linear_base) < (mach->ap_size << 20)))) { + (((addr - mach->linear_base) >= ((mach->ap_size << 20) - 0x200)) && ((addr - mach->linear_base) < (mach->ap_size << 20))) && + (svga->mapping.base == 0xa0000)) { if (addr & 0x100) { mach_log("Port WORDB Write=%04x.\n", actual_port_ext); mach_accel_outb(actual_port_ext, val, mach); @@ -5967,8 +5997,8 @@ mach32_ap_writeb(uint32_t addr, uint8_t val, void *priv) mach_accel_outb(actual_port, val, mach); } } else { - mach_log("Linear WORDB Write=%08x, val=%02x, ON=%x, dpconfig=%04x, apsize=%08x.\n", - addr & dev->vram_mask, val, dev->on, mach->accel.dp_config, mach->ap_size << 20); + mach_log("Linear WORDB Write=%08x, val=%02x, ON=%x, dpconfig=%04x, apsize=%08x, addr=%08x.\n", + addr - mach->linear_base, val, dev->on, mach->accel.dp_config, mach->ap_size << 20, addr); if (dev->on) mach32_write_common(addr, val, 1, mach, svga); @@ -5988,17 +6018,19 @@ mach32_ap_writew(uint32_t addr, uint16_t val, void *priv) uint16_t actual_port_ext = 0x02ee + (port_dword << 8); if (((mach->local_cntl & 0x20) || (mach->pci_cntl_reg & 0x80)) && - (((addr - mach->linear_base) >= ((mach->ap_size << 20) - 0x200)) && ((addr - mach->linear_base) < (mach->ap_size << 20)))) { + (((addr - mach->linear_base) >= ((mach->ap_size << 20) - 0x200)) && ((addr - mach->linear_base) < (mach->ap_size << 20))) && + (svga->mapping.base == 0xa0000)) { if (addr & 0x100) { mach_log("Port WORDW Write=%04x, localcntl=%02x, pcicntl=%02x, actual addr=%08x, val=%04x.\n", actual_port_ext, mach->local_cntl & 0x20, mach->pci_cntl_reg & 0x80, addr, val); mach_accel_outw(actual_port_ext, val, mach); } else { - mach_log("Port WORDW Write=%04x, localcntl=%02x, pcicntl=%02x, actual addr=%08x.\n", actual_port, mach->local_cntl & 0x20, mach->pci_cntl_reg & 0x80, addr); + mach_log("Port WORDW Write=%04x, localcntl=%02x, pcicntl=%02x, actual addr=%08x, val=%04x.\n", actual_port, mach->local_cntl & 0x20, mach->pci_cntl_reg & 0x80, addr, val); mach_accel_outw(actual_port, val, mach); } } else { - mach_log("Linear WORDW Write=%08x, val=%04x, ON=%x, dpconfig=%04x, apsize=%08x, base=%08x, 8514/A port=%04x, ATI port=%04x, switch=%03x.\n", - addr - mach->linear_base, val, dev->on, mach->accel.dp_config, mach->ap_size << 20, mach->linear_base, actual_port, actual_port_ext, addr & 0x100); + mach_log("Linear WORDW Write=%08x, val=%04x, ON=%x, dpconfig=%04x, apsize=%08x, addr=%08x.\n", + addr - mach->linear_base, val, dev->on, mach->accel.dp_config, mach->ap_size << 20, addr); + if (dev->on) mach32_writew_linear(addr, val, mach); else @@ -6016,11 +6048,9 @@ mach32_ap_writel(uint32_t addr, uint32_t val, void *priv) uint16_t actual_port = 0x02e8 + (port_dword << 8); uint16_t actual_port_ext = 0x02ee + (port_dword << 8); - mach_log("Linear WORDL Write=%08x, val=%08x, ON=%x, dpconfig=%04x, apsize=%08x.\n", - addr - mach->linear_base, val, dev->on, mach->accel.dp_config, mach->ap_size << 20); - if (((mach->local_cntl & 0x20) || (mach->pci_cntl_reg & 0x80)) && - (((addr - mach->linear_base) >= ((mach->ap_size << 20) - 0x200)) && ((addr - mach->linear_base) < (mach->ap_size << 20)))) { + (((addr - mach->linear_base) >= ((mach->ap_size << 20) - 0x200)) && ((addr - mach->linear_base) < (mach->ap_size << 20))) && + (svga->mapping.base == 0xa0000)) { if (addr & 0x100) { mach_log("Port WORDL Write=%04x, localcntl=%02x, pcicntl=%02x.\n", actual_port_ext, mach->local_cntl & 0x20, mach->pci_cntl_reg & 0x80); mach_accel_outl(actual_port_ext, val, mach); @@ -6029,6 +6059,9 @@ mach32_ap_writel(uint32_t addr, uint32_t val, void *priv) mach_accel_outl(actual_port, val, mach); } } else { + mach_log("Linear WORDL Write=%08x, val=%08x, ON=%x, dpconfig=%04x, apsize=%08x, addr=%08x.\n", + addr - mach->linear_base, val, dev->on, mach->accel.dp_config, mach->ap_size << 20, addr); + if (dev->on) mach32_writel_linear(addr, val, mach); else @@ -6048,7 +6081,8 @@ mach32_ap_readb(uint32_t addr, void *priv) uint16_t actual_port_ext = 0x02ee + (addr & 1) + (port_dword << 8); if (((mach->local_cntl & 0x20) || (mach->pci_cntl_reg & 0x80)) && - (((addr - mach->linear_base) >= ((mach->ap_size << 20) - 0x200)) && ((addr - mach->linear_base) < (mach->ap_size << 20)))) { + (((addr - mach->linear_base) >= ((mach->ap_size << 20) - 0x200)) && ((addr - mach->linear_base) < (mach->ap_size << 20))) && + (svga->mapping.base == 0xa0000)) { if (addr & 0x100) temp = mach_accel_inb(actual_port_ext, mach); else @@ -6077,7 +6111,8 @@ mach32_ap_readw(uint32_t addr, void *priv) uint16_t actual_port_ext = 0x02ee + (port_dword << 8); if (((mach->local_cntl & 0x20) || (mach->pci_cntl_reg & 0x80)) && - (((addr - mach->linear_base) >= ((mach->ap_size << 20) - 0x200)) && ((addr - mach->linear_base) < (mach->ap_size << 20)))) { + (((addr - mach->linear_base) >= ((mach->ap_size << 20) - 0x200)) && ((addr - mach->linear_base) < (mach->ap_size << 20))) && + (svga->mapping.base == 0xa0000)) { if (addr & 0x100) { temp = mach_accel_inw(actual_port_ext, mach); mach_log("Port WORDW Read=%04x.\n", actual_port_ext); @@ -6109,7 +6144,8 @@ mach32_ap_readl(uint32_t addr, void *priv) uint16_t actual_port_ext = 0x02ee + (port_dword << 8); if (((mach->local_cntl & 0x20) || (mach->pci_cntl_reg & 0x80)) && - (((addr - mach->linear_base) >= ((mach->ap_size << 20) - 0x200)) && ((addr - mach->linear_base) < (mach->ap_size << 20)))) { + (((addr - mach->linear_base) >= ((mach->ap_size << 20) - 0x200)) && ((addr - mach->linear_base) < (mach->ap_size << 20))) && + (svga->mapping.base == 0xa0000)) { if (addr & 0x100) { temp = mach_accel_inl(actual_port_ext, mach); mach_log("Port WORDL Read=%04x.\n", actual_port_ext); @@ -6149,32 +6185,18 @@ mach32_updatemapping(mach_t *mach, svga_t *svga) case 0x0: /*128k at A0000*/ mem_mapping_set_addr(&svga->mapping, 0xa0000, 0x20000); svga->banked_mask = 0xffff; - mem_mapping_set_addr(&mach->banked_mapping, 0xa0000, 0x20000); break; case 0x4: /*64k at A0000*/ mem_mapping_set_addr(&svga->mapping, 0xa0000, 0x10000); svga->banked_mask = 0xffff; - mem_mapping_set_addr(&mach->banked_mapping, 0xa0000, 0x10000); break; case 0x8: /*32k at B0000*/ mem_mapping_set_addr(&svga->mapping, 0xb0000, 0x08000); svga->banked_mask = 0x7fff; - mem_mapping_set_addr(&mach->banked_mapping, 0xb0000, 0x08000); break; case 0xC: /*32k at B8000*/ mem_mapping_set_addr(&svga->mapping, 0xb8000, 0x08000); svga->banked_mask = 0x7fff; - if (ATI_MACH32 && !(dev->accel.advfunc_cntl & 0x01) && !(mach->accel.clock_sel & 0x01)) { - if ((svga->gdcreg[6] & 0x01) || (svga->attrregs[0x10] & 0x01)) { - if (svga->attrregs[0x10] & 0x40) { - dev->vendor_mode = 0; - dev->on &= ~0x01; - mach_log("No 8514/A mode on b8000.\n"); - mach_set_resolution(mach, svga); - } - } - } - mem_mapping_set_addr(&mach->banked_mapping, 0xb8000, 0x08000); break; default: @@ -6205,16 +6227,16 @@ mach32_updatemapping(mach_t *mach, svga_t *svga) if (ATI_MACH32) { if (dev->on && dev->vendor_mode) { mach_log("Mach32 banked mapping.\n"); - mem_mapping_disable(&svga->mapping); - mem_mapping_enable(&mach->banked_mapping); + mem_mapping_set_handler(&svga->mapping, mach32_read, mach32_readw, mach32_readl, mach32_write, mach32_writew, mach32_writel); + mem_mapping_set_p(&svga->mapping, mach); } else { mach_log("IBM compatible banked mapping.\n"); - mem_mapping_enable(&svga->mapping); - mem_mapping_disable(&mach->banked_mapping); + mem_mapping_set_handler(&svga->mapping, svga_read, svga_readw, svga_readl, mach32_svga_write, mach32_svga_writew, mach32_svga_writel); + mem_mapping_set_p(&svga->mapping, svga); } } else { - mem_mapping_enable(&svga->mapping); - mem_mapping_disable(&mach->banked_mapping); + mem_mapping_set_handler(&svga->mapping, svga_read, svga_readw, svga_readl, svga_write, svga_writew, svga_writel); + mem_mapping_set_p(&svga->mapping, svga); } } @@ -6231,8 +6253,11 @@ mach32_hwcursor_draw(svga_t *svga, int displine) uint32_t *p; int x_pos; int y_pos; + int shift = 0; offset = dev->hwcursor_latch.x - dev->hwcursor_latch.xoff; + if (!dev->vram_512k_8514 && ((mach->accel.ext_ge_config & 0x30) == 0x00)) + shift = 1; mach_log("BPP=%d, displine=%d.\n", dev->accel_bpp, displine); switch (dev->accel_bpp) { @@ -6254,16 +6279,26 @@ mach32_hwcursor_draw(svga_t *svga, int displine) case 32: color0 = ((mach->ext_cur_col_0_r << 16) | (mach->ext_cur_col_0_g << 8) | mach->cursor_col_0); color1 = ((mach->ext_cur_col_1_r << 16) | (mach->ext_cur_col_1_g << 8) | mach->cursor_col_1); + mach_log("24/32BPP: Color0=%08x, Color1=%08x.\n", color0, color1); break; } if (dev->interlace && dev->hwcursor_oddeven) - dev->hwcursor_latch.addr += 16; + dev->hwcursor_latch.addr += (16 >> shift); - for (int x = 0; x < 64; x += 8) { - dat = dev->vram[dev->hwcursor_latch.addr & dev->vram_mask] | (dev->vram[(dev->hwcursor_latch.addr + 1) & dev->vram_mask] << 8); - - for (int xx = 0; xx < 8; xx++) { + for (int x = 0; x < 64; x += (8 >> shift)) { + if (shift) { + dat = dev->vram[(dev->hwcursor_latch.addr) & dev->vram_mask] & 0x0f; + dat |= (dev->vram[(dev->hwcursor_latch.addr + 1) & dev->vram_mask] << 4); + dat |= (dev->vram[(dev->hwcursor_latch.addr + 2) & dev->vram_mask] << 8); + dat |= (dev->vram[(dev->hwcursor_latch.addr + 3) & dev->vram_mask] << 12); + mach_log("4bpp Data=%04x.\n", dat); + } else { + dat = dev->vram[dev->hwcursor_latch.addr & dev->vram_mask]; + dat |= (dev->vram[(dev->hwcursor_latch.addr + 1) & dev->vram_mask] << 8); + mach_log("8bppplus Data=%04x.\n", dat); + } + for (int xx = 0; xx < (8 >> shift); xx++) { comb = (dat >> (xx << 1)) & 0x03; y_pos = displine; @@ -6293,7 +6328,7 @@ mach32_hwcursor_draw(svga_t *svga, int displine) } if (dev->interlace && !dev->hwcursor_oddeven) - dev->hwcursor_latch.addr += 16; + dev->hwcursor_latch.addr += (16 >> shift); } static void @@ -6923,20 +6958,20 @@ ati8514_accel_out_fifo(void *priv, uint16_t port, uint16_t val, int len) static void mach_disable_handlers(mach_t *mach) { - io_removehandler(0x01ce, 2, mach_in, NULL, NULL, mach_out, NULL, NULL, mach); - io_removehandler(0x02ea, 4, mach_in, NULL, NULL, mach_out, NULL, NULL, mach); - io_removehandler(0x03c0, 32, mach_in, NULL, NULL, mach_out, NULL, NULL, mach); - mach_io_remove(mach); + if (mach->pci_bus) { + io_removehandler(0x01ce, 2, mach_in, NULL, NULL, mach_out, NULL, NULL, mach); + io_removehandler(0x02ea, 4, mach_in, NULL, NULL, mach_out, NULL, NULL, mach); + io_removehandler(0x03c0, 32, mach_in, NULL, NULL, mach_out, NULL, NULL, mach); + mach_io_remove(mach); + } mem_mapping_disable(&mach->mmio_linear_mapping); - mem_mapping_disable(&mach->banked_mapping); mem_mapping_disable(&mach->svga.mapping); if (mach->pci_bus && mach->has_bios) mem_mapping_disable(&mach->bios_rom.mapping); /* Save all the mappings and the timers because they are part of linked lists. */ reset_state->mmio_linear_mapping = mach->mmio_linear_mapping; - reset_state->banked_mapping = mach->banked_mapping; reset_state->svga.mapping = mach->svga.mapping; reset_state->bios_rom.mapping = mach->bios_rom.mapping; @@ -6951,6 +6986,10 @@ mach_reset(void *priv) ibm8514_t *dev = (ibm8514_t *) svga->dev8514; if (reset_state != NULL) { + dev->on = 0; + dev->vendor_mode = 0; + dev->_8514on = 0; + dev->_8514crt = 0; mach_disable_handlers(mach); mach->force_busy = 0; dev->force_busy = 0; @@ -7068,9 +7107,7 @@ mach8_init(const device_t *info) mach->config1 |= 0x0400; svga->clock_gen = device_add(&ati18811_1_device); } - mem_mapping_add(&mach->banked_mapping, 0, 0, mach32_read, mach32_readw, mach32_readl, mach32_write, mach32_writew, mach32_writel, NULL, MEM_MAPPING_EXTERNAL, mach); mem_mapping_add(&mach->mmio_linear_mapping, 0, 0, mach32_ap_readb, mach32_ap_readw, mach32_ap_readl, mach32_ap_writeb, mach32_ap_writew, mach32_ap_writel, NULL, MEM_MAPPING_EXTERNAL, mach); - mem_mapping_disable(&mach->banked_mapping); mem_mapping_disable(&mach->mmio_linear_mapping); mem_mapping_set_handler(&svga->mapping, svga_read, svga_readw, svga_readl, mach32_svga_write, mach32_svga_writew, mach32_svga_writel); @@ -7096,7 +7133,7 @@ mach8_init(const device_t *info) svga->getclock = ics2494_getclock; dev->on = 0; - dev->ext_pitch = 1024; + dev->pitch = 1024; dev->ext_crt_pitch = 0x80; dev->accel_bpp = 8; svga->force_old_addr = 1; @@ -7158,7 +7195,7 @@ ati8514_init(svga_t *svga, void *ext8514, void *dev8514) /*Init as 1024x768 87hz interlaced first, per 8514/A.*/ dev->on = 0; - dev->ext_pitch = 1024; + dev->pitch = 1024; dev->ext_crt_pitch = 0x80; dev->accel_bpp = 8; dev->rowoffset = 0x80; @@ -7170,7 +7207,6 @@ ati8514_init(svga_t *svga, void *ext8514, void *dev8514) dev->disp_cntl = 0x33; mach->accel.clock_sel = 0x1c; mach->shadow_set = 0x02; - mach->crt_resolution = 0x02; dev->accel.cmd_back = 1; io_sethandler(0x02ea, 4, ati8514_in, NULL, NULL, ati8514_out, NULL, NULL, svga); diff --git a/src/video/vid_svga.c b/src/video/vid_svga.c index d0189e0f7..67469ed22 100644 --- a/src/video/vid_svga.c +++ b/src/video/vid_svga.c @@ -776,9 +776,9 @@ svga_recalctimings(svga_t *svga) } if (!(svga->gdcreg[6] & 1) && !(svga->attrregs[0x10] & 1)) { /*Text mode*/ - if (svga->seqregs[1] & 8) { /*40 column*/ + if (svga->seqregs[1] & 8) /*40 column*/ svga->render = svga_render_text_40; - } else + else svga->render = svga_render_text_80; if (xga_active && (svga->xga != NULL)) { @@ -981,7 +981,7 @@ svga_recalctimings(svga_t *svga) crtcconst = svga->clock * svga->char_width; if (ibm8514_active && (svga->dev8514 != NULL)) { if (dev->on) - crtcconst8514 = svga->clock8514; + crtcconst8514 = svga->clock_8514; } if (xga_active && (svga->xga != NULL)) { if (xga->on) From b7319cf60b6297803f3405c877b3a7b3474fe40f Mon Sep 17 00:00:00 2001 From: TC1995 Date: Tue, 22 Apr 2025 21:24:31 +0200 Subject: [PATCH 064/180] Fix warnings and build. --- src/video/vid_ati_mach8.c | 2 +- src/video/vid_chips_69000.c | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/video/vid_ati_mach8.c b/src/video/vid_ati_mach8.c index 3bcde5b0c..5cbd48623 100644 --- a/src/video/vid_ati_mach8.c +++ b/src/video/vid_ati_mach8.c @@ -5829,7 +5829,7 @@ mach32_read(uint32_t addr, void *priv) mach_t *mach = (mach_t *) priv; svga_t *svga = &mach->svga; ibm8514_t *dev = (ibm8514_t *) svga->dev8514; - uint8_t ret; + uint8_t ret = 0x00; (void) xga_read_test(addr, svga); addr = (addr & svga->banked_mask) + svga->read_bank; diff --git a/src/video/vid_chips_69000.c b/src/video/vid_chips_69000.c index d06ab0484..c9830f0ed 100644 --- a/src/video/vid_chips_69000.c +++ b/src/video/vid_chips_69000.c @@ -2793,7 +2793,8 @@ chips_69000_disable_handlers(chips_69000_t *chips) reset_state->decrement_timer = chips->decrement_timer; reset_state->svga.timer = chips->svga.timer; - reset_state->svga.timer8514 = chips->svga.timer8514; + reset_state->svga.timer_8514 = chips->svga.timer_8514; + reset_state->svga.timer_xga = chips->svga.timer_xga; } static void From cdb01de6d4604b57fbb493877d9b6e75db3887d1 Mon Sep 17 00:00:00 2001 From: TC1995 Date: Tue, 22 Apr 2025 21:33:21 +0200 Subject: [PATCH 065/180] Apply it to the virge too. --- src/video/vid_s3_virge.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/video/vid_s3_virge.c b/src/video/vid_s3_virge.c index cc0985c02..1b61c02d5 100644 --- a/src/video/vid_s3_virge.c +++ b/src/video/vid_s3_virge.c @@ -5109,7 +5109,8 @@ s3_virge_disable_handlers(virge_t *dev) reset_state->bios_rom.mapping = dev->bios_rom.mapping; reset_state->svga.timer = dev->svga.timer; - reset_state->svga.timer8514 = dev->svga.timer8514; + reset_state->svga.timer_8514 = dev->svga.timer_8514; + reset_state->svga.timer_xga = dev->svga.timer_xga; reset_state->irq_timer = dev->irq_timer; } From 571b0595debfb26093c1e6c3b27cbbdc94b4789b Mon Sep 17 00:00:00 2001 From: TC1995 Date: Tue, 22 Apr 2025 21:44:56 +0200 Subject: [PATCH 066/180] sigh, apply it to the Bochs VBE virtual card too. --- src/video/vid_bochs_vbe.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/video/vid_bochs_vbe.c b/src/video/vid_bochs_vbe.c index 6dc015fb0..36185214c 100644 --- a/src/video/vid_bochs_vbe.c +++ b/src/video/vid_bochs_vbe.c @@ -344,7 +344,7 @@ bochs_vbe_recalctimings(svga_t* svga) svga->rowoffset = dev->vbe_regs[VBE_DISPI_INDEX_VIRT_WIDTH] * ((svga->bpp == 15) ? 2 : (svga->bpp / 8)); svga->ma_latch = (dev->vbe_regs[VBE_DISPI_INDEX_Y_OFFSET] * svga->rowoffset) + (dev->vbe_regs[VBE_DISPI_INDEX_X_OFFSET] * ((svga->bpp == 15) ? 2 : (svga->bpp / 8))); - svga->fullchange = 3; + svga->fullchange = 3; } if (svga->bpp == 4) @@ -708,7 +708,7 @@ bochs_vbe_disable_handlers(bochs_vbe_t *dev) reset_state->bios_rom.mapping = dev->bios_rom.mapping; reset_state->svga.timer = dev->svga.timer; - reset_state->svga.timer8514 = dev->svga.timer8514; + reset_state->svga.timer_8514 = dev->svga.timer_8514; } static void From 406588293ce2bea83bd83b746eb734ed32640946 Mon Sep 17 00:00:00 2001 From: OBattler Date: Tue, 22 Apr 2025 22:38:16 +0200 Subject: [PATCH 067/180] Load key bind defaults before loading the config, fixes saved key binds across emulator closures and reopenings. --- src/86box.c | 15 +++++++-------- src/config.c | 54 ++++++++++++++++++++++++---------------------------- 2 files changed, 32 insertions(+), 37 deletions(-) diff --git a/src/86box.c b/src/86box.c index cde98f5d8..57abb12a6 100644 --- a/src/86box.c +++ b/src/86box.c @@ -1000,6 +1000,13 @@ usage: zip_global_init(); mo_global_init(); + /* Initialize the keyboard accelerator list with default values */ + for (int x = 0; x < NUM_ACCELS; x++) { + strcpy(acc_keys[x].name, def_acc_keys[x].name); + strcpy(acc_keys[x].desc, def_acc_keys[x].desc); + strcpy(acc_keys[x].seq, def_acc_keys[x].seq); + } + /* Load the configuration file. */ config_load(); @@ -1030,14 +1037,6 @@ usage: gdbstub_init(); - // Initialize the keyboard accelerator list with default values - for(int x=0;x Date: Wed, 23 Apr 2025 12:49:29 +0500 Subject: [PATCH 068/180] Fix cleared key bindings not being reloaded --- src/config.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/config.c b/src/config.c index 0de69de70..98923d9cf 100644 --- a/src/config.c +++ b/src/config.c @@ -1774,9 +1774,12 @@ load_keybinds(void) /* Now load values from config */ for (int x = 0; x < NUM_ACCELS; x++) { - p = ini_section_get_string(cat, acc_keys[x].name, "none"); + p = ini_section_get_string(cat, acc_keys[x].name, "default"); + /* Check if the binding was marked as cleared */ + if (strcmp(p, "none") == 0) + acc_keys[x].seq[0] = '\0'; /* If there's no binding in the file, leave it alone. */ - if (strcmp(p, "none") != 0) { + else if (strcmp(p, "default") != 0) { /* It would be ideal to validate whether the user entered a valid combo at this point, but the Qt method for testing that is @@ -2527,6 +2530,9 @@ save_keybinds(void) /* Has accelerator been changed from default? */ if (strcmp(def_acc_keys[x].seq, acc_keys[x].seq) == 0) ini_section_delete_var(cat, acc_keys[x].name); + /* Check for a cleared binding to avoid saving it as an empty string */ + else if (acc_keys[x].seq[0] == '\0') + ini_section_set_string(cat, acc_keys[x].name, "none"); else ini_section_set_string(cat, acc_keys[x].name, acc_keys[x].seq); } From 41a3e132ef75d86ae9566191cb82a033949ae19d Mon Sep 17 00:00:00 2001 From: Alexander Babikov Date: Wed, 23 Apr 2025 12:56:20 +0500 Subject: [PATCH 069/180] Fix `QMetaObject::connectSlotsByName` warnings --- src/qt/qt_settingsinput.cpp | 17 ++++------------- src/qt/qt_settingsinput.hpp | 6 +++--- 2 files changed, 7 insertions(+), 16 deletions(-) diff --git a/src/qt/qt_settingsinput.cpp b/src/qt/qt_settingsinput.cpp index 79225cb91..695dc43e9 100644 --- a/src/qt/qt_settingsinput.cpp +++ b/src/qt/qt_settingsinput.cpp @@ -79,15 +79,6 @@ SettingsInput::SettingsInput(QWidget *parent) refreshInputList(); - connect(ui->tableKeys, &QTableWidget::cellDoubleClicked, - this, &SettingsInput::on_tableKeys_doubleClicked); - - connect(ui->pushButtonBind, &QPushButton::clicked, - this, &SettingsInput::on_pushButtonBind_Clicked); - - connect(ui->pushButtonClearBind, &QPushButton::clicked, - this, &SettingsInput::on_pushButtonClearBind_Clicked); - onCurrentMachineChanged(machine); } @@ -194,7 +185,7 @@ SettingsInput::on_tableKeys_currentCellChanged(int currentRow, int currentColumn } void -SettingsInput::on_tableKeys_doubleClicked(int row, int col) +SettingsInput::on_tableKeys_cellDoubleClicked(int row, int col) { // Edit bind QTableWidgetItem *cell = ui->tableKeys->item(row,1); @@ -233,17 +224,17 @@ SettingsInput::on_tableKeys_doubleClicked(int row, int col) } void -SettingsInput::on_pushButtonBind_Clicked() +SettingsInput::on_pushButtonBind_clicked() { // Edit bind QTableWidgetItem *cell = ui->tableKeys->currentItem(); if (!cell) return; - on_tableKeys_doubleClicked(cell->row(), cell->column()); + on_tableKeys_cellDoubleClicked(cell->row(), cell->column()); } void -SettingsInput::on_pushButtonClearBind_Clicked() +SettingsInput::on_pushButtonClearBind_clicked() { // Wipe bind QTableWidgetItem *cell = ui->tableKeys->item(ui->tableKeys->currentRow(), 1); diff --git a/src/qt/qt_settingsinput.hpp b/src/qt/qt_settingsinput.hpp index ec7dc393b..742421f64 100644 --- a/src/qt/qt_settingsinput.hpp +++ b/src/qt/qt_settingsinput.hpp @@ -33,10 +33,10 @@ private slots: void on_pushButtonJoystick2_clicked(); void on_pushButtonJoystick3_clicked(); void on_pushButtonJoystick4_clicked(); - void on_tableKeys_doubleClicked(int row, int col); + void on_tableKeys_cellDoubleClicked(int row, int col); void on_tableKeys_currentCellChanged(int currentRow, int currentColumn, int previousRow, int previousColumn); - void on_pushButtonBind_Clicked(); - void on_pushButtonClearBind_Clicked(); + void on_pushButtonBind_clicked(); + void on_pushButtonClearBind_clicked(); private: Ui::SettingsInput *ui; From b074c28d3d4929957319778073561869dc99d8ed Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Wed, 23 Apr 2025 16:07:41 +0600 Subject: [PATCH 070/180] DMA-based IDE writes are now reported properly --- src/disk/hdc_ide.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/disk/hdc_ide.c b/src/disk/hdc_ide.c index fe48bba6d..e1e12afcd 100644 --- a/src/disk/hdc_ide.c +++ b/src/disk/hdc_ide.c @@ -2514,6 +2514,7 @@ ide_callback(void *priv) return; } else if (ret & 1) { /* DMA successful */ + ui_sb_update_icon_write(SB_HDD | hdd[ide->hdd_num].bus_type, 1); ret = hdd_image_write(ide->hdd_num, ide_get_sector(ide), ide->sector_pos, ide->sector_buffer); @@ -2524,7 +2525,6 @@ ide_callback(void *priv) err = UNC_ERR; ide_irq_raise(ide); - ui_sb_update_icon_write(SB_HDD | hdd[ide->hdd_num].bus_type, 0); } else { /* Bus master DMA error, abort the command. */ ide_log("IDE %i: DMA read aborted (failed)\n", ide->channel); From 531e6545be8ff3714536c8557e32948048fac637 Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Wed, 23 Apr 2025 16:22:53 +0600 Subject: [PATCH 071/180] IDE: Report single sector writes properly for 28-bit Write commands --- src/disk/hdc_ide.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/disk/hdc_ide.c b/src/disk/hdc_ide.c index e1e12afcd..d725b2ace 100644 --- a/src/disk/hdc_ide.c +++ b/src/disk/hdc_ide.c @@ -2472,6 +2472,7 @@ ide_callback(void *priv) else if (!ide->tf->lba && (ide->cfg_spt == 0)) err = IDNF_ERR; else { + ui_sb_update_icon_write(SB_HDD | hdd[ide->hdd_num].bus_type, 1); ret = hdd_image_write(ide->hdd_num, ide_get_sector(ide), 1, (uint8_t *) ide->buffer); ide_irq_raise(ide); ide->tf->secount--; @@ -2479,10 +2480,8 @@ ide_callback(void *priv) ide->tf->atastat = DRQ_STAT | DRDY_STAT | DSC_STAT; ide->tf->pos = 0; ide_next_sector(ide); - ui_sb_update_icon_write(SB_HDD | hdd[ide->hdd_num].bus_type, 1); } else { ide->tf->atastat = DRDY_STAT | DSC_STAT; - ui_sb_update_icon_write(SB_HDD | hdd[ide->hdd_num].bus_type, 0); } if (ret < 0) err = UNC_ERR; From 17eeea1fd516274a2d952d6526edd67f0b8046b9 Mon Sep 17 00:00:00 2001 From: usergithub64 <58270614+usergithub64@users.noreply.github.com> Date: Thu, 24 Apr 2025 13:24:43 +0300 Subject: [PATCH 072/180] Update the Russian translation Update the Russian translation --- src/qt/languages/ru-RU.po | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/qt/languages/ru-RU.po b/src/qt/languages/ru-RU.po index baf1035ea..ebc71bb1b 100644 --- a/src/qt/languages/ru-RU.po +++ b/src/qt/languages/ru-RU.po @@ -1618,7 +1618,7 @@ msgid "CODEC" msgstr "Кодек" msgid "Raise CODEC interrupt on CODEC setup (needed by some drivers)" -msgstr "Поднимать прерывание кодека при настройке кодека (необходимо некоторым драйверам)." +msgstr "Поднимать прерывание кодека при настройке кодека (необходимо некоторым драйверам)" msgid "SB Address" msgstr "Адрес SB" @@ -1885,7 +1885,7 @@ msgid "Color (generic)" msgstr "Цветной (стандартный)" msgid "Green Monochrome" -msgstr "Зеленый монохромный" +msgstr "Зелёный монохромный" msgid "Amber Monochrome" msgstr "Янтарный монохромный" From 191503e5292ff2e48083ac238a0932b2dcd0b684 Mon Sep 17 00:00:00 2001 From: usergithub64 <58270614+usergithub64@users.noreply.github.com> Date: Thu, 24 Apr 2025 13:30:11 +0300 Subject: [PATCH 073/180] Update the Russian translation Update the Russian translation --- src/qt/languages/ru-RU.po | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/qt/languages/ru-RU.po b/src/qt/languages/ru-RU.po index ebc71bb1b..b1c6cf22b 100644 --- a/src/qt/languages/ru-RU.po +++ b/src/qt/languages/ru-RU.po @@ -2059,22 +2059,22 @@ msgid "[Generic] 1989 (3500 RPM)" msgstr "[Стандартный] 1989 (3500 RPM)" msgid "[Generic] 1992 (3600 RPM)" -msgstr "[Стандартный] 1989 (3500 RPM)" +msgstr "[Стандартный] 1992 (3600 RPM)" msgid "[Generic] 1994 (4500 RPM)" -msgstr "[Стандартный] 1989 (3500 RPM)" +msgstr "[Стандартный] 1994 (4500 RPM)" msgid "[Generic] 1996 (5400 RPM)" -msgstr "[Стандартный] 1989 (3500 RPM)" +msgstr "[Стандартный] 1996 (5400 RPM)" msgid "[Generic] 1997 (5400 RPM)" -msgstr "[Стандартный] 1989 (3500 RPM)" +msgstr "[Стандартный] 1997 (5400 RPM)" msgid "[Generic] 1998 (5400 RPM)" -msgstr "[Стандартный] 1989 (3500 RPM)" +msgstr "[Стандартный] 1998 (5400 RPM)" msgid "[Generic] 2000 (7200 RPM)" -msgstr "[Стандартный] 1989 (3500 RPM)" +msgstr "[Стандартный] 2000 (7200 RPM)" msgid "IBM 8514/A clone (ISA)" msgstr "Клон IBM 8514/A (ISA)" From 1c12b8c68fcaf7ba4c61c871b2b218fe8f91dc9e Mon Sep 17 00:00:00 2001 From: usergithub64 <58270614+usergithub64@users.noreply.github.com> Date: Thu, 24 Apr 2025 16:31:20 +0300 Subject: [PATCH 074/180] Fixes for broken translation Fixes for broken translation --- src/qt/qt_keybind.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/qt/qt_keybind.cpp b/src/qt/qt_keybind.cpp index 8b0f52eab..c7ed894b3 100644 --- a/src/qt/qt_keybind.cpp +++ b/src/qt/qt_keybind.cpp @@ -88,7 +88,7 @@ QKeySequence KeyBinder::BindKey(QWidget* widget, QString CurValue) { KeyBinder kb(widget); - kb.setWindowTitle("Bind Key"); + kb.setWindowTitle(tr("Bind Key")); kb.setFixedSize(kb.minimumSizeHint()); kb.findChild()->setKeySequence(QKeySequence::fromString(CurValue)); kb.setEnabled(true); From d3f32a52f4bbee0e13780ea6b7a00b1147019c03 Mon Sep 17 00:00:00 2001 From: usergithub64 <58270614+usergithub64@users.noreply.github.com> Date: Thu, 24 Apr 2025 16:32:21 +0300 Subject: [PATCH 075/180] Update the Russian translation Update the Russian translation --- src/qt/languages/ru-RU.po | 42 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/src/qt/languages/ru-RU.po b/src/qt/languages/ru-RU.po index b1c6cf22b..e88f4f0fc 100644 --- a/src/qt/languages/ru-RU.po +++ b/src/qt/languages/ru-RU.po @@ -2162,3 +2162,45 @@ msgstr "Вниз" msgid "Could not load file %1" msgstr "Не удалось загрузить файл %1" + +msgid "Key Bindings:" +msgstr "Привязки клавиш:" + +msgid "Action" +msgstr "Действие" + +msgid "Keybind" +msgstr "Привязка клавиш" + +msgid "Clear binding" +msgstr "Очистить привязку" + +msgid "Bind" +msgstr "Привязка" + +msgid "Bind Key" +msgstr "Привязать клавишу" + +msgid "Enter key combo:" +msgstr "Введите комбинацию клавиш:" + +msgid "Send Control+Alt+Del" +msgstr "Отправить Control+Alt+Del" + +msgid "Send Control+Alt+Escape" +msgstr "Отправить Control+Alt+Escape" + +msgid "Toggle fullscreen" +msgstr "Переключить на полноэкранный режим" + +msgid "Screenshot" +msgstr "Скриншот" + +msgid "Release mouse pointer" +msgstr "Отпустить указатель мыши" + +msgid "Toggle pause" +msgstr "Переключить паузу" + +msgid "Toggle mute" +msgstr "Переключить беззвучный режим" \ No newline at end of file From 57d5bb76282175db1876c49de5d1cfe0e558ba53 Mon Sep 17 00:00:00 2001 From: sharkbyte16 <87238812+sharkbyte16@users.noreply.github.com> Date: Sat, 26 Apr 2025 12:08:37 +0200 Subject: [PATCH 076/180] Update nl-NL.po --- src/qt/languages/nl-NL.po | 86 +++++++++++++++++++-------------------- 1 file changed, 43 insertions(+), 43 deletions(-) diff --git a/src/qt/languages/nl-NL.po b/src/qt/languages/nl-NL.po index 8ee391957..49a32506b 100644 --- a/src/qt/languages/nl-NL.po +++ b/src/qt/languages/nl-NL.po @@ -112,7 +112,7 @@ msgid "Hi&DPI scaling" msgstr "Hi&DPI-schaling" msgid "&Fullscreen" -msgstr "&Fullscreen" +msgstr "&Volledig scherm" msgid "Fullscreen &stretch mode" msgstr "Volledig scherm &uitrekmodus" @@ -670,16 +670,16 @@ msgid "Surface images" msgstr "Oppervlakte-images" msgid "Machine \"%hs\" is not available due to missing ROMs in the roms/machines directory. Switching to an available machine." -msgstr "Machine \"%hs\" is niet beschikbaar door ontbrekende ROMs in de map roms/machines. Overschakelen naar een beschikbare machine." +msgstr "Machine \"%hs\" is niet beschikbaar door ontbrekende ROMs in de map roms/machines. Er wordt overgeschakeld naar een beschikbare machine." msgid "Video card \"%hs\" is not available due to missing ROMs in the roms/video directory. Switching to an available video card." -msgstr "Videokaart \"%hs\" is niet beschikbaar door ontbrekende ROMs in de map roms/video. Overschakel over naar een beschikbare videokaart." +msgstr "Videokaart \"%hs\" is niet beschikbaar door ontbrekende ROMs in de map roms/video. Er wordt overgeschakeld naar een beschikbare videokaart." msgid "Video card #2 \"%hs\" is not available due to missing ROMs in the roms/video directory. Disabling the second video card." -msgstr "Videokaart #2 \"%hs\" is niet beschikbaar door ontbrekende ROMs in de map roms/video. Uitschakel de tweede videokaart." +msgstr "Videokaart #2 \"%hs\" is niet beschikbaar door ontbrekende ROMs in de map roms/video. De tweede videokaart wordt uitgeschakeld." msgid "Device \"%hs\" is not available due to missing ROMs. Ignoring the device." -msgstr "Het apparaat \"%hs\" is niet beschikbaar door ontbrekende ROMs. Negeer het apparaat." +msgstr "Het apparaat \"%hs\" is niet beschikbaar door ontbrekende ROMs. Het apparaat wordt genegeerd." msgid "Machine" msgstr "Machine" @@ -1018,7 +1018,7 @@ msgid "Differencing VHD" msgstr "Verschil-VHD" msgid "(N/A)" -msgstr "(N/A)" +msgstr "(N/B)" msgid "Raw image (.img)" msgstr "Ruw image (.img)" @@ -1054,7 +1054,7 @@ msgid "This could mean that the parent image was modified after the differencing msgstr "Dit kan betekenen dat de bovenliggende image is gewijzigd nadat de verschil-image is gemaakt.\n\nDit kan ook gebeuren als de imagebestanden zijn verplaatst of gekopieerd, of door een fout in het programma waarmee deze schijf is gemaakt.\n\nWil je de tijdstempels herstellen?" msgid "Parent and child disk timestamps do not match" -msgstr "Bovenliggende en onderliggende schijf tijdstempels komen niet overeen" +msgstr "Bovenliggende en onderliggende schijftijdstempels komen niet overeen" msgid "Could not fix VHD timestamp." msgstr "Kan VHD tijdstempel niet herstellen." @@ -1234,7 +1234,7 @@ msgid "Open screenshots folder..." msgstr "Map met schermafbeeldingen openen..." msgid "Apply fullscreen stretch mode when maximized" -msgstr "Pas fullscreen stretchmodus toe wanneer gemaximaliseerd" +msgstr "Schakel de volledig scherm-uitrekmodus in bij maximaliseren" msgid "Cursor/Puck" msgstr "Cursor/Puck" @@ -1291,7 +1291,7 @@ msgid "Browse..." msgstr "Bladeren..." msgid "Couldn't create OpenGL context." -msgstr "Kan OpenGL context niet maken." +msgstr "Kan OpenGL context niet aanmaken." msgid "Couldn't switch to OpenGL context." msgstr "Kan niet overschakelen naar OpenGL context." @@ -1444,7 +1444,7 @@ msgid "Enable backlight" msgstr "Backlight inschakelen" msgid "Invert colors" -msgstr "Kleuren omkeren" +msgstr "Kleuren inverteren" msgid "BIOS size" msgstr "BIOS-grootte" @@ -1810,7 +1810,7 @@ msgid "Five + Wheel" msgstr "Vijf + Wiel" msgid "Five + 2 Wheels" -msgstr "" +msgstr "Vijf + 2 Wielen" msgid "A3 - SMT2 Serial / SMT3(R)V" msgstr "A3 - SMT2 Serieel / SMT3(R)V" @@ -1957,13 +1957,13 @@ msgid "Bochs latest" msgstr "Bochs nieuwste" msgid "Mono Non-Interlaced" -msgstr "Mono Non-Interlaced" +msgstr "Mono niet geïnterlaced" msgid "Color Interlaced" msgstr "Kleur interlaced" msgid "Color Non-Interlaced" -msgstr "Kleur non-interlaced" +msgstr "Kleur niet geïnterlaced" msgid "3Dfx Voodoo Graphics" msgstr "3Dfx Voodoo Graphics" @@ -2053,34 +2053,34 @@ msgid "High performance impact" msgstr "Hoge prestatie-impact" msgid "[Generic] RAM Disk (max. speed)" -msgstr "[Generic] RAM-schijf (max. snelheid)" +msgstr "[Generiek] RAM-schijf (max. snelheid)" msgid "[Generic] 1989 (3500 RPM)" -msgstr "" +msgstr "[Generiek] 1989 (3500 RPM)" msgid "[Generic] 1992 (3600 RPM)" -msgstr "" +msgstr "[Generiek] 1992 (3600 RPM)" msgid "[Generic] 1994 (4500 RPM)" -msgstr "" +msgstr "[Generiek] 1994 (4500 RPM)" msgid "[Generic] 1996 (5400 RPM)" -msgstr "" +msgstr "[Generiek] 1996 (5400 RPM)" msgid "[Generic] 1997 (5400 RPM)" -msgstr "" +msgstr "[Generiek] 1997 (5400 RPM)" msgid "[Generic] 1998 (5400 RPM)" -msgstr "" +msgstr "[Generiek] 1998 (5400 RPM)" msgid "[Generic] 2000 (7200 RPM)" -msgstr "" +msgstr "[Generiek] 2000 (7200 RPM)" msgid "IBM 8514/A clone (ISA)" msgstr "IBM 8514/A-kloon (ISA)" msgid "Vendor" -msgstr "Verkoper" +msgstr "Leverancier" msgid "Generic PC/XT Memory Expansion" msgstr "Generieke PC/XT geheugenuitbreiding" @@ -2095,64 +2095,64 @@ msgid "TrueType fonts in the \"roms/printer/fonts\" directory are required for t msgstr "TrueType lettertypen in de map \"roms/printer/fonts\" zijn nodig voor de emulatie van de generieke ESC/P dot-matrix-printer." msgid "Inhibit multimedia keys" -msgstr "" +msgstr "Multimedia-toetsen blokkeren" msgid "Ask for confirmation before saving settings" -msgstr "" +msgstr "Vraag om bevestiging voor het opslaan van instellingen" msgid "Ask for confirmation before hard resetting" -msgstr "" +msgstr "Vraag om bevestiging voor een harde reset" msgid "Ask for confirmation before quitting" -msgstr "" +msgstr "Vraag om bevestiging voor afsluiten" msgid "Display hotkey message when entering full-screen mode" -msgstr "" +msgstr "Toon een sneltoetsmelding bij het openen van de volledigschermmodus" msgid "Options" -msgstr "" +msgstr "Opties" msgid "Model" -msgstr "" +msgstr "Model" msgid "Model:" -msgstr "" +msgstr "Model:" msgid "Failed to initialize Vulkan renderer." -msgstr "" +msgstr "Initialisatie van de Vulkan-renderer is mislukt." msgid "GLSL Error" -msgstr "" +msgstr "GLSL-fout" msgid "Could not load shader: %1" -msgstr "" +msgstr "Kon de shader niet laden: %1" msgid "OpenGL version 3.0 or greater is required. Current GLSL version is %1.%2" -msgstr "" +msgstr "OpenGL versie 3.0 of hoger is vereist. Huidige GLSL-versie is %1.%2" msgid "Could not load texture: %1" -msgstr "" +msgstr "Kon de textuur niet laden: %1" msgid "Could not compile shader:\n\n%1" -msgstr "" +msgstr "Kon de shader niet compileren:\n\n%1" msgid "Program not linked:\n\n%1" -msgstr "" +msgstr "Programma niet gelinkt:\n\n%1" msgid "Shader Manager" -msgstr "" +msgstr "Shaderbeheer" msgid "Shader Configuration" -msgstr "" +msgstr "Shaderconfiguratie" msgid "Add" -msgstr "" +msgstr "Toevoegen" msgid "Move up" -msgstr "" +msgstr "Omhoog verplaatsen" msgid "Move down" -msgstr "" +msgstr "Omlaag verplaatsen" msgid "Could not load file %1" -msgstr "" +msgstr "Kon bestand %1 niet laden" From 34e017bbf4c1af21c2cc86705140d6cc3680f9b9 Mon Sep 17 00:00:00 2001 From: sharkbyte16 <87238812+sharkbyte16@users.noreply.github.com> Date: Sat, 26 Apr 2025 16:03:37 +0200 Subject: [PATCH 077/180] Add cmake linux clang and intel Add cmake files for x86_64 linux clang and intel compilers. --- cmake/intel-linux-x86_64.cmake | 20 ++++++++++++++++++++ cmake/llvm-linux-x86_64.cmake | 23 +++++++++++++++++++++++ 2 files changed, 43 insertions(+) create mode 100644 cmake/intel-linux-x86_64.cmake create mode 100644 cmake/llvm-linux-x86_64.cmake diff --git a/cmake/intel-linux-x86_64.cmake b/cmake/intel-linux-x86_64.cmake new file mode 100644 index 000000000..a0c3e5d0b --- /dev/null +++ b/cmake/intel-linux-x86_64.cmake @@ -0,0 +1,20 @@ +# +# 86Box A hypervisor and IBM PC system emulator that specializes in +# running old operating systems and software designed for IBM +# PC systems and compatibles from 1981 through fairly recent +# system designs based on the PCI bus. +# +# This file is part of the 86Box distribution. +# +# CMake toolchain file defining GCC compiler flags +# for 64-bit x86 targets. +# +# Authors: David Hrdlička, +# +# Copyright 2021 David Hrdlička. +# + +include(${CMAKE_CURRENT_LIST_DIR}/flags-gcc-x86_64.cmake) + +set(CMAKE_C_COMPILER icx) +set(CMAKE_CXX_COMPILER icpx) diff --git a/cmake/llvm-linux-x86_64.cmake b/cmake/llvm-linux-x86_64.cmake new file mode 100644 index 000000000..ccdd7b18e --- /dev/null +++ b/cmake/llvm-linux-x86_64.cmake @@ -0,0 +1,23 @@ +# +# 86Box A hypervisor and IBM PC system emulator that specializes in +# running old operating systems and software designed for IBM +# PC systems and compatibles from 1981 through fairly recent +# system designs based on the PCI bus. +# +# This file is part of the 86Box distribution. +# +# CMake toolchain file defining Clang compiler flags +# for 64-bit x86 targets. +# +# Authors: David Hrdlička, +# dob205 +# +# Copyright 2021 David Hrdlička. +# Copyright 2022 dob205. +# + +include(${CMAKE_CURRENT_LIST_DIR}/flags-gcc-x86_64.cmake) + +# Use the GCC-compatible Clang executables in order to use our flags +set(CMAKE_C_COMPILER clang) +set(CMAKE_CXX_COMPILER clang++) From e076c1051d9cd43936dc170857b24cb99a574a75 Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Sat, 26 Apr 2025 23:17:32 +0600 Subject: [PATCH 078/180] Fix x87_op being outside of structure, fixing crashes in ARM64 NDR --- src/codegen_new/codegen.h | 1 + src/codegen_new/codegen_block.c | 1 + src/codegen_new/codegen_reg.c | 14 ++++++++++++++ src/cpu/386_common.c | 2 -- src/cpu/cpu.h | 4 +++- src/cpu/x86.c | 1 + 6 files changed, 20 insertions(+), 3 deletions(-) diff --git a/src/codegen_new/codegen.h b/src/codegen_new/codegen.h index eecfa249b..0ff6a90d6 100644 --- a/src/codegen_new/codegen.h +++ b/src/codegen_new/codegen.h @@ -306,6 +306,7 @@ struct ir_data_t; x86seg *codegen_generate_ea(struct ir_data_t *ir, x86seg *op_ea_seg, uint32_t fetchdat, int op_ssegs, uint32_t *op_pc, uint32_t op_32, int stack_offset); extern void codegen_check_seg_read(codeblock_t *block, struct ir_data_t *ir, x86seg *seg); extern void codegen_check_seg_write(codeblock_t *block, struct ir_data_t *ir, x86seg *seg); +extern void codegen_check_regs(void); extern int codegen_purge_purgable_list(void); /*Delete a random code block to free memory. This is obviously quite expensive, and diff --git a/src/codegen_new/codegen_block.c b/src/codegen_new/codegen_block.c index a8ea0e06e..ff82384be 100644 --- a/src/codegen_new/codegen_block.c +++ b/src/codegen_new/codegen_block.c @@ -217,6 +217,7 @@ block_free_list_get(void) void codegen_init(void) { + codegen_check_regs(); codegen_allocator_init(); codegen_backend_init(); diff --git a/src/codegen_new/codegen_reg.c b/src/codegen_new/codegen_reg.c index ba60ab038..75cf25ded 100644 --- a/src/codegen_new/codegen_reg.c +++ b/src/codegen_new/codegen_reg.c @@ -226,6 +226,20 @@ reg_is_native_size(ir_reg_t ir_reg) return 0; } +void +codegen_check_regs(void) +{ + int i = 0; + for (i = 0; i < IREG_COUNT; i++) { + if (ireg_data[i].is_volatile == REG_VOLATILE) + continue; + + if (ireg_data[i].p && ((uintptr_t)ireg_data[i].p - (uintptr_t)&cpu_state) >= sizeof(cpu_state)) { + fatal("Register number %d outside cpu_state!\n", i); + } + } +} + void codegen_reg_reset(void) { diff --git a/src/cpu/386_common.c b/src/cpu/386_common.c index c6a759d36..2853e3c9a 100644 --- a/src/cpu/386_common.c +++ b/src/cpu/386_common.c @@ -113,8 +113,6 @@ uint8_t is_smint = 0; uint16_t io_port = 0x0000; uint32_t io_val = 0x00000000; -uint32_t x87_op = 0x00000000; - int opcode_has_modrm[256] = { 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, /*00*/ 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, /*10*/ diff --git a/src/cpu/cpu.h b/src/cpu/cpu.h index b76e2d622..b6f5f593c 100644 --- a/src/cpu/cpu.h +++ b/src/cpu/cpu.h @@ -416,6 +416,8 @@ typedef struct { uint16_t eflags; uint32_t _smbase; + + uint32_t x87_op; } cpu_state_t; #define in_smm cpu_state._in_smm @@ -784,7 +786,7 @@ typedef struct { uint32_t smhr; } cyrix_t; -extern uint32_t x87_op; +#define x87_op cpu_state.x87_op extern uint32_t addr64; extern uint32_t addr64_2; diff --git a/src/cpu/x86.c b/src/cpu/x86.c index 97ae19f3a..a8ab9d866 100644 --- a/src/cpu/x86.c +++ b/src/cpu/x86.c @@ -272,6 +272,7 @@ reset_common(int hard) msr.fcr = (1 << 8) | (1 << 9) | (1 << 12) | (1 << 16) | (1 << 19) | (1 << 21); msw = 0; new_ne = 0; + x87_op = 0; ccr0 = ccr1 = ccr2 = ccr3 = ccr4 = ccr5 = ccr6 = ccr7 = 0; ccr4 = 0x85; From 2424e848a7c7ab03671f5b65c599674b830ad6b4 Mon Sep 17 00:00:00 2001 From: Nelson Kerber Hennemann Filho <87081197+nelsonhef@users.noreply.github.com> Date: Sat, 26 Apr 2025 15:27:14 -0300 Subject: [PATCH 079/180] Update pt-BR.po Some fixes and added missing translations --- src/qt/languages/pt-BR.po | 86 +++++++++++++++++++-------------------- 1 file changed, 43 insertions(+), 43 deletions(-) diff --git a/src/qt/languages/pt-BR.po b/src/qt/languages/pt-BR.po index 8961f11b8..a3e98b625 100644 --- a/src/qt/languages/pt-BR.po +++ b/src/qt/languages/pt-BR.po @@ -631,7 +631,7 @@ msgid " - PAUSED" msgstr " - PAUSADO" msgid "Press %s to return to windowed mode." -msgstr "Use %s para retornar ao modo janela" +msgstr "Use %s para retornar ao modo janela." msgid "Speed" msgstr "Velocidade" @@ -847,7 +847,7 @@ msgid "86Box v" msgstr "86Box versão" msgid "An emulator of old computers\n\nAuthors: Miran Grča (OBattler), RichardG867, Jasmine Iwanek, TC1995, coldbrewed, Teemu Korhonen (Manaatti), Joakim L. Gilje, Adrien Moulin (elyosh), Daniel Balsom (gloriouscow), Cacodemon345, Fred N. van Kempen (waltje), Tiseno100, reenigne, and others.\n\nWith previous core contributions from Sarah Walker, leilei, JohnElliott, greatpsycho, and others.\n\nReleased under the GNU General Public License version 2 or later. See LICENSE for more information." -msgstr "Um emulador de computadores antigos\n\nAutores: Miran Grča (OBattler), RichardG867, Jasmine Iwanek, TC1995, coldbrewed, Teemu Korhonen (Manaatti), Joakim L. Gilje, Adrien Moulin (elyosh), Daniel Balsom (gloriouscow), Cacodemon345, Fred N. van Kempen (waltje), Tiseno100, reenigne, e outros.\n\nCom contribuições anteriores de Sarah Walker, leilei, JohnElliott, greatpsycho, e outros.\n\nTraduzido por: Altieres Lima da Silva\n\nLançado sob a Licença Pública Geral GNU, versão 2 ou posterior. Veja o arquivo LICENSE para mais informações." +msgstr "Um emulador de computadores antigos\n\nAutores: Miran Grča (OBattler), RichardG867, Jasmine Iwanek, TC1995, coldbrewed, Teemu Korhonen (Manaatti), Joakim L. Gilje, Adrien Moulin (elyosh), Daniel Balsom (gloriouscow), Cacodemon345, Fred N. van Kempen (waltje), Tiseno100, reenigne, e outros.\n\nCom contribuições anteriores de Sarah Walker, leilei, JohnElliott, greatpsycho, e outros.\n\nTraduzido por: Altieres Lima da Silva, Nelson K. Hennemann Filho\n\nLançado sob a Licença Pública Geral GNU, versão 2 ou posterior. Veja o arquivo LICENSE para mais informações." msgid "Hardware not available" msgstr "Hardware não disponível" @@ -967,13 +967,13 @@ msgid "HDI or HDX images with a sector size other than 512 are not supported." msgstr "Imagens HDI ou HDX com um tamanho de setor que não seja 512 não são suportadas." msgid "Disk image file already exists" -msgstr "Esta imagem existe" +msgstr "A imagem de disco já existe" msgid "Please specify a valid file name." msgstr "Digite um nome de arquivo válido." msgid "Disk image created" -msgstr "A imagem foi criada com sucesso" +msgstr "A imagem de disco foi criada" msgid "Make sure the file exists and is readable." msgstr "Certifique-se de que o arquivo existe e é legível." @@ -982,7 +982,7 @@ msgid "Make sure the file is being saved to a writable directory." msgstr "Certifique-se de que o arquivo está sendo salvo em um diretório gravável." msgid "Disk image too large" -msgstr "A imagem do disco é muito grande" +msgstr "A imagem de disco é muito grande" msgid "Remember to partition and format the newly-created drive." msgstr "Lembre-se de particionar e formatar a unidade recém-criada." @@ -1312,16 +1312,16 @@ msgid "This machine might have been moved or copied." msgstr "Essa máquina pode ter sido movida ou copiada." msgid "In order to ensure proper networking functionality, 86Box needs to know if this machine was moved or copied.\n\nSelect \"I Copied It\" if you are not sure." -msgstr "Para garantir a funcionalidade adequada da rede, o 86Box precisa saber se essa máquina foi movida ou copiada.\n\nSelecione \"A copiei\" se não tiver certeza." +msgstr "Para garantir a funcionalidade adequada da rede, o 86Box precisa saber se essa máquina foi movida ou copiada.\n\nSelecione \"Copiei\" se não tiver certeza." msgid "I Moved It" -msgstr "O movi" +msgstr "Movi" msgid "I Copied It" -msgstr "A copiei" +msgstr "Copiei" msgid "86Box Monitor #" -msgstr "Monitor 86Box " +msgstr "Monitor 86Box #" msgid "No MCA devices." msgstr "Nenhum dispositivo MCA." @@ -1483,7 +1483,7 @@ msgid "MIDI Clockout" msgstr "Saída do relógio MIDI" msgid "SoundFont" -msgstr "Fonte de som" +msgstr "SoundFont" msgid "Output Gain" msgstr "Ganho de saída" @@ -1789,7 +1789,7 @@ msgid "4th Order" msgstr "De 4ª ordem" msgid "7th Order" -msgstr "De 7º order" +msgstr "De 7ª order" msgid "Non-timed (original)" msgstr "Sem cronômetro (original)" @@ -1807,10 +1807,10 @@ msgid "Wheel" msgstr "Roda" msgid "Five + Wheel" -msgstr "Cinco + roda" +msgstr "Cinco + Roda" msgid "Five + 2 Wheels" -msgstr "" +msgstr "Cinco + 2 Rodas" msgid "A3 - SMT2 Serial / SMT3(R)V" msgstr "A3 - SMT2 Serial / SMT3(R)V" @@ -2035,7 +2035,7 @@ msgid "Baud Rate of Passthrough" msgstr "Taxa de transmissão de passagem" msgid "Named Pipe (Server)" -msgstr "Tubo nomeado (servidor)" +msgstr "Pipe nomeado (servidor)" msgid "Host Serial Passthrough" msgstr "Passagem da porta serial do host" @@ -2053,28 +2053,28 @@ msgid "High performance impact" msgstr "Alto impacto no desempenho" msgid "[Generic] RAM Disk (max. speed)" -msgstr "[Generic] Disco RAM (velocidade máxima)" +msgstr "[Genérico] Disco RAM (velocidade máxima)" msgid "[Generic] 1989 (3500 RPM)" -msgstr "" +msgstr "[Genérico] 1989 (3500 RPM)" msgid "[Generic] 1992 (3600 RPM)" -msgstr "" +msgstr "[Genérico] 1992 (3600 RPM)" msgid "[Generic] 1994 (4500 RPM)" -msgstr "" +msgstr "[Genérico] 1994 (4500 RPM)" msgid "[Generic] 1996 (5400 RPM)" -msgstr "" +msgstr "[Genérico] 1996 (5400 RPM)" msgid "[Generic] 1997 (5400 RPM)" -msgstr "" +msgstr "[Genérico] 1997 (5400 RPM)" msgid "[Generic] 1998 (5400 RPM)" -msgstr "" +msgstr "[Genérico] 1998 (5400 RPM)" msgid "[Generic] 2000 (7200 RPM)" -msgstr "" +msgstr "[Genérico] 2000 (7200 RPM)" msgid "IBM 8514/A clone (ISA)" msgstr "Clone IBM 8514/A (ISA)" @@ -2095,64 +2095,64 @@ msgid "TrueType fonts in the \"roms/printer/fonts\" directory are required for t msgstr "As fontes TrueType no diretório \"roms/printer/fonts\" são necessárias para a emulação da impressora matricial de pontos ESC/P genérica." msgid "Inhibit multimedia keys" -msgstr "" +msgstr "Inibir teclas multimídia" msgid "Ask for confirmation before saving settings" -msgstr "" +msgstr "Perguntar antes de salvar configurações" msgid "Ask for confirmation before hard resetting" -msgstr "" +msgstr "Perguntar antes de reinicialização completa" msgid "Ask for confirmation before quitting" -msgstr "" +msgstr "Perguntar antes de sair" msgid "Display hotkey message when entering full-screen mode" -msgstr "" +msgstr "Mostrar mensagem de atalho quando entrar em tela cheia" msgid "Options" -msgstr "" +msgstr "Opções" msgid "Model" -msgstr "" +msgstr "Modelo" msgid "Model:" -msgstr "" +msgstr "Modelo:" msgid "Failed to initialize Vulkan renderer." -msgstr "" +msgstr "Falha ao inicializar o renderizador Vulkan." msgid "GLSL Error" -msgstr "" +msgstr "Erro GLSL" msgid "Could not load shader: %1" -msgstr "" +msgstr "Impossível carregar o shader: %1" msgid "OpenGL version 3.0 or greater is required. Current GLSL version is %1.%2" -msgstr "" +msgstr "OpenGL versão 3.0 ou superior é exigido. Versão atual GLSL é %1.%2" msgid "Could not load texture: %1" -msgstr "" +msgstr "Impossível carregar a textura: %1" msgid "Could not compile shader:\n\n%1" -msgstr "" +msgstr "Impossível compilar o shader:\n\n%1" msgid "Program not linked:\n\n%1" -msgstr "" +msgstr "Programa não linkado:\n\n%1" msgid "Shader Manager" -msgstr "" +msgstr "Gerenciador de Shader" msgid "Shader Configuration" -msgstr "" +msgstr "Configuração de Shader" msgid "Add" -msgstr "" +msgstr "Adicionar" msgid "Move up" -msgstr "" +msgstr "Mover para cima" msgid "Move down" -msgstr "" +msgstr "Mover para baixo" msgid "Could not load file %1" -msgstr "" +msgstr "Impossível carregar arquivo %1" From 388fcb3046b19eef209620b6920a8635e835d433 Mon Sep 17 00:00:00 2001 From: Nelson Kerber Hennemann Filho <87081197+nelsonhef@users.noreply.github.com> Date: Sat, 26 Apr 2025 15:36:47 -0300 Subject: [PATCH 080/180] Update 2 pt-BR.po Added strings and translations for the new key bindings settings --- src/qt/languages/pt-BR.po | 42 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/src/qt/languages/pt-BR.po b/src/qt/languages/pt-BR.po index a3e98b625..4f06e0d85 100644 --- a/src/qt/languages/pt-BR.po +++ b/src/qt/languages/pt-BR.po @@ -2156,3 +2156,45 @@ msgstr "Mover para baixo" msgid "Could not load file %1" msgstr "Impossível carregar arquivo %1" + +msgid "Key Bindings:" +msgstr "Atalhos:" + +msgid "Action" +msgstr "Ação" + +msgid "Keybind" +msgstr "Atalho" + +msgid "Clear binding" +msgstr "Limpar atalho" + +msgid "Bind" +msgstr "Vincular" + +msgid "Bind Key" +msgstr "Vincular tecla" + +msgid "Enter key combo:" +msgstr "Pressione combinação de teclas:" + +msgid "Send Control+Alt+Del" +msgstr "Enviar Control+Alt+Del" + +msgid "Send Control+Alt+Escape" +msgstr "Enviar Control+Alt+Escape" + +msgid "Toggle fullscreen" +msgstr "Alternar tela cheia" + +msgid "Screenshot" +msgstr "Captura de tela" + +msgid "Release mouse pointer" +msgstr "Liberar ponteiro do mouse" + +msgid "Toggle pause" +msgstr "Alternar pausa" + +msgid "Toggle mute" +msgstr "Alternar mudo" From 98e3cdf1cf24f18ccc293806082146aa5b71b2e8 Mon Sep 17 00:00:00 2001 From: Nelson Kerber Hennemann Filho <87081197+nelsonhef@users.noreply.github.com> Date: Sat, 26 Apr 2025 16:18:31 -0300 Subject: [PATCH 081/180] Update 3 pt-BR.po Fix minor typo --- src/qt/languages/pt-BR.po | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/qt/languages/pt-BR.po b/src/qt/languages/pt-BR.po index 4f06e0d85..e33630ccf 100644 --- a/src/qt/languages/pt-BR.po +++ b/src/qt/languages/pt-BR.po @@ -1789,7 +1789,7 @@ msgid "4th Order" msgstr "De 4ª ordem" msgid "7th Order" -msgstr "De 7ª order" +msgstr "De 7ª ordem" msgid "Non-timed (original)" msgstr "Sem cronômetro (original)" From f563b73768b8705d1adb21db98f635276fe24b7e Mon Sep 17 00:00:00 2001 From: OBattler Date: Sun, 27 Apr 2025 17:52:53 +0200 Subject: [PATCH 082/180] Warn on deprecated usage. --- src/86box.c | 98 ++++++++++++++++++++++++++++++++--------------------- 1 file changed, 60 insertions(+), 38 deletions(-) diff --git a/src/86box.c b/src/86box.c index 57abb12a6..66d9afa00 100644 --- a/src/86box.c +++ b/src/86box.c @@ -586,6 +586,55 @@ delete_nvr_file(uint8_t flash) extern void device_find_all_descs(void); +static void +pc_show_usage(char *s) +{ + char p[4096] = { 0 }; + + sprintf(p, + "\n%sUsage: 86box [options] [cfg-file]\n\n" + "Valid options are:\n\n" + "-? or --help\t\t\t- show this information\n" + "-C or --config path\t\t- set 'path' to be config file\n" +#ifdef _WIN32 + "-D or --debug\t\t\t- force debug output logging\n" +#endif +#if 0 + "-E or --nographic\t\t- forces the old behavior\n" +#endif + "-F or --fullscreen\t\t- start in fullscreen mode\n" + "-G or --lang langid\t\t- start with specified language\n" + "\t\t\t\t (e.g. en-US, or system)\n" +#ifdef _WIN32 + "-H or --hwnd id,hwnd\t\t- sends back the main dialog's hwnd\n" +#endif + "-I or --image d:path\t\t- load 'path' as floppy image on drive d\n" +#ifdef USE_INSTRUMENT + "-J or --instrument name\t- set 'name' to be the profiling instrument\n" +#endif + "-L or --logfile pat\t\t- set 'path' to be the logfile\n" + "-M or --missing\t\t- dump missing machines and video cards\n" + "-N or --noconfirm\t\t- do not ask for confirmation on quit\n" + "-P or --vmpath path\t\t- set 'path' to be root for vm\n" + "-R or --rompath path\t\t- set 'path' to be ROM path\n" +#ifndef USE_SDL_UI + "-S or --settings\t\t\t- show only the settings dialog\n" +#endif + "-T or --testmode\t\t- test mode: execute the test mode entry\n" + "\t\t\t\t point on init/hard reset\n" + "-V or --vmname name\t\t- overrides the name of the running VM\n" + "-W or --nohook\t\t- disables keyboard hook\n" + "\t\t\t\t (compatibility-only outside Windows)\n" + "-X or --clear what\t\t- clears the 'what' (cmos/flash/both)\n" + "-Y or --donothing\t\t- do not show any UI or run the emulation\n" + "-Z or --lastvmpath\t\t- the last parameter is VM path rather\n" + "\t\t\t\t than config\n" + "\nA config file can be specified. If none is, the default file will be used.\n", + (s == NULL) ? "" : s); + + ui_msgbox(MBX_ANSI | ((s == NULL) ? MBX_INFO : MBX_WARNING), p); +} + /* * Perform initial startup of the PC. * @@ -609,6 +658,7 @@ pc_init(int argc, char *argv[]) time_t now; int c; int lvmp = 0; + int deprecated = 1; #ifdef ENABLE_NG int ng = 0; #endif @@ -666,44 +716,7 @@ usage: } } - ui_msgbox(MBX_INFO, L"\nUsage: 86box [options] [cfg-file]\n\n" - "Valid options are:\n\n" - "-? or --help\t\t\t- show this information\n" - "-C or --config path\t\t- set 'path' to be config file\n" -#ifdef _WIN32 - "-D or --debug\t\t\t- force debug output logging\n" -#endif -#if 0 - "-E or --nographic\t\t- forces the old behavior\n" -#endif - "-F or --fullscreen\t\t- start in fullscreen mode\n" - "-G or --lang langid\t\t- start with specified language\n" - "\t\t\t\t (e.g. en-US, or system)\n" -#ifdef _WIN32 - "-H or --hwnd id,hwnd\t\t- sends back the main dialog's hwnd\n" -#endif - "-I or --image d:path\t\t- load 'path' as floppy image on drive d\n" -#ifdef USE_INSTRUMENT - "-J or --instrument name\t- set 'name' to be the profiling instrument\n" -#endif - "-L or --logfile pat\t\t- set 'path' to be the logfile\n" - "-M or --missing\t\t- dump missing machines and video cards\n" - "-N or --noconfirm\t\t- do not ask for confirmation on quit\n" - "-P or --vmpath path\t\t- set 'path' to be root for vm\n" - "-R or --rompath path\t\t- set 'path' to be ROM path\n" -#ifndef USE_SDL_UI - "-S or --settings\t\t\t- show only the settings dialog\n" -#endif - "-T or --testmode\t\t- test mode: execute the test mode entry\n" - "\t\t\t\t point on init/hard reset\n" - "-V or --vmname name\t\t- overrides the name of the running VM\n" - "-W or --nohook\t\t- disables keyboard hook\n" - "\t\t\t\t (compatibility-only outside Windows)\n" - "-X or --clear what\t\t- clears the 'what' (cmos/flash/both)\n" - "-Y or --donothing\t\t- do not show any UI or run the emulation\n" - "-Z or --lastvmpath\t\t- the last parameter is VM path rather\n" - "\t\t\t\t than config\n" - "\nA config file can be specified. If none is, the default file will be used.\n"); + pc_show_usage(NULL); return 0; } else if (!strcasecmp(argv[c], "--lastvmpath") || !strcasecmp(argv[c], "-Z")) { lvmp = 1; @@ -730,6 +743,7 @@ usage: goto usage; ppath = argv[++c]; + deprecated = 0; } else if (!strcasecmp(argv[c], "--rompath") || !strcasecmp(argv[c], "-R")) { if ((c + 1) == argc) goto usage; @@ -741,6 +755,7 @@ usage: goto usage; cfg = argv[++c]; + deprecated = 0; } else if (!strcasecmp(argv[c], "--image") || !strcasecmp(argv[c], "-I")) { if ((c + 1) == argc) goto usage; @@ -839,11 +854,18 @@ usage: ppath = argv[c++]; else cfg = argv[c++]; + + deprecated = 0; } if (c != argc) goto usage; + if (deprecated) + pc_show_usage("Running 86Box without a specified VM path and/or configuration\n" + "file has been deprected. Please specify one or use a manager\n" + "(Avalonia 86 is recommended).\n\n"); + path_slash(usr_path); path_slash(rom_path); From 5b4db319bf53e0984568c168fc56e090597846d1 Mon Sep 17 00:00:00 2001 From: OBattler Date: Sun, 27 Apr 2025 18:50:45 +0200 Subject: [PATCH 083/180] Opcode D6 is now an alias of opcode D7 (XLAT) on NEC Vx0, closes #5516. --- src/cpu/808x.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/cpu/808x.c b/src/cpu/808x.c index e98b7de3d..be0d5e6cc 100644 --- a/src/cpu/808x.c +++ b/src/cpu/808x.c @@ -3438,10 +3438,13 @@ execx86(int cycs) set_pzs(8); break; case 0xD6: /*SALC*/ - wait(1, 0); - AL = (cpu_state.flags & C_FLAG) ? 0xff : 0x00; - wait(1, 0); - break; + if (!is_nec) { + wait(1, 0); + AL = (cpu_state.flags & C_FLAG) ? 0xff : 0x00; + wait(1, 0); + break; + } + fallthrough; case 0xD7: /*XLATB*/ cpu_state.eaaddr = (BX + AL) & 0xffff; access(4, 8); From 9b93e71b23f9e0f539387ce22c72e0d5ab3c68ce Mon Sep 17 00:00:00 2001 From: OBattler Date: Sun, 27 Apr 2025 18:57:21 +0200 Subject: [PATCH 084/180] #included the missing plat_fallthrough.h. --- src/cpu/808x.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/cpu/808x.c b/src/cpu/808x.c index be0d5e6cc..dda688ee1 100644 --- a/src/cpu/808x.c +++ b/src/cpu/808x.c @@ -38,6 +38,7 @@ #include <86box/ppi.h> #include <86box/timer.h> #include <86box/gdbstub.h> +#include <86box/plat_fallthrough.h> #include <86box/plat_unused.h> /* Is the CPU 8088 or 8086. */ From d0f682ea08ceed2726fe3ee3eb6a604c50795470 Mon Sep 17 00:00:00 2001 From: OBattler Date: Mon, 28 Apr 2025 04:37:58 +0200 Subject: [PATCH 085/180] Print help to console on non-Windows OS'es unless it's the deprecaption warning. --- src/86box.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/86box.c b/src/86box.c index 66d9afa00..d96a571c0 100644 --- a/src/86box.c +++ b/src/86box.c @@ -632,7 +632,14 @@ pc_show_usage(char *s) "\nA config file can be specified. If none is, the default file will be used.\n", (s == NULL) ? "" : s); +#ifdef _WIN32 ui_msgbox(MBX_ANSI | ((s == NULL) ? MBX_INFO : MBX_WARNING), p); +#else + if (s == NULL) + pclog(p); + else + ui_msgbox(MBX_ANSI | MBX_WARNING, p); +#endif } /* From 94a68a869834ec92a16b66fb7ee38c31a4cb7be5 Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Mon, 28 Apr 2025 14:26:49 +0600 Subject: [PATCH 086/180] Add Mouse Systems Bus Mouse --- src/device/mouse.c | 27 ++++++----- src/device/mouse_serial.c | 97 +++++++++++++++++++++++++++++++++++--- src/device/serial.c | 31 ++++++++---- src/include/86box/mouse.h | 2 + src/include/86box/serial.h | 2 +- 5 files changed, 130 insertions(+), 29 deletions(-) diff --git a/src/device/mouse.c b/src/device/mouse.c index f7d8c9861..0bf87934d 100644 --- a/src/device/mouse.c +++ b/src/device/mouse.c @@ -83,23 +83,24 @@ static const device_t mouse_internal_device = { static mouse_t mouse_devices[] = { // clang-format off - { &mouse_none_device }, - { &mouse_internal_device }, - { &mouse_logibus_device }, - { &mouse_msinport_device }, + { &mouse_none_device }, + { &mouse_internal_device }, + { &mouse_logibus_device }, + { &mouse_msinport_device }, #ifdef USE_GENIBUS - { &mouse_genibus_device }, + { &mouse_genibus_device }, #endif - { &mouse_mssystems_device }, - { &mouse_msserial_device }, - { &mouse_ltserial_device }, - { &mouse_ps2_device }, + { &mouse_mssystems_device }, + { &mouse_mssystems_bus_device }, + { &mouse_msserial_device }, + { &mouse_ltserial_device }, + { &mouse_ps2_device }, #ifdef USE_WACOM - { &mouse_wacom_device }, - { &mouse_wacom_artpad_device }, + { &mouse_wacom_device }, + { &mouse_wacom_artpad_device }, #endif - { &mouse_mtouch_device }, - { NULL } + { &mouse_mtouch_device }, + { NULL } // clang-format on }; diff --git a/src/device/mouse_serial.c b/src/device/mouse_serial.c index 8ed4865cd..24d7ae853 100644 --- a/src/device/mouse_serial.c +++ b/src/device/mouse_serial.c @@ -833,10 +833,6 @@ sermouse_close(void *priv) { mouse_t *dev = (mouse_t *) priv; - /* Detach serial port from the mouse. */ - if (dev && dev->serial && dev->serial->sd) - memset(dev->serial->sd, 0, sizeof(serial_device_t)); - free(dev); } @@ -849,6 +845,11 @@ sermouse_init(const device_t *info) void (*dev_write)(struct serial_s *serial, void *priv, uint8_t data); void (*transmit_period_callback)(struct serial_s *serial, void *priv, double transmit_period); + if (info->local == MOUSE_TYPE_MSYSTEMSB) { + uintptr_t irqbase = ((device_get_config_int("irq") << 16) | (device_get_config_hex16("addr") << 20)) | ns16450_device.local; + device_add_params(&ns16450_device, (void*)irqbase); + } + dev = (mouse_t *) calloc(1, sizeof(mouse_t)); dev->name = info->name; dev->but = device_get_config_int("buttons"); @@ -862,7 +863,7 @@ sermouse_init(const device_t *info) if (dev->but > 2) dev->flags |= FLAG_3BTN; - if (info->local == MOUSE_TYPE_MSYSTEMS) { + if (info->local == MOUSE_TYPE_MSYSTEMS || info->local == MOUSE_TYPE_MSYSTEMSB) { dev->format = 0; dev->type = info->local; dev->id_len = 1; @@ -893,7 +894,7 @@ sermouse_init(const device_t *info) } } - dev->port = device_get_config_int("port"); + dev->port = (info->local == MOUSE_TYPE_MSYSTEMSB) ? SERIAL_MAX : device_get_config_int("port"); /* Attach a serial port to the mouse. */ rcr_callback = dev->rts_toggle ? sermouse_callback : NULL; @@ -968,6 +969,76 @@ static const device_config_t msssermouse_config[] = { // clang-format on }; +static const device_config_t mssbusmouse_config[] = { + // clang-format off + { + .name = "addr", + .description = "Address", + .type = CONFIG_HEX16, + .default_string = NULL, + .default_int = 0x238, + .file_filter = NULL, + .spinner = { 0 }, + .selection = { + { .description = "0x338", .value = 0x338 }, + { .description = "0x238", .value = 0x238 }, + { .description = "" } + }, + .bios = { { 0 } } + }, + + { + .name = "irq", + .description = "IRQ", + .type = CONFIG_SELECTION, + .default_string = NULL, + .default_int = 5, + .file_filter = NULL, + .spinner = { 0 }, + .selection = { + { .description = "IRQ 2", .value = 2 }, + { .description = "IRQ 3", .value = 3 }, + { .description = "IRQ 4", .value = 4 }, + { .description = "IRQ 5", .value = 5 }, + { .description = "IRQ 7", .value = 7 }, + { .description = "IRQ 10", .value = 10 }, + { .description = "IRQ 11", .value = 11 }, + { .description = "IRQ 12", .value = 12 }, + { .description = "IRQ 15", .value = 15 }, + { .description = "" } + }, + .bios = { { 0 } } + }, + { + .name = "buttons", + .description = "Buttons", + .type = CONFIG_SELECTION, + .default_string = NULL, + .default_int = 2, + .file_filter = NULL, + .spinner = { 0 }, + .selection = { + { .description = "Two", .value = 2 }, + { .description = "Three", .value = 3 }, + { .description = "" } + }, + .bios = { { 0 } } + }, + { + .name = "rts_toggle", + .description = "RTS toggle", + .type = CONFIG_BINARY, + .default_string = NULL, + .default_int = 0, + .file_filter = NULL, + .spinner = { 0 }, + .selection = { { 0 } }, + .bios = { { 0 } } + }, + { .name = "", .description = "", .type = CONFIG_END } + // clang-format on + }; + static const device_config_t mssermouse_config[] = { // clang-format off { @@ -1087,6 +1158,20 @@ const device_t mouse_mssystems_device = { .config = msssermouse_config }; +const device_t mouse_mssystems_bus_device = { + .name = "Mouse Systems Bus Mouse", + .internal_name = "mssystems_bus", + .flags = DEVICE_ISA, + .local = MOUSE_TYPE_MSYSTEMSB, + .init = sermouse_init, + .close = sermouse_close, + .reset = NULL, + .available = NULL, + .speed_changed = sermouse_speed_changed, + .force_redraw = NULL, + .config = mssbusmouse_config +}; + const device_t mouse_msserial_device = { .name = "Microsoft Serial Mouse", .internal_name = "msserial", diff --git a/src/device/serial.c b/src/device/serial.c index deb97225a..c00cfad10 100644 --- a/src/device/serial.c +++ b/src/device/serial.c @@ -38,7 +38,7 @@ #include <86box/serial.h> #include <86box/mouse.h> -serial_port_t com_ports[SERIAL_MAX]; +serial_port_t com_ports[SERIAL_MAX + 1]; enum { SERIAL_INT_LSR = 1, @@ -53,7 +53,7 @@ enum { void serial_update_ints(serial_t *dev); static int next_inst = 0; -static serial_device_t serial_devices[SERIAL_MAX]; +static serial_device_t serial_devices[SERIAL_MAX + 1]; static void serial_xmit_d_empty_evt(void *priv); @@ -884,10 +884,10 @@ serial_close(void *priv) { serial_t *dev = (serial_t *) priv; - next_inst--; - - if (com_ports[dev->inst].enabled) + if (dev->sd) { + memset(dev->sd, 0, sizeof(serial_device_t)); fifo_close(dev->rcvr_fifo); + } free(dev); } @@ -897,7 +897,7 @@ serial_reset(void *priv) { serial_t *dev = (serial_t *) priv; - if (com_ports[dev->inst].enabled) { + if (dev->sd) { timer_disable(&dev->transmit_timer); timer_disable(&dev->timeout_timer); timer_disable(&dev->receive_timer); @@ -930,16 +930,28 @@ static void * serial_init(const device_t *info) { serial_t *dev = (serial_t *) calloc(1, sizeof(serial_t)); + int orig_inst = next_inst; + + if (info->local & 0xFFF00000) { + next_inst = SERIAL_MAX; + } dev->inst = next_inst; - if (com_ports[next_inst].enabled) { + if (com_ports[next_inst].enabled || (info->local & 0xFFF00000)) { serial_log("Adding serial port %i...\n", next_inst); dev->type = info->local; memset(&(serial_devices[next_inst]), 0, sizeof(serial_device_t)); dev->sd = &(serial_devices[next_inst]); dev->sd->serial = dev; - if (next_inst == 6) + + if (info->local & 0xFFF00000) { + dev->base_address = info->local >> 20; + dev->irq = (info->local >> 16) & 0xF; + io_sethandler(dev->base_address, 0x0008, serial_read, NULL, NULL, serial_write, NULL, NULL, dev); + next_inst = orig_inst; + } + else if (next_inst == 6) serial_setup(dev, COM7_ADDR, COM7_IRQ); else if (next_inst == 5) serial_setup(dev, COM6_ADDR, COM6_IRQ); @@ -984,7 +996,8 @@ serial_init(const device_t *info) serial_reset_port(dev); } - next_inst++; + if (!(info->local & 0xFFF00000)) + next_inst++; return dev; } diff --git a/src/include/86box/mouse.h b/src/include/86box/mouse.h index 333849846..8dd3bad2d 100644 --- a/src/include/86box/mouse.h +++ b/src/include/86box/mouse.h @@ -41,6 +41,7 @@ #define MOUSE_TYPE_PS2 11 /* PS/2 series Bus Mouse */ #define MOUSE_TYPE_WACOM 12 /* WACOM tablet */ #define MOUSE_TYPE_WACOMARTP 13 /* WACOM tablet (ArtPad) */ +#define MOUSE_TYPE_MSYSTEMSB 14 /* Mouse Systems bus mouse */ #define MOUSE_TYPE_ONBOARD 0x80 /* Mouse is an on-board version of one of the above. */ @@ -68,6 +69,7 @@ extern const device_t mouse_msinport_device; extern const device_t mouse_genibus_device; # endif extern const device_t mouse_mssystems_device; +extern const device_t mouse_mssystems_bus_device; extern const device_t mouse_msserial_device; extern const device_t mouse_ltserial_device; extern const device_t mouse_ps2_device; diff --git a/src/include/86box/serial.h b/src/include/86box/serial.h index 31c77ce5a..c6259d7bc 100644 --- a/src/include/86box/serial.h +++ b/src/include/86box/serial.h @@ -116,7 +116,7 @@ typedef struct serial_port_s { uint8_t enabled; } serial_port_t; -extern serial_port_t com_ports[SERIAL_MAX]; +extern serial_port_t com_ports[SERIAL_MAX + 1]; extern serial_t *serial_attach_ex(int port, void (*rcr_callback)(struct serial_s *serial, void *priv), From 6fc6a16be6c8a408a3ae2f1d4729f60b20e18da8 Mon Sep 17 00:00:00 2001 From: OBattler Date: Mon, 28 Apr 2025 11:18:57 +0200 Subject: [PATCH 087/180] Fixed a few minor things with how the Mouse Systems Bus Mouse as added. --- src/86box.c | 2 +- src/config.c | 6 +++--- src/device/mouse_serial.c | 11 ++++++++--- src/device/serial.c | 18 ++++++++---------- src/device/serial_passthrough.c | 2 +- src/include/86box/86box.h | 2 +- src/include/86box/serial.h | 2 +- src/include/86box/serial_passthrough.h | 2 +- src/qt/qt_settingsports.cpp | 4 ++-- 9 files changed, 26 insertions(+), 23 deletions(-) diff --git a/src/86box.c b/src/86box.c index d96a571c0..cd573d98f 100644 --- a/src/86box.c +++ b/src/86box.c @@ -174,7 +174,7 @@ int force_43 = 0; /* (C) video * int video_filter_method = 1; /* (C) video */ int video_vsync = 0; /* (C) video */ int video_framerate = -1; /* (C) video */ -bool serial_passthrough_enabled[SERIAL_MAX] = { 0, 0, 0, 0, 0, 0, 0 }; /* (C) activation and kind of +bool serial_passthrough_enabled[SERIAL_MAX - 1] = { 0, 0, 0, 0, 0, 0, 0 }; /* (C) activation and kind of pass-through for serial ports */ int bugger_enabled = 0; /* (C) enable ISAbugger */ int novell_keycard_enabled = 0; /* (C) enable Novell NetWare 2.x key card emulation. */ diff --git a/src/config.c b/src/config.c index 98923d9cf..52a80763a 100644 --- a/src/config.c +++ b/src/config.c @@ -746,7 +746,7 @@ load_ports(void) char temp[512]; memset(temp, 0, sizeof(temp)); - for (int c = 0; c < SERIAL_MAX; c++) { + for (int c = 0; c < (SERIAL_MAX - 1); c++) { sprintf(temp, "serial%d_enabled", c + 1); com_ports[c].enabled = !!ini_section_get_int(cat, temp, (c >= 2) ? 0 : 1); @@ -1839,7 +1839,7 @@ config_load(void) com_ports[0].enabled = 1; com_ports[1].enabled = 1; - for (i = 2; i < SERIAL_MAX; i++) + for (i = 2; i < (SERIAL_MAX - 1); i++) com_ports[i].enabled = 0; lpt_ports[0].enabled = 1; @@ -2459,7 +2459,7 @@ save_ports(void) ini_section_t cat = ini_find_or_create_section(config, "Ports (COM & LPT)"); char temp[512]; - for (int c = 0; c < SERIAL_MAX; c++) { + for (int c = 0; c < (SERIAL_MAX - 1); c++) { sprintf(temp, "serial%d_enabled", c + 1); if (((c < 2) && com_ports[c].enabled) || ((c >= 2) && !com_ports[c].enabled)) ini_section_delete_var(cat, temp); diff --git a/src/device/mouse_serial.c b/src/device/mouse_serial.c index 24d7ae853..7505cf3a3 100644 --- a/src/device/mouse_serial.c +++ b/src/device/mouse_serial.c @@ -843,10 +843,13 @@ sermouse_init(const device_t *info) mouse_t *dev; void (*rcr_callback)(struct serial_s *serial, void *priv); void (*dev_write)(struct serial_s *serial, void *priv, uint8_t data); - void (*transmit_period_callback)(struct serial_s *serial, void *priv, double transmit_period); + void (*transmit_period_callback)(struct serial_s *serial, void *priv, + double transmit_period); if (info->local == MOUSE_TYPE_MSYSTEMSB) { - uintptr_t irqbase = ((device_get_config_int("irq") << 16) | (device_get_config_hex16("addr") << 20)) | ns16450_device.local; + uintptr_t irqbase = ((device_get_config_int("irq") << 16) | + (device_get_config_hex16("addr") << 20)) | + ns16450_device.local; device_add_params(&ns16450_device, (void*)irqbase); } @@ -894,7 +897,7 @@ sermouse_init(const device_t *info) } } - dev->port = (info->local == MOUSE_TYPE_MSYSTEMSB) ? SERIAL_MAX : device_get_config_int("port"); + dev->port = (info->local == MOUSE_TYPE_MSYSTEMSB) ? (SERIAL_MAX - 1) : device_get_config_int("port"); /* Attach a serial port to the mouse. */ rcr_callback = dev->rts_toggle ? sermouse_callback : NULL; @@ -982,6 +985,8 @@ static const device_config_t mssbusmouse_config[] = { .selection = { { .description = "0x338", .value = 0x338 }, { .description = "0x238", .value = 0x238 }, + { .description = "0x3f8", .value = 0x3f8 }, + { .description = "0x2f8", .value = 0x2f8 }, { .description = "" } }, .bios = { { 0 } } diff --git a/src/device/serial.c b/src/device/serial.c index c00cfad10..71be924c1 100644 --- a/src/device/serial.c +++ b/src/device/serial.c @@ -38,7 +38,7 @@ #include <86box/serial.h> #include <86box/mouse.h> -serial_port_t com_ports[SERIAL_MAX + 1]; +serial_port_t com_ports[SERIAL_MAX]; enum { SERIAL_INT_LSR = 1, @@ -53,7 +53,7 @@ enum { void serial_update_ints(serial_t *dev); static int next_inst = 0; -static serial_device_t serial_devices[SERIAL_MAX + 1]; +static serial_device_t serial_devices[SERIAL_MAX]; static void serial_xmit_d_empty_evt(void *priv); @@ -932,9 +932,8 @@ serial_init(const device_t *info) serial_t *dev = (serial_t *) calloc(1, sizeof(serial_t)); int orig_inst = next_inst; - if (info->local & 0xFFF00000) { - next_inst = SERIAL_MAX; - } + if (info->local & 0xFFF00000) + next_inst = SERIAL_MAX - 1; dev->inst = next_inst; @@ -945,13 +944,12 @@ serial_init(const device_t *info) dev->sd = &(serial_devices[next_inst]); dev->sd->serial = dev; - if (info->local & 0xFFF00000) { + if (info->local & 0xfff00000) { dev->base_address = info->local >> 20; dev->irq = (info->local >> 16) & 0xF; io_sethandler(dev->base_address, 0x0008, serial_read, NULL, NULL, serial_write, NULL, NULL, dev); next_inst = orig_inst; - } - else if (next_inst == 6) + } else if (next_inst == 6) serial_setup(dev, COM7_ADDR, COM7_IRQ); else if (next_inst == 5) serial_setup(dev, COM6_ADDR, COM6_IRQ); @@ -996,7 +994,7 @@ serial_init(const device_t *info) serial_reset_port(dev); } - if (!(info->local & 0xFFF00000)) + if (!(info->local & 0xfff00000)) next_inst++; return dev; @@ -1011,7 +1009,7 @@ serial_set_next_inst(int ni) void serial_standalone_init(void) { - while (next_inst < SERIAL_MAX) + while (next_inst < (SERIAL_MAX - 1)) device_add_inst(&ns8250_device, next_inst + 1); }; diff --git a/src/device/serial_passthrough.c b/src/device/serial_passthrough.c index 3ad969006..25db29096 100644 --- a/src/device/serial_passthrough.c +++ b/src/device/serial_passthrough.c @@ -54,7 +54,7 @@ serial_passthrough_log(const char *fmt, ...) void serial_passthrough_init(void) { - for (uint8_t c = 0; c < SERIAL_MAX; c++) { + for (uint8_t c = 0; c < (SERIAL_MAX - 1); c++) { if (serial_passthrough_enabled[c]) { /* Instance n for COM n */ device_add_inst(&serial_passthrough_device, c + 1); diff --git a/src/include/86box/86box.h b/src/include/86box/86box.h index 7f7723bba..e19665535 100644 --- a/src/include/86box/86box.h +++ b/src/include/86box/86box.h @@ -27,7 +27,7 @@ /* Configuration values. */ #define GFXCARD_MAX 2 -#define SERIAL_MAX 7 +#define SERIAL_MAX 8 #define PARALLEL_MAX 4 #define SCREEN_RES_X 640 #define SCREEN_RES_Y 480 diff --git a/src/include/86box/serial.h b/src/include/86box/serial.h index c6259d7bc..31c77ce5a 100644 --- a/src/include/86box/serial.h +++ b/src/include/86box/serial.h @@ -116,7 +116,7 @@ typedef struct serial_port_s { uint8_t enabled; } serial_port_t; -extern serial_port_t com_ports[SERIAL_MAX + 1]; +extern serial_port_t com_ports[SERIAL_MAX]; extern serial_t *serial_attach_ex(int port, void (*rcr_callback)(struct serial_s *serial, void *priv), diff --git a/src/include/86box/serial_passthrough.h b/src/include/86box/serial_passthrough.h index 7ca6479d6..c5454194a 100644 --- a/src/include/86box/serial_passthrough.h +++ b/src/include/86box/serial_passthrough.h @@ -55,7 +55,7 @@ typedef struct serial_passthrough_s { void *backend_priv; /* Private platform backend data */ } serial_passthrough_t; -extern bool serial_passthrough_enabled[SERIAL_MAX]; +extern bool serial_passthrough_enabled[SERIAL_MAX - 1]; extern const device_t serial_passthrough_device; extern void serial_passthrough_init(void); diff --git a/src/qt/qt_settingsports.cpp b/src/qt/qt_settingsports.cpp index f68106dc9..2b57a683c 100644 --- a/src/qt/qt_settingsports.cpp +++ b/src/qt/qt_settingsports.cpp @@ -58,7 +58,7 @@ SettingsPorts::save() lpt_ports[i].enabled = checkBox->isChecked() ? 1 : 0; } - for (int i = 0; i < SERIAL_MAX; i++) { + for (int i = 0; i < (SERIAL_MAX - 1); i++) { auto *checkBox = findChild(QString("checkBoxSerial%1").arg(i + 1)); auto *checkBoxPass = findChild(QString("checkBoxSerialPassThru%1").arg(i + 1)); if (checkBox != NULL) @@ -118,7 +118,7 @@ SettingsPorts::onCurrentMachineChanged(int machineId) cbox[i]->setEnabled(lpt_ports[i].enabled > 0); } - for (int i = 0; i < SERIAL_MAX; i++) { + for (int i = 0; i < (SERIAL_MAX - 1); i++) { auto *checkBox = findChild(QString("checkBoxSerial%1").arg(i + 1)); auto *checkBoxPass = findChild(QString("checkBoxSerialPassThru%1").arg(i + 1)); auto *buttonPass = findChild(QString("pushButtonSerialPassThru%1").arg(i + 1)); From aa940316ffe6446fcadfd923b85af9a1929f20ed Mon Sep 17 00:00:00 2001 From: Alexander Babikov Date: Mon, 28 Apr 2025 18:00:49 +0500 Subject: [PATCH 088/180] qt: For device config dialogs, default to the settings dialog as the parent Fixes (somehow) controls being non-interactable when no parent dialog is passed and 86Box is running in settings-only mode --- src/qt/qt_deviceconfig.hpp | 2 +- src/qt/qt_settingsdisplay.cpp | 16 ++++++++-------- src/qt/qt_settingsinput.cpp | 2 +- src/qt/qt_settingsmachine.cpp | 2 +- src/qt/qt_settingsnetwork.cpp | 8 ++++---- src/qt/qt_settingsotherperipherals.cpp | 10 +++++----- src/qt/qt_settingsports.cpp | 14 +++++++------- src/qt/qt_settingssound.cpp | 18 ++++++++---------- src/qt/qt_settingsstoragecontrollers.cpp | 18 +++++++++--------- 9 files changed, 44 insertions(+), 46 deletions(-) diff --git a/src/qt/qt_deviceconfig.hpp b/src/qt/qt_deviceconfig.hpp index a16c152a6..a5214111f 100644 --- a/src/qt/qt_deviceconfig.hpp +++ b/src/qt/qt_deviceconfig.hpp @@ -23,7 +23,7 @@ public: ~DeviceConfig() override; static void ConfigureDevice(const _device_ *device, int instance = 0, - Settings *settings = nullptr); + Settings *settings = qobject_cast(Settings::settings)); static QString DeviceName(const _device_ *device, const char *internalName, int bus); private: diff --git a/src/qt/qt_settingsdisplay.cpp b/src/qt/qt_settingsdisplay.cpp index b7a930711..fbe6ab5cc 100644 --- a/src/qt/qt_settingsdisplay.cpp +++ b/src/qt/qt_settingsdisplay.cpp @@ -122,22 +122,22 @@ SettingsDisplay::on_pushButtonConfigure_clicked() auto *device = video_card_getdevice(videoCard); if (videoCard == VID_INTERNAL) device = machine_get_vid_device(machineId); - DeviceConfig::ConfigureDevice(device, 0, qobject_cast(Settings::settings)); + DeviceConfig::ConfigureDevice(device); } void SettingsDisplay::on_pushButtonConfigureVoodoo_clicked() { - DeviceConfig::ConfigureDevice(&voodoo_device, 0, qobject_cast(Settings::settings)); + DeviceConfig::ConfigureDevice(&voodoo_device); } void SettingsDisplay::on_pushButtonConfigure8514_clicked() { if (machine_has_bus(machineId, MACHINE_BUS_MCA) > 0) { - DeviceConfig::ConfigureDevice(&ibm8514_mca_device, 0, qobject_cast(Settings::settings)); + DeviceConfig::ConfigureDevice(&ibm8514_mca_device); } else { - DeviceConfig::ConfigureDevice(&gen8514_isa_device, 0, qobject_cast(Settings::settings)); + DeviceConfig::ConfigureDevice(&gen8514_isa_device); } } @@ -145,16 +145,16 @@ void SettingsDisplay::on_pushButtonConfigureXga_clicked() { if (machine_has_bus(machineId, MACHINE_BUS_MCA) > 0) { - DeviceConfig::ConfigureDevice(&xga_device, 0, qobject_cast(Settings::settings)); + DeviceConfig::ConfigureDevice(&xga_device); } else { - DeviceConfig::ConfigureDevice(&xga_isa_device, 0, qobject_cast(Settings::settings)); + DeviceConfig::ConfigureDevice(&xga_isa_device); } } void SettingsDisplay::on_pushButtonConfigureDa2_clicked() { - DeviceConfig::ConfigureDevice(&ps55da2_device, 0, qobject_cast(Settings::settings)); + DeviceConfig::ConfigureDevice(&ps55da2_device); } void @@ -298,5 +298,5 @@ void SettingsDisplay::on_pushButtonConfigureSecondary_clicked() { auto *device = video_card_getdevice(ui->comboBoxVideoSecondary->currentData().toInt()); - DeviceConfig::ConfigureDevice(device, 0, qobject_cast(Settings::settings)); + DeviceConfig::ConfigureDevice(device); } diff --git a/src/qt/qt_settingsinput.cpp b/src/qt/qt_settingsinput.cpp index 695dc43e9..f3729ab3f 100644 --- a/src/qt/qt_settingsinput.cpp +++ b/src/qt/qt_settingsinput.cpp @@ -274,7 +274,7 @@ void SettingsInput::on_pushButtonConfigureMouse_clicked() { int mouseId = ui->comboBoxMouse->currentData().toInt(); - DeviceConfig::ConfigureDevice(mouse_get_device(mouseId), 0, qobject_cast(Settings::settings)); + DeviceConfig::ConfigureDevice(mouse_get_device(mouseId)); } static int diff --git a/src/qt/qt_settingsmachine.cpp b/src/qt/qt_settingsmachine.cpp index 939cd9eb2..8548ca8cc 100644 --- a/src/qt/qt_settingsmachine.cpp +++ b/src/qt/qt_settingsmachine.cpp @@ -347,7 +347,7 @@ SettingsMachine::on_pushButtonConfigure_clicked() // deviceconfig_inst_open int machineId = ui->comboBoxMachine->currentData().toInt(); const auto *device = machine_get_device(machineId); - DeviceConfig::ConfigureDevice(device, 0, qobject_cast(Settings::settings)); + DeviceConfig::ConfigureDevice(device); } void SettingsMachine::on_checkBoxFPUSoftfloat_stateChanged(int state) { diff --git a/src/qt/qt_settingsnetwork.cpp b/src/qt/qt_settingsnetwork.cpp index 9a53411d5..1ea48ee6b 100644 --- a/src/qt/qt_settingsnetwork.cpp +++ b/src/qt/qt_settingsnetwork.cpp @@ -240,7 +240,7 @@ SettingsNetwork::on_pushButtonConf1_clicked() auto *device = network_card_getdevice(netCard); if (netCard == NET_INTERNAL) device = machine_get_net_device(machineId); - DeviceConfig::ConfigureDevice(device, 1, qobject_cast(Settings::settings)); + DeviceConfig::ConfigureDevice(device, 1); } void @@ -248,7 +248,7 @@ SettingsNetwork::on_pushButtonConf2_clicked() { int netCard = ui->comboBoxNIC2->currentData().toInt(); auto *device = network_card_getdevice(netCard); - DeviceConfig::ConfigureDevice(device, 2, qobject_cast(Settings::settings)); + DeviceConfig::ConfigureDevice(device, 2); } void @@ -256,7 +256,7 @@ SettingsNetwork::on_pushButtonConf3_clicked() { int netCard = ui->comboBoxNIC3->currentData().toInt(); auto *device = network_card_getdevice(netCard); - DeviceConfig::ConfigureDevice(device, 3, qobject_cast(Settings::settings)); + DeviceConfig::ConfigureDevice(device, 3); } void @@ -264,5 +264,5 @@ SettingsNetwork::on_pushButtonConf4_clicked() { int netCard = ui->comboBoxNIC4->currentData().toInt(); auto *device = network_card_getdevice(netCard); - DeviceConfig::ConfigureDevice(device, 4, qobject_cast(Settings::settings)); + DeviceConfig::ConfigureDevice(device, 4); } diff --git a/src/qt/qt_settingsotherperipherals.cpp b/src/qt/qt_settingsotherperipherals.cpp index b780dc1a6..e1920bf47 100644 --- a/src/qt/qt_settingsotherperipherals.cpp +++ b/src/qt/qt_settingsotherperipherals.cpp @@ -159,7 +159,7 @@ SettingsOtherPeripherals::on_comboBoxRTC_currentIndexChanged(int index) void SettingsOtherPeripherals::on_pushButtonConfigureRTC_clicked() { - DeviceConfig::ConfigureDevice(isartc_get_device(ui->comboBoxRTC->currentData().toInt()), 0, qobject_cast(Settings::settings)); + DeviceConfig::ConfigureDevice(isartc_get_device(ui->comboBoxRTC->currentData().toInt())); } void @@ -174,7 +174,7 @@ SettingsOtherPeripherals::on_comboBoxCard1_currentIndexChanged(int index) void SettingsOtherPeripherals::on_pushButtonConfigureCard1_clicked() { - DeviceConfig::ConfigureDevice(isamem_get_device(ui->comboBoxCard1->currentData().toInt()), 1, qobject_cast(Settings::settings)); + DeviceConfig::ConfigureDevice(isamem_get_device(ui->comboBoxCard1->currentData().toInt()), 1); } void @@ -189,7 +189,7 @@ SettingsOtherPeripherals::on_comboBoxCard2_currentIndexChanged(int index) void SettingsOtherPeripherals::on_pushButtonConfigureCard2_clicked() { - DeviceConfig::ConfigureDevice(isamem_get_device(ui->comboBoxCard2->currentData().toInt()), 2, qobject_cast(Settings::settings)); + DeviceConfig::ConfigureDevice(isamem_get_device(ui->comboBoxCard2->currentData().toInt()), 2); } void @@ -204,7 +204,7 @@ SettingsOtherPeripherals::on_comboBoxCard3_currentIndexChanged(int index) void SettingsOtherPeripherals::on_pushButtonConfigureCard3_clicked() { - DeviceConfig::ConfigureDevice(isamem_get_device(ui->comboBoxCard3->currentData().toInt()), 3, qobject_cast(Settings::settings)); + DeviceConfig::ConfigureDevice(isamem_get_device(ui->comboBoxCard3->currentData().toInt()), 3); } void @@ -219,7 +219,7 @@ SettingsOtherPeripherals::on_comboBoxCard4_currentIndexChanged(int index) void SettingsOtherPeripherals::on_pushButtonConfigureCard4_clicked() { - DeviceConfig::ConfigureDevice(isamem_get_device(ui->comboBoxCard4->currentData().toInt()), 4, qobject_cast(Settings::settings)); + DeviceConfig::ConfigureDevice(isamem_get_device(ui->comboBoxCard4->currentData().toInt()), 4); } void diff --git a/src/qt/qt_settingsports.cpp b/src/qt/qt_settingsports.cpp index 2b57a683c..7e8f2aeda 100644 --- a/src/qt/qt_settingsports.cpp +++ b/src/qt/qt_settingsports.cpp @@ -254,43 +254,43 @@ SettingsPorts::on_checkBoxSerialPassThru7_stateChanged(int state) void SettingsPorts::on_pushButtonSerialPassThru1_clicked() { - DeviceConfig::ConfigureDevice(&serial_passthrough_device, 1, qobject_cast(Settings::settings)); + DeviceConfig::ConfigureDevice(&serial_passthrough_device, 1); } void SettingsPorts::on_pushButtonSerialPassThru2_clicked() { - DeviceConfig::ConfigureDevice(&serial_passthrough_device, 2, qobject_cast(Settings::settings)); + DeviceConfig::ConfigureDevice(&serial_passthrough_device, 2); } void SettingsPorts::on_pushButtonSerialPassThru3_clicked() { - DeviceConfig::ConfigureDevice(&serial_passthrough_device, 3, qobject_cast(Settings::settings)); + DeviceConfig::ConfigureDevice(&serial_passthrough_device, 3); } void SettingsPorts::on_pushButtonSerialPassThru4_clicked() { - DeviceConfig::ConfigureDevice(&serial_passthrough_device, 4, qobject_cast(Settings::settings)); + DeviceConfig::ConfigureDevice(&serial_passthrough_device, 4); } #if 0 void SettingsPorts::on_pushButtonSerialPassThru5_clicked() { - DeviceConfig::ConfigureDevice(&serial_passthrough_device, 5, qobject_cast(Settings::settings)); + DeviceConfig::ConfigureDevice(&serial_passthrough_device, 5); } void SettingsPorts::on_pushButtonSerialPassThru6_clicked() { - DeviceConfig::ConfigureDevice(&serial_passthrough_device, 6, qobject_cast(Settings::settings)); + DeviceConfig::ConfigureDevice(&serial_passthrough_device, 6); } void SettingsPorts::on_pushButtonSerialPassThru7_clicked() { - DeviceConfig::ConfigureDevice(&serial_passthrough_device, 7, qobject_cast(Settings::settings)); + DeviceConfig::ConfigureDevice(&serial_passthrough_device, 7); } #endif diff --git a/src/qt/qt_settingssound.cpp b/src/qt/qt_settingssound.cpp index 3e1240888..e49e1ae27 100644 --- a/src/qt/qt_settingssound.cpp +++ b/src/qt/qt_settingssound.cpp @@ -232,7 +232,7 @@ SettingsSound::on_pushButtonConfigureSoundCard1_clicked() if (sndCard == SOUND_INTERNAL) device = machine_get_snd_device(machineId); - DeviceConfig::ConfigureDevice(device, 1, qobject_cast(Settings::settings)); + DeviceConfig::ConfigureDevice(device, 1); } void @@ -252,7 +252,7 @@ SettingsSound::on_pushButtonConfigureSoundCard2_clicked() { int sndCard = ui->comboBoxSoundCard2->currentData().toInt(); const device_t *device = sound_card_getdevice(sndCard); - DeviceConfig::ConfigureDevice(device, 2, qobject_cast(Settings::settings)); + DeviceConfig::ConfigureDevice(device, 2); } void @@ -273,7 +273,7 @@ SettingsSound::on_pushButtonConfigureSoundCard3_clicked() int sndCard = ui->comboBoxSoundCard3->currentData().toInt(); const device_t *device = sound_card_getdevice(sndCard); - DeviceConfig::ConfigureDevice(device, 3, qobject_cast(Settings::settings)); + DeviceConfig::ConfigureDevice(device, 3); } void @@ -294,7 +294,7 @@ SettingsSound::on_pushButtonConfigureSoundCard4_clicked() int sndCard = ui->comboBoxSoundCard4->currentData().toInt(); const device_t *device = sound_card_getdevice(sndCard); - DeviceConfig::ConfigureDevice(device, 4, qobject_cast(Settings::settings)); + DeviceConfig::ConfigureDevice(device, 4); } void @@ -312,8 +312,7 @@ SettingsSound::on_comboBoxMidiOut_currentIndexChanged(int index) void SettingsSound::on_pushButtonConfigureMidiOut_clicked() { - DeviceConfig::ConfigureDevice(midi_out_device_getdevice(ui->comboBoxMidiOut->currentData().toInt()), 0, - qobject_cast(Settings::settings)); + DeviceConfig::ConfigureDevice(midi_out_device_getdevice(ui->comboBoxMidiOut->currentData().toInt())); } void @@ -331,8 +330,7 @@ SettingsSound::on_comboBoxMidiIn_currentIndexChanged(int index) void SettingsSound::on_pushButtonConfigureMidiIn_clicked() { - DeviceConfig::ConfigureDevice(midi_in_device_getdevice(ui->comboBoxMidiIn->currentData().toInt()), 0, - qobject_cast(Settings::settings)); + DeviceConfig::ConfigureDevice(midi_in_device_getdevice(ui->comboBoxMidiIn->currentData().toInt())); } void @@ -345,7 +343,7 @@ void SettingsSound::on_pushButtonConfigureMPU401_clicked() { if (machine_has_bus(machineId, MACHINE_BUS_MCA) > 0) - DeviceConfig::ConfigureDevice(&mpu401_mca_device, 0, qobject_cast(Settings::settings)); + DeviceConfig::ConfigureDevice(&mpu401_mca_device); else - DeviceConfig::ConfigureDevice(&mpu401_device, 0, qobject_cast(Settings::settings)); + DeviceConfig::ConfigureDevice(&mpu401_device); } diff --git a/src/qt/qt_settingsstoragecontrollers.cpp b/src/qt/qt_settingsstoragecontrollers.cpp index 6fa5906b5..48fa04892 100644 --- a/src/qt/qt_settingsstoragecontrollers.cpp +++ b/src/qt/qt_settingsstoragecontrollers.cpp @@ -281,31 +281,31 @@ SettingsStorageControllers::on_checkBoxQuaternaryIDE_stateChanged(int arg1) void SettingsStorageControllers::on_pushButtonHD_clicked() { - DeviceConfig::ConfigureDevice(hdc_get_device(ui->comboBoxHD->currentData().toInt()), 0, qobject_cast(Settings::settings)); + DeviceConfig::ConfigureDevice(hdc_get_device(ui->comboBoxHD->currentData().toInt())); } void SettingsStorageControllers::on_pushButtonFD_clicked() { - DeviceConfig::ConfigureDevice(fdc_card_getdevice(ui->comboBoxFD->currentData().toInt()), 0, qobject_cast(Settings::settings)); + DeviceConfig::ConfigureDevice(fdc_card_getdevice(ui->comboBoxFD->currentData().toInt())); } void SettingsStorageControllers::on_pushButtonCDInterface_clicked() { - DeviceConfig::ConfigureDevice(cdrom_interface_get_device(ui->comboBoxCDInterface->currentData().toInt()), 0, qobject_cast(Settings::settings)); + DeviceConfig::ConfigureDevice(cdrom_interface_get_device(ui->comboBoxCDInterface->currentData().toInt())); } void SettingsStorageControllers::on_pushButtonTertiaryIDE_clicked() { - DeviceConfig::ConfigureDevice(&ide_ter_device, 0, qobject_cast(Settings::settings)); + DeviceConfig::ConfigureDevice(&ide_ter_device); } void SettingsStorageControllers::on_pushButtonQuaternaryIDE_clicked() { - DeviceConfig::ConfigureDevice(&ide_qua_device, 0, qobject_cast(Settings::settings)); + DeviceConfig::ConfigureDevice(&ide_qua_device); } void @@ -347,25 +347,25 @@ SettingsStorageControllers::on_comboBoxSCSI4_currentIndexChanged(int index) void SettingsStorageControllers::on_pushButtonSCSI1_clicked() { - DeviceConfig::ConfigureDevice(scsi_card_getdevice(ui->comboBoxSCSI1->currentData().toInt()), 1, qobject_cast(Settings::settings)); + DeviceConfig::ConfigureDevice(scsi_card_getdevice(ui->comboBoxSCSI1->currentData().toInt()), 1); } void SettingsStorageControllers::on_pushButtonSCSI2_clicked() { - DeviceConfig::ConfigureDevice(scsi_card_getdevice(ui->comboBoxSCSI2->currentData().toInt()), 2, qobject_cast(Settings::settings)); + DeviceConfig::ConfigureDevice(scsi_card_getdevice(ui->comboBoxSCSI2->currentData().toInt()), 2); } void SettingsStorageControllers::on_pushButtonSCSI3_clicked() { - DeviceConfig::ConfigureDevice(scsi_card_getdevice(ui->comboBoxSCSI3->currentData().toInt()), 3, qobject_cast(Settings::settings)); + DeviceConfig::ConfigureDevice(scsi_card_getdevice(ui->comboBoxSCSI3->currentData().toInt()), 3); } void SettingsStorageControllers::on_pushButtonSCSI4_clicked() { - DeviceConfig::ConfigureDevice(scsi_card_getdevice(ui->comboBoxSCSI4->currentData().toInt()), 4, qobject_cast(Settings::settings)); + DeviceConfig::ConfigureDevice(scsi_card_getdevice(ui->comboBoxSCSI4->currentData().toInt()), 4); } void From d566a0620285ed3d625fe01b6d1a85f14b3cf43d Mon Sep 17 00:00:00 2001 From: TC1995 Date: Mon, 28 Apr 2025 19:28:58 +0200 Subject: [PATCH 089/180] Fix pitch regression of the ATI Mach8/32 side (April 28th, 2025) This patch fixes the pitch that was originally 0 when specifying the 8514/A compatible side in the Mach8/32 cards, which should be 1024 for 8514/A compatible stuff. --- src/video/vid_ati_mach8.c | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/video/vid_ati_mach8.c b/src/video/vid_ati_mach8.c index 5cbd48623..d2fde4f93 100644 --- a/src/video/vid_ati_mach8.c +++ b/src/video/vid_ati_mach8.c @@ -2761,9 +2761,9 @@ ati8514_recalctimings(svga_t *svga) mach_log("ON=%d, vgahdisp=%d.\n", dev->on, svga->hdisp); if (dev->on) { - mach_log("8514/A ON.\n"); - dev->pitch = ((mach->accel.ge_pitch & 0xff) << 3); + mach_log("8514/A ON, pitch=%d.\n", dev->ext_pitch); dev->interlace = !!(dev->disp_cntl & 0x10); + dev->pitch = dev->ext_pitch; dev->rowoffset = dev->ext_crt_pitch; dev->rowcount = !!(dev->disp_cntl & 0x08); dev->accel.ge_offset = (mach->accel.ge_offset_lo | (mach->accel.ge_offset_hi << 16)) << 2; @@ -2865,7 +2865,7 @@ mach_recalctimings(svga_t *svga) if (dev->on) { dev->ma_latch = 0; /*(mach->accel.crt_offset_lo | (mach->accel.crt_offset_hi << 16)) << 2;*/ dev->interlace = !!(dev->disp_cntl & 0x10); - dev->pitch = ((mach->accel.ge_pitch & 0xff) << 3); + dev->pitch = dev->ext_pitch; dev->rowoffset = dev->ext_crt_pitch; dev->rowcount = !!(dev->disp_cntl & 0x08); dev->accel.ge_offset = (mach->accel.ge_offset_lo | (mach->accel.ge_offset_hi << 16)); @@ -3321,6 +3321,7 @@ mach_accel_out_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, u mach_set_resolution(mach, svga); mach32_updatemapping(mach, svga); } else { + dev->ext_pitch = 1024; dev->ext_crt_pitch = 128; mach_set_resolution(mach, svga); } @@ -3515,8 +3516,11 @@ mach_accel_out_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, u ibm8514_accel_out_fifo(svga, port, val, len); if (len == 2) { if ((dev->accel.multifunc_cntl >> 12) == 5) { - if (!ATI_MACH32) + if (!ATI_MACH32) { + dev->ext_pitch = 1024; dev->ext_crt_pitch = 128; + svga_recalctimings(svga); + } } } break; @@ -3847,6 +3851,7 @@ mach_accel_out_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, u else { WRITE8(port, mach->accel.ge_pitch, val); } + dev->ext_pitch = ((mach->accel.ge_pitch & 0xff) << 3); mach_log("ATI 8514/A: (0x%04x) GE Pitch val=0x%02x.\n", port, val); svga_recalctimings(svga); break; From ad4ec20374d08ddb3b8e8919d2fc775ab3e0c22e Mon Sep 17 00:00:00 2001 From: OBattler Date: Tue, 29 Apr 2025 00:33:51 +0200 Subject: [PATCH 090/180] Modify the CL-GD 54xx (S)VGA read and write handlers in order to use the pointer to the svga struct instead of the gd54xx struct, fixes #5521. --- src/include/86box/vid_svga.h | 2 + src/video/vid_cl54xx.c | 78 ++++++++++++++++++------------------ 2 files changed, 41 insertions(+), 39 deletions(-) diff --git a/src/include/86box/vid_svga.h b/src/include/86box/vid_svga.h index 932aa718a..6de73f9f9 100644 --- a/src/include/86box/vid_svga.h +++ b/src/include/86box/vid_svga.h @@ -315,6 +315,8 @@ typedef struct svga_t { card should not attempt to display anything. */ void (*render_override)(void *priv); void * priv_parent; + + void * local; } svga_t; extern void ibm8514_set_poll(svga_t *svga); diff --git a/src/video/vid_cl54xx.c b/src/video/vid_cl54xx.c index b60f9bdca..4988b3797 100644 --- a/src/video/vid_cl54xx.c +++ b/src/video/vid_cl54xx.c @@ -2263,8 +2263,8 @@ gd54xx_mem_sys_src_write(gd54xx_t *gd54xx, uint8_t val, uint8_t ap) static void gd54xx_write(uint32_t addr, uint8_t val, void *priv) { - gd54xx_t *gd54xx = (gd54xx_t *) priv; - svga_t *svga = &gd54xx->svga; + svga_t *svga = (svga_t *) priv; + gd54xx_t *gd54xx = (gd54xx_t *) svga->local; if (gd54xx->countminusone && !gd54xx->blt.ms_is_dest && !(gd54xx->blt.status & CIRRUS_BLT_PAUSED)) { @@ -2282,16 +2282,16 @@ gd54xx_write(uint32_t addr, uint8_t val, void *priv) static void gd54xx_writew(uint32_t addr, uint16_t val, void *priv) { - gd54xx_t *gd54xx = (gd54xx_t *) priv; - svga_t *svga = &gd54xx->svga; + svga_t *svga = (svga_t *) priv; + gd54xx_t *gd54xx = (gd54xx_t *) svga->local; if (gd54xx->countminusone && !gd54xx->blt.ms_is_dest && !(gd54xx->blt.status & CIRRUS_BLT_PAUSED)) { if ((gd54xx->blt.mode & CIRRUS_BLTMODE_COLOREXPAND) && (gd54xx->blt.modeext & CIRRUS_BLTMODEEXT_DWORDGRANULARITY)) val = (val >> 8) | (val << 8); - gd54xx_write(addr, val, gd54xx); - gd54xx_write(addr + 1, val >> 8, gd54xx); + gd54xx_write(addr, val, svga); + gd54xx_write(addr + 1, val >> 8, svga); return; } @@ -2312,18 +2312,18 @@ gd54xx_writew(uint32_t addr, uint16_t val, void *priv) static void gd54xx_writel(uint32_t addr, uint32_t val, void *priv) { - gd54xx_t *gd54xx = (gd54xx_t *) priv; - svga_t *svga = &gd54xx->svga; + svga_t *svga = (svga_t *) priv; + gd54xx_t *gd54xx = (gd54xx_t *) svga->local; if (gd54xx->countminusone && !gd54xx->blt.ms_is_dest && !(gd54xx->blt.status & CIRRUS_BLT_PAUSED)) { if ((gd54xx->blt.mode & CIRRUS_BLTMODE_COLOREXPAND) && (gd54xx->blt.modeext & CIRRUS_BLTMODEEXT_DWORDGRANULARITY)) val = ((val & 0xff000000) >> 24) | ((val & 0x00ff0000) >> 8) | ((val & 0x0000ff00) << 8) | ((val & 0x000000ff) << 24); - gd54xx_write(addr, val, gd54xx); - gd54xx_write(addr + 1, val >> 8, gd54xx); - gd54xx_write(addr + 2, val >> 16, gd54xx); - gd54xx_write(addr + 3, val >> 24, gd54xx); + gd54xx_write(addr, val, svga); + gd54xx_write(addr + 1, val >> 8, svga); + gd54xx_write(addr + 2, val >> 16, svga); + gd54xx_write(addr + 3, val >> 24, svga); return; } @@ -2881,8 +2881,8 @@ gd54xx_writel_linear(uint32_t addr, uint32_t val, void *priv) static uint8_t gd54xx_read(uint32_t addr, void *priv) { - gd54xx_t *gd54xx = (gd54xx_t *) priv; - svga_t *svga = &gd54xx->svga; + svga_t *svga = (svga_t *) priv; + gd54xx_t *gd54xx = (gd54xx_t *) svga->local; if (gd54xx->countminusone && gd54xx->blt.ms_is_dest && !(gd54xx->blt.status & CIRRUS_BLT_PAUSED)) @@ -2898,14 +2898,14 @@ gd54xx_read(uint32_t addr, void *priv) static uint16_t gd54xx_readw(uint32_t addr, void *priv) { - gd54xx_t *gd54xx = (gd54xx_t *) priv; - svga_t *svga = &gd54xx->svga; + svga_t *svga = (svga_t *) priv; + gd54xx_t *gd54xx = (gd54xx_t *) svga->local; uint16_t ret; if (gd54xx->countminusone && gd54xx->blt.ms_is_dest && !(gd54xx->blt.status & CIRRUS_BLT_PAUSED)) { - ret = gd54xx_read(addr, priv); - ret |= gd54xx_read(addr + 1, priv) << 8; + ret = gd54xx_read(addr, svga); + ret |= gd54xx_read(addr + 1, svga) << 8; return ret; } @@ -2920,16 +2920,16 @@ gd54xx_readw(uint32_t addr, void *priv) static uint32_t gd54xx_readl(uint32_t addr, void *priv) { - gd54xx_t *gd54xx = (gd54xx_t *) priv; - svga_t *svga = &gd54xx->svga; + svga_t *svga = (svga_t *) priv; + gd54xx_t *gd54xx = (gd54xx_t *) svga->local; uint32_t ret; if (gd54xx->countminusone && gd54xx->blt.ms_is_dest && !(gd54xx->blt.status & CIRRUS_BLT_PAUSED)) { - ret = gd54xx_read(addr, priv); - ret |= gd54xx_read(addr + 1, priv) << 8; - ret |= gd54xx_read(addr + 2, priv) << 16; - ret |= gd54xx_read(addr + 3, priv) << 24; + ret = gd54xx_read(addr, svga); + ret |= gd54xx_read(addr + 1, svga) << 8; + ret |= gd54xx_read(addr + 2, svga) << 16; + ret |= gd54xx_read(addr + 3, svga) << 24; return ret; } @@ -3120,7 +3120,7 @@ gd543x_mmio_write(uint32_t addr, uint8_t val, void *priv) break; } } else if (gd54xx->mmio_vram_overlap) - gd54xx_write(addr, val, gd54xx); + gd54xx_write(addr, val, svga); } static void @@ -3153,8 +3153,8 @@ gd543x_mmio_writew(uint32_t addr, uint16_t val, void *priv) gd543x_mmio_write(addr, val & 0xff, gd54xx); gd543x_mmio_write(addr + 1, val >> 8, gd54xx); } else { - gd54xx_write(addr, val, gd54xx); - gd54xx_write(addr + 1, val >> 8, gd54xx); + gd54xx_write(addr, val, svga); + gd54xx_write(addr + 1, val >> 8, svga); } } } @@ -3178,10 +3178,10 @@ gd543x_mmio_writel(uint32_t addr, uint32_t val, void *priv) gd543x_mmio_write(addr + 2, val >> 16, gd54xx); gd543x_mmio_write(addr + 3, val >> 24, gd54xx); } else { - gd54xx_write(addr, val, gd54xx); - gd54xx_write(addr + 1, val >> 8, gd54xx); - gd54xx_write(addr + 2, val >> 16, gd54xx); - gd54xx_write(addr + 3, val >> 24, gd54xx); + gd54xx_write(addr, val, svga); + gd54xx_write(addr + 1, val >> 8, svga); + gd54xx_write(addr + 2, val >> 16, svga); + gd54xx_write(addr + 3, val >> 24, svga); } } } @@ -3320,7 +3320,7 @@ gd543x_mmio_read(uint32_t addr, void *priv) break; } } else if (gd54xx->mmio_vram_overlap) - ret = gd54xx_read(addr, gd54xx); + ret = gd54xx_read(addr, svga); else if (gd54xx->countminusone && gd54xx->blt.ms_is_dest && !(gd54xx->blt.status & CIRRUS_BLT_PAUSED)) ret = gd54xx_mem_sys_dest_read(gd54xx, 0); @@ -3338,7 +3338,7 @@ gd543x_mmio_readw(uint32_t addr, void *priv) if (gd543x_do_mmio(svga, addr)) ret = gd543x_mmio_read(addr, gd54xx) | (gd543x_mmio_read(addr + 1, gd54xx) << 8); else if (gd54xx->mmio_vram_overlap) - ret = gd54xx_read(addr, gd54xx) | (gd54xx_read(addr + 1, gd54xx) << 8); + ret = gd54xx_read(addr, svga) | (gd54xx_read(addr + 1, svga) << 8); else if (gd54xx->countminusone && gd54xx->blt.ms_is_dest && !(gd54xx->blt.status & CIRRUS_BLT_PAUSED)) { ret = gd543x_mmio_read(addr, priv); @@ -3361,7 +3361,7 @@ gd543x_mmio_readl(uint32_t addr, void *priv) (gd543x_mmio_read(addr + 2, gd54xx) << 16) | (gd543x_mmio_read(addr + 3, gd54xx) << 24); else if (gd54xx->mmio_vram_overlap) - ret = gd54xx_read(addr, gd54xx) | (gd54xx_read(addr + 1, gd54xx) << 8) | + ret = gd54xx_read(addr, svga) | (gd54xx_read(addr + 1, svga) << 8) | (gd54xx_read(addr + 2, gd54xx) << 16) | (gd54xx_read(addr + 3, gd54xx) << 24); else if (gd54xx->countminusone && gd54xx->blt.ms_is_dest && !(gd54xx->blt.status & CIRRUS_BLT_PAUSED)) { @@ -4141,6 +4141,8 @@ gd54xx_reset(void *priv) gd54xx_t *gd54xx = (gd54xx_t *) priv; svga_t *svga = &gd54xx->svga; + pclog("gd54xx_reset()\n"); + memset(svga->crtc, 0x00, sizeof(svga->crtc)); memset(svga->seqregs, 0x00, sizeof(svga->seqregs)); memset(svga->gdcreg, 0x00, sizeof(svga->gdcreg)); @@ -4159,7 +4161,6 @@ gd54xx_reset(void *priv) memset(gd54xx->pci_regs, 0x00, 256); - mem_mapping_set_p(&svga->mapping, gd54xx); mem_mapping_disable(&gd54xx->mmio_mapping); mem_mapping_disable(&gd54xx->linear_mapping); mem_mapping_disable(&gd54xx->aperture2_mapping); @@ -4210,7 +4211,7 @@ gd54xx_reset(void *priv) static void * gd54xx_init(const device_t *info) { - gd54xx_t *gd54xx = malloc(sizeof(gd54xx_t)); + gd54xx_t *gd54xx = calloc(1, sizeof(gd54xx_t)); svga_t *svga = &gd54xx->svga; int id = info->local & 0xff; int vram; @@ -4218,8 +4219,6 @@ gd54xx_init(const device_t *info) const char *romfn1 = NULL; const char *romfn2 = NULL; - memset(gd54xx, 0, sizeof(gd54xx_t)); - gd54xx->pci = !!(info->flags & DEVICE_PCI); gd54xx->vlb = !!(info->flags & DEVICE_VLB); gd54xx->mca = !!(info->flags & DEVICE_MCA); @@ -4475,7 +4474,6 @@ gd54xx_init(const device_t *info) if ((id <= CIRRUS_ID_CLGD5429) || (!gd54xx->pci && !gd54xx->vlb)) mem_mapping_set_base_ignore(&gd54xx->linear_mapping, 0xff000000); - mem_mapping_set_p(&svga->mapping, gd54xx); mem_mapping_disable(&gd54xx->mmio_mapping); mem_mapping_disable(&gd54xx->linear_mapping); mem_mapping_disable(&gd54xx->aperture2_mapping); @@ -4538,6 +4536,8 @@ gd54xx_init(const device_t *info) gd54xx->overlay.colorkeycompare = 0xff; + svga->local = gd54xx; + return gd54xx; } From 0da871f54e45f8b7ac349c3f304d22732cc95a5a Mon Sep 17 00:00:00 2001 From: TC1995 Date: Tue, 29 Apr 2025 00:39:26 +0200 Subject: [PATCH 091/180] Vast overhaul to the 15bpp/16bpp accelerated mode of the 911/924. 1. See above, as best as possible, but manuals would be helpful. 2. Reverted the ramdac of the 924 to the sierra one because of a bug that triggers 24bpp mode when it shouldn't. --- src/video/vid_s3.c | 563 +++++++++++++++++++++++++++++++++++---------- 1 file changed, 445 insertions(+), 118 deletions(-) diff --git a/src/video/vid_s3.c b/src/video/vid_s3.c index ef21b18df..8fa392891 100644 --- a/src/video/vid_s3.c +++ b/src/video/vid_s3.c @@ -245,6 +245,8 @@ typedef struct s3_t { uint32_t pat_bg_color, pat_fg_color; uint32_t bkgd_color; uint32_t frgd_color; + uint16_t bkgd_color_back; + uint16_t frgd_color_back; uint32_t wrt_mask; uint32_t rd_mask; uint32_t color_cmp; @@ -253,7 +255,8 @@ typedef struct s3_t { uint16_t multifunc_cntl; uint16_t multifunc[16]; uint8_t pix_trans[4]; - uint16_t pix_trans_val; + uint8_t pix_trans_val[2048][2048]; + int pix_trans_inc; int ssv_state; int16_t cx, cy; @@ -281,7 +284,10 @@ typedef struct s3_t { uint8_t bkgd_color_actual[2]; uint8_t wrt_mask_actual[2]; int color_16bit_check; + int color_16bit_check_pixtrans; int16_t minus; + int rd_mask_16bit_check; + int start; /*For non-threaded FIFO*/ int setup_fifo_slot; @@ -611,18 +617,34 @@ s3_accel_out_pixtrans_w(s3_t *s3, uint16_t val) if (((s3->accel.frgd_mix & 0x60) != 0x40) || ((s3->accel.bkgd_mix & 0x60) != 0x40)) { if (s3->accel.cmd & 0x1000) val = (val >> 8) | (val << 8); + s3->accel_start(8, 1, val | (val << 16), 0, s3); } else { - if ((s3->bpp == 0) && s3->color_16bit) + if ((s3->bpp == 0) && s3->color_16bit) { + if (s3->accel.rd_mask_16bit_check) { + if (s3->accel.cur_x & 0x400) + val = (val >> 8) | (val << 8); + } else { + if (s3->accel.cur_x & 0x400) + s3->accel.color_16bit_check_pixtrans = 1; + else + s3->accel.color_16bit_check_pixtrans = 0; + } s3->accel_start(2, 1, 0xffffffff, val | (val << 16), s3); - else + } else s3->accel_start(1, 1, 0xffffffff, val | (val << 16), s3); } } else { if ((s3->bpp == 0) && s3->color_16bit) { - if (s3->accel.cur_x & 0x400) - val = (val >> 8) | (val << 8); - + if (s3->accel.rd_mask_16bit_check) { + if (s3->accel.cur_x & 0x400) + val = (val >> 8) | (val << 8); + } else { + if (s3->accel.cur_x & 0x400) + s3->accel.color_16bit_check_pixtrans = 1; + else + s3->accel.color_16bit_check_pixtrans = 0; + } s3->accel_start(2, 1, 0xffffffff, val | (val << 16), s3); } else s3->accel_start(1, 1, 0xffffffff, val | (val << 16), s3); @@ -638,11 +660,19 @@ s3_accel_out_pixtrans_w(s3_t *s3, uint16_t val) } else s3->accel_start(2, 1, 0xffffffff, val | (val << 16), s3); } else { - if ((s3->bpp == 0) && s3->color_16bit) { - if (s3->accel.cur_x & 0x400) + if (s3->accel.rd_mask_16bit_check) { + if (s3->accel.cmd == 0x53f1) { + if (s3->accel.cur_x & 0x400) + val = (val >> 8) | (val << 8); + + s3->accel_start(2, 1, 0xffffffff, val | (val << 16), s3); + val = (val >> 8) | (val << 8); - } - s3->accel_start(2, 1, 0xffffffff, val | (val << 16), s3); + s3->accel_start(2, 1, 0xffffffff, val | (val << 16), s3); + } else + s3->accel_start(2, 1, 0xffffffff, val | (val << 16), s3); + } else + s3->accel_start(2, 1, 0xffffffff, val | (val << 16), s3); } break; case 0x400: @@ -1037,7 +1067,6 @@ s3_accel_out_fifo(s3_t *s3, uint16_t port, uint8_t val) break; case 0xa549: case 0xa6e9: - s3_log("[%04X:%08X] OUT PORTB=%04x (Foreground Color), val=%02x.\n", CS, cpu_state.pc, port, val); if (s3->bpp == 3) { if ((s3->chip >= S3_86C928) && (s3->chip < S3_VISION964)) { if (s3->accel.multifunc[0xe] & 0x10) @@ -1450,6 +1479,8 @@ s3_accel_out_fifo(s3_t *s3, uint16_t port, uint8_t val) case 0xbee9: s3->accel.multifunc_cntl = (s3->accel.multifunc_cntl & 0xff) | (val << 8); s3->accel.multifunc[s3->accel.multifunc_cntl >> 12] = s3->accel.multifunc_cntl & 0xfff; + if ((s3->accel.multifunc_cntl >> 12) == 5) + s3_log("S3 multifunc_cntl = %d, val = %03x.\n", s3->accel.multifunc_cntl >> 12, s3->accel.multifunc_cntl & 0xfff); break; case 0xd148: @@ -1589,13 +1620,36 @@ s3_accel_out_fifo(s3_t *s3, uint16_t port, uint8_t val) s3->accel_start(1, 1, 0xffffffff, s3->accel.pix_trans[0], s3); } else { if ((s3->bpp == 0) && s3->color_16bit) { - s3->accel.pix_trans[1] = svga->vram[dword_remap(svga, (s3->accel.dest + s3->accel.cx - s3->accel.minus)) & s3->vram_mask]; - if (s3->accel.cur_x & 0x400) { - s3_log("Last Pixel Written=%02x (1024).\n", s3->accel.pix_trans[1]); - s3->accel_start(2, 1, 0xffffffff, s3->accel.pix_trans[1] | (s3->accel.pix_trans[0] << 8), s3); + if (s3->accel.rd_mask_16bit_check) { + s3->accel.pix_trans[1] = svga->vram[dword_remap(svga, (s3->accel.dest + s3->accel.cx - s3->accel.minus)) & s3->vram_mask]; + if (s3->accel.cmd & 0x1000) { + if (s3->accel.cur_x & 0x400) { + s3_log("Last Pixel Written=%02x (1024) reverse.\n", s3->accel.pix_trans[1]); + s3->accel_start(2, 1, 0xffffffff, s3->accel.pix_trans[0] | (s3->accel.pix_trans[1] << 8), s3); + } else { + s3_log("Last Pixel Written=%02x (0) reverse, cx=%d.\n", s3->accel.pix_trans[1], s3->accel.cx, s3->accel.cur_x); + s3->accel_start(2, 1, 0xffffffff, s3->accel.pix_trans[1] | (s3->accel.pix_trans[0] << 8), s3); + } + } else { + if (s3->accel.cur_x & 0x400) { + s3_log("Last Pixel Written=%02x (1024) normal, cx=%d, curx=%d.\n", s3->accel.pix_trans[1], s3->accel.cx, s3->accel.cur_x); + s3->accel_start(2, 1, 0xffffffff, s3->accel.pix_trans[1] | (s3->accel.pix_trans[0] << 8), s3); + } else { + s3_log("Last Pixel Written=%02x (0) normal, cx=%d, curx=%d.\n", s3->accel.pix_trans[1], s3->accel.cx, s3->accel.cur_x); + s3->accel_start(2, 1, 0xffffffff, s3->accel.pix_trans[0] | (s3->accel.pix_trans[1] << 8), s3); + } + } } else { - s3_log("Last Pixel Written=%02x (0).\n", s3->accel.pix_trans[1]); - s3->accel_start(2, 1, 0xffffffff, s3->accel.pix_trans[0] | (s3->accel.pix_trans[1] << 8), s3); + s3->accel.pix_trans_val[s3->accel.cy][s3->accel.cx] = val; + + if (s3->accel.cur_x & 0x400) { + s3->accel.color_16bit_check_pixtrans = 0; + s3_log("%04X:%08X: Last Pixel Written=%04x (1024) normal, cx=%d, cy=%d.\n", CS, cpu_state.pc, s3->accel.pix_trans_val[s3->accel.cy][s3->accel.cx - s3->accel.minus] | (s3->accel.pix_trans_val[s3->accel.cy][s3->accel.cx] << 8), s3->accel.cx, s3->accel.cy); + s3->accel_start(2, 1, 0xffffffff, s3->accel.pix_trans_val[s3->accel.cy][s3->accel.cx - s3->accel.minus] | (s3->accel.pix_trans_val[s3->accel.cy][s3->accel.cx] << 8), s3); + } else { + s3->accel.color_16bit_check_pixtrans = 1; + s3->accel_start(2, 1, 0xffffffff, s3->accel.pix_trans[0], s3); + } } } else s3->accel_start(1, 1, 0xffffffff, s3->accel.pix_trans[0], s3); @@ -2164,7 +2218,7 @@ s3_hwcursor_draw(svga_t *svga, int displine) const s3_t *s3 = (s3_t *) svga->priv; int shift = 1; int width = 16; - uint16_t dat[2] = { 0, 0 }; + uint16_t dat[4] = { 0, 0, 0, 0 }; int xx; int offset = svga->hwcursor_latch.x - svga->hwcursor_latch.xoff; uint32_t fg; @@ -2176,30 +2230,53 @@ s3_hwcursor_draw(svga_t *svga, int displine) case 15: fg = video_15to32[s3->hwc_fg_col & 0xffff]; bg = video_15to32[s3->hwc_bg_col & 0xffff]; - if (s3->chip >= S3_86C928 && s3->chip <= S3_86C805) { - if (s3->card_type != S3_MIROCRYSTAL10SD_805 && s3->card_type != S3_MIROCRYSTAL8S_805) { - if (!(svga->crtc[0x45] & 0x04)) { - shift = 2; - width = 8; + if ((s3->chip >= S3_86C928) && (s3->chip <= S3_86C805)) { + if (!s3->color_16bit) { + if ((s3->card_type != S3_MIROCRYSTAL10SD_805) && (s3->card_type != S3_MIROCRYSTAL8S_805)) { + if (!(svga->crtc[0x45] & 0x04)) { + shift = 2; + width = 8; + } } + } else { + shift = 2; + width = 8; + fg = svga->pallook[svga->crtc[0xe]]; + bg = svga->pallook[svga->crtc[0xf]]; } + } else if (s3->chip <= S3_86C924) { + shift = 2; + width = 8; + fg = svga->pallook[svga->crtc[0xe]]; + bg = svga->pallook[svga->crtc[0xf]]; } break; case 16: fg = video_16to32[s3->hwc_fg_col & 0xffff]; bg = video_16to32[s3->hwc_bg_col & 0xffff]; - if (s3->chip >= S3_86C928 && s3->chip <= S3_86C805) { - if ((s3->card_type != S3_MIROCRYSTAL10SD_805) && (s3->card_type != S3_MIROCRYSTAL8S_805)) { - if (!(svga->crtc[0x45] & 0x04)) { - shift = 2; - width = 8; - } - } else if (s3->card_type == S3_MIROCRYSTAL10SD_805) { - if (!(svga->crtc[0x45] & 0x04)) { - offset <<= 1; + if ((s3->chip >= S3_86C928) && (s3->chip <= S3_86C805)) { + if (!s3->color_16bit) { + if ((s3->card_type != S3_MIROCRYSTAL10SD_805) && (s3->card_type != S3_MIROCRYSTAL8S_805)) { + if (!(svga->crtc[0x45] & 0x04)) { + shift = 2; + width = 8; + } + } else if (s3->card_type == S3_MIROCRYSTAL10SD_805) { + if (!(svga->crtc[0x45] & 0x04)) + offset <<= 1; } + } else { + shift = 2; + width = 8; + fg = svga->pallook[svga->crtc[0xe]]; + bg = svga->pallook[svga->crtc[0xf]]; } + } else if (s3->chip <= S3_86C924) { + shift = 2; + width = 8; + fg = svga->pallook[svga->crtc[0xe]]; + bg = svga->pallook[svga->crtc[0xf]]; } break; @@ -2236,40 +2313,62 @@ s3_hwcursor_draw(svga_t *svga, int displine) for (uint8_t x = 0; x < 64; x += 16) { remapped_addr = dword_remap(svga, real_addr); + if (((svga->bpp == 15) || (svga->bpp == 16)) && s3->color_16bit) { + dat[0] = svga->vram[remapped_addr & s3->vram_mask]; + dat[1] = svga->vram[(remapped_addr + 1) & s3->vram_mask]; + dat[2] = svga->vram[(remapped_addr + 2) & s3->vram_mask]; + dat[3] = svga->vram[(remapped_addr + 3) & s3->vram_mask]; - dat[0] = (svga->vram[remapped_addr & s3->vram_mask] << 8) | svga->vram[(remapped_addr + 1) & s3->vram_mask]; - dat[1] = (svga->vram[(remapped_addr + 2) & s3->vram_mask] << 8) | svga->vram[(remapped_addr + 3) & s3->vram_mask]; - - if (svga->crtc[0x55] & 0x10) { - /*X11*/ - for (xx = 0; xx < 16; xx++) { - if (offset >= 0) { - if (dat[0] & 0x8000) - buffer32->line[displine][offset + svga->x_add] = (dat[1] & 0x8000) ? fg : bg; - } - - offset++; - dat[0] <<= shift; - dat[1] <<= shift; - } - } else { /*Windows*/ - for (xx = 0; xx < width; xx++) { + for (xx = 0; xx < 8; xx++) { if (offset >= 0) { - if (!(dat[0] & 0x8000)) - buffer32->line[displine][offset + svga->x_add] = (dat[1] & 0x8000) ? fg : bg; - else if (dat[1] & 0x8000) + if (!(dat[(xx & 4) ? 2 : 0] & 0x80)) + buffer32->line[displine][offset + svga->x_add] = (dat[(xx & 4) ? 3 : 1] & 0x80) ? fg : bg; + else if (dat[(xx & 4) ? 3 : 1] & 0x80) buffer32->line[displine][offset + svga->x_add] ^= 0xffffff; } offset++; - dat[0] <<= shift; - dat[1] <<= shift; + s3_log("Up: Data0=%04x, Data1=%04x, Data2=%04x, Data3=%04x, xx=%d addr=%06x.\n", dat[0], dat[1], dat[2], dat[3], xx, remapped_addr); + dat[(xx & 4) ? 2 : 0] <<= 2; + dat[(xx & 4) ? 3 : 1] <<= 2; + } + } else { + dat[0] = (svga->vram[remapped_addr & s3->vram_mask] << 8) | svga->vram[(remapped_addr + 1) & s3->vram_mask]; + dat[1] = (svga->vram[(remapped_addr + 2) & s3->vram_mask] << 8) | svga->vram[(remapped_addr + 3) & s3->vram_mask]; + + if (svga->crtc[0x55] & 0x10) { + /*X11*/ + for (xx = 0; xx < 16; xx++) { + if (offset >= 0) { + if (dat[0] & 0x8000) + buffer32->line[displine][offset + svga->x_add] = (dat[1] & 0x8000) ? fg : bg; + } + + offset++; + dat[0] <<= shift; + dat[1] <<= shift; + } + } else { + /*Windows*/ + for (xx = 0; xx < width; xx++) { + if (offset >= 0) { + if (!(dat[0] & 0x8000)) + buffer32->line[displine][offset + svga->x_add] = (dat[1] & 0x8000) ? fg : bg; + else if (dat[1] & 0x8000) + buffer32->line[displine][offset + svga->x_add] ^= 0xffffff; + } + + offset++; + dat[0] <<= shift; + dat[1] <<= shift; + } } } svga->hwcursor_latch.addr += 4; real_addr = s3_hwcursor_convert_addr(svga); } + if (svga->interlace && !svga->hwcursor_oddeven) svga->hwcursor_latch.addr += 16; } @@ -2812,10 +2911,10 @@ s3_out(uint16_t addr, uint8_t val, void *priv) else if (s3->chip == S3_VISION968 && (s3->card_type == S3_SPEA_MERCURY_P64V || s3->card_type == S3_MIROVIDEO40SV_ERGO_968)) { rs3 = !!(svga->crtc[0x55] & 0x02); tvp3026_ramdac_out(addr, rs2, rs3, val, svga->ramdac, svga); - } else if (((s3->chip == S3_86C801) || (s3->chip == S3_86C805) || (s3->chip == S3_86C924)) && + } else if (((s3->chip == S3_86C801) || (s3->chip == S3_86C805)) && ((s3->card_type != S3_MIROCRYSTAL10SD_805) && (s3->card_type != S3_MIROCRYSTAL8S_805))) att49x_ramdac_out(addr, rs2, val, svga->ramdac, svga); - else if (s3->chip == S3_86C911) { + else if (s3->chip <= S3_86C924) { sc1148x_ramdac_out(addr, rs2, val, svga->ramdac, svga); } else if (s3->card_type == S3_NUMBER9_9FX_531) att498_ramdac_out(addr, rs2, val, svga->ramdac, svga); @@ -2916,7 +3015,7 @@ s3_out(uint16_t addr, uint8_t val, void *priv) break; case 0x45: - if (s3->chip == S3_VISION964 || s3->chip == S3_VISION968) + if ((s3->chip == S3_VISION964) || (s3->chip == S3_VISION968)) break; svga->hwcursor.ena = val & 1; break; @@ -2928,7 +3027,7 @@ s3_out(uint16_t addr, uint8_t val, void *priv) case 0x4d: case 0x4e: case 0x4f: - if (s3->chip == S3_VISION964 || s3->chip == S3_VISION968) + if ((s3->chip == S3_VISION964) || (s3->chip == S3_VISION968)) break; svga->hwcursor.x = ((svga->crtc[0x46] << 8) | svga->crtc[0x47]) & 0x7ff; if (svga->bpp == 32) @@ -2937,14 +3036,14 @@ s3_out(uint16_t addr, uint8_t val, void *priv) svga->hwcursor.xoff = svga->crtc[0x4e] & 0x3f; svga->hwcursor.yoff = svga->crtc[0x4f] & 0x3f; svga->hwcursor.addr = ((((svga->crtc[0x4c] << 8) | svga->crtc[0x4d]) & 0xfff) * 1024) + (svga->hwcursor.yoff * 16); - if ((s3->chip >= S3_TRIO32) && svga->bpp == 32) + if ((s3->chip >= S3_TRIO32) && (svga->bpp == 32)) svga->hwcursor.x <<= 1; - else if ((s3->chip >= S3_86C928 && s3->chip <= S3_86C805) && (svga->bpp == 15 || svga->bpp == 16)) { - if ((s3->card_type == S3_MIROCRYSTAL10SD_805) && !(svga->crtc[0x45] & 0x04) && svga->bpp == 16) + else if ((s3->chip >= S3_86C928 && s3->chip <= S3_86C805) && ((svga->bpp == 15) || (svga->bpp == 16))) { + if ((s3->card_type == S3_MIROCRYSTAL10SD_805) && !(svga->crtc[0x45] & 0x04) && (svga->bpp == 16)) svga->hwcursor.x >>= 2; else svga->hwcursor.x >>= 1; - } else if ((s3->chip >= S3_86C928 && s3->chip <= S3_86C805) && (svga->bpp == 24)) + } else if ((s3->chip >= S3_86C928) && (s3->chip <= S3_86C805) && (svga->bpp == 24)) svga->hwcursor.x /= 3; else if ((s3->chip <= S3_86C805) && s3->color_16bit) svga->hwcursor.x >>= 1; @@ -3137,10 +3236,10 @@ s3_in(uint16_t addr, void *priv) else if (s3->chip == S3_VISION968 && (s3->card_type == S3_SPEA_MERCURY_P64V || s3->card_type == S3_MIROVIDEO40SV_ERGO_968)) { rs3 = !!(svga->crtc[0x55] & 0x02); return tvp3026_ramdac_in(addr, rs2, rs3, svga->ramdac, svga); - } else if (((s3->chip == S3_86C801) || (s3->chip == S3_86C805) || (s3->chip == S3_86C924)) && + } else if (((s3->chip == S3_86C801) || (s3->chip == S3_86C805)) && ((s3->card_type != S3_MIROCRYSTAL10SD_805) && (s3->card_type != S3_MIROCRYSTAL8S_805))) return att49x_ramdac_in(addr, rs2, svga->ramdac, svga); - else if (s3->chip == S3_86C911) + else if (s3->chip <= S3_86C924) return sc1148x_ramdac_in(addr, rs2, svga->ramdac, svga); else if (s3->card_type == S3_NUMBER9_9FX_531) return att498_ramdac_in(addr, rs2, svga->ramdac, svga); @@ -3449,7 +3548,8 @@ s3_recalctimings(svga_t *svga) if (s3->chip <= S3_86C805) { s3->color_16bit = !!(svga->crtc[0x43] & 0x08); - if (svga->bpp == 24) + s3_log("Color 16bit=%x, bpp=%d, 256color=%x.\n", s3->color_16bit, svga->bpp, (svga->attrregs[0x10] & 0x40)); + if ((svga->bpp == 24) || (svga->bpp == 8)) s3->color_16bit = 0; if (s3->color_16bit) @@ -5678,11 +5778,15 @@ s3_accel_in_w(uint16_t port, void *priv) if (((s3->accel.frgd_mix & 0x60) != 0x40) || ((s3->accel.bkgd_mix & 0x60) != 0x40)) { if (s3->accel.cmd & 0x1000) temp = (temp >> 8) | (temp << 8); + s3->accel_start(8, 1, temp | (temp << 16), 0, s3); } else { - if ((s3->bpp == 0) && s3->color_16bit) + if ((s3->bpp == 0) && s3->color_16bit) { + if (s3->accel.cur_x & 0x400) + temp = ((temp >> 8) | (temp << 8)) & 0xffff; + s3->accel_start(2, 1, 0xffffffff, temp | (temp << 16), s3); - else + } else s3->accel_start(1, 1, 0xffffffff, temp | (temp << 16), s3); } } else { @@ -5715,6 +5819,7 @@ s3_accel_in_w(uint16_t port, void *priv) } else { if (s3_enable_fifo(s3)) s3_wait_fifo_idle(s3); + temp = s3->accel.short_stroke; } @@ -6472,7 +6577,6 @@ polygon_setup(s3_t *s3) #define MIX \ { \ - old_dest_dat = dest_dat; \ MIX_READ \ dest_dat = (dest_dat & wrt_mask) | (old_dest_dat & ~wrt_mask); \ } @@ -7695,6 +7799,9 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi uint32_t srcbase; uint32_t dstbase; + frgd_mix = (s3->accel.frgd_mix >> 5) & 3; + bkgd_mix = (s3->accel.bkgd_mix >> 5) & 3; + if (((s3->chip >= S3_TRIO64) || (s3->chip == S3_VISION968) || (s3->chip == S3_VISION868)) && (s3->accel.cmd & (1 << 11))) cmd |= 0x08; @@ -7720,32 +7827,6 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi if ((s3->accel.cmd & 0x100) && (s3_cpu_src(s3) || (s3_cpu_dest(s3))) && (!cpu_input || (s3_enable_fifo(s3) == 0))) s3->force_busy = 1; - if ((s3->bpp == 0) && s3->color_16bit && !s3->accel.b2e8_pix) { - if (cmd <= 2) { - if (s3->accel.cur_x & 0x400) { - if (s3->accel.cmd != 0x41b3) - wrt_mask = (wrt_mask << 8) & 0xff00; - else - wrt_mask &= 0xff; - - frgd_color = (frgd_color << 8) & 0xff00; - bkgd_color = (bkgd_color << 8) & 0xff00; - } else { - if (clip_r >= 0x400) { - wrt_mask &= 0xff; - frgd_color &= 0xff; - bkgd_color &= 0xff; - } - } - } else if (cmd == 6) { - if (s3->accel.destx_distp & 0x400) { - wrt_mask = (wrt_mask << 8) & 0xff00; - frgd_color = (frgd_color << 8) & 0xff00; - bkgd_color = (bkgd_color << 8) & 0xff00; - } - } - } - if (!cpu_input) s3->accel.dat_count = 0; @@ -7794,13 +7875,10 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi break; } - frgd_mix = (s3->accel.frgd_mix >> 5) & 3; - bkgd_mix = (s3->accel.bkgd_mix >> 5) & 3; - /*Bit 4 of the Command register is the draw yes bit, which enables writing to memory/reading from memory when enabled. When this bit is disabled, no writing to memory/reading from memory is allowed. (This bit is almost meaningless on the NOP command)*/ - s3_log("CMD=%d, full=%04x, s3bpp=%x, multifuncE=%03x, sourcedisplay=%x, mmio=%02x, srcbase=%08x, dstbase=%08x, cpu=%04x, mix=%04x, count=%d, rd_mask=%04x, wrt_mask=%04x, width=%d, s=%d,%d, c=%d,%d, d=%d,%d, 16bitcolor=%x, frgdcolor=%04x, bkgdcolor=%04x, frgdsel=%d, bkgdsel=%d, frgdmix=%02x, svgabpp=%d.\n", cmd, s3->accel.cmd, s3->bpp, s3->accel.multifunc[0x0e], vram_mask, svga->crtc[0x53] & 0x18, srcbase, dstbase, cpu_dat & 0xffff, mix_dat & 0xffff, count, rd_mask, wrt_mask, s3->width, s3->accel.sx, s3->accel.sy, s3->accel.cx, s3->accel.cy, s3->accel.dx, s3->accel.dy, s3->color_16bit, frgd_color, bkgd_color, frgd_mix, bkgd_mix, s3->accel.frgd_mix & 0x0f, svga->bpp); + s3_log("CMD=%d, full=%04x, s3bpp=%x, clr=%d, clb=%d, sourcedisplay=%x, mmio=%02x, srcbase=%08x, dstbase=%08x, cpu=%04x, mix=%04x, count=%d, rd_mask=%04x, wrt_mask=%04x, width=%d, s=%d,%d, c=%d,%d, d=%d,%d, 16bitcolor=%x, frgdcolor=%04x, bkgdcolor=%04x, frgdsel=%d, bkgdsel=%d, frgdmix=%02x, curx=%d, cury=%d, cll=%d, b2e8pix=%x.\n", cmd, s3->accel.cmd, s3->bpp, clip_r, clip_b, vram_mask, svga->crtc[0x53] & 0x18, srcbase, dstbase, cpu_dat & 0xffff, mix_dat & 0xffff, count, rd_mask, wrt_mask, s3->width, s3->accel.sx, s3->accel.sy, s3->accel.cx, s3->accel.cy, s3->accel.dx, s3->accel.dy, s3->color_16bit, frgd_color, bkgd_color, frgd_mix, bkgd_mix, s3->accel.frgd_mix & 0x0f, s3->accel.cur_x, s3->accel.cur_y, clip_l, s3->accel.b2e8_pix); switch (cmd) { case 0: /*NOP (Short Stroke Vectors)*/ @@ -7846,6 +7924,7 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi if (update) { READ((s3->accel.cy * s3->width) + s3->accel.cx, dest_dat); + old_dest_dat = dest_dat; MIX if (s3->accel.ssv_draw) { @@ -7911,10 +7990,16 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi case 1: /*Draw line*/ if (!cpu_input) { s3->accel.minus = 0; + s3->accel.color_16bit_check_pixtrans = 0; s3->accel.cx = s3->accel.cur_x & 0xfff; s3->accel.cy = s3->accel.cur_y & 0xfff; s3->accel.sy = s3->accel.maj_axis_pcnt; - if ((s3->bpp == 0) && s3->color_16bit && (s3->accel.cur_x & 0x400)) + if ((s3->bpp == 0) && s3->color_16bit) + s3->accel.rd_mask_16bit_check = ((rd_mask & 0xff00) != 0xff00); + else + s3->accel.rd_mask_16bit_check = 0; + + if ((s3->bpp == 0) && s3->color_16bit && (s3->accel.cur_x & 0x400) && s3->accel.rd_mask_16bit_check) s3->accel.minus = 0x400; if (s3_cpu_src(s3)) @@ -7922,6 +8007,22 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi } if (s3->accel.cmd & 0x08) { /*Radial*/ + if ((s3->bpp == 0) && s3->color_16bit) { + if (s3->accel.rd_mask_16bit_check) { + if (s3->accel.cur_x & 0x400) { + wrt_mask = (s3->accel.wrt_mask_actual[1] << 8); + frgd_color = (s3->accel.frgd_color_actual[1] << 8); + bkgd_color = (s3->accel.bkgd_color_actual[1] << 8); + } else { + wrt_mask = s3->accel.wrt_mask_actual[0]; + frgd_color = s3->accel.frgd_color_actual[0]; + bkgd_color = s3->accel.bkgd_color_actual[0]; + } + rd_mask &= 0x00ff; + } else if (!s3->accel.rd_mask_16bit_check && (s3->accel.cur_x & 0x400)) + break; + } + while (count-- && s3->accel.sy >= 0) { if ((s3->accel.cx & 0xfff) >= clip_l && (s3->accel.cx & 0xfff) <= clip_r && (s3->accel.cy & 0xfff) >= clip_t && (s3->accel.cy & 0xfff) <= clip_b) { switch ((mix_dat & mix_mask) ? frgd_mix : bkgd_mix) { @@ -7960,6 +8061,7 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi if (update) { READ((s3->accel.cy * s3->width) + s3->accel.cx - s3->accel.minus, dest_dat); + old_dest_dat = dest_dat; MIX WRITE((s3->accel.cy * s3->width) + s3->accel.cx - s3->accel.minus, dest_dat); @@ -7973,8 +8075,15 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi else cpu_dat >>= 16; - if (!s3->accel.sy) + if (!s3->accel.sy) { + if ((s3->bpp == 0) && s3->color_16bit) { + if (!(s3->accel.cur_x & 0x400)) + s3->accel.color_16bit_check = 1; + else + s3->accel.color_16bit_check = 0; + } break; + } switch (s3->accel.cmd & 0xe0) { case 0x00: @@ -8016,9 +8125,40 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi s3->accel.cur_x = s3->accel.cx & 0xfff; s3->accel.cur_y = s3->accel.cy & 0xfff; } else { /*Bresenham*/ - if (s3->accel.b2e8_pix && s3_cpu_src(s3) && (count == 16)) { /*Stupid undocumented 0xB2E8 on 911/924*/ + if (s3->accel.b2e8_pix && s3_cpu_src(s3) && (count == 16)) { /*Pattern on pixtrans (911/924)*/ count = s3->accel.maj_axis_pcnt + 1; s3->accel.temp_cnt = 16; + if ((s3->bpp == 0) && s3->color_16bit) { + if (s3->accel.rd_mask_16bit_check) { + if (s3->accel.cur_x & 0x400) { + wrt_mask = (s3->accel.wrt_mask_actual[1] << 8); + frgd_color = (s3->accel.frgd_color_actual[1] << 8); + bkgd_color = (s3->accel.bkgd_color_actual[1] << 8); + } else { + wrt_mask = s3->accel.wrt_mask_actual[0]; + frgd_color = s3->accel.frgd_color_actual[0]; + bkgd_color = s3->accel.bkgd_color_actual[0]; + } + rd_mask &= 0x00ff; + } else if (!s3->accel.rd_mask_16bit_check && (s3->accel.cur_x & 0x400)) + break; + } + } else { + if ((s3->bpp == 0) && s3->color_16bit) { + if (s3->accel.rd_mask_16bit_check) { + if (s3->accel.cur_x & 0x400) { + wrt_mask = (s3->accel.wrt_mask_actual[1] << 8); + frgd_color = (s3->accel.frgd_color_actual[1] << 8); + bkgd_color = (s3->accel.bkgd_color_actual[1] << 8); + } else { + wrt_mask = s3->accel.wrt_mask_actual[0]; + frgd_color = s3->accel.frgd_color_actual[0]; + bkgd_color = s3->accel.bkgd_color_actual[0]; + } + rd_mask &= 0x00ff; + } else if (!s3->accel.rd_mask_16bit_check && (s3->accel.cur_x & 0x400)) + break; + } } while (count-- && s3->accel.sy >= 0) { @@ -8064,6 +8204,7 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi if (update) { READ((s3->accel.cy * s3->width) + s3->accel.cx - s3->accel.minus, dest_dat); + old_dest_dat = dest_dat; MIX WRITE((s3->accel.cy * s3->width) + s3->accel.cx - s3->accel.minus, dest_dat); @@ -8086,8 +8227,15 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi else cpu_dat >>= 16; - if (!s3->accel.sy) + if (!s3->accel.sy) { + if ((s3->bpp == 0) && s3->color_16bit) { + if (!(s3->accel.cur_x & 0x400)) + s3->accel.color_16bit_check = 1; + else + s3->accel.color_16bit_check = 0; + } break; + } if (s3->accel.cmd & 0x40) { if (s3->accel.cmd & 0x80) @@ -8131,21 +8279,43 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi case 2: /*Rectangle fill*/ if (!cpu_input) /*!cpu_input is trigger to start operation*/ { + s3->accel.start = 0; s3->accel.minus = 0; + s3->accel.color_16bit_check_pixtrans = 0; s3->accel.sx = s3->accel.maj_axis_pcnt & 0xfff; s3->accel.sy = s3->accel.multifunc[0] & 0xfff; s3->accel.cx = s3->accel.cur_x & 0xfff; s3->accel.cy = s3->accel.cur_y & 0xfff; - if ((s3->bpp == 0) && s3->color_16bit && (s3->accel.cur_x & 0x400)) - s3->accel.minus = 0x400; - - if (s3->accel.cur_x & 0x400) - s3_log("Rectangle Fill + 1024 FULLCMD=%04x: frgdcolor=%04x, s(%d,%d), c(%d,%d).\n", s3->accel.cmd, frgd_color, s3->accel.sx, s3->accel.sy, s3->accel.cx, s3->accel.cy); - else - s3_log("Rectangle Fill + 0 FULLCMD=%04x: frgdcolor=%04x, s(%d,%d), c(%d,%d).\n", s3->accel.cmd, frgd_color, s3->accel.sx, s3->accel.sy, s3->accel.cx, s3->accel.cy); s3->accel.dest = dstbase + s3->accel.cy * s3->width; + if ((s3->bpp == 0) && s3->color_16bit) { + s3->accel.rd_mask_16bit_check = ((rd_mask & 0xff00) != 0xff00); + if (s3->accel.rd_mask_16bit_check) { + s3->accel.start = 1; + if (s3->accel.cur_x & 0x400) { + s3->accel.minus = 0x400; + if ((s3->accel.cmd == 0x41b3) && (frgd_mix == 0)) + s3->accel.minus = 0; + } + } else { + if (s3->accel.cmd & 0x100) { + if (!(s3->accel.cmd & 0x200)) { + if (s3->accel.cur_x & 0x400) + s3->accel.minus = 0x400; + else + s3->accel.minus = 0; + } + } + } + } else + s3->accel.rd_mask_16bit_check = 0; + + if (s3->accel.cur_x & 0x400) + s3_log("Rectangle Fill + 1024 FULLCMD=%04x: frgdcolor=%04x, s=%d,%d, c=%d,%d, frmix=%x, bkmix=%x, pixcntl=%02x, m2=%d, m4=%d.\n", s3->accel.cmd, s3->accel.frgd_color_actual[1] << 8, s3->accel.sx, s3->accel.sy, s3->accel.cx, s3->accel.cy, frgd_mix, bkgd_mix, s3->accel.multifunc[0xa] & 0xc0, s3->accel.multifunc[2], s3->accel.multifunc[4]); + else + s3_log("Rectangle Fill + 0 FULLCMD=%04x: frgdcolor=%04x, s=%d,%d, c=%d,%d, frmix=%x, bkmix=%x, pixcntl=%02x, m2=%d, m4=%d.\n", s3->accel.cmd, s3->accel.frgd_color_actual[0], s3->accel.sx, s3->accel.sy, s3->accel.cx, s3->accel.cy, frgd_mix, bkgd_mix, s3->accel.multifunc[0xa] & 0xc0, s3->accel.multifunc[2], s3->accel.multifunc[4]); + if (s3_cpu_src(s3)) { s3->data_available = 0; return; /*Wait for data from CPU*/ @@ -8155,9 +8325,93 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi } } - if (s3->accel.b2e8_pix && s3_cpu_src(s3) && (count == 16)) { /*Stupid undocumented 0xB2E8 on 911/924*/ + + if (s3->accel.b2e8_pix && s3_cpu_src(s3) && (count == 16)) { /*Pattern on pixtrans (911/924)*/ count = s3->accel.maj_axis_pcnt + 1; s3->accel.temp_cnt = 16; + if (s3->accel.rd_mask_16bit_check) { + if (s3->accel.cur_x & 0x400) { + if (s3->accel.start) { + s3->accel.minus = 0x400; + s3->accel.start = 0; + } + wrt_mask = (s3->accel.wrt_mask_actual[1] << 8); + frgd_color = (s3->accel.frgd_color_actual[1] << 8); + bkgd_color = (s3->accel.bkgd_color_actual[1] << 8); + } else { + if (s3->accel.start) { + s3->accel.minus = 0; + s3->accel.start = 0; + } + wrt_mask = s3->accel.wrt_mask_actual[0]; + frgd_color = s3->accel.frgd_color_actual[0]; + bkgd_color = s3->accel.bkgd_color_actual[0]; + } + rd_mask &= 0x00ff; + } else if (!s3->accel.rd_mask_16bit_check && (s3->accel.cur_x & 0x400)) + break; + } else { + if ((s3->bpp == 0) && s3->color_16bit) { + if (s3->accel.cmd == 0x41b3) { + if (frgd_mix != 0) { + if (s3->accel.rd_mask_16bit_check) { + if (s3->accel.cur_x & 0x400) { + wrt_mask = (s3->accel.wrt_mask_actual[1] << 8); + frgd_color = (s3->accel.frgd_color_actual[1] << 8); + bkgd_color = (s3->accel.bkgd_color_actual[1] << 8); + } else { + wrt_mask = s3->accel.wrt_mask_actual[0]; + frgd_color = s3->accel.frgd_color_actual[0]; + bkgd_color = s3->accel.bkgd_color_actual[0]; + } + rd_mask &= 0x00ff; + } else if (!s3->accel.rd_mask_16bit_check && (s3->accel.cur_x & 0x400)) + break; + } + } else { + if (s3->accel.rd_mask_16bit_check) { + rd_mask &= 0x00ff; + if (s3->accel.cmd == 0x53b3) { + if (clip_l & 0x400) { + if (s3->accel.start) { + s3->accel.minus = 0x400; + s3->accel.start = 0; + } + wrt_mask = (s3->accel.wrt_mask_actual[1] << 8); + frgd_color = (s3->accel.frgd_color_actual[1] << 8); + bkgd_color = (s3->accel.bkgd_color_actual[1] << 8); + } else { + if (s3->accel.start) { + s3->accel.minus = 0; + s3->accel.start = 0; + } + wrt_mask = s3->accel.wrt_mask_actual[0]; + frgd_color = s3->accel.frgd_color_actual[0]; + bkgd_color = s3->accel.bkgd_color_actual[0]; + } + } else { + if (s3->accel.cur_x & 0x400) { + wrt_mask = (s3->accel.wrt_mask_actual[1] << 8); + frgd_color = (s3->accel.frgd_color_actual[1] << 8); + bkgd_color = (s3->accel.bkgd_color_actual[1] << 8); + } else { + wrt_mask = s3->accel.wrt_mask_actual[0]; + frgd_color = s3->accel.frgd_color_actual[0]; + bkgd_color = s3->accel.bkgd_color_actual[0]; + } + } + } else { + if ((s3_cpu_src(s3)) && !(s3->accel.cmd & 0x200)) { + s3_log("FIXME: S3 911/924 15/16bpp documentation needed.\n"); + } else { + if (!cpu_input && (s3->accel.cur_x & 0x400)) + break; + else if (cpu_input && (s3->accel.cmd == 0x53b3) && (s3->accel.cur_x & 0x400)) + break; + } + } + } + } } while (count-- && (s3->accel.sy >= 0)) { @@ -8177,7 +8431,7 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi mix_dat = mix_dat ? mix_mask : 0; } - if (s3_cpu_dest(s3) || ((s3_cpu_src(s3)) && s3->color_16bit && (s3->bpp == 0) && (s3->accel.cmd == 0x41b3))) { + if (s3_cpu_dest(s3)) { READ(s3->accel.dest + s3->accel.cx - s3->accel.minus, src_dat); if (vram_mask) src_dat = ((src_dat & rd_mask) == rd_mask); @@ -8221,17 +8475,18 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi if (s3_cpu_dest(s3)) { if (vram_mask) { + old_dest_dat = dest_dat; MIX } } else { + old_dest_dat = dest_dat; MIX } if (s3->accel.cmd & 0x10) { - if (s3->accel.cmd == 0x41b3) - s3_log("Full=%04x: Destination=%04x, OldDest=%04x, c=%d,%d.\n", s3->accel.cmd, dest_dat, old_dest_dat, s3->accel.cx, s3->accel.cy); - - WRITE(s3->accel.dest + s3->accel.cx - s3->accel.minus, dest_dat); + if (!s3->accel.color_16bit_check_pixtrans) { + WRITE(s3->accel.dest + s3->accel.cx - s3->accel.minus, dest_dat); + } } } } @@ -8274,9 +8529,25 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi s3->accel.cy &= 0xfff; s3->accel.dest = dstbase + s3->accel.cy * s3->width; + s3->accel.sy--; if (cpu_input) { + if (s3->accel.sy < 0) { + if ((s3->bpp == 0) && s3->color_16bit) { + if ((s3->accel.cmd == 0x53b3) && !s3->accel.b2e8_pix) { + if (!(clip_l & 0x400)) + s3->accel.color_16bit_check = 1; + else + s3->accel.color_16bit_check = 0; + } else { + if (!(s3->accel.cur_x & 0x400)) + s3->accel.color_16bit_check = 1; + else + s3->accel.color_16bit_check = 0; + } + } + } if (s3->accel.b2e8_pix) { s3->accel.cur_x = s3->accel.cx; s3->accel.cur_y = s3->accel.cy; @@ -8284,6 +8555,12 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi return; } if (s3->accel.sy < 0) { + if ((s3->bpp == 0) && s3->color_16bit) { + if (!(s3->accel.cur_x & 0x400)) + s3->accel.color_16bit_check = 1; + else + s3->accel.color_16bit_check = 0; + } s3->accel.cur_x = s3->accel.cx; s3->accel.cur_y = s3->accel.cy; return; @@ -8352,6 +8629,7 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi if (update) { READ(s3->accel.dest + s3->accel.poly_x, dest_dat); + old_dest_dat = dest_dat; MIX if (s3->accel.cmd & 0x10) { @@ -8396,10 +8674,17 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi s3->accel.dx = s3->accel.destx_distp & 0xfff; s3->accel.dy = s3->accel.desty_axstp & 0xfff; + s3->accel.rd_mask_16bit_check = ((rd_mask & 0xff00) != 0xff00); - if ((s3->bpp == 0) && s3->color_16bit && (clip_r > 0x3ff) && (s3->accel.destx_distp & 0x400)) + if ((s3->bpp == 0) && s3->color_16bit && (s3->accel.destx_distp & 0x400) && s3->accel.rd_mask_16bit_check) s3->accel.minus = 0x400; + if (s3->accel.destx_distp & 0x400) { + s3_log("BitBLT + 1024 FULLCMD=%04x: frgdcolor=%04x, s=%d,%d, d=%d,%d, frmix=%x, bkmix=%x, pixcntl=%02x.\n", s3->accel.cmd, frgd_color, s3->accel.sx, s3->accel.sy, s3->accel.dx, s3->accel.dy, frgd_mix, bkgd_mix, s3->accel.multifunc[0xa] & 0xc0); + } else { + s3_log("BitBLT + 0 FULLCMD=%04x: frgdcolor=%04x, s=%d,%d, d=%d,%d, frmix=%x, bkmix=%x, pixcntl=%02x.\n", s3->accel.cmd, frgd_color, s3->accel.sx, s3->accel.sy, s3->accel.dx, s3->accel.dy, frgd_mix, bkgd_mix, s3->accel.multifunc[0xa] & 0xc0); + } + s3->accel.cx = s3->accel.cur_x & 0xfff; s3->accel.cy = s3->accel.cur_y & 0xfff; @@ -8411,6 +8696,22 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi if ((s3->accel.cmd & 0x100) && !cpu_input) return; /*Wait for data from CPU*/ + if ((s3->bpp == 0) && s3->color_16bit) { + if (s3->accel.rd_mask_16bit_check) { + if (s3->accel.destx_distp & 0x400) { + wrt_mask = (s3->accel.wrt_mask_actual[1] << 8); + frgd_color = (s3->accel.frgd_color_actual[1] << 8); + bkgd_color = (s3->accel.bkgd_color_actual[1] << 8); + } else { + wrt_mask = s3->accel.wrt_mask_actual[0]; + frgd_color = s3->accel.frgd_color_actual[0]; + bkgd_color = s3->accel.bkgd_color_actual[0]; + } + rd_mask &= 0x00ff; + } else if (!s3->accel.rd_mask_16bit_check && (s3->accel.destx_distp & 0x400)) + break; + } + if (!cpu_input && (frgd_mix == 3) && !vram_mask && !(s3->accel.multifunc[0xe] & 0x100) && ((s3->accel.cmd & 0xa0) == 0xa0) && ((s3->accel.frgd_mix & 0xf) == 7) && ((s3->accel.bkgd_mix & 0xf) == 7)) { while (1) { if ((s3->accel.dx >= clip_l) && (s3->accel.dx <= clip_r) && (s3->accel.dy >= clip_t) && (s3->accel.dy <= clip_b)) { @@ -8441,6 +8742,12 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi s3->accel.sy--; if (s3->accel.sy < 0) { + if ((s3->bpp == 0) && s3->color_16bit) { + if (!(s3->accel.destx_distp & 0x400)) + s3->accel.color_16bit_check = 1; + else + s3->accel.color_16bit_check = 0; + } s3->accel.destx_distp = s3->accel.dx; s3->accel.desty_axstp = s3->accel.dy; return; @@ -8493,6 +8800,7 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi if (update) { READ(s3->accel.dest + s3->accel.dx - s3->accel.minus, dest_dat); + old_dest_dat = dest_dat; MIX if ((!(s3->accel.cmd & 0x10) && vram_mask) || (s3->accel.cmd & 0x10)) { @@ -8540,10 +8848,25 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi s3->accel.sy--; - if (cpu_input) + if (cpu_input) { + if (s3->accel.sy < 0) { + if ((s3->bpp == 0) && s3->color_16bit) { + if (!(s3->accel.destx_distp & 0x400)) + s3->accel.color_16bit_check = 1; + else + s3->accel.color_16bit_check = 0; + } + } return; + } if (s3->accel.sy < 0) { + if ((s3->bpp == 0) && s3->color_16bit) { + if (!(s3->accel.destx_distp & 0x400)) + s3->accel.color_16bit_check = 1; + else + s3->accel.color_16bit_check = 0; + } s3->accel.destx_distp = s3->accel.dx; s3->accel.desty_axstp = s3->accel.dy; return; @@ -8623,6 +8946,7 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi if (update) { READ(s3->accel.dest + s3->accel.dx, dest_dat); + old_dest_dat = dest_dat; MIX if (s3->accel.cmd & 0x10) { @@ -8728,6 +9052,7 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi if (update) { READ((s3->accel.cy * s3->width) + s3->accel.cx, dest_dat); + old_dest_dat = dest_dat; MIX if (s3->accel.cmd & 0x10) { @@ -8777,6 +9102,7 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi if (update) { READ((s3->accel.cy * s3->width) + s3->accel.cx, dest_dat); + old_dest_dat = dest_dat; MIX if (s3->accel.cmd & 0x10) { @@ -8878,6 +9204,7 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi if (update) { READ(s3->accel.dest + s3->accel.poly_x, dest_dat); + old_dest_dat = dest_dat; MIX if (s3->accel.cmd & 0x10) { @@ -9838,7 +10165,7 @@ s3_init(const device_t *info) s3->id_ext_pci = 0; s3->packed_mmio = 0; - svga->ramdac = device_add(&att490_ramdac_device); + svga->ramdac = device_add(&sc11483_ramdac_device); svga->clock_gen = device_add(&ics2494an_305_device); svga->getclock = ics2494_getclock; break; From d623425efdf1b418623a444278aad60ec024d201 Mon Sep 17 00:00:00 2001 From: TC1995 Date: Tue, 29 Apr 2025 00:57:03 +0200 Subject: [PATCH 092/180] Some more changes to the Mach8/32/8514/A side (April 29th, 2025) 1. Do not stall the guest when the passthrough mode is on, fixes hang ups in Windows 3.1 using the 2.3 drivers. 2. In the pitch register, make sure the passthrough goes on when needed only on the ATI Mach32, not 8, fixes mode on/off in text mode when needed. 3. Cosmetic changes and logs. --- src/video/vid_8514a.c | 2 +- src/video/vid_ati_mach8.c | 21 +++++++++++++-------- 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/src/video/vid_8514a.c b/src/video/vid_8514a.c index 533ec8fa9..ba4641259 100644 --- a/src/video/vid_8514a.c +++ b/src/video/vid_8514a.c @@ -961,7 +961,7 @@ ibm8514_accel_in(uint16_t port, svga_t *svga) temp |= INT_GE_BSY; } - if (!dev->fifo_idx) { + if (!dev->fifo_idx && !dev->on) { dev->force_busy = 0; dev->force_busy2 = 0; dev->data_available = 0; diff --git a/src/video/vid_ati_mach8.c b/src/video/vid_ati_mach8.c index d2fde4f93..07fa0a93c 100644 --- a/src/video/vid_ati_mach8.c +++ b/src/video/vid_ati_mach8.c @@ -866,6 +866,9 @@ mach_accel_start(int cmd_type, int cpu_input, int count, uint32_t mix_dat, uint3 mach->accel.stepy = 1; } + if (mach->accel.dp_config == 0x4011) + mach->accel.height++; + dev->accel.sy = 0; dev->accel.dest = mach->accel.dst_ge_offset + (dev->accel.dy * mach->accel.dst_pitch); @@ -1172,7 +1175,7 @@ mach_accel_start(int cmd_type, int cpu_input, int count, uint32_t mix_dat, uint3 mach->accel.sx++; if (mach->accel.sx >= mach->accel.src_width) { mach->accel.sx = 0; - if (mach->accel.src_stepx < 0) + if (mach->accel.src_stepx == -1) dev->accel.cx += mach->accel.src_width; else dev->accel.cx -= mach->accel.src_width; @@ -1196,7 +1199,7 @@ mach_accel_start(int cmd_type, int cpu_input, int count, uint32_t mix_dat, uint3 dev->accel.sx++; if ((dev->accel.sx >= mach->accel.width) || (dev->accel.dx >= 0x600)) { dev->accel.sx = 0; - if (mach->accel.stepx < 0) + if (mach->accel.stepx == -1) dev->accel.dx += mach->accel.width; else dev->accel.dx -= mach->accel.width; @@ -3457,7 +3460,7 @@ mach_accel_out_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, u case 0xe2e9: case 0xe6e9: - mach_log("Write PORT=%04x, 8514/A=%x, val=%04x, len=%d.\n", port, dev->accel.cmd_back, val, len); + mach_log("Write PORT=%04x, 8514/A=%x, val0=%02x, sy=%d, len=%d, dx=%d, dy=%d.\n", port, dev->accel.cmd_back, val, dev->accel.sy, len, dev->accel.dx, dev->accel.dy); if (len == 1) { if (!dev->accel.cmd_back) { if (mach->accel.cmd_type >= 0) { @@ -3645,9 +3648,9 @@ mach_accel_out_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, u if (len == 2) { dev->_8514crt = 0; - if (!(dev->accel.advfunc_cntl & 0x01)) { + if (!(dev->accel.advfunc_cntl & 0x01) && ATI_MACH32) { dev->on = 1; - dev->vendor_mode = !!ATI_MACH32; + dev->vendor_mode = 1; } } else dev->_8514crt = 1; @@ -3656,7 +3659,7 @@ mach_accel_out_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, u if (ATI_GRAPHICS_ULTRA || ATI_MACH32) mach32_updatemapping(mach, svga); - mach_log("ATI 8514/A: (0x%04x) CRT Pitch, val=0x%02x, crtpitch=%x, len=%d, extended 8514/A mode bpp=%d.\n", port, val, dev->ext_crt_pitch, len, dev->accel_bpp); + mach_log("ATI 8514/A: (0x%04x) CRT Pitch, val=0x%02x, crtpitch=%x, len=%d, extended 8514/A mode bpp=%d, enable_on=%d.\n", port, val, dev->ext_crt_pitch, len, dev->accel_bpp, dev->on); break; case 0x2aee: @@ -4747,21 +4750,23 @@ mach_accel_in_call(uint16_t port, mach_t *mach, svga_t *svga, ibm8514_t *dev) } } - if (!dev->fifo_idx) { + if (!dev->fifo_idx && !dev->on) { dev->force_busy = 0; dev->force_busy2 = 0; mach->force_busy = 0; dev->data_available = 0; dev->data_available2 = 0; temp |= INT_FIFO_EMP; + mach_log("Fifo Empty.\n"); } temp |= (dev->subsys_stat | (dev->vram_512k_8514 ? 0x00 : 0x80)); if (mach->accel.ext_ge_config & 0x08) temp |= ((mach->accel.ext_ge_config & 0x07) << 4); else temp |= 0x20; + + mach_log("0x%04x read: Subsystem Status=%02x, monitoralias=%02x.\n", port, temp, mach->accel.ext_ge_config & 0x07); } - mach_log("0x%04x read: Subsystem Status=%02x, monitoralias=%02x.\n", port, temp, mach->accel.ext_ge_config & 0x07); break; /*ATI Mach8/32 specific registers*/ From 1282ecfd56fc21095de975e34a59e716d12533d2 Mon Sep 17 00:00:00 2001 From: OBattler Date: Wed, 30 Apr 2025 01:37:25 +0200 Subject: [PATCH 093/180] BT-958D PCI: Preserve PCI slot across device resets, fixes IRQ's. --- src/scsi/scsi_buslogic.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/scsi/scsi_buslogic.c b/src/scsi/scsi_buslogic.c index 352232e34..0e8954aff 100644 --- a/src/scsi/scsi_buslogic.c +++ b/src/scsi/scsi_buslogic.c @@ -1551,6 +1551,8 @@ buslogic_reset(void *priv) reset_state.timer = dev->timer; reset_state.ResetCB = dev->ResetCB; + reset_state.pci_slot = dev->pci_slot; + memcpy(dev, &reset_state, sizeof(x54x_t)); dev->timer.period = 10.0; From 9f03881dd84d173280583e289ffa7a9b9258f538 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miran=20Gr=C4=8Da?= Date: Wed, 30 Apr 2025 18:04:25 +0200 Subject: [PATCH 094/180] Trigem 486G: Fix memory limits. --- src/machine/machine_table.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/machine/machine_table.c b/src/machine/machine_table.c index 39d9cc9ff..c269c7b0f 100644 --- a/src/machine/machine_table.c +++ b/src/machine/machine_table.c @@ -7328,9 +7328,9 @@ const machine_t machines[] = { .bus_flags = MACHINE_PS2_VLB, .flags = MACHINE_IDE | MACHINE_APM, /* Has internal video: Western Digital WD90C33-ZZ */ .ram = { - .min = 1024, - .max = 65536, - .step = 1024 + .min = 4096, + .max = 40960, + .step = 4096 }, .nvrmask = 127, .kbc_device = NULL, From a6599a60b2f246c6e39f6969fabc481cbe6ee6c8 Mon Sep 17 00:00:00 2001 From: OBattler Date: Wed, 30 Apr 2025 18:46:39 +0200 Subject: [PATCH 095/180] TriGem 486G: Initialize NVR with 0x00's instead of 0xFF's, fixes the cache error on empty NVR. --- src/machine/m_at_386dx_486.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/machine/m_at_386dx_486.c b/src/machine/m_at_386dx_486.c index ef30a5aa4..264111a96 100644 --- a/src/machine/m_at_386dx_486.c +++ b/src/machine/m_at_386dx_486.c @@ -2283,7 +2283,10 @@ machine_at_tg486gp_init(const machine_t *model) if (bios_only || !ret) return ret; - machine_at_common_ide_init(model); + machine_at_common_init_ex(model, 2); + device_add(&amstrad_megapc_nvr_device); + + device_add(&ide_isa_device); device_add(&ali1429g_device); From 77f7be608ec596c0c584cccf43eb59f669faf96b Mon Sep 17 00:00:00 2001 From: OBattler Date: Wed, 30 Apr 2025 19:15:12 +0200 Subject: [PATCH 096/180] Turns out I committed the NVR fix to the wrong TriGem 486 machine. --- src/machine/m_at_386dx_486.c | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/machine/m_at_386dx_486.c b/src/machine/m_at_386dx_486.c index 264111a96..5b746e3ef 100644 --- a/src/machine/m_at_386dx_486.c +++ b/src/machine/m_at_386dx_486.c @@ -2283,10 +2283,7 @@ machine_at_tg486gp_init(const machine_t *model) if (bios_only || !ret) return ret; - machine_at_common_init_ex(model, 2); - device_add(&amstrad_megapc_nvr_device); - - device_add(&ide_isa_device); + machine_at_common_ide_init(model); device_add(&ali1429g_device); @@ -2319,7 +2316,8 @@ machine_at_tg486g_init(const machine_t *model) if (bios_only || !ret) return ret; - machine_at_common_init(model); + machine_at_common_init_ex(model, 2); + device_add(&amstrad_megapc_nvr_device); device_add(&sis_85c471_device); device_add(&ide_isa_device); device_add(&fdc37c651_ide_device); From 26c0e4af811f1a41cc73bca04e8424156d8d8b38 Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Wed, 30 Apr 2025 14:51:49 -0400 Subject: [PATCH 097/180] Fix second standard joystick --- src/game/joystick_standard.c | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/src/game/joystick_standard.c b/src/game/joystick_standard.c index 122d2c65f..5f200cb98 100644 --- a/src/game/joystick_standard.c +++ b/src/game/joystick_standard.c @@ -62,13 +62,18 @@ joystick_standard_read(UNUSED(void *priv)) { uint8_t ret = 0xf0; - for (int js = 0; js < 2; js++) { - if (JOYSTICK_PRESENT(0, js)) { - if (joystick_state[0][js].button[0]) - ret &= ~0x10; - if (joystick_state[0][js].button[1]) - ret &= ~0x20; - } + if (JOYSTICK_PRESENT(0, 0)) { + if (joystick_state[0][0].button[0]) + ret &= ~0x10; + if (joystick_state[0][0].button[1]) + ret &= ~0x20; + } + + if (JOYSTICK_PRESENT(0, 1)) { + if (joystick_state[0][1].button[0]) + ret &= ~0x40; + if (joystick_state[0][1].button[1]) + ret &= ~0x80; } return ret; From 49bbd6e8cdcd451c099a86d18f9a28868c22c097 Mon Sep 17 00:00:00 2001 From: OBattler Date: Wed, 30 Apr 2025 22:20:33 +0200 Subject: [PATCH 098/180] Removed the usage deprecation warning. --- src/86box.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/86box.c b/src/86box.c index cd573d98f..1d7a73060 100644 --- a/src/86box.c +++ b/src/86box.c @@ -665,7 +665,9 @@ pc_init(int argc, char *argv[]) time_t now; int c; int lvmp = 0; +#ifdef DEPRECATE_USAGE int deprecated = 1; +#endif #ifdef ENABLE_NG int ng = 0; #endif @@ -750,7 +752,9 @@ usage: goto usage; ppath = argv[++c]; +#ifdef DEPRECATE_USAGE deprecated = 0; +#endif } else if (!strcasecmp(argv[c], "--rompath") || !strcasecmp(argv[c], "-R")) { if ((c + 1) == argc) goto usage; @@ -762,7 +766,9 @@ usage: goto usage; cfg = argv[++c]; +#ifdef DEPRECATE_USAGE deprecated = 0; +#endif } else if (!strcasecmp(argv[c], "--image") || !strcasecmp(argv[c], "-I")) { if ((c + 1) == argc) goto usage; @@ -862,16 +868,20 @@ usage: else cfg = argv[c++]; +#ifdef DEPRECATE_USAGE deprecated = 0; +#endif } if (c != argc) goto usage; +#ifdef DEPRECATE_USAGE if (deprecated) pc_show_usage("Running 86Box without a specified VM path and/or configuration\n" "file has been deprected. Please specify one or use a manager\n" "(Avalonia 86 is recommended).\n\n"); +#endif path_slash(usr_path); path_slash(rom_path); From 8c736c7b9a66f5ec26db51a154f08af9edb19ba5 Mon Sep 17 00:00:00 2001 From: TC1995 Date: Wed, 30 Apr 2025 23:15:58 +0200 Subject: [PATCH 099/180] Stall fix for the mach8/32 (April 30th, 2025) See above. --- src/video/vid_ati_mach8.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/video/vid_ati_mach8.c b/src/video/vid_ati_mach8.c index 07fa0a93c..ce6ee12d5 100644 --- a/src/video/vid_ati_mach8.c +++ b/src/video/vid_ati_mach8.c @@ -4264,10 +4264,13 @@ mach_accel_in_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, in if (dev->force_busy) { temp |= 0x0200; /*Hardware busy*/ if (mach->accel.cmd_type >= 0) { + mono_src = (mach->accel.dp_config >> 5) & 3; switch (mach->accel.cmd_type) { case 2: if (dev->accel.sy >= mach->accel.height) dev->force_busy = 0; + else if (mono_src == 2) + dev->force_busy = 0; break; case 5: if (dev->accel.sx >= mach->accel.width) From 27425dbd492e935e094eb120139bc0d70cc03ebc Mon Sep 17 00:00:00 2001 From: OBattler Date: Thu, 1 May 2025 15:39:43 +0200 Subject: [PATCH 100/180] SiS 85c471: Implement DRAM banks/rows. --- src/chipset/sis_85c4xx.c | 442 ++++++++++++++++++++++++++++++++++++--- 1 file changed, 418 insertions(+), 24 deletions(-) diff --git a/src/chipset/sis_85c4xx.c b/src/chipset/sis_85c4xx.c index 537675a85..003b66697 100644 --- a/src/chipset/sis_85c4xx.c +++ b/src/chipset/sis_85c4xx.c @@ -36,24 +36,340 @@ #include <86box/machine.h> #include <86box/chipset.h> +typedef struct ram_bank_t { + uint32_t virt_base; + uint32_t virt_size; + uint32_t phys_base; + uint32_t phys_size; + + mem_mapping_t mapping; +} ram_bank_t; + typedef struct sis_85c4xx_t { - uint8_t cur_reg; - uint8_t tries; - uint8_t reg_base; - uint8_t reg_last; - uint8_t reg_00; - uint8_t is_471; - uint8_t force_flush; - uint8_t shadowed; - uint8_t smram_enabled; - uint8_t pad; - uint8_t regs[39]; - uint8_t scratch[2]; - uint32_t mem_state[8]; - smram_t *smram; - port_92_t *port_92; + uint8_t cur_reg; + uint8_t tries; + uint8_t reg_base; + uint8_t reg_last; + uint8_t reg_00; + uint8_t is_471; + uint8_t ram_banks_val; + uint8_t force_flush; + uint8_t shadowed; + uint8_t smram_enabled; + uint8_t pad; + uint8_t regs[39]; + uint8_t scratch[2]; + uint32_t mem_state[8]; + ram_bank_t ram_banks[8]; + smram_t * smram; + port_92_t * port_92; } sis_85c4xx_t; +static uint8_t ram_4xx[64] = { 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x03, 0x00, + 0x04, 0x00, 0x05, 0x00, 0x0b, 0x00, 0x00, 0x00, + 0x19, 0x00, 0x06, 0x00, 0x14, 0x00, 0x00, 0x00, + 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x1b, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, + 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; +static uint8_t ram_471[64] = { 0x00, 0x00, 0x01, 0x01, 0x02, 0x20, 0x09, 0x09, + 0x04, 0x04, 0x05, 0x05, 0x0b, 0x0b, 0x0b, 0x0b, + 0x13, 0x21, 0x06, 0x06, 0x0d, 0x0d, 0x0d, 0x0d, + 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, + 0x1b, 0x1b, 0x1b, 0x1b, 0x0f, 0x0f, 0x0f, 0x0f, + 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, + 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, + 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e }; +static uint8_t ram_tg486g[64] = { 0x10, 0x10, 0x10, 0x10, 0x10, 0x11, 0x11, 0x11, + 0x11, 0x12, 0x12, 0x12, 0x12, 0x13, 0x13, 0x13, + 0x13, 0x14, 0x14, 0x14, 0x14, 0x15, 0x15, 0x15, + 0x15, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, + 0x1d, 0x16, 0x16, 0x16, 0x16, 0x17, 0x17, 0x17, + 0x17, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, + 0x1e, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, + 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f }; + +static uint32_t banks_471[64][4] = { { 0x00100000, 0x00000000, 0x00000000, 0x00000000 }, /* 0x00 */ + { 0x00100000, 0x00100000, 0x00000000, 0x00000000 }, + { 0x00100000, 0x00100000, 0x00200000, 0x00000000 }, + { 0x00100000, 0x00100000, 0x00400000, 0x00000000 }, + { 0x00100000, 0x00100000, 0x00200000, 0x00400000 }, + { 0x00100000, 0x00100000, 0x00400000, 0x00400000 }, + { 0x00100000, 0x00100000, 0x01000000, 0x00000000 }, + { 0x00200000, 0x00000000, 0x00000000, 0x00000000 }, + { 0x00200000, 0x00200000, 0x00000000, 0x00000000 }, /* 0x08 */ + { 0x00200000, 0x00400000, 0x00000000, 0x00000000 }, + { 0x00200000, 0x00200000, 0x00400000, 0x00000000 }, + { 0x00200000, 0x00200000, 0x00400000, 0x00400000 }, + { 0x00200000, 0x01000000, 0x00000000, 0x00000000 }, + { 0x00200000, 0x00200000, 0x01000000, 0x00000000 }, + { 0x00200000, 0x00200000, 0x00400000, 0x01000000 }, + { 0x00200000, 0x00200000, 0x01000000, 0x01000000 }, + { 0x00400000, 0x00000000, 0x00000000, 0x00000000 }, /* 0x10 */ + { 0x00400000, 0x00400000, 0x00000000, 0x00000000 }, + { 0x00400000, 0x00400000, 0x00400000, 0x00000000 }, + { 0x00400000, 0x00400000, 0x00400000, 0x00400000 }, + { 0x00400000, 0x01000000, 0x00000000, 0x00000000 }, + { 0x00400000, 0x00400000, 0x01000000, 0x00000000 }, + { 0x00400000, 0x01000000, 0x01000000, 0x00000000 }, + { 0x00400000, 0x00400000, 0x01000000, 0x01000000 }, + { 0x00800000, 0x00000000, 0x00000000, 0x00000000 }, /* 0x18 */ + { 0x00800000, 0x00800000, 0x00000000, 0x00000000 }, + { 0x00800000, 0x00800000, 0x00800000, 0x00000000 }, + { 0x00800000, 0x00800000, 0x00800000, 0x00800000 }, + { 0x01000000, 0x00000000, 0x00000000, 0x00000000 }, + { 0x01000000, 0x01000000, 0x00000000, 0x00000000 }, + { 0x01000000, 0x01000000, 0x01000000, 0x00000000 }, + { 0x01000000, 0x01000000, 0x01000000, 0x01000000 }, + { 0x00100000, 0x00400000, 0x00000000, 0x00000000 }, /* 0x20 */ + { 0x00100000, 0x01000000, 0x00000000, 0x00000000 }, + { 0x00100000, 0x04000000, 0x00000000, 0x00000000 }, + { 0x00400000, 0x00800000, 0x00000000, 0x00000000 }, + { 0x00400000, 0x04000000, 0x00000000, 0x00000000 }, + { 0x00400000, 0x00400000, 0x04000000, 0x00000000 }, + { 0x01000000, 0x04000000, 0x00000000, 0x00000000 }, + { 0x01000000, 0x01000000, 0x04000000, 0x00000000 }, + { 0x04000000, 0x00000000, 0x00000000, 0x00000000 }, /* 0x28 */ + { 0x04000000, 0x04000000, 0x00000000, 0x00000000 }, + { 0x00400000, 0x02000000, 0x00000000, 0x00000000 }, + { 0x00400000, 0x02000000, 0x02000000, 0x00000000 }, + { 0x00400000, 0x00400000, 0x02000000, 0x00000000 }, + { 0x00400000, 0x00400000, 0x02000000, 0x02000000 }, + { 0x01000000, 0x02000000, 0x00000000, 0x00000000 }, + { 0x01000000, 0x02000000, 0x02000000, 0x00000000 }, + { 0x01000000, 0x01000000, 0x02000000, 0x00000000 }, /* 0x30 */ + { 0x01000000, 0x01000000, 0x02000000, 0x02000000 }, + { 0x02000000, 0x00000000, 0x00000000, 0x00000000 }, + { 0x02000000, 0x02000000, 0x00000000, 0x00000000 }, + { 0x02000000, 0x02000000, 0x02000000, 0x00000000 }, + { 0x02000000, 0x02000000, 0x02000000, 0x02000000 }, + { 0x00400000, 0x00800000, 0x00800000, 0x00000000 }, + { 0x00400000, 0x00800000, 0x00800000, 0x00800000 }, + { 0x00400000, 0x00400000, 0x00800000, 0x00000000 }, /* 0x38 */ + { 0x00400000, 0x00400000, 0x00800000, 0x00800000 }, + { 0x00800000, 0x01000000, 0x00000000, 0x00000000 }, + { 0x00800000, 0x00800000, 0x00800000, 0x01000000 }, + { 0x00800000, 0x00800000, 0x01000000, 0x00000000 }, + { 0x00800000, 0x00800000, 0x01000000, 0x01000000 }, + { 0x00800000, 0x00800000, 0x02000000, 0x00000000 }, + { 0x00800000, 0x00800000, 0x02000000, 0x02000000 } }; + +static uint32_t +sis_85c471_get_row(ram_bank_t *dev, uint32_t addr) +{ + uint32_t ret = 0x00000000; + + switch (dev->virt_size) { + case 0x04000000: + ret = (addr >> 14) & 0x00000fff; + break; + case 0x01000000: + ret = (addr >> 13) & 0x000007ff; + break; + case 0x00400000: + ret = (addr >> 12) & 0x000003ff; + break; + case 0x00100000: + ret = (addr >> 11) & 0x000001ff; + break; + } + + return ret; +} + +static uint32_t +sis_85c471_get_col(ram_bank_t *dev, uint32_t addr) +{ + uint32_t ret = 0x00000000; + + switch (dev->virt_size) { + case 0x04000000: + ret = (addr >> 2) & 0x00000fff; + break; + case 0x01000000: + ret = (addr >> 2) & 0x000007ff; + break; + case 0x00400000: + ret = (addr >> 2) & 0x000003ff; + break; + case 0x00100000: + ret = (addr >> 2) & 0x000001ff; + break; + } + + return ret; +} + +static uint32_t +sis_85c471_set_row(ram_bank_t *dev, uint32_t addr) +{ + uint32_t ret = 0x00000000; + + switch (dev->phys_size) { + case 0x04000000: + ret = (addr & 0x00000fff) << 14; + break; + case 0x01000000: + ret = (addr & 0x000007ff) << 13; + break; + case 0x00400000: + ret = (addr & 0x000003ff) << 12; + break; + case 0x00100000: + ret = (addr & 0x000002ff) << 11; + break; + } + + return ret; +} + +static uint32_t +sis_85c471_set_col(ram_bank_t *dev, uint32_t addr) +{ + uint32_t ret = 0x00000000; + + switch (dev->phys_size) { + case 0x04000000: + ret = (addr & 0x00000fff) << 2; + break; + case 0x01000000: + ret = (addr & 0x000007ff) << 2; + break; + case 0x00400000: + ret = (addr & 0x000003ff) << 2; + break; + case 0x00100000: + ret = (addr & 0x000002ff) << 2; + break; + } + + return ret; +} + +static uint8_t +sis_85c471_read_ram(uint32_t addr, void *priv) +{ + ram_bank_t *dev = (ram_bank_t *) priv; + uint32_t rel = addr - dev->virt_base; + uint8_t ret = 0xff; + + if ((dev->virt_size == 0x01000000) && (dev->phys_size == 0x00400000)) { + uint32_t row = sis_85c471_set_row(dev, sis_85c471_get_row(dev, rel)); + uint32_t col = sis_85c471_set_col(dev, sis_85c471_get_col(dev, rel)); + uint32_t dw = rel & 0x00000003; + rel = row | col | dw; + } + + addr = (rel + dev->phys_base); + + if ((addr < (mem_size << 10)) && (rel < dev->phys_size)) + ret = ram[addr]; + + return ret; +} + +static uint16_t +sis_85c471_read_ramw(uint32_t addr, void *priv) +{ + ram_bank_t *dev = (ram_bank_t *) priv; + uint32_t rel = addr - dev->virt_base; + uint16_t ret = 0xffff; + + if ((dev->virt_size == 0x01000000) && (dev->phys_size == 0x00400000)) { + uint32_t row = sis_85c471_set_row(dev, sis_85c471_get_row(dev, rel)); + uint32_t col = sis_85c471_set_col(dev, sis_85c471_get_col(dev, rel)); + uint32_t dw = rel & 0x00000003; + rel = row | col | dw; + } + + addr = (rel + dev->phys_base); + + if ((addr < (mem_size << 10)) && (rel < dev->phys_size)) + ret = *(uint16_t *) &(ram[addr]); + + return ret; +} + +static uint32_t +sis_85c471_read_raml(uint32_t addr, void *priv) +{ + ram_bank_t *dev = (ram_bank_t *) priv; + uint32_t rel = addr - dev->virt_base; + uint32_t ret = 0xffffffff; + + if ((dev->virt_size == 0x01000000) && (dev->phys_size == 0x00400000)) { + uint32_t row = sis_85c471_set_row(dev, sis_85c471_get_row(dev, rel)); + uint32_t col = sis_85c471_set_col(dev, sis_85c471_get_col(dev, rel)); + uint32_t dw = rel & 0x00000003; + rel = row | col | dw; + } + + addr = (rel + dev->phys_base); + + if ((addr < (mem_size << 10)) && (rel < dev->phys_size)) + ret = *(uint32_t *) &(ram[addr]); + + return ret; +} + +static void +sis_85c471_write_ram(uint32_t addr, uint8_t val, void *priv) +{ + ram_bank_t *dev = (ram_bank_t *) priv; + uint32_t rel = addr - dev->virt_base; + + if ((dev->virt_size == 0x01000000) && (dev->phys_size == 0x00400000)) { + uint32_t row = sis_85c471_set_row(dev, sis_85c471_get_row(dev, rel)); + uint32_t col = sis_85c471_set_col(dev, sis_85c471_get_col(dev, rel)); + uint32_t dw = rel & 0x00000003; + rel = row | col | dw; + } + + addr = (rel + dev->phys_base); + + if ((addr < (mem_size << 10)) && (rel < dev->phys_size)) + ram[addr] = val; +} + +static void +sis_85c471_write_ramw(uint32_t addr, uint16_t val, void *priv) +{ + ram_bank_t *dev = (ram_bank_t *) priv; + uint32_t rel = addr - dev->virt_base; + + if ((dev->virt_size == 0x01000000) && (dev->phys_size == 0x00400000)) { + uint32_t row = sis_85c471_set_row(dev, sis_85c471_get_row(dev, rel)); + uint32_t col = sis_85c471_set_col(dev, sis_85c471_get_col(dev, rel)); + uint32_t dw = rel & 0x00000003; + rel = row | col | dw; + } + + addr = (rel + dev->phys_base); + + if ((addr < (mem_size << 10)) && (rel < dev->phys_size)) + *(uint16_t *) &(ram[addr]) = val; +} + +static void +sis_85c471_write_raml(uint32_t addr, uint32_t val, void *priv) +{ + ram_bank_t *dev = (ram_bank_t *) priv; + uint32_t rel = addr - dev->virt_base; + + if ((dev->virt_size == 0x01000000) && (dev->phys_size == 0x00400000)) { + uint32_t row = sis_85c471_set_row(dev, sis_85c471_get_row(dev, rel)); + uint32_t col = sis_85c471_set_col(dev, sis_85c471_get_col(dev, rel)); + uint32_t dw = rel & 0x00000003; + rel = row | col | dw; + } + + addr = (rel + dev->phys_base); + + if ((addr < (mem_size << 10)) && (rel < dev->phys_size)) + *(uint32_t *) &(ram[addr]) = val; +} + static void sis_85c4xx_recalcremap(sis_85c4xx_t *dev) { @@ -158,6 +474,60 @@ sis_85c4xx_sw_smi_handler(sis_85c4xx_t *dev) NULL, NULL, NULL, sis_85c4xx_sw_smi_out, NULL, NULL, dev); } +static void +sis_85c471_banks_split(uint32_t *b_ex, uint32_t *banks) +{ + for (uint8_t i = 0; i < 4; i++) { + if ((banks[i] == 0x00200000) || (banks[i] == 0x00800000) || + (banks[i] == 0x02000000)) + b_ex[i << 1] = b_ex[(i << 1) + 1] = banks[i] >> 1; + else { + b_ex[i << 1] = banks[i]; + b_ex[(i << 1) + 1] = 0x00000000; + } + } +} + +static void +sis_85c471_banks_recalc(sis_85c4xx_t *dev) +{ + for (uint8_t i = 0; i < 8; i++) + mem_mapping_disable(&dev->ram_banks[i].mapping); + + mem_mapping_disable(&ram_low_mapping); + mem_mapping_disable(&ram_high_mapping); + mem_set_mem_state_both(1 << 20, 127 << 20, MEM_READ_EXTERNAL | MEM_WRITE_EXTERNAL); + + if ((dev->regs[0x09] & 0x3f) == dev->ram_banks_val) { + if (mem_size > 1024) { + mem_mapping_enable(&ram_low_mapping); + mem_mapping_enable(&ram_high_mapping); + mem_set_mem_state_both(1 << 20, (mem_size << 10) - (1 << 20), + MEM_READ_INTERNAL | MEM_WRITE_INTERNAL); + } + } else { + uint8_t banks_val = dev->regs[0x09] & 0x3f; + uint32_t *banks = banks_471[banks_val]; + uint32_t b_ex[8] = { 0x00000000 }; + uint32_t size = 0x00000000; + + sis_85c471_banks_split(b_ex, banks); + + for (uint8_t i = 0; i < 8; i++) if (b_ex[i] != 0x00000000) { + dev->ram_banks[i].virt_base = size; + dev->ram_banks[i].virt_size = b_ex[i]; + + mem_mapping_set_addr(&dev->ram_banks[i].mapping, size, b_ex[i]); + + size += b_ex[i]; + } + + mem_set_mem_state_both(1 << 20, 127 << 20, MEM_READ_INTERNAL | MEM_WRITE_INTERNAL); + } + + flushmmucache_nopc(); +} + static void sis_85c4xx_out(uint16_t port, uint8_t val, void *priv) { @@ -192,6 +562,11 @@ sis_85c4xx_out(uint16_t port, uint8_t val, void *priv) sis_85c4xx_recalcmapping(dev); break; + case 0x09: + if (dev->is_471) + sis_85c471_banks_recalc(dev); + break; + case 0x0b: sis_85c4xx_sw_smi_handler(dev); if (valxor & 0x02) @@ -297,14 +672,6 @@ sis_85c4xx_reset(void *priv) { sis_85c4xx_t *dev = (sis_85c4xx_t *) priv; int mem_size_mb = mem_size >> 10; - static uint8_t ram_4xx[64] = { 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x03, 0x00, 0x04, 0x00, 0x05, 0x00, 0x0b, 0x00, 0x00, 0x00, - 0x19, 0x00, 0x06, 0x00, 0x14, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x1b, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; - static uint8_t ram_471[64] = { 0x00, 0x00, 0x01, 0x01, 0x02, 0x20, 0x09, 0x09, 0x04, 0x04, 0x05, 0x05, 0x0b, 0x0b, 0x0b, 0x0b, - 0x13, 0x21, 0x06, 0x06, 0x0d, 0x0d, 0x0d, 0x0d, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, - 0x1b, 0x1b, 0x1b, 0x1b, 0x0f, 0x0f, 0x0f, 0x0f, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, - 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e }; memset(dev->regs, 0x00, sizeof(dev->regs)); @@ -318,8 +685,25 @@ sis_85c4xx_reset(void *priv) dev->regs[0x09] |= 0x22; else dev->regs[0x09] |= 0x24; - } else + } else if (!strcmp(machine_get_internal_name(), "tg486g")) + dev->regs[0x09] |= ram_tg486g[mem_size_mb]; + else dev->regs[0x09] |= ram_471[mem_size_mb]; + dev->ram_banks_val = dev->regs[0x09] & 0x3f; + dev->regs[0x09] = 0x00; + + uint32_t *banks = banks_471[dev->ram_banks_val]; + uint32_t b_ex[8] = { 0x00000000 }; + uint32_t size = 0x00000000; + + sis_85c471_banks_split(b_ex, banks); + + for (uint8_t i = 0; i < 8; i++) { + dev->ram_banks[i].phys_base = size; + dev->ram_banks[i].phys_size = b_ex[i]; + + size += b_ex[i]; + } dev->regs[0x11] = 0x09; dev->regs[0x12] = 0xff; @@ -332,6 +716,8 @@ sis_85c4xx_reset(void *priv) port_92_remove(dev->port_92); soft_reset_mask = 0; + + sis_85c471_banks_recalc(dev); } else { /* Bits 6 and 7 must be clear on the SiS 40x. */ if (dev->reg_base == 0x60) @@ -380,6 +766,14 @@ sis_85c4xx_init(const device_t *info) dev->smram = smram_add(); dev->port_92 = device_add(&port_92_device); + + for (uint8_t i = 0; i < 8; i++) { + mem_mapping_add(&dev->ram_banks[i].mapping, 0x00000000, 0x00000000, + sis_85c471_read_ram, sis_85c471_read_ramw, sis_85c471_read_raml, + sis_85c471_write_ram, sis_85c471_write_ramw, sis_85c471_write_raml, + NULL, MEM_MAPPING_INTERNAL, &(dev->ram_banks[i])); + mem_mapping_disable(&dev->ram_banks[i].mapping); + } } else dev->reg_last = dev->reg_base + 0x11; From a2abb497e2d75d67cc9d4482a785e7910aabcc86 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Hrdli=C4=8Dka?= <13226155+dhrdlicka@users.noreply.github.com> Date: Thu, 1 May 2025 21:02:59 +0200 Subject: [PATCH 101/180] Fix header guard warning --- src/qt/qt_iconindicators.hpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/qt/qt_iconindicators.hpp b/src/qt/qt_iconindicators.hpp index 861e41d94..12f82f259 100644 --- a/src/qt/qt_iconindicators.hpp +++ b/src/qt/qt_iconindicators.hpp @@ -1,5 +1,5 @@ #ifndef QT_ICONINDICATORS_HPP -# define QT_INDICATORS_HPP +# define QT_ICONINDICATORS_HPP #include #include @@ -14,4 +14,4 @@ enum IconIndicator { QPixmap getIconWithIndicator(const QIcon &icon, const QSize &size, QIcon::Mode iconMode, IconIndicator indicator); -#endif \ No newline at end of file +#endif From a72142f2b5395e04e40cbf0ecb0dd3ed73174d39 Mon Sep 17 00:00:00 2001 From: GreaseMonkey Date: Fri, 2 May 2025 10:51:34 +1200 Subject: [PATCH 102/180] Fix EGA/VGA/SVGA odd-even handling of write mask Matches my AMD Stoney + S3 Trio64V2, and also Intel's 2023 GPU docs (which *still* tend to be more accurate than IBM's), and makes more sense than what we've (I've?) been doing. --- src/video/vid_ega.c | 4 +--- src/video/vid_svga.c | 4 +--- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/src/video/vid_ega.c b/src/video/vid_ega.c index 8333e522e..b828239c0 100644 --- a/src/video/vid_ega.c +++ b/src/video/vid_ega.c @@ -1180,9 +1180,7 @@ ega_write(uint32_t addr, uint8_t val, void *priv) cycles -= video_timing_write_b; if (ega->chain2_write) { - writemask2 &= ~0xa; - if (addr & 1) - writemask2 <<= 1; + writemask2 &= 0x5 << (addr & 1); } addr = ega_remap_cpu_addr(addr, ega); diff --git a/src/video/vid_svga.c b/src/video/vid_svga.c index 67469ed22..86a57c00e 100644 --- a/src/video/vid_svga.c +++ b/src/video/vid_svga.c @@ -1689,9 +1689,7 @@ svga_write_common(uint32_t addr, uint8_t val, uint8_t linear, void *priv) addr &= ~3; addr = ((addr & 0xfffc) << 2) | ((addr & 0x30000) >> 14) | (addr & ~0x3ffff); } else if (svga->chain2_write) { - writemask2 &= ~0xa; - if (addr & 1) - writemask2 <<= 1; + writemask2 &= 0x5 << (addr & 1); addr &= ~1; addr <<= 2; } else From 5e85f4533a18026311f5249b1cab826034a590a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miran=20Gr=C4=8Da?= Date: Fri, 2 May 2025 02:06:02 +0200 Subject: [PATCH 103/180] Update RAM limits for SiS 471 machines --- src/machine/machine_table.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/machine/machine_table.c b/src/machine/machine_table.c index c269c7b0f..77132b6b5 100644 --- a/src/machine/machine_table.c +++ b/src/machine/machine_table.c @@ -7089,7 +7089,7 @@ const machine_t machines[] = { .flags = MACHINE_APM, .ram = { .min = 1024, - .max = 65536, + .max = 131072, .step = 1024 }, .nvrmask = 127, @@ -7129,7 +7129,7 @@ const machine_t machines[] = { .flags = MACHINE_APM, .ram = { .min = 1024, - .max = 65536, + .max = 131072, .step = 1024 }, .nvrmask = 127, @@ -7209,7 +7209,7 @@ const machine_t machines[] = { .flags = MACHINE_APM, .ram = { .min = 1024, - .max = 65536, + .max = 131072, .step = 1024 }, .nvrmask = 127, @@ -7249,7 +7249,7 @@ const machine_t machines[] = { .flags = MACHINE_APM, .ram = { .min = 1024, - .max = 65536, + .max = 131072, .step = 1024 }, .nvrmask = 127, @@ -7368,9 +7368,9 @@ const machine_t machines[] = { .bus_flags = MACHINE_PS2, .flags = MACHINE_IDE_DUAL | MACHINE_SUPER_IO | MACHINE_APM | MACHINE_VIDEO, .ram = { - .min = 1024, - .max = 65536, - .step = 1024 + .min = 4096, + .max = 69632, + .step = 4096 }, .nvrmask = 127, .kbc_device = NULL, From 7885c28ea2ad5597d8c52c73b750d59a0bce2ad4 Mon Sep 17 00:00:00 2001 From: OBattler Date: Fri, 2 May 2025 02:17:09 +0200 Subject: [PATCH 104/180] SiS 471: Fix RAM bank values (and some other minor things), fixes #5534. --- src/chipset/sis_85c4xx.c | 35 +++++++++++++++++++++++++++++------ 1 file changed, 29 insertions(+), 6 deletions(-) diff --git a/src/chipset/sis_85c4xx.c b/src/chipset/sis_85c4xx.c index 003b66697..51f7fd4e6 100644 --- a/src/chipset/sis_85c4xx.c +++ b/src/chipset/sis_85c4xx.c @@ -33,6 +33,7 @@ #include <86box/mem.h> #include <86box/smram.h> #include <86box/pic.h> +#include <86box/keyboard.h> #include <86box/machine.h> #include <86box/chipset.h> @@ -79,8 +80,8 @@ static uint8_t ram_471[64] = { 0x00, 0x00, 0x01, 0x01, 0x02, 0x20, 0x09, 0x09, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x1b, 0x1b, 0x1b, 0x1b, 0x0f, 0x0f, 0x0f, 0x0f, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, - 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, - 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e }; + 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, + 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d }; static uint8_t ram_tg486g[64] = { 0x10, 0x10, 0x10, 0x10, 0x10, 0x11, 0x11, 0x11, 0x11, 0x12, 0x12, 0x12, 0x12, 0x13, 0x13, 0x13, 0x13, 0x14, 0x14, 0x14, 0x14, 0x15, 0x15, 0x15, @@ -544,12 +545,23 @@ sis_85c4xx_out(uint16_t port, uint8_t val, void *priv) case 0x23: if ((dev->cur_reg >= dev->reg_base) && (dev->cur_reg <= dev->reg_last)) { valxor = val ^ dev->regs[rel_reg]; - if (rel_reg == 0x00) + + if (!dev->is_471 && (rel_reg == 0x00)) dev->regs[rel_reg] = (dev->regs[rel_reg] & 0x1f) | (val & 0xe0); else dev->regs[rel_reg] = val; switch (rel_reg) { + case 0x00: + if (val & 0x01) { + kbc_at_set_fast_reset(0); + cpu_cpurst_on_sr = 1; + } else { + kbc_at_set_fast_reset(1); + cpu_cpurst_on_sr = 0; + } + break; + case 0x01: cpu_cache_ext_enabled = ((val & 0x84) == 0x84); cpu_update_waitstates(); @@ -560,6 +572,8 @@ sis_85c4xx_out(uint16_t port, uint8_t val, void *priv) case 0x08: if (valxor) sis_85c4xx_recalcmapping(dev); + if (rel_reg == 0x08) + flushmmucache(); break; case 0x09: @@ -681,10 +695,16 @@ sis_85c4xx_reset(void *priv) if (dev->is_471) { dev->regs[0x09] = 0x40; if (mem_size_mb >= 64) { - if ((mem_size_mb >= 65) && (mem_size_mb < 68)) - dev->regs[0x09] |= 0x22; + if ((mem_size_mb >= 64) && (mem_size_mb < 68)) + dev->regs[0x09] |= 0x33; + if ((mem_size_mb >= 68) && (mem_size_mb < 72)) + dev->regs[0x09] |= 0x2b; + if ((mem_size_mb >= 72) && (mem_size_mb < 80)) + dev->regs[0x09] |= 0x2d; + if ((mem_size_mb >= 80) && (mem_size_mb < 96)) + dev->regs[0x09] |= 0x2f; else - dev->regs[0x09] |= 0x24; + dev->regs[0x09] |= 0x29; } else if (!strcmp(machine_get_internal_name(), "tg486g")) dev->regs[0x09] |= ram_tg486g[mem_size_mb]; else @@ -718,6 +738,9 @@ sis_85c4xx_reset(void *priv) soft_reset_mask = 0; sis_85c471_banks_recalc(dev); + + kbc_at_set_fast_reset(1); + cpu_cpurst_on_sr = 0; } else { /* Bits 6 and 7 must be clear on the SiS 40x. */ if (dev->reg_base == 0x60) From 384af874f5dee71ce0cd300d9186561d2d2227d8 Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Sat, 3 May 2025 17:02:30 +0600 Subject: [PATCH 105/180] Bochs VBE: Update for 0.9c ROM --- src/video/vid_bochs_vbe.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/video/vid_bochs_vbe.c b/src/video/vid_bochs_vbe.c index 36185214c..a87890c75 100644 --- a/src/video/vid_bochs_vbe.c +++ b/src/video/vid_bochs_vbe.c @@ -811,22 +811,22 @@ bochs_vbe_init(const device_t *info) dev->vram_size = device_get_config_int("memory") * (1 << 20); rom_init(&dev->bios_rom, "roms/video/bochs/VGABIOS-lgpl-latest.bin", - 0xc0000, 0x10000, 0xffff, 0x0000, + 0xc0000, 0x8000, 0x7fff, 0x0000, MEM_MAPPING_EXTERNAL); if (dev->id5_val == VBE_DISPI_ID4) { /* Patch the BIOS to match the PCI ID. */ dev->bios_rom.rom[0x010c] = 0xee; - dev->bios_rom.rom[0x8dff] -= (0xee - 0x34); + dev->bios_rom.rom[0x7fff] -= (0xee - 0x34); dev->bios_rom.rom[0x010d] = 0x80; - dev->bios_rom.rom[0x8dff] -= (0x80 - 0x12); + dev->bios_rom.rom[0x7fff] -= (0x80 - 0x12); dev->bios_rom.rom[0x010e] = 0xef; - dev->bios_rom.rom[0x8dff] -= (0xef - 0x11); + dev->bios_rom.rom[0x7fff] -= (0xef - 0x11); dev->bios_rom.rom[0x010f] = 0xbe; - dev->bios_rom.rom[0x8dff] -= (0xbe - 0x11); + dev->bios_rom.rom[0x7fff] -= (0xbe - 0x11); } video_inform(VIDEO_FLAG_TYPE_SPECIAL, &timing_bochs); From e09a5007c5d7cde3d27fcba0dfb8ee8a96f9770c Mon Sep 17 00:00:00 2001 From: toggo9 <121191375+toggo9@users.noreply.github.com> Date: Sat, 3 May 2025 21:10:55 +0200 Subject: [PATCH 106/180] Fix Acer P3 Machine table entry... ... to make the onboard video's RAM configurable. --- 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 77132b6b5..9c83f4b22 100644 --- a/src/machine/machine_table.c +++ b/src/machine/machine_table.c @@ -8392,7 +8392,7 @@ const machine_t machines[] = { .device = NULL, .fdc_device = NULL, .sio_device = NULL, - .vid_device = NULL, + .vid_device = &gd5434_onboard_pci_device, .snd_device = NULL, .net_device = NULL }, From c9d07c657c0cd8b33f5c93e989eda8db321fc1d6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jernej=20Simon=C4=8Di=C4=8D?= <1800143+jernejs@users.noreply.github.com> Date: Sat, 3 May 2025 21:58:14 +0200 Subject: [PATCH 107/180] Update sl-SI.po --- src/qt/languages/sl-SI.po | 196 +++++++++++++++++++------------------- 1 file changed, 98 insertions(+), 98 deletions(-) diff --git a/src/qt/languages/sl-SI.po b/src/qt/languages/sl-SI.po index 7c2b36650..dcb3dbf50 100644 --- a/src/qt/languages/sl-SI.po +++ b/src/qt/languages/sl-SI.po @@ -37,7 +37,7 @@ msgid "&Hide status bar" msgstr "&Skrij statusno vrstico" msgid "Hide &toolbar" -msgstr "Hide &toolbar" +msgstr "Skrij &orodno vrstico" msgid "&Resizeable window" msgstr "S&premenljiva velikost okna" @@ -55,7 +55,7 @@ msgid "Qt (&OpenGL)" msgstr "Qt (&OpenGL)" msgid "Open&GL (3.0 Core)" -msgstr "Open&GL (Jedro 3.0)" +msgstr "Open&GL (jedro 3.0)" msgid "&VNC" msgstr "&VNC" @@ -64,10 +64,10 @@ msgid "Specify dimensions..." msgstr "&Določi velikost..." msgid "F&orce 4:3 display ratio" -msgstr "&Vsili 4:3 razmerje zaslona" +msgstr "&Vsili razmerje zaslona 4:3" msgid "&Window scale factor" -msgstr "&Faktor velikosti okna" +msgstr "&Faktor povečave okna" msgid "&0.5x" msgstr "&0.5x" @@ -100,7 +100,7 @@ msgid "&8x" msgstr "&8x" msgid "Filter method" -msgstr "&Metoda filtriranja" +msgstr "&Vrsta filtriranja" msgid "&Nearest" msgstr "&Najbližja" @@ -241,7 +241,7 @@ msgid "E&ject" msgstr "I&zvrzi" msgid "&Image..." -msgstr "Slika..." +msgstr "S&lika..." msgid "E&xport to 86F..." msgstr "&Izvozi v 86F..." @@ -355,7 +355,7 @@ msgid "Speed:" msgstr "Hitrost:" msgid "Frequency:" -msgstr "Pogostost:" +msgstr "Takt:" msgid "FPU:" msgstr "Procesor plavajoče vejice:" @@ -367,7 +367,7 @@ msgid "MB" msgstr "MB" msgid "Memory:" -msgstr "Spomin:" +msgstr "Pomnilnik:" msgid "Time synchronization" msgstr "Sinhronizacija časa" @@ -445,7 +445,7 @@ msgid "FM synth driver" msgstr "Gonilnik sintetizacije FM" msgid "Nuked (more accurate)" -msgstr "Nuked (točnejši)" +msgstr "Nuked (natančnejši)" msgid "YMFM (faster)" msgstr "YMFM (hitrejši)" @@ -487,22 +487,22 @@ msgid "Serial port 4" msgstr "Serijska vrata 4" msgid "Parallel port 1" -msgstr "Paralelna vrata 1" +msgstr "Vzporedna vrata 1" msgid "Parallel port 2" -msgstr "Paralelna vrata 2" +msgstr "Vzporedna vrata 2" msgid "Parallel port 3" -msgstr "Paralelna vrata 3" +msgstr "Vzporedna vrata 3" msgid "Parallel port 4" -msgstr "Paralelna vrata 4" +msgstr "Vzporedna vrata 4" msgid "HD Controller:" msgstr "Krmilnik trdega diska:" msgid "FD Controller:" -msgstr "Krmilnik disketnika:" +msgstr "Disketni krmilnik:" msgid "Tertiary IDE Controller" msgstr "Terciarni krmilnik IDE" @@ -550,7 +550,7 @@ msgid "ID:" msgstr "ID:" msgid "&Specify..." -msgstr "Določi..." +msgstr "&Določi..." msgid "Sectors:" msgstr "Sektorji:" @@ -595,7 +595,7 @@ msgid "ZIP 250" msgstr "ZIP 250" msgid "ISA RTC:" -msgstr "Ura v realnem času ISA:" +msgstr "Ura realnega časa ISA:" msgid "ISA Memory Expansion" msgstr "Razširitev pomnilnika ISA" @@ -643,7 +643,7 @@ msgid "ZIP images" msgstr "ZIP slike" msgid "86Box could not find any usable ROM images.\n\nPlease download a ROM set and extract it into the \"roms\" directory." -msgstr "86Box ni našel nobenih uporabnih ROM slik.\n\nProsim prenesite set ROM-ov in ga razširite v mapo \"roms\"." +msgstr "86Box ni našel nobenih uporabnih ROM slik.\n\nProsim prenesite komplet ROM-ov in ga razširite v mapo \"roms\"." msgid "(empty)" msgstr "(prazno)" @@ -751,7 +751,7 @@ msgid "Type" msgstr "Vrsta" msgid "No PCap devices found" -msgstr "Nobena naprava PCap ni bila najdena" +msgstr "Najdena ni bila nobena naprava PCap" msgid "Invalid PCap device" msgstr "Neveljavna naprava PCap" @@ -874,16 +874,16 @@ msgid "Don't exit" msgstr "Prekliči izhod" msgid "Reset" -msgstr "Resetiraj" +msgstr "Znova zaženi" msgid "Don't reset" -msgstr "Ne resetiraj" +msgstr "Ne zaženi znova" msgid "CD-ROM images" msgstr "Slike CD-ROM" msgid "%1 Device Configuration" -msgstr "Konfiguracija naprave %1" +msgstr "Nastavitev naprave %1" msgid "Monitor in sleep mode" msgstr "Zaslon v načinu spanja" @@ -946,7 +946,7 @@ msgid "Add New Hard Disk" msgstr "Dodaj nov trdi disk" msgid "Add Existing Hard Disk" -msgstr "Dodaj obstoječ trdi disk" +msgstr "Dodaj obstoječi trdi disk" msgid "HDI disk images cannot be larger than 4 GB." msgstr "Slike diska HDI ne morejo biti večje od 4 GB." @@ -1048,13 +1048,13 @@ msgid "VHD files" msgstr "Datoteke VHD" msgid "Select the parent VHD" -msgstr "Izberite starševsko sliko VHD" +msgstr "Izberite nadrejeno sliko VHD" msgid "This could mean that the parent image was modified after the differencing image was created.\n\nIt can also happen if the image files were moved or copied, or by a bug in the program that created this disk.\n\nDo you want to fix the timestamps?" -msgstr "To lahko pomeni, da je bila starševska slika spremenjena potem, ko je že bila ustvarjena diferencialna slika.\n\nDo tega lahko pride tudi kadar so datoteke slik diska premaknjene ali kopirane, ali pa gre za hrošča v programu, ki je ustvaril ta disk.\n\nŽelite popraviti časovni žig?" +msgstr "To lahko pomeni, da je bila nadrejena slika spremenjena po ustvaritvi diferencialne slike.\n\nDo tega lahko pride tudi kadar so datoteke slik diska premaknjene ali kopirane, ali pa gre za hrošča v programu, ki je ustvaril ta disk.\n\nŽelite popraviti časovni žig?" msgid "Parent and child disk timestamps do not match" -msgstr "Časovna žiga starševske slike diska in slike diska otroka se ne ujemata" +msgstr "Časovna žiga nadrejene in podrejene slike diska se ne ujemata" msgid "Could not fix VHD timestamp." msgstr "Ne morem popraviti časovnega žiga slike VHD." @@ -1105,10 +1105,10 @@ msgid "1.44 MB" msgstr "1.44 MB" msgid "DMF (cluster 1024)" -msgstr "DMF (grozd 1024)" +msgstr "DMF (gruča 1024)" msgid "DMF (cluster 2048)" -msgstr "DMF (grozd 2048)" +msgstr "DMF (gruča 2048)" msgid "2.88 MB" msgstr "2.88 MB" @@ -1162,7 +1162,7 @@ msgid "(System Default)" msgstr "(Sistemsko privzeto)" msgid "Failed to initialize network driver" -msgstr "Ni uspelo inicializirati omrežnega gonilnika" +msgstr "Inicializacija omrežnega gonilnika ni uspela" msgid "The network configuration will be switched to the null driver" msgstr "Omrežne nastavitve bodo preklopljene na ničelni gonilnik" @@ -1234,7 +1234,7 @@ msgid "Open screenshots folder..." msgstr "Odprite mapo s posnetki zaslona..." msgid "Apply fullscreen stretch mode when maximized" -msgstr "Uporabi način celozaslonskega raztezanja v povečanem stanju" +msgstr "Uporabi način celozaslonskega raztezanja v maksimiranem stanju" msgid "Cursor/Puck" msgstr "Kazalec/ključ" @@ -1243,19 +1243,19 @@ msgid "Pen" msgstr "Pisalo" msgid "Host CD/DVD Drive (%1:)" -msgstr "Pogon CD/DVD gostitelja (%1:)" +msgstr "Gostiteljski pogon CD/DVD (%1:)" msgid "&Connected" msgstr "&Povezan" msgid "Clear image history" -msgstr "Jasna zgodovina slik" +msgstr "Počisti zgodovino slik" msgid "Create..." msgstr "Ustvari..." msgid "Host CD/DVD Drive (%1)" -msgstr "Pogon CD/DVD gostitelja (%1)" +msgstr "Gostiteljski pogon CD/DVD (%1)" msgid "Unknown Bus" msgstr "Neznano vodilo" @@ -1288,7 +1288,7 @@ msgid "Remove" msgstr "Odstrani" msgid "Browse..." -msgstr "Brskaj..." +msgstr "Prerskaj..." msgid "Couldn't create OpenGL context." msgstr "Ni bilo mogoče ustvariti konteksta OpenGL." @@ -1297,13 +1297,13 @@ msgid "Couldn't switch to OpenGL context." msgstr "Ni bilo mogoče preklopiti na kontekst OpenGL." msgid "OpenGL version 3.0 or greater is required. Current version is %1.%2" -msgstr "Zahteva se različica OpenGL 3.0 ali novejša. Trenutna različica je %1.%2" +msgstr "Potrebna je OpenGL različica 3.0 ali novejša. Trenutna različica je %1.%2" msgid "Error initializing OpenGL" msgstr "Napaka pri inicializaciji OpenGL" msgid "\nFalling back to software rendering." -msgstr "\nVrnitev k programskemu upodabljanju." +msgstr "\nVrnitev na programsko upodabljanje." msgid "<html><head/><body><p>When selecting media images (CD-ROM, floppy, etc.) the open dialog will start in the same directory as the 86Box configuration file. This setting will likely only make a difference on macOS.</p></body></html>" msgstr "<html><head/><body><p>Pri izbiri medijskih slik (CD-ROM, disketa itd.) se bo odprto pogovorno okno začelo v istem imeniku kot konfiguracijska datoteka 86Box. Ta nastavitev bo verjetno imela pomen le v operacijskem sistemu MacOS.</p></body></html>" @@ -1312,7 +1312,7 @@ msgid "This machine might have been moved or copied." msgstr "Ta naprava je bila morda premeščena ali kopirana." msgid "In order to ensure proper networking functionality, 86Box needs to know if this machine was moved or copied.\n\nSelect \"I Copied It\" if you are not sure." -msgstr "Da bi zagotovili pravilno delovanje omrežja, mora 86Box vedeti, ali je bil ta stroj prestavljen ali kopiran.\n\nČe niste prepričani, izberite \"Kopiral sem jo\"." +msgstr "Da bi zagotovili pravilno delovanje omrežja, mora 86Box vedeti, ali je bil ta virtualna naprava prestavljena ali kopirana.\n\nČe niste prepričani, izberite \"Kopiral sem jo\"." msgid "I Moved It" msgstr "Premaknil sem jo" @@ -1348,7 +1348,7 @@ msgid "Interface:" msgstr "Vmesnik:" msgid "Adapter:" -msgstr "Adapter:" +msgstr "Mrežna kartica:" msgid "VDE Socket:" msgstr "Vtičnica VDE:" @@ -1396,7 +1396,7 @@ msgid "3M MicroTouch (Serial)" msgstr "3M MicroTouch (serijska)" msgid "[COM] Standard Hayes-compliant Modem" -msgstr "[COM] Standardni modem v skladu s standardom Hayes" +msgstr "[COM] Standardni modem v skladen s Hayes" msgid "Roland MT-32 Emulation" msgstr "Emulacija Roland MT-32" @@ -1411,10 +1411,10 @@ msgid "Roland CM-32LN Emulation" msgstr "Emulacija Roland CM-32LN" msgid "OPL4-ML Daughterboard" -msgstr "Hčerinska plošča OPL4-ML" +msgstr "Dodatna kartica OPL4-ML" msgid "System MIDI" -msgstr "Sistem MIDI" +msgstr "Sistemski MIDI" msgid "MIDI Input Device" msgstr "Vhodna naprava MIDI" @@ -1423,7 +1423,7 @@ msgid "BIOS Address" msgstr "Naslov BIOS-a" msgid "Enable BIOS extension ROM Writes" -msgstr "Omogočanje razširitve BIOS-a ROM piše" +msgstr "Omogoči zapisovanje razširitev BIOS ROM-a" msgid "Address" msgstr "Naslov" @@ -1435,7 +1435,7 @@ msgid "BIOS Revision" msgstr "Revizija BIOS-a" msgid "Translate 26 -> 17" -msgstr "Prevesti 26 -> 17" +msgstr "Prevedi 26 -> 17" msgid "Language" msgstr "Jezik" @@ -1450,25 +1450,25 @@ msgid "BIOS size" msgstr "Velikost BIOS-a" msgid "Map C0000-C7FFF as UMB" -msgstr "Zemljevid C0000-C7FFF kot UMB" +msgstr "Preslikaj C0000-C7FFF kot UMB" msgid "Map C8000-CFFFF as UMB" -msgstr "Zemljevid C8000-CFFFF kot UMB" +msgstr "Preslikaj C8000-CFFFF kot UMB" msgid "Map D0000-D7FFF as UMB" -msgstr "Zemljevid D0000-D7FFF kot UMB" +msgstr "Preslikaj D0000-D7FFF kot UMB" msgid "Map D8000-DFFFF as UMB" -msgstr "Zemljevid D8000-DFFFF kot UMB" +msgstr "Preslikaj D8000-DFFFF kot UMB" msgid "Map E0000-E7FFF as UMB" -msgstr "Zemljevid E0000-E7FFF kot UMB" +msgstr "Preslikaj E0000-E7FFF kot UMB" msgid "Map E8000-EFFFF as UMB" -msgstr "Zemljevid E8000-EFFFF kot UMB" +msgstr "Preslikaj E8000-EFFFF kot UMB" msgid "JS9 Jumper (JIM)" -msgstr "JS9 Jumper (JIM)" +msgstr "JS9 mostiček (JIM)" msgid "MIDI Output Device" msgstr "Izhodna naprava MIDI" @@ -1582,10 +1582,10 @@ msgid "RAM Address" msgstr "Naslov RAM" msgid "RAM size" -msgstr "Velikost pomnilnika RAM" +msgstr "Velikost pomnilnika" msgid "Initial RAM size" -msgstr "Začetna velikost pomnilnika RAM" +msgstr "Začetna velikost pomnilnika" msgid "Serial Number" msgstr "Serijska številka" @@ -1597,7 +1597,7 @@ msgid "FDC Address" msgstr "Naslov FDC" msgid "MPU-401 Address" -msgstr "MPU-401 Naslov" +msgstr "Naslov MPU-401" msgid "MPU-401 IRQ" msgstr "MPU-401 IRQ" @@ -1633,7 +1633,7 @@ msgid "Enable OPL" msgstr "Omogoči OPL" msgid "Receive MIDI input (MPU-401)" -msgstr "Sprejemaj vhod MIDI (MPU-401)" +msgstr "Vhod MIDI za sprejem (MPU-401)" msgid "SB low DMA" msgstr "Nizki DMA SB" @@ -1666,7 +1666,7 @@ msgid "Codec" msgstr "Kodek" msgid "GUS type" -msgstr "Tip GUS" +msgstr "Vrsta GUS" msgid "Enable 0x04 \"Exit 86Box\" command" msgstr "Omogoči ukaz 0x04 \"Zapusti 86Box\"" @@ -1681,7 +1681,7 @@ msgid "RGB type" msgstr "Vrsta RGB zaslona" msgid "Line doubling type" -msgstr "Vrsta podvojitve črt" +msgstr "Vrsta podvojevanja črt" msgid "Snow emulation" msgstr "Emulacija snega" @@ -1693,16 +1693,16 @@ msgid "Character set" msgstr "Nabor znakov" msgid "XGA type" -msgstr "Tip kartice XGA" +msgstr "Vrsta kartice XGA" msgid "Instance" -msgstr "Primer" +msgstr "Primerek" msgid "MMIO Address" msgstr "Naslov MMIO" msgid "RAMDAC type" -msgstr "Vrsta čipa RAMDAC" +msgstr "Vrsta RAMDAC" msgid "Blend" msgstr "Mešanica" @@ -1714,13 +1714,13 @@ msgid "Dithering" msgstr "Barvno stresanje" msgid "Enable NMI for CGA emulation" -msgstr "Omogočite NMI za emulacijo CGA" +msgstr "Omogoči NMI za emulacijo CGA" msgid "Voodoo type" -msgstr "Tip kartice Voodoo" +msgstr "Vrsta kartice Voodoo" msgid "Framebuffer memory size" -msgstr "Velikost pomnilnika predpomnilnika okvirja" +msgstr "Velikost videopomnilnika" msgid "Texture memory size" msgstr "Velikost pomnilnika tekstur" @@ -1732,7 +1732,7 @@ msgid "Screen Filter" msgstr "Filter zaslona" msgid "Render threads" -msgstr "Nitke za upodabljanje" +msgstr "Niti za upodabljanje" msgid "SLI" msgstr "SLI" @@ -1795,7 +1795,7 @@ msgid "Non-timed (original)" msgstr "Brez časovnika (izvirnik)" msgid "45 Hz (JMP2 not populated)" -msgstr "45 Hz (brez mostička na JMP2)" +msgstr "45 Hz (brez mostička JMP2)" msgid "Two" msgstr "Dva" @@ -1804,13 +1804,13 @@ msgid "Three" msgstr "Tri" msgid "Wheel" -msgstr "Kolesa" +msgstr "Kolesce" msgid "Five + Wheel" -msgstr "Pet + kolo" +msgstr "Pet + kolesce" msgid "Five + 2 Wheels" -msgstr "" +msgstr "Pet + 2 kolesci" msgid "A3 - SMT2 Serial / SMT3(R)V" msgstr "A3 - SMT2 serijska / SMT3(R)V" @@ -1885,13 +1885,13 @@ msgid "Color (generic)" msgstr "Barvni (generični)" msgid "Green Monochrome" -msgstr "Zeleni enobvarni" +msgstr "Zeleni monokromatski" msgid "Amber Monochrome" -msgstr "Jantarni enobarvni" +msgstr "Jantarni monokromatski" msgid "Gray Monochrome" -msgstr "Sivi enobarvni" +msgstr "Sivi monokromatski" msgid "Color (no brown)" msgstr "Barvni (brez rjave)" @@ -1912,13 +1912,13 @@ msgid "128 KB" msgstr "128 KB" msgid "Monochrome (5151/MDA) (white)" -msgstr "Enobarvni (5151/MDA) (beli)" +msgstr "Monokromatski (5151/MDA) (beli)" msgid "Monochrome (5151/MDA) (green)" -msgstr "Enobarvni (5151/MDA) (zeleni)" +msgstr "Monokromatski (5151/MDA) (zeleni)" msgid "Monochrome (5151/MDA) (amber)" -msgstr "Enobarvni (5151/MDA) (jantarni)" +msgstr "Monokromatski (5151/MDA) (jantarni)" msgid "Color 40x25 (5153/CGA)" msgstr "Barvni 40x25 (5153/CGA)" @@ -1930,7 +1930,7 @@ msgid "Enhanced Color - Normal Mode (5154/ECD)" msgstr "Izboljšani barvni - običajni način (5154/ECD)" msgid "Enhanced Color - Enhanced Mode (5154/ECD)" -msgstr "Izboljšani barvni - Izboljšani način (5154/ECD)" +msgstr "Izboljšani barvni - izboljšani način (5154/ECD)" msgid "Green" msgstr "Zeleni" @@ -2008,7 +2008,7 @@ msgid "Generic PCL5e Printer" msgstr "Generični tiskalnik PCL5e" msgid "Parallel Line Internet Protocol" -msgstr "Internetni protokol za paralelno linijo" +msgstr "Internetni protokol za vzporedno linijo" msgid "Protection Dongle for Savage Quest" msgstr "Zaščitni ključek za Savage Quest" @@ -2029,7 +2029,7 @@ msgid "Data bits" msgstr "Podatkovni biti" msgid "Stop bits" -msgstr "Stop biti" +msgstr "Zaključni biti" msgid "Baud Rate of Passthrough" msgstr "Baudna hitrost prepusta" @@ -2038,7 +2038,7 @@ msgid "Named Pipe (Server)" msgstr "Poimenovana cev (Strežnik)" msgid "Host Serial Passthrough" -msgstr "Prepustno serijskih vrat gostitelja" +msgstr "Prepust serijskih vrat gostitelja" msgid "E&ject %1" msgstr "I&zvrzi %1" @@ -2053,7 +2053,7 @@ msgid "High performance impact" msgstr "Visok učinek na hitrost delovanja" msgid "[Generic] RAM Disk (max. speed)" -msgstr "[Generic] Pogon RAM (največja hitrost)" +msgstr "[Generic] Pomnilniški disk (največja hitrost)" msgid "[Generic] 1989 (3500 RPM)" msgstr "" @@ -2089,28 +2089,28 @@ msgid "Generic PC/AT Memory Expansion" msgstr "Generična razširitev pomnilnika PC/AT" msgid "Unable to find Dot-Matrix fonts" -msgstr "Matričnih pisav ni bilo mogoče najti" +msgstr "Ni bilo mogoče najti matričnih pisav" msgid "TrueType fonts in the \"roms/printer/fonts\" directory are required for the emulation of the Generic ESC/P Dot-Matrix Printer." -msgstr "Matrične pisave v imeniku \"roms/printer/fonts\" so potrebne za emulacijo generičnega matričnega tiskalnika ESC/P." +msgstr "Za emulacijo generičnega ESC/P matričnega tiskalnika so potrebne TrueType pisave v imeniku \"roms/printer/fonts\"." msgid "Inhibit multimedia keys" -msgstr "" +msgstr "Blokiraj multimedijske tipke" msgid "Ask for confirmation before saving settings" -msgstr "" +msgstr "Vprašaj za potrditev pred shranjevanjem nastavitev" msgid "Ask for confirmation before hard resetting" -msgstr "" +msgstr "Vprašaj za potrditev pred ponovnim zagonom" msgid "Ask for confirmation before quitting" -msgstr "" +msgstr "Vprašaj za potrditev pred izhodom" msgid "Display hotkey message when entering full-screen mode" -msgstr "" +msgstr "Prikaži obvestilo o bližnjični tipki pri prehodu v celozaslonski način" msgid "Options" -msgstr "" +msgstr "Možnosti" msgid "Model" msgstr "" @@ -2119,40 +2119,40 @@ msgid "Model:" msgstr "" msgid "Failed to initialize Vulkan renderer." -msgstr "" +msgstr "Inicializacija upodobljevalnika Vulkan ni uspela." msgid "GLSL Error" -msgstr "" +msgstr "Napaka GLSL" msgid "Could not load shader: %1" -msgstr "" +msgstr "Ni bilo mogoče naložiti senčilnika: %1" msgid "OpenGL version 3.0 or greater is required. Current GLSL version is %1.%2" -msgstr "" +msgstr "Potrebna je OpenGL različica 3.0 ali novejša. Trenutna različica GLSL je %1.%2" msgid "Could not load texture: %1" -msgstr "" +msgstr "Ni bilo mogoče naložiti teksture: %1" msgid "Could not compile shader:\n\n%1" -msgstr "" +msgstr "Ni bilo mogoče prevesti senčilnika:\n\n%1" msgid "Program not linked:\n\n%1" -msgstr "" +msgstr "Program ni povezan:\n\n%1" msgid "Shader Manager" -msgstr "" +msgstr "Upravljalnik senčilnikov" msgid "Shader Configuration" -msgstr "" +msgstr "Nastavitve senčilnikov" msgid "Add" -msgstr "" +msgstr "Dodaj" msgid "Move up" -msgstr "" +msgstr "Premakni gor" msgid "Move down" -msgstr "" +msgstr "Premakni dol" msgid "Could not load file %1" -msgstr "" +msgstr "Ni bilo mogoče naložiti datoteke %1" From b1d409471c37bac854a551cbeedfae45c04e2d9d Mon Sep 17 00:00:00 2001 From: TC1995 Date: Sun, 4 May 2025 02:01:34 +0200 Subject: [PATCH 108/180] Fixes to the S3 911/924 of the night (May 4th, 2025) 1. Actually mostly workarounds to make it render normally without a hitch (I hope) using the Diamond Stealth VRAM 911-based 15bpp driver. 2. Updated logs. --- src/video/vid_s3.c | 240 +++++++++++++++++++++++++++++---------------- 1 file changed, 156 insertions(+), 84 deletions(-) diff --git a/src/video/vid_s3.c b/src/video/vid_s3.c index 8fa392891..d6b91903a 100644 --- a/src/video/vid_s3.c +++ b/src/video/vid_s3.c @@ -234,6 +234,8 @@ typedef struct s3_t { uint8_t advfunc_cntl; uint16_t cur_y, cur_y2; uint16_t cur_x, cur_x2; + uint16_t cur_x_overflow; + uint16_t destx_overflow; uint16_t x2, ropmix; uint16_t pat_x, pat_y; int16_t desty_axstp, desty_axstp2; @@ -288,6 +290,7 @@ typedef struct s3_t { int16_t minus; int rd_mask_16bit_check; int start; + int mix_dat_upper; /*For non-threaded FIFO*/ int setup_fifo_slot; @@ -657,22 +660,29 @@ s3_accel_out_pixtrans_w(s3_t *s3, uint16_t val) val = (val >> 8) | (val << 8); s3->accel_start(16, 1, val | (val << 16), 0, s3); - } else - s3->accel_start(2, 1, 0xffffffff, val | (val << 16), s3); - } else { - if (s3->accel.rd_mask_16bit_check) { - if (s3->accel.cmd == 0x53f1) { + } else { + if ((s3->accel.cmd == 0x53f1) || (s3->accel.cmd == 0x53b1)) { if (s3->accel.cur_x & 0x400) val = (val >> 8) | (val << 8); s3->accel_start(2, 1, 0xffffffff, val | (val << 16), s3); val = (val >> 8) | (val << 8); - s3->accel_start(2, 1, 0xffffffff, val | (val << 16), s3); - } else - s3->accel_start(2, 1, 0xffffffff, val | (val << 16), s3); - } else + } s3->accel_start(2, 1, 0xffffffff, val | (val << 16), s3); + } + } else { + if (s3->accel.rd_mask_16bit_check) { + if ((s3->accel.cmd == 0x53f1) || (s3->accel.cmd == 0x53b1)) { + if (s3->accel.cur_x & 0x400) + val = (val >> 8) | (val << 8); + + s3->accel_start(2, 1, 0xffffffff, val | (val << 16), s3); + + val = (val >> 8) | (val << 8); + } + } + s3->accel_start(2, 1, 0xffffffff, val | (val << 16), s3); } break; case 0x400: @@ -808,12 +818,14 @@ s3_accel_out_fifo(s3_t *s3, uint16_t port, uint8_t val) case 0x8548: case 0x86e8: s3->accel.cur_x = (s3->accel.cur_x & 0xf00) | val; + s3->accel.cur_x_overflow = (s3->accel.cur_x_overflow & 0xff00) | val; s3->accel.poly_cx = s3->accel.cur_x << 20; s3->accel.poly_x = s3->accel.poly_cx >> 20; break; case 0x8549: case 0x86e9: s3->accel.cur_x = (s3->accel.cur_x & 0xff) | ((val & 0x0f) << 8); + s3->accel.cur_x_overflow = (s3->accel.cur_x_overflow & 0xff) | (val << 8); s3->accel.poly_cx = s3->accel.poly_x = s3->accel.cur_x << 20; s3->accel.poly_x = s3->accel.poly_cx >> 20; s3_log("[%04X:%08X] OUT PORTB=%04x, val=%04x.\n", CS, cpu_state.pc, port - 1, s3->accel.cur_x); @@ -859,11 +871,13 @@ s3_accel_out_fifo(s3_t *s3, uint16_t port, uint8_t val) case 0x8d48: case 0x8ee8: s3->accel.destx_distp = (s3->accel.destx_distp & 0x3f00) | val; + s3->accel.destx_overflow = (s3->accel.destx_overflow & 0xff00) | val; s3->accel.point_1_updated = 1; break; case 0x8d49: case 0x8ee9: s3->accel.destx_distp = (s3->accel.destx_distp & 0xff) | ((val & 0x3f) << 8); + s3->accel.destx_overflow = (s3->accel.destx_overflow & 0xff) | (val << 8); if (val & 0x20) s3->accel.destx_distp |= ~0x3fff; s3->accel.point_1_updated = 1; @@ -5763,6 +5777,8 @@ s3_accel_in_w(uint16_t port, void *priv) s3_t *s3 = (s3_t *) priv; svga_t *svga = &s3->svga; uint16_t temp = 0x0000; + uint16_t temp1 = 0x0000; + uint16_t temp2 = 0x0000; const uint16_t *vram_w = (uint16_t *) svga->vram; if (!s3->enable_8514) @@ -5774,7 +5790,7 @@ s3_accel_in_w(uint16_t port, void *priv) switch (s3->accel.cmd & 0x600) { case 0x000: - if (((s3->accel.multifunc[0xa] & 0xc0) == 0x80) || (s3->accel.cmd & 2)) { + if (((s3->accel.multifunc[0xa] & 0xc0) == 0x80) || (s3->accel.cmd & 0x02)) { if (((s3->accel.frgd_mix & 0x60) != 0x40) || ((s3->accel.bkgd_mix & 0x60) != 0x40)) { if (s3->accel.cmd & 0x1000) temp = (temp >> 8) | (temp << 8); @@ -5800,15 +5816,31 @@ s3_accel_in_w(uint16_t port, void *priv) } break; case 0x200: - if (((s3->accel.multifunc[0xa] & 0xc0) == 0x80) || (s3->accel.cmd & 2)) { + if (((s3->accel.multifunc[0xa] & 0xc0) == 0x80) || (s3->accel.cmd & 0x02)) { if (((s3->accel.frgd_mix & 0x60) != 0x40) || ((s3->accel.bkgd_mix & 0x60) != 0x40)) { if (s3->accel.cmd & 0x1000) temp = (temp >> 8) | (temp << 8); + s3->accel_start(16, 1, temp | (temp << 16), 0, s3); } else s3->accel_start(2, 1, 0xffffffff, temp | (temp << 16), s3); } else { - s3->accel_start(2, 1, 0xffffffff, temp | (temp << 16), s3); + if (s3->accel.rd_mask_16bit_check) { + if (s3->accel.cmd == 0x53b0) { + temp1 = vram_w[dword_remap_w(svga, s3->accel.dest + s3->accel.cx - s3->accel.minus) & (s3->vram_mask >> 1)]; + temp2 = vram_w[dword_remap_w(svga, s3->accel.dest + s3->accel.cx - s3->accel.minus + 1) & (s3->vram_mask >> 1)]; + if (s3->accel.cur_x & 0x400) { + temp = temp1 >> 8; + temp |= (temp2 >> 8) << 8; + } else { + temp = temp1 & 0xff; + temp |= ((temp2 & 0xff) << 8); + } + s3->accel_start(4, 1, 0xffffffff, temp | (temp << 16), s3); + } else + s3->accel_start(2, 1, 0xffffffff, temp | (temp << 16), s3); + } else + s3->accel_start(2, 1, 0xffffffff, temp | (temp << 16), s3); } break; @@ -7878,7 +7910,7 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi /*Bit 4 of the Command register is the draw yes bit, which enables writing to memory/reading from memory when enabled. When this bit is disabled, no writing to memory/reading from memory is allowed. (This bit is almost meaningless on the NOP command)*/ - s3_log("CMD=%d, full=%04x, s3bpp=%x, clr=%d, clb=%d, sourcedisplay=%x, mmio=%02x, srcbase=%08x, dstbase=%08x, cpu=%04x, mix=%04x, count=%d, rd_mask=%04x, wrt_mask=%04x, width=%d, s=%d,%d, c=%d,%d, d=%d,%d, 16bitcolor=%x, frgdcolor=%04x, bkgdcolor=%04x, frgdsel=%d, bkgdsel=%d, frgdmix=%02x, curx=%d, cury=%d, cll=%d, b2e8pix=%x.\n", cmd, s3->accel.cmd, s3->bpp, clip_r, clip_b, vram_mask, svga->crtc[0x53] & 0x18, srcbase, dstbase, cpu_dat & 0xffff, mix_dat & 0xffff, count, rd_mask, wrt_mask, s3->width, s3->accel.sx, s3->accel.sy, s3->accel.cx, s3->accel.cy, s3->accel.dx, s3->accel.dy, s3->color_16bit, frgd_color, bkgd_color, frgd_mix, bkgd_mix, s3->accel.frgd_mix & 0x0f, s3->accel.cur_x, s3->accel.cur_y, clip_l, s3->accel.b2e8_pix); + s3_log("CMD=%d, full=%04x, s3bpp=%x, clr=%d, clb=%d, sourcedisplay=%02x, mmio=%02x, srcbase=%08x, dstbase=%08x, cpu=%04x, mix=%04x, count=%d, rd_mask=%04x, wrt_mask=%04x, width=%d, s=%d,%d, c=%d,%d, d=%d,%d, 16bitcolor=%x, frgdcolor=%04x, bkgdcolor=%04x, frgdsel=%d, bkgdsel=%d, frgdmix=%02x, curx=%d, cury=%d, cll=%d, b2e8pix=%x.\n", cmd, s3->accel.cmd, s3->bpp, clip_r, clip_b, s3->accel.multifunc[0x0a] & 0xc4, svga->crtc[0x53] & 0x18, srcbase, dstbase, cpu_dat & 0xffff, mix_dat & 0xffff, count, rd_mask, wrt_mask, s3->width, s3->accel.sx, s3->accel.sy, s3->accel.cx, s3->accel.cy, s3->accel.dx, s3->accel.dy, s3->color_16bit, frgd_color, bkgd_color, frgd_mix, bkgd_mix, s3->accel.frgd_mix & 0x0f, s3->accel.cur_x, s3->accel.cur_y, clip_l, s3->accel.b2e8_pix); switch (cmd) { case 0: /*NOP (Short Stroke Vectors)*/ @@ -8279,8 +8311,8 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi case 2: /*Rectangle fill*/ if (!cpu_input) /*!cpu_input is trigger to start operation*/ { - s3->accel.start = 0; s3->accel.minus = 0; + s3->accel.mix_dat_upper = 0; s3->accel.color_16bit_check_pixtrans = 0; s3->accel.sx = s3->accel.maj_axis_pcnt & 0xfff; s3->accel.sy = s3->accel.multifunc[0] & 0xfff; @@ -8292,11 +8324,37 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi if ((s3->bpp == 0) && s3->color_16bit) { s3->accel.rd_mask_16bit_check = ((rd_mask & 0xff00) != 0xff00); if (s3->accel.rd_mask_16bit_check) { - s3->accel.start = 1; - if (s3->accel.cur_x & 0x400) { - s3->accel.minus = 0x400; - if ((s3->accel.cmd == 0x41b3) && (frgd_mix == 0)) - s3->accel.minus = 0; + if (s3->accel.cmd == 0x41b3) { + if (frgd_mix == 0) { + if (!(s3->accel.cur_x & 0x400)) + s3->accel.color_16bit_check = 0; + } else { + if ((s3->accel.cur_x_overflow & 0xc00) == 0xc00) + s3->accel.start = 1; + else { + if (s3->accel.start) { + s3->accel.start = 0; + s3->accel.minus = 0x400; + } else { + s3->accel.start = 0; + if (s3->accel.cur_x_overflow & 0x400) + s3->accel.minus = 0x400; + } + } + } + } else { + if ((s3->accel.cur_x_overflow & 0xc00) == 0xc00) + s3->accel.start = 1; + else { + if (s3->accel.start) { + s3->accel.start = 0; + s3->accel.minus = 0x400; + } else { + s3->accel.start = 0; + if (s3->accel.cur_x_overflow & 0x400) + s3->accel.minus = 0x400; + } + } } } else { if (s3->accel.cmd & 0x100) { @@ -8330,19 +8388,11 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi count = s3->accel.maj_axis_pcnt + 1; s3->accel.temp_cnt = 16; if (s3->accel.rd_mask_16bit_check) { - if (s3->accel.cur_x & 0x400) { - if (s3->accel.start) { - s3->accel.minus = 0x400; - s3->accel.start = 0; - } + if (s3->accel.minus) { wrt_mask = (s3->accel.wrt_mask_actual[1] << 8); frgd_color = (s3->accel.frgd_color_actual[1] << 8); bkgd_color = (s3->accel.bkgd_color_actual[1] << 8); } else { - if (s3->accel.start) { - s3->accel.minus = 0; - s3->accel.start = 0; - } wrt_mask = s3->accel.wrt_mask_actual[0]; frgd_color = s3->accel.frgd_color_actual[0]; bkgd_color = s3->accel.bkgd_color_actual[0]; @@ -8355,7 +8405,7 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi if (s3->accel.cmd == 0x41b3) { if (frgd_mix != 0) { if (s3->accel.rd_mask_16bit_check) { - if (s3->accel.cur_x & 0x400) { + if (s3->accel.minus) { wrt_mask = (s3->accel.wrt_mask_actual[1] << 8); frgd_color = (s3->accel.frgd_color_actual[1] << 8); bkgd_color = (s3->accel.bkgd_color_actual[1] << 8); @@ -8367,39 +8417,33 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi rd_mask &= 0x00ff; } else if (!s3->accel.rd_mask_16bit_check && (s3->accel.cur_x & 0x400)) break; + } else { + if (s3->accel.rd_mask_16bit_check) { + if (s3->accel.minus) { + wrt_mask = (s3->accel.wrt_mask_actual[1] << 8); + frgd_color = (s3->accel.frgd_color_actual[1] << 8); + bkgd_color = (s3->accel.bkgd_color_actual[1] << 8); + } else { + wrt_mask = s3->accel.wrt_mask_actual[0]; + frgd_color = s3->accel.frgd_color_actual[0]; + bkgd_color = s3->accel.bkgd_color_actual[0]; + s3->accel.mix_dat_upper = !!(mix_dat & 0xff00); + } + rd_mask &= 0x00ff; + } } } else { if (s3->accel.rd_mask_16bit_check) { - rd_mask &= 0x00ff; - if (s3->accel.cmd == 0x53b3) { - if (clip_l & 0x400) { - if (s3->accel.start) { - s3->accel.minus = 0x400; - s3->accel.start = 0; - } - wrt_mask = (s3->accel.wrt_mask_actual[1] << 8); - frgd_color = (s3->accel.frgd_color_actual[1] << 8); - bkgd_color = (s3->accel.bkgd_color_actual[1] << 8); - } else { - if (s3->accel.start) { - s3->accel.minus = 0; - s3->accel.start = 0; - } - wrt_mask = s3->accel.wrt_mask_actual[0]; - frgd_color = s3->accel.frgd_color_actual[0]; - bkgd_color = s3->accel.bkgd_color_actual[0]; - } + if (s3->accel.minus) { + wrt_mask = (s3->accel.wrt_mask_actual[1] << 8); + frgd_color = (s3->accel.frgd_color_actual[1] << 8); + bkgd_color = (s3->accel.bkgd_color_actual[1] << 8); } else { - if (s3->accel.cur_x & 0x400) { - wrt_mask = (s3->accel.wrt_mask_actual[1] << 8); - frgd_color = (s3->accel.frgd_color_actual[1] << 8); - bkgd_color = (s3->accel.bkgd_color_actual[1] << 8); - } else { - wrt_mask = s3->accel.wrt_mask_actual[0]; - frgd_color = s3->accel.frgd_color_actual[0]; - bkgd_color = s3->accel.bkgd_color_actual[0]; - } + wrt_mask = s3->accel.wrt_mask_actual[0]; + frgd_color = s3->accel.frgd_color_actual[0]; + bkgd_color = s3->accel.bkgd_color_actual[0]; } + rd_mask &= 0x00ff; } else { if ((s3_cpu_src(s3)) && !(s3->accel.cmd & 0x200)) { s3_log("FIXME: S3 911/924 15/16bpp documentation needed.\n"); @@ -8414,6 +8458,9 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi } } + if (s3->accel.mix_dat_upper) + s3_log("CMDFULL=%04x, FRGDMIX=%x, BKGDCOLR=%04x, RDMASK=%04x, MINUS=%d, WRTMASK=%04X, MIX=%04x, CX=%d, CY=%d, SX=%d, SY=%d, PIXCNTL=%02x, 16BITCOLOR=%x, RDCHECK=%x, OVERFLOW=%d.\n", s3->accel.cmd, s3->accel.frgd_mix & 0x0f, s3->accel.bkgd_color, rd_mask, s3->accel.minus, wrt_mask, mix_dat & 0xffff, s3->accel.cx, s3->accel.cy, s3->accel.sx, s3->accel.sy, s3->accel.multifunc[0x0a] & 0xc4, s3->accel.color_16bit_check, s3->accel.rd_mask_16bit_check, (s3->accel.cur_x_overflow & 0xc00) == 0xc00); + while (count-- && (s3->accel.sy >= 0)) { if (s3->accel.b2e8_pix && s3_cpu_src(s3) && !s3->accel.temp_cnt) { mix_dat >>= 16; @@ -8535,15 +8582,13 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi if (cpu_input) { if (s3->accel.sy < 0) { if ((s3->bpp == 0) && s3->color_16bit) { - if ((s3->accel.cmd == 0x53b3) && !s3->accel.b2e8_pix) { - if (!(clip_l & 0x400)) - s3->accel.color_16bit_check = 1; - else + if (s3->accel.rd_mask_16bit_check) { + if (s3->accel.minus) s3->accel.color_16bit_check = 0; - } else { - if (!(s3->accel.cur_x & 0x400)) - s3->accel.color_16bit_check = 1; else + s3->accel.color_16bit_check = 1; + + if ((s3->accel.cmd == 0x41b3) && (frgd_mix == 0)) s3->accel.color_16bit_check = 0; } } @@ -8556,10 +8601,12 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi } if (s3->accel.sy < 0) { if ((s3->bpp == 0) && s3->color_16bit) { - if (!(s3->accel.cur_x & 0x400)) - s3->accel.color_16bit_check = 1; - else - s3->accel.color_16bit_check = 0; + if (s3->accel.rd_mask_16bit_check) { + if (s3->accel.minus) + s3->accel.color_16bit_check = 0; + else + s3->accel.color_16bit_check = 1; + } } s3->accel.cur_x = s3->accel.cx; s3->accel.cur_y = s3->accel.cy; @@ -8674,10 +8721,24 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi s3->accel.dx = s3->accel.destx_distp & 0xfff; s3->accel.dy = s3->accel.desty_axstp & 0xfff; - s3->accel.rd_mask_16bit_check = ((rd_mask & 0xff00) != 0xff00); - if ((s3->bpp == 0) && s3->color_16bit && (s3->accel.destx_distp & 0x400) && s3->accel.rd_mask_16bit_check) - s3->accel.minus = 0x400; + if ((s3->bpp == 0) && s3->color_16bit) { + s3->accel.rd_mask_16bit_check = ((rd_mask & 0xff00) != 0xff00); + if (s3->accel.rd_mask_16bit_check) { + if (!(s3->accel.cmd & 0x40) && !(clip_r & 0x400)) + s3->accel.start = 1; + else { + if (s3->accel.start) { + s3->accel.start = 0; + s3->accel.minus = 0x400; + } else { + s3->accel.start = 0; + if (s3->accel.destx_distp & 0x400) + s3->accel.minus = 0x400; + } + } + } + } if (s3->accel.destx_distp & 0x400) { s3_log("BitBLT + 1024 FULLCMD=%04x: frgdcolor=%04x, s=%d,%d, d=%d,%d, frmix=%x, bkmix=%x, pixcntl=%02x.\n", s3->accel.cmd, frgd_color, s3->accel.sx, s3->accel.sy, s3->accel.dx, s3->accel.dy, frgd_mix, bkgd_mix, s3->accel.multifunc[0xa] & 0xc0); @@ -8698,7 +8759,7 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi if ((s3->bpp == 0) && s3->color_16bit) { if (s3->accel.rd_mask_16bit_check) { - if (s3->accel.destx_distp & 0x400) { + if (s3->accel.minus) { wrt_mask = (s3->accel.wrt_mask_actual[1] << 8); frgd_color = (s3->accel.frgd_color_actual[1] << 8); bkgd_color = (s3->accel.bkgd_color_actual[1] << 8); @@ -8712,6 +8773,9 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi break; } + if (!vram_mask && (frgd_mix == 3)) + s3_log("CMDFULL=%04x, FRGDMIX=%x, BKGDMIX=%x, RDMASK=%04x, MINUS=%d, WRTMASK=%04X, MIX=%04x, CX=%d, CY=%d, DX=%d, DY=%d, SX=%d, SY=%d, PIXCNTL=%02x, 16BITCOLOR=%x, RDCHECK=%x, CLIPL=%d, CLIPR=%d, OVERFLOW=%d.\n", s3->accel.cmd, frgd_mix, bkgd_mix, rd_mask, s3->accel.minus, wrt_mask, mix_dat & 0xffff, s3->accel.cx, s3->accel.cy, s3->accel.dx, s3->accel.dy, s3->accel.sx, s3->accel.sy, s3->accel.multifunc[0x0a] & 0xc4, s3->accel.color_16bit_check, s3->accel.rd_mask_16bit_check, clip_l, clip_r, (s3->accel.destx_overflow & 0xc00) == 0xc00); + if (!cpu_input && (frgd_mix == 3) && !vram_mask && !(s3->accel.multifunc[0xe] & 0x100) && ((s3->accel.cmd & 0xa0) == 0xa0) && ((s3->accel.frgd_mix & 0xf) == 7) && ((s3->accel.bkgd_mix & 0xf) == 7)) { while (1) { if ((s3->accel.dx >= clip_l) && (s3->accel.dx <= clip_r) && (s3->accel.dy >= clip_t) && (s3->accel.dy <= clip_b)) { @@ -8728,6 +8792,7 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi s3->accel.dx++; s3->accel.sx--; s3->accel.dx &= 0xfff; + if (s3->accel.sx < 0) { s3->accel.cx -= (s3->accel.maj_axis_pcnt & 0xfff) + 1; s3->accel.dx -= (s3->accel.maj_axis_pcnt & 0xfff) + 1; @@ -8742,11 +8807,11 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi s3->accel.sy--; if (s3->accel.sy < 0) { - if ((s3->bpp == 0) && s3->color_16bit) { - if (!(s3->accel.destx_distp & 0x400)) - s3->accel.color_16bit_check = 1; - else + if (s3->accel.rd_mask_16bit_check) { + if (s3->accel.minus) s3->accel.color_16bit_check = 0; + else + s3->accel.color_16bit_check = 1; } s3->accel.destx_distp = s3->accel.dx; s3->accel.desty_axstp = s3->accel.dy; @@ -8824,7 +8889,11 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi s3->accel.cx--; s3->accel.dx--; } - s3->accel.dx &= 0xfff; + if (s3->accel.rd_mask_16bit_check) + s3->accel.dx &= 0x7ff; + else + s3->accel.dx &= 0xfff; + s3->accel.sx--; if (s3->accel.sx < 0) { if (s3->accel.cmd & 0x20) { @@ -8850,21 +8919,24 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi if (cpu_input) { if (s3->accel.sy < 0) { - if ((s3->bpp == 0) && s3->color_16bit) { - if (!(s3->accel.destx_distp & 0x400)) - s3->accel.color_16bit_check = 1; - else + if (s3->accel.rd_mask_16bit_check) { + if (s3->accel.minus) s3->accel.color_16bit_check = 0; + else + s3->accel.color_16bit_check = 1; } } return; } if (s3->accel.sy < 0) { - if ((s3->bpp == 0) && s3->color_16bit) { - if (!(s3->accel.destx_distp & 0x400)) - s3->accel.color_16bit_check = 1; + if (s3->accel.rd_mask_16bit_check) { + if (s3->accel.minus) + s3->accel.color_16bit_check = 0; else + s3->accel.color_16bit_check = 1; + + if (s3->accel.mix_dat_upper && !vram_mask && (frgd_mix == 3)) s3->accel.color_16bit_check = 0; } s3->accel.destx_distp = s3->accel.dx; From 608ce2d15537751e594029b460c80c3d06cb0be3 Mon Sep 17 00:00:00 2001 From: TC1995 Date: Sun, 4 May 2025 02:04:41 +0200 Subject: [PATCH 109/180] Another stall fix for the mach8/32. See above, covering the foreground and background select bits as well. --- src/video/vid_ati_mach8.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/video/vid_ati_mach8.c b/src/video/vid_ati_mach8.c index ce6ee12d5..3537cf337 100644 --- a/src/video/vid_ati_mach8.c +++ b/src/video/vid_ati_mach8.c @@ -4264,12 +4264,14 @@ mach_accel_in_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, in if (dev->force_busy) { temp |= 0x0200; /*Hardware busy*/ if (mach->accel.cmd_type >= 0) { + frgd_sel = (mach->accel.dp_config >> 13) & 7; + bkgd_sel = (mach->accel.dp_config >> 7) & 3; mono_src = (mach->accel.dp_config >> 5) & 3; switch (mach->accel.cmd_type) { case 2: if (dev->accel.sy >= mach->accel.height) dev->force_busy = 0; - else if (mono_src == 2) + else if ((mono_src == 2) || (frgd_sel == 2) || (bkgd_sel == 2)) dev->force_busy = 0; break; case 5: From 3bce5e13f1c234f9f0e573679fe8389320bead30 Mon Sep 17 00:00:00 2001 From: OBattler Date: Sun, 4 May 2025 02:19:48 +0200 Subject: [PATCH 110/180] SiS 5511 Host to PCI bridge: Fix DRB unit, fixes AOpen AP5S soft reset. --- src/chipset/sis_5511_h2p.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/chipset/sis_5511_h2p.c b/src/chipset/sis_5511_h2p.c index b94e69f26..c8cb44a0a 100644 --- a/src/chipset/sis_5511_h2p.c +++ b/src/chipset/sis_5511_h2p.c @@ -259,7 +259,7 @@ sis_5511_host_to_pci_write(int addr, uint8_t val, void *priv) case 0x7a: /* DRAM Bank Register 2-1 */ case 0x7c: /* DRAM Bank Register 3-0 */ case 0x7e: /* DRAM Bank Register 3-1 */ - spd_write_drbs(dev->pci_conf, 0x70, 0x7e, 0x82); + spd_write_drbs(dev->pci_conf, 0x70, 0x7e, 0x02); break; case 0x71: /* DRAM Bank Register 0-0 */ From dca7ed737c4f82e43c536ea8b004d7b04fbff536 Mon Sep 17 00:00:00 2001 From: OBattler Date: Sun, 4 May 2025 23:58:41 +0200 Subject: [PATCH 111/180] SiS 85c471: Fix DRAM banks, fixes #5545. --- src/chipset/sis_85c4xx.c | 194 ++++++++++++++++++++++++--------------- 1 file changed, 122 insertions(+), 72 deletions(-) diff --git a/src/chipset/sis_85c4xx.c b/src/chipset/sis_85c4xx.c index 51f7fd4e6..1c1e0614b 100644 --- a/src/chipset/sis_85c4xx.c +++ b/src/chipset/sis_85c4xx.c @@ -33,6 +33,7 @@ #include <86box/mem.h> #include <86box/smram.h> #include <86box/pic.h> +#include <86box/plat_fallthrough.h> #include <86box/keyboard.h> #include <86box/machine.h> #include <86box/chipset.h> @@ -82,6 +83,14 @@ static uint8_t ram_471[64] = { 0x00, 0x00, 0x01, 0x01, 0x02, 0x20, 0x09, 0x09, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d }; +static uint8_t ram_asus[64] = { 0x00, 0x00, 0x01, 0x10, 0x10, 0x20, 0x03, 0x11, + 0x11, 0x05, 0x05, 0x12, 0x12, 0x13, 0x13, 0x13, + 0x13, 0x21, 0x06, 0x14, 0x14, 0x15, 0x15, 0x15, + 0x15, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, + 0x1d, 0x16, 0x16, 0x16, 0x16, 0x17, 0x17, 0x17, + 0x17, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, + 0x1e, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, + 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f }; static uint8_t ram_tg486g[64] = { 0x10, 0x10, 0x10, 0x10, 0x10, 0x11, 0x11, 0x11, 0x11, 0x12, 0x12, 0x12, 0x12, 0x13, 0x13, 0x13, 0x13, 0x14, 0x14, 0x14, 0x14, 0x15, 0x15, 0x15, @@ -162,17 +171,32 @@ sis_85c471_get_row(ram_bank_t *dev, uint32_t addr) uint32_t ret = 0x00000000; switch (dev->virt_size) { - case 0x04000000: - ret = (addr >> 14) & 0x00000fff; - break; - case 0x01000000: - ret = (addr >> 13) & 0x000007ff; + case 0x00100000: + case 0x00200000: + ret |= (addr >> 13) & 0x00000001; + ret |= ((addr >> 12) & 0x00000001) << 1; + ret |= ((addr >> 14) & 0x0000003f) << 2; + ret |= ((addr >> 11) & 0x00000001) << 8; + ret |= ((addr >> 20) & 0x00000001) << 9; + ret |= ((addr >> 22) & 0x00000001) << 10; + ret |= ((addr >> 24) & 0x00000001) << 11; break; case 0x00400000: - ret = (addr >> 12) & 0x000003ff; + case 0x00800000: + ret |= (addr >> 13) & 0x00000001; + ret |= ((addr >> 12) & 0x00000001) << 1; + ret |= ((addr >> 14) & 0x000000ff) << 2; + ret |= ((addr >> 22) & 0x00000001) << 10; + ret |= ((addr >> 24) & 0x00000001) << 11; break; - case 0x00100000: - ret = (addr >> 11) & 0x000001ff; + case 0x01000000: + case 0x02000000: + case 0x04000000: + ret |= (addr >> 13) & 0x00000001; + ret |= ((addr >> 22) & 0x00000001) << 1; + ret |= ((addr >> 14) & 0x000000ff) << 2; + ret |= ((addr >> 23) & 0x00000001) << 10; + ret |= ((addr >> 24) & 0x00000001) << 11; break; } @@ -185,17 +209,31 @@ sis_85c471_get_col(ram_bank_t *dev, uint32_t addr) uint32_t ret = 0x00000000; switch (dev->virt_size) { - case 0x04000000: - ret = (addr >> 2) & 0x00000fff; - break; - case 0x01000000: - ret = (addr >> 2) & 0x000007ff; + case 0x00100000: + case 0x00200000: + ret |= (addr >> 3) & 0x00000001; + ret |= ((addr >> 2) & 0x00000001) << 1; + ret |= ((addr >> 4) & 0x0000003f) << 2; + ret |= ((addr >> 10) & 0x00000001) << 8; + ret |= ((addr >> 21) & 0x00000001) << 9; + ret |= ((addr >> 23) & 0x00000001) << 10; + ret |= ((addr >> 25) & 0x00000001) << 11; break; case 0x00400000: - ret = (addr >> 2) & 0x000003ff; + case 0x00800000: + ret |= (addr >> 3) & 0x00000001; + ret |= ((addr >> 2) & 0x00000001) << 1; + ret |= ((addr >> 4) & 0x000000ff) << 2; + ret |= ((addr >> 23) & 0x00000001) << 10; + ret |= ((addr >> 25) & 0x00000001) << 11; break; - case 0x00100000: - ret = (addr >> 2) & 0x000001ff; + case 0x01000000: + case 0x02000000: + case 0x04000000: + ret |= (addr >> 3) & 0x00000001; + ret |= ((addr >> 2) & 0x00000001) << 1; + ret |= ((addr >> 4) & 0x000001ff) << 2; + ret |= ((addr >> 25) & 0x00000001) << 11; break; } @@ -208,17 +246,26 @@ sis_85c471_set_row(ram_bank_t *dev, uint32_t addr) uint32_t ret = 0x00000000; switch (dev->phys_size) { - case 0x04000000: - ret = (addr & 0x00000fff) << 14; + case 0x00100000: + ret = (addr & 0x1ff) << 11; break; - case 0x01000000: - ret = (addr & 0x000007ff) << 13; + case 0x00200000: + ret = (addr & 0x3ff) << 11; break; case 0x00400000: - ret = (addr & 0x000003ff) << 12; + ret = (addr & 0x3ff) << 12; break; - case 0x00100000: - ret = (addr & 0x000002ff) << 11; + case 0x00800000: + ret = (addr & 0x7ff) << 12; + break; + case 0x01000000: + ret = (addr & 0x7ff) << 13; + break; + case 0x02000000: + ret = (addr & 0xfff) << 13; + break; + case 0x04000000: + ret = (addr & 0xfff) << 14; break; } @@ -231,23 +278,28 @@ sis_85c471_set_col(ram_bank_t *dev, uint32_t addr) uint32_t ret = 0x00000000; switch (dev->phys_size) { - case 0x04000000: - ret = (addr & 0x00000fff) << 2; - break; - case 0x01000000: - ret = (addr & 0x000007ff) << 2; + case 0x00100000: + case 0x00200000: + ret = (addr & 0x1ff) << 2; break; case 0x00400000: - ret = (addr & 0x000003ff) << 2; + case 0x00800000: + ret = (addr & 0x3ff) << 2; break; - case 0x00100000: - ret = (addr & 0x000002ff) << 2; + case 0x01000000: + case 0x02000000: + ret = (addr & 0x7ff) << 2; + break; + case 0x04000000: + ret = (addr & 0xfff) << 2; break; } return ret; } +uint8_t reg09 = 0x00; + static uint8_t sis_85c471_read_ram(uint32_t addr, void *priv) { @@ -255,12 +307,10 @@ sis_85c471_read_ram(uint32_t addr, void *priv) uint32_t rel = addr - dev->virt_base; uint8_t ret = 0xff; - if ((dev->virt_size == 0x01000000) && (dev->phys_size == 0x00400000)) { - uint32_t row = sis_85c471_set_row(dev, sis_85c471_get_row(dev, rel)); - uint32_t col = sis_85c471_set_col(dev, sis_85c471_get_col(dev, rel)); - uint32_t dw = rel & 0x00000003; - rel = row | col | dw; - } + uint32_t row = sis_85c471_set_row(dev, sis_85c471_get_row(dev, rel)); + uint32_t col = sis_85c471_set_col(dev, sis_85c471_get_col(dev, rel)); + uint32_t dw = rel & 0x00000003; + rel = row | col | dw; addr = (rel + dev->phys_base); @@ -277,12 +327,10 @@ sis_85c471_read_ramw(uint32_t addr, void *priv) uint32_t rel = addr - dev->virt_base; uint16_t ret = 0xffff; - if ((dev->virt_size == 0x01000000) && (dev->phys_size == 0x00400000)) { - uint32_t row = sis_85c471_set_row(dev, sis_85c471_get_row(dev, rel)); - uint32_t col = sis_85c471_set_col(dev, sis_85c471_get_col(dev, rel)); - uint32_t dw = rel & 0x00000003; - rel = row | col | dw; - } + uint32_t row = sis_85c471_set_row(dev, sis_85c471_get_row(dev, rel)); + uint32_t col = sis_85c471_set_col(dev, sis_85c471_get_col(dev, rel)); + uint32_t dw = rel & 0x00000003; + rel = row | col | dw; addr = (rel + dev->phys_base); @@ -299,12 +347,10 @@ sis_85c471_read_raml(uint32_t addr, void *priv) uint32_t rel = addr - dev->virt_base; uint32_t ret = 0xffffffff; - if ((dev->virt_size == 0x01000000) && (dev->phys_size == 0x00400000)) { - uint32_t row = sis_85c471_set_row(dev, sis_85c471_get_row(dev, rel)); - uint32_t col = sis_85c471_set_col(dev, sis_85c471_get_col(dev, rel)); - uint32_t dw = rel & 0x00000003; - rel = row | col | dw; - } + uint32_t row = sis_85c471_set_row(dev, sis_85c471_get_row(dev, rel)); + uint32_t col = sis_85c471_set_col(dev, sis_85c471_get_col(dev, rel)); + uint32_t dw = rel & 0x00000003; + rel = row | col | dw; addr = (rel + dev->phys_base); @@ -320,12 +366,10 @@ sis_85c471_write_ram(uint32_t addr, uint8_t val, void *priv) ram_bank_t *dev = (ram_bank_t *) priv; uint32_t rel = addr - dev->virt_base; - if ((dev->virt_size == 0x01000000) && (dev->phys_size == 0x00400000)) { - uint32_t row = sis_85c471_set_row(dev, sis_85c471_get_row(dev, rel)); - uint32_t col = sis_85c471_set_col(dev, sis_85c471_get_col(dev, rel)); - uint32_t dw = rel & 0x00000003; - rel = row | col | dw; - } + uint32_t row = sis_85c471_set_row(dev, sis_85c471_get_row(dev, rel)); + uint32_t col = sis_85c471_set_col(dev, sis_85c471_get_col(dev, rel)); + uint32_t dw = rel & 0x00000003; + rel = row | col | dw; addr = (rel + dev->phys_base); @@ -339,12 +383,10 @@ sis_85c471_write_ramw(uint32_t addr, uint16_t val, void *priv) ram_bank_t *dev = (ram_bank_t *) priv; uint32_t rel = addr - dev->virt_base; - if ((dev->virt_size == 0x01000000) && (dev->phys_size == 0x00400000)) { - uint32_t row = sis_85c471_set_row(dev, sis_85c471_get_row(dev, rel)); - uint32_t col = sis_85c471_set_col(dev, sis_85c471_get_col(dev, rel)); - uint32_t dw = rel & 0x00000003; - rel = row | col | dw; - } + uint32_t row = sis_85c471_set_row(dev, sis_85c471_get_row(dev, rel)); + uint32_t col = sis_85c471_set_col(dev, sis_85c471_get_col(dev, rel)); + uint32_t dw = rel & 0x00000003; + rel = row | col | dw; addr = (rel + dev->phys_base); @@ -358,12 +400,10 @@ sis_85c471_write_raml(uint32_t addr, uint32_t val, void *priv) ram_bank_t *dev = (ram_bank_t *) priv; uint32_t rel = addr - dev->virt_base; - if ((dev->virt_size == 0x01000000) && (dev->phys_size == 0x00400000)) { - uint32_t row = sis_85c471_set_row(dev, sis_85c471_get_row(dev, rel)); - uint32_t col = sis_85c471_set_col(dev, sis_85c471_get_col(dev, rel)); - uint32_t dw = rel & 0x00000003; - rel = row | col | dw; - } + uint32_t row = sis_85c471_set_row(dev, sis_85c471_get_row(dev, rel)); + uint32_t col = sis_85c471_set_col(dev, sis_85c471_get_col(dev, rel)); + uint32_t dw = rel & 0x00000003; + rel = row | col | dw; addr = (rel + dev->phys_base); @@ -492,6 +532,8 @@ sis_85c471_banks_split(uint32_t *b_ex, uint32_t *banks) static void sis_85c471_banks_recalc(sis_85c4xx_t *dev) { + reg09 = dev->regs[0x09]; + for (uint8_t i = 0; i < 8; i++) mem_mapping_disable(&dev->ram_banks[i].mapping); @@ -694,17 +736,25 @@ sis_85c4xx_reset(void *priv) if (dev->is_471) { dev->regs[0x09] = 0x40; - if (mem_size_mb >= 64) { + + if (!strcmp(machine_get_internal_name(), "vli486sv2g")) { + if (mem_size_mb == 64) + dev->regs[0x09] |= 0x1f; + else + dev->regs[0x09] |= ram_asus[mem_size_mb]; + } else if (mem_size_mb >= 64) { if ((mem_size_mb >= 64) && (mem_size_mb < 68)) dev->regs[0x09] |= 0x33; - if ((mem_size_mb >= 68) && (mem_size_mb < 72)) + else if ((mem_size_mb >= 68) && (mem_size_mb < 72)) dev->regs[0x09] |= 0x2b; - if ((mem_size_mb >= 72) && (mem_size_mb < 80)) + else if ((mem_size_mb >= 72) && (mem_size_mb < 80)) dev->regs[0x09] |= 0x2d; - if ((mem_size_mb >= 80) && (mem_size_mb < 96)) + else if ((mem_size_mb >= 80) && (mem_size_mb < 96)) dev->regs[0x09] |= 0x2f; + else if ((mem_size_mb >= 96) && (mem_size_mb < 128)) + dev->regs[0x09] |= 0x34; else - dev->regs[0x09] |= 0x29; + dev->regs[0x09] |= 0x35; } else if (!strcmp(machine_get_internal_name(), "tg486g")) dev->regs[0x09] |= ram_tg486g[mem_size_mb]; else From 6a6be85852bcd1946bd6f8bd4038d5d6d68b393c Mon Sep 17 00:00:00 2001 From: TC1995 Date: Mon, 5 May 2025 02:02:02 +0200 Subject: [PATCH 112/180] Late night fixes for the Mach8 (May 5th, 2025) 1. The Mach8 doesn't have separate graphics pitches a la Mach32 (68800-6 and up), fixes the rendering in some drivers for Windows. 2. Special case for the add-on Mach8 for the mode switching (resolution only). --- src/video/vid_ati_mach8.c | 56 +++++++++++++++++++++++---------------- 1 file changed, 33 insertions(+), 23 deletions(-) diff --git a/src/video/vid_ati_mach8.c b/src/video/vid_ati_mach8.c index 3537cf337..8423f096b 100644 --- a/src/video/vid_ati_mach8.c +++ b/src/video/vid_ati_mach8.c @@ -2681,7 +2681,6 @@ ati_render_32bpp(svga_t *svga) When ATI mode is selected, allow complete auto-detection. But when 8514/A mode is selected, allow detection based on the shadow register sets. */ - static void mach_set_resolution(mach_t *mach, svga_t *svga) { @@ -2707,15 +2706,27 @@ mach_set_resolution(mach_t *mach, svga_t *svga) if (dev->interlace) dev->v_syncstart >>= 1; - if ((mach->accel.clock_sel & 0x01) && !(mach->old_on2 & 0x01) && - !(dev->accel.advfunc_cntl & 0x01)) - ret = 2; - else if ((dev->accel.advfunc_cntl & 0x01) && !(mach->old_on1 & 0x01) && - !(mach->accel.clock_sel & 0x01)) - ret = 1; - else if ((!(dev->accel.advfunc_cntl & 0x01) && (mach->old_on1 & 0x01)) || - (!(mach->accel.clock_sel & 0x01) && (mach->old_on2 & 0x01))) - ret = 0; + if (ATI_8514A_ULTRA) { + if ((mach->accel.clock_sel & 0x01) && + !(dev->accel.advfunc_cntl & 0x01)) + ret = 2; + else if ((dev->accel.advfunc_cntl & 0x01) && + !(mach->accel.clock_sel & 0x01)) + ret = 1; + else if ((!(dev->accel.advfunc_cntl & 0x01) && (mach->old_on1 & 0x01)) || + (!(mach->accel.clock_sel & 0x01) && (mach->old_on2 & 0x01))) + ret = 0; + } else { + if ((mach->accel.clock_sel & 0x01) && !(mach->old_on2 & 0x01) && + !(dev->accel.advfunc_cntl & 0x01)) + ret = 2; + else if ((dev->accel.advfunc_cntl & 0x01) && !(mach->old_on1 & 0x01) && + !(mach->accel.clock_sel & 0x01)) + ret = 1; + else if ((!(dev->accel.advfunc_cntl & 0x01) && (mach->old_on1 & 0x01)) || + (!(mach->accel.clock_sel & 0x01) && (mach->old_on2 & 0x01))) + ret = 0; + } if (ret) { if (ret == 2) @@ -2730,11 +2741,13 @@ mach_set_resolution(mach_t *mach, svga_t *svga) if (dev->hdisp == 640) { dev->hdisp = 1024; dev->vdisp = 768; + mach_log("1024x768.\n"); } } else { if (dev->hdisp == 1024) { dev->hdisp = 640; dev->vdisp = 480; + mach_log("640x480.\n"); } } svga_recalctimings(svga); @@ -2764,7 +2777,6 @@ ati8514_recalctimings(svga_t *svga) mach_log("ON=%d, vgahdisp=%d.\n", dev->on, svga->hdisp); if (dev->on) { - mach_log("8514/A ON, pitch=%d.\n", dev->ext_pitch); dev->interlace = !!(dev->disp_cntl & 0x10); dev->pitch = dev->ext_pitch; dev->rowoffset = dev->ext_crt_pitch; @@ -2773,16 +2785,19 @@ ati8514_recalctimings(svga_t *svga) mach->accel.crt_offset = (mach->accel.crt_offset_lo | (mach->accel.crt_offset_hi << 16)) << 2; dev->accel.ge_offset -= mach->accel.crt_offset; + mach_log("HDISP=%d, VDISP=%d, shadowset=%x, 8514/A mode=%x, clocksel=%02x.\n", dev->hdisp, dev->vdisp, mach->shadow_set & 0x03, dev->accel.advfunc_cntl & 0x05, mach->accel.clock_sel & 0x01); - mach->accel.src_pitch = ((mach->accel.ge_pitch & 0xff) << 3); - mach->accel.dst_pitch = ((mach->accel.ge_pitch & 0xff) << 3); + mach->accel.src_pitch = dev->pitch; + mach->accel.dst_pitch = dev->pitch; mach->accel.src_ge_offset = (mach->accel.ge_offset_lo | (mach->accel.ge_offset_hi << 16)) << 2; mach->accel.dst_ge_offset = (mach->accel.ge_offset_lo | (mach->accel.ge_offset_hi << 16)) << 2; mach->accel.src_ge_offset -= mach->accel.crt_offset; mach->accel.dst_ge_offset -= mach->accel.crt_offset; + mach_log("8514/A ON, pitch=%d, GE offset=%08x.\n", ((mach->accel.ge_pitch & 0xff) << 3), dev->accel.ge_offset); + dev->h_disp = dev->hdisp; dev->dispend = dev->vdisp; if (dev->dispend == 600) @@ -2809,6 +2824,7 @@ ati8514_recalctimings(svga_t *svga) } dev->accel_bpp = 8; svga->render8514 = ibm8514_render_8bpp; + } else mach->crt_resolution = 0; } @@ -3009,17 +3025,12 @@ mach_recalctimings(svga_t *svga) } } } else { - mach->accel.src_pitch = ((mach->accel.ge_pitch & 0xff) << 3); - mach->accel.dst_pitch = ((mach->accel.ge_pitch & 0xff) << 3); + mach->accel.src_pitch = dev->pitch; + mach->accel.dst_pitch = dev->pitch; mach->accel.src_ge_offset = (mach->accel.ge_offset_lo | (mach->accel.ge_offset_hi << 16)); mach->accel.dst_ge_offset = (mach->accel.ge_offset_lo | (mach->accel.ge_offset_hi << 16)); - if (dev->bpp) { - mach->accel.src_ge_offset <<= 1; - mach->accel.dst_ge_offset <<= 1; - } else { - mach->accel.src_ge_offset <<= 2; - mach->accel.dst_ge_offset <<= 2; - } + mach->accel.src_ge_offset <<= 2; + mach->accel.dst_ge_offset <<= 2; mach->accel.src_ge_offset -= mach->accel.crt_offset; mach->accel.dst_ge_offset -= mach->accel.crt_offset; @@ -7221,7 +7232,6 @@ ati8514_init(svga_t *svga, void *ext8514, void *dev8514) dev->v_sync_start = 0x0600; dev->disp_cntl = 0x33; mach->accel.clock_sel = 0x1c; - mach->shadow_set = 0x02; dev->accel.cmd_back = 1; io_sethandler(0x02ea, 4, ati8514_in, NULL, NULL, ati8514_out, NULL, NULL, svga); From 018bbfae4333beaf0c71e6b05603aabb5ab242ed Mon Sep 17 00:00:00 2001 From: OBattler Date: Mon, 5 May 2025 05:11:55 +0200 Subject: [PATCH 113/180] SM(S)C FDC37C93x Super I/O chip rewrite, add the Acer V62x, and un-dev-branch the V-Tech Laser XT machines. --- src/chipset/intel_piix.c | 61 -- src/device/kbc_at.c | 23 +- src/floppy/fdc.c | 19 +- src/include/86box/fdc.h | 5 + src/include/86box/keyboard.h | 1 + src/include/86box/machine.h | 9 +- src/include/86box/sio.h | 24 +- src/machine/CMakeLists.txt | 6 +- src/machine/m_at_slot1.c | 33 +- src/machine/m_at_socket7.c | 23 +- src/machine/m_at_socket7_3v.c | 8 +- src/machine/m_at_socket8.c | 4 +- src/machine/m_pcjr.c | 3 +- src/machine/m_xt_laserxt.c | 461 +++++++-- src/machine/m_xt_zenith.c | 3 +- src/machine/machine_table.c | 61 +- src/sio/sio_fdc37c93x.c | 1732 ++++++++++++++++++++++++--------- 17 files changed, 1810 insertions(+), 666 deletions(-) diff --git a/src/chipset/intel_piix.c b/src/chipset/intel_piix.c index 6969d3274..ed9fd9460 100644 --- a/src/chipset/intel_piix.c +++ b/src/chipset/intel_piix.c @@ -59,7 +59,6 @@ typedef struct piix_io_trap_t { } piix_io_trap_t; typedef struct _piix_ { - uint8_t cur_readout_reg; uint8_t rev; uint8_t type; uint8_t func_shift; @@ -67,7 +66,6 @@ typedef struct _piix_ { uint8_t pci_slot; uint8_t no_mirq0; uint8_t regs[4][256]; - uint8_t readout_regs[256]; uint16_t func0_id; uint16_t nvr_io_base; uint16_t acpi_io_base; @@ -1185,31 +1183,6 @@ piix_read(int func, int addr, void *priv) return ret; } -static void -board_write(uint16_t port, uint8_t val, void *priv) -{ - piix_t *dev = (piix_t *) priv; - - if (port == 0x00e0) - dev->cur_readout_reg = val; - else if (port == 0x00e1) - dev->readout_regs[dev->cur_readout_reg] = val; -} - -static uint8_t -board_read(uint16_t port, void *priv) -{ - const piix_t *dev = (piix_t *) priv; - uint8_t ret = 0x64; - - if (port == 0x00e0) - ret = dev->cur_readout_reg; - else if (port == 0x00e1) - ret = dev->readout_regs[dev->cur_readout_reg]; - - return ret; -} - static void piix_reset_hard(piix_t *dev) { @@ -1624,40 +1597,6 @@ piix_init(const device_t *info) if (dev->type < 3) pci_enable_mirq(1); - dev->readout_regs[0] = 0xff; - dev->readout_regs[1] = 0x40; - dev->readout_regs[2] = 0xff; - - /* Port E1 register 01 (TODO: Find how multipliers > 3.0 are defined): - - Bit 6: 1 = can boot, 0 = no; - Bit 7, 1 = multiplier (00 = 2.5, 01 = 2.0, 10 = 3.0, 11 = 1.5); - Bit 5, 4 = bus speed (00 = 50 MHz, 01 = 66 MHz, 10 = 60 MHz, 11 = ????): - Bit 7, 5, 4, 1: 0000 = 125 MHz, 0010 = 166 MHz, 0100 = 150 MHz, 0110 = ??? MHz; - 0001 = 100 MHz, 0011 = 133 MHz, 0101 = 120 MHz, 0111 = ??? MHz; - 1000 = 150 MHz, 1010 = 200 MHz, 1100 = 180 MHz, 1110 = ??? MHz; - 1001 = 75 MHz, 1011 = 100 MHz, 1101 = 90 MHz, 1111 = ??? MHz */ - - if (cpu_busspeed <= 40000000) - dev->readout_regs[1] |= 0x30; - else if ((cpu_busspeed > 40000000) && (cpu_busspeed <= 50000000)) - dev->readout_regs[1] |= 0x00; - else if ((cpu_busspeed > 50000000) && (cpu_busspeed <= 60000000)) - dev->readout_regs[1] |= 0x20; - else if (cpu_busspeed > 60000000) - dev->readout_regs[1] |= 0x10; - - if (cpu_dmulti <= 1.5) - dev->readout_regs[1] |= 0x82; - else if ((cpu_dmulti > 1.5) && (cpu_dmulti <= 2.0)) - dev->readout_regs[1] |= 0x02; - else if ((cpu_dmulti > 2.0) && (cpu_dmulti <= 2.5)) - dev->readout_regs[1] |= 0x00; - else if (cpu_dmulti > 2.5) - dev->readout_regs[1] |= 0x80; - - io_sethandler(0x00e0, 0x0002, board_read, NULL, NULL, board_write, NULL, NULL, dev); - #if 0 device_add(&i8254_sec_device); #endif diff --git a/src/device/kbc_at.c b/src/device/kbc_at.c index 447c07780..aaa746570 100644 --- a/src/device/kbc_at.c +++ b/src/device/kbc_at.c @@ -509,9 +509,6 @@ kbc_scan_kbd_at(atkbc_t *dev) } } -static void -write_p2(atkbc_t *dev, uint8_t val); - static void kbc_at_poll_at(atkbc_t *dev) { @@ -778,6 +775,7 @@ static void write_p2(atkbc_t *dev, uint8_t val) { uint8_t old = dev->p2; + kbc_at_log("ATkbc: write P2: %02X (old: %02X)\n", val, dev->p2); uint8_t kbc_ven = dev->flags & KBC_VEN_MASK; @@ -851,6 +849,25 @@ write_p2(atkbc_t *dev, uint8_t val) } } +uint8_t +kbc_at_read_p(void *priv, uint8_t port, uint8_t mask) +{ + atkbc_t *dev = (atkbc_t *) priv; + uint8_t *p = (port == 2) ? &dev->p2 : &dev->p1; + uint8_t ret = *p & mask; + + return ret; +} + +void +kbc_at_write_p(void *priv, uint8_t port, uint8_t mask, uint8_t val) +{ + atkbc_t *dev = (atkbc_t *) priv; + uint8_t *p = (port == 2) ? &dev->p2 : &dev->p1; + + *p = (*p & mask) | val; +} + static void write_p2_fast_a20(atkbc_t *dev, uint8_t val) { diff --git a/src/floppy/fdc.c b/src/floppy/fdc.c index c32b1f442..de8508e69 100644 --- a/src/floppy/fdc.c +++ b/src/floppy/fdc.c @@ -81,6 +81,7 @@ int fdc_current[FDC_MAX] = { 0, 0 }; volatile int fdcinited = 0; +// #define ENABLE_FDC_LOG 1 #ifdef ENABLE_FDC_LOG int fdc_do_log = ENABLE_FDC_LOG; @@ -395,6 +396,20 @@ fdc_update_rwc(fdc_t *fdc, int drive, int rwc) fdc_rate(fdc, drive); } +uint8_t +fdc_get_media_id(fdc_t *fdc, int id) +{ + uint8_t ret = fdc->media_id & (1 << id); + + return ret; +} + +void +fdc_set_media_id(fdc_t *fdc, int id, int set) +{ + fdc->media_id = (fdc->media_id & ~(1 << id)) | (set << id); +} + int fdc_get_boot_drive(fdc_t *fdc) { @@ -1369,7 +1384,7 @@ fdc_read(uint16_t addr, void *priv) } else if (!fdc->enh_mode) ret = 0x20; else - ret = fdc->rwc[drive] << 4; + ret = (fdc->rwc[drive] << 4) | (fdc->media_id << 6); break; case 4: /*Status*/ ret = fdc->stat; @@ -2352,6 +2367,8 @@ fdc_reset(void *priv) } fdc->power_down = 0; + + fdc->media_id = 0; } static void diff --git a/src/include/86box/fdc.h b/src/include/86box/fdc.h index 2d17380d0..36cfaeb7a 100644 --- a/src/include/86box/fdc.h +++ b/src/include/86box/fdc.h @@ -119,6 +119,8 @@ typedef struct fdc_t { uint8_t lock; uint8_t dsr; + uint8_t media_id; + uint8_t params[15]; uint8_t specify[2]; uint8_t res[11]; @@ -166,6 +168,9 @@ extern void fdc_3f1_enable(fdc_t *fdc, int enable); extern int fdc_get_bit_rate(fdc_t *fdc); extern int fdc_get_bitcell_period(fdc_t *fdc); +extern uint8_t fdc_get_media_id(fdc_t *fdc, int id); +extern void fdc_set_media_id(fdc_t *fdc, int id, int set); + /* A few functions to communicate between Super I/O chips and the FDC. */ extern void fdc_update_enh_mode(fdc_t *fdc, int enh_mode); extern int fdc_get_rwc(fdc_t *fdc, int drive); diff --git a/src/include/86box/keyboard.h b/src/include/86box/keyboard.h index e21fa60d9..583960e80 100644 --- a/src/include/86box/keyboard.h +++ b/src/include/86box/keyboard.h @@ -285,6 +285,7 @@ extern int keyboard_isfsexit(void); extern int keyboard_isfsexit_up(void); extern void keyboard_set_is_amstrad(int ams); extern void kbc_at_set_ps2(void *priv, uint8_t ps2); +extern uint8_t kbc_at_read_p(void *priv, uint8_t port, uint8_t mask); extern void kbc_at_write_p(void *priv, uint8_t port, uint8_t mask, uint8_t val); extern void kbc_at_set_fast_reset(uint8_t new_fast_reset); diff --git a/src/include/86box/machine.h b/src/include/86box/machine.h index 4469b55c2..d62947848 100644 --- a/src/include/86box/machine.h +++ b/src/include/86box/machine.h @@ -806,6 +806,7 @@ extern int machine_at_p65up5_cp6nd_init(const machine_t *); /* m_at_slot1.c */ extern int machine_at_m729_init(const machine_t *); +extern int machine_at_acerv62x_init(const machine_t *); extern int machine_at_p65up5_cpknd_init(const machine_t *); extern int machine_at_kn97_init(const machine_t *); @@ -969,10 +970,14 @@ extern int machine_xt_compaq_deskpro_init(const machine_t *); extern int machine_xt_compaq_portable_init(const machine_t *); /* m_xt_laserxt.c */ -#ifdef USE_LASERXT extern int machine_xt_laserxt_init(const machine_t *); +#ifdef EMU_DEVICE_H +extern const device_t laserxt_device; +#endif extern int machine_xt_lxt3_init(const machine_t *); -#endif /* USE_LASERXT */ +#ifdef EMU_DEVICE_H +extern const device_t lxt3_device; +#endif /* m_xt_philips.c */ extern int machine_xt_p3105_init(const machine_t *); diff --git a/src/include/86box/sio.h b/src/include/86box/sio.h index 7fcb376b9..bdff29f7f 100644 --- a/src/include/86box/sio.h +++ b/src/include/86box/sio.h @@ -48,14 +48,22 @@ extern const device_t fdc37c669_370_device; extern const device_t fdc37c67x_device; -extern const device_t fdc37c931apm_device; -extern const device_t fdc37c931apm_compaq_device; -extern const device_t fdc37c932fr_device; -extern const device_t fdc37c932qf_device; -extern const device_t fdc37c932_device; -extern const device_t fdc37c935_device; -extern const device_t fdc37c935_370_device; -extern const device_t fdc37c935_no_nvr_device; +#define FDC37C93X_NORMAL 0x0002 +#define FDC37C93X_FR 0x0003 +#define FDC37C93X_APM 0x0030 +#define FDC37C93X_CHIP_ID 0x00ff + +#define FDC37C931 0x0100 /* Compaq KBC firmware and configuration registers on GPIO ports. */ +#define FDC37C932 0x0200 /* AMI '5' Megakey KBC firmware. */ +#define FDC37C933 0x0300 /* IBM KBC firmware. */ +#define FDC37C935 0x0500 /* Phoenix Multikey/42 1.38 KBC firmware. */ +#define FDC37C937 0x0700 /* Phoenix Multikey/42i 4.16 KBC firmware. */ +#define FDC37C93X_KBC 0x0f00 + +#define FDC37C93X_NO_NVR 0x1000 +#define FDC37C93X_370 0x2000 + +extern const device_t fdc37c93x_device; extern const device_t fdc37m60x_device; extern const device_t fdc37m60x_370_device; diff --git a/src/machine/CMakeLists.txt b/src/machine/CMakeLists.txt index ff6a66801..4098f2553 100644 --- a/src/machine/CMakeLists.txt +++ b/src/machine/CMakeLists.txt @@ -20,6 +20,7 @@ add_library(mch OBJECT machine_table.c m_xt.c m_xt_compaq.c + m_xt_laserxt.c m_xt_philips.c m_xt_t1000.c m_xt_t1000_vid.c @@ -64,11 +65,6 @@ if(DESKPRO386) target_compile_definitions(mch PRIVATE USE_DESKPRO386) endif() -if(LASERXT) - target_sources(mch PRIVATE m_xt_laserxt.c) - target_compile_definitions(mch PRIVATE USE_LASERXT) -endif() - if(OLIVETTI) target_compile_definitions(mch PRIVATE USE_OLIVETTI) endif() diff --git a/src/machine/m_at_slot1.c b/src/machine/m_at_slot1.c index a3ff921e3..bd3a4833f 100644 --- a/src/machine/m_at_slot1.c +++ b/src/machine/m_at_slot1.c @@ -40,6 +40,35 @@ #include <86box/clock.h> #include <86box/snd_ac97.h> +int +machine_at_acerv62x_init(const machine_t *model) +{ + int ret; + + ret = bios_load_linear("roms/machines/acerv62x/v62xc0s1.bin", + 0x000c0000, 262144, 0); + + if (bios_only || !ret) + return ret; + + machine_at_common_init_ex(model, 2); + + pci_init(PCI_CONFIG_TYPE_1); + pci_register_slot(0x00, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); + pci_register_slot(0x07, PCI_CARD_SOUTHBRIDGE, 5, 0, 0, 4); + pci_register_slot(0x12, PCI_CARD_NORMAL, 4, 1, 2, 3); + pci_register_slot(0x10, PCI_CARD_NORMAL, 3, 4, 1, 2); + pci_register_slot(0x0E, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x0F, PCI_CARD_NORMAL, 2, 3, 4, 1); + pci_register_slot(0x0D, PCI_CARD_NORMAL, 2, 3, 4, 1); + device_add(&i440fx_device); + device_add(&piix3_device); + device_add_params(&fdc37c93x_device, (void *) (FDC37C935 | FDC37C93X_APM)); + device_add(&sst_flash_29ee020_device); + + return ret; +} + int machine_at_p65up5_cpknd_init(const machine_t *model) { @@ -131,7 +160,7 @@ machine_at_spitfire_init(const machine_t *model) if (bios_only || !ret) return ret; - machine_at_common_init_ex(model, 2); + machine_at_common_init(model); pci_init(PCI_CONFIG_TYPE_1); pci_register_slot(0x00, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); @@ -143,7 +172,7 @@ machine_at_spitfire_init(const machine_t *model) pci_register_slot(0x01, PCI_CARD_AGPBRIDGE, 1, 2, 3, 4); device_add(&i440lx_device); device_add(&piix4e_device); - device_add(&fdc37c935_no_nvr_device); + device_add_params(&fdc37c93x_device, (void *) (FDC37C935 | FDC37C93X_NORMAL | FDC37C93X_NO_NVR)); device_add(&intel_flash_bxt_device); spd_register(SPD_TYPE_SDRAM, 0xF, 256); device_add(&lm78_device); /* no reporting in BIOS */ diff --git a/src/machine/m_at_socket7.c b/src/machine/m_at_socket7.c index 3fe883323..319856d41 100644 --- a/src/machine/m_at_socket7.c +++ b/src/machine/m_at_socket7.c @@ -69,7 +69,8 @@ machine_at_acerv35n_init(const machine_t *model) pci_register_slot(0x0D, PCI_CARD_NORMAL, 1, 2, 3, 4); device_add(&i430hx_device); device_add(&piix3_device); - device_add(&fdc37c932fr_device); + /* The chip is not marked FR but the BIOS accesses register 06h of GPIO. */ + device_add_params(&fdc37c93x_device, (void *) (FDC37C935 | FDC37C93X_FR)); device_add(&sst_flash_29ee010_device); return ret; @@ -160,7 +161,7 @@ machine_at_m7shi_init(const machine_t *model) pci_register_slot(0x00, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); device_add(&i430hx_device); device_add(&piix3_device); - device_add(&fdc37c935_device); + device_add_params(&fdc37c93x_device, (void *) (FDC37C935 | FDC37C93X_NORMAL)); device_add(&intel_flash_bxt_device); return ret; @@ -568,7 +569,7 @@ machine_at_presario2240_init(const machine_t *model) device_add(&i430vx_device); device_add(&piix3_device); - device_add(&fdc37c932qf_device); + device_add_params(&fdc37c93x_device, (void *) (FDC37C932 | FDC37C93X_NORMAL)); device_add(&sst_flash_29ee020_device); return ret; @@ -598,7 +599,7 @@ machine_at_presario4500_init(const machine_t *model) device_add(&i430vx_device); device_add(&piix3_device); - device_add(&fdc37c931apm_compaq_device); + device_add_params(&fdc37c93x_device, (void *) (FDC37C931 | FDC37C93X_APM)); device_add(&sst_flash_29ee020_device); return ret; @@ -631,7 +632,7 @@ machine_at_dellhannibalp_init(const machine_t *model) pci_register_slot(0x07, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 4); device_add(&i430vx_device); device_add(&piix3_device); - device_add(&fdc37c932fr_device); + device_add_params(&fdc37c93x_device, (void *) (FDC37C932 | FDC37C93X_FR)); device_add(&intel_flash_bxt_ami_device); return ret; @@ -659,7 +660,7 @@ machine_at_p55va_init(const machine_t *model) pci_register_slot(0x07, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 0); device_add(&i430vx_device); device_add(&piix3_device); - device_add(&fdc37c932fr_device); + device_add_params(&fdc37c93x_device, (void *) (FDC37C932 | FDC37C93X_FR)); device_add(&intel_flash_bxt_device); return ret; @@ -687,7 +688,7 @@ machine_at_brio80xx_init(const machine_t *model) pci_register_slot(0x00, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); device_add(&i430vx_device); device_add(&piix3_device); - device_add(&fdc37c935_370_device); + device_add_params(&fdc37c93x_device, (void *) (FDC37C935 | FDC37C93X_NORMAL | FDC37C93X_370)); device_add(&sst_flash_29ee020_device); return ret; @@ -756,7 +757,7 @@ machine_at_pb810_init(const machine_t *model) device_add(&i430vx_device); device_add(&piix3_device); - device_add(&fdc37c935_370_device); + device_add_params(&fdc37c93x_device, (void *) (FDC37C935 | FDC37C93X_NORMAL | FDC37C93X_370)); device_add(&intel_flash_bxt_device); return ret; @@ -851,7 +852,7 @@ machine_at_gw2kte_init(const machine_t *model) device_add(&i430vx_device); device_add(&piix3_device); - device_add(&fdc37c932fr_device); + device_add_params(&fdc37c93x_device, (void *) (FDC37C932 | FDC37C93X_FR)); device_add(&intel_flash_bxt_ami_device); return ret; @@ -1553,7 +1554,7 @@ machine_at_thunderbolt_init(const machine_t *model) if (bios_only || !ret) return ret; - machine_at_common_init_ex(model, 2); + machine_at_common_init(model); pci_init(PCI_CONFIG_TYPE_1); pci_register_slot(0x00, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); @@ -1564,7 +1565,7 @@ machine_at_thunderbolt_init(const machine_t *model) pci_register_slot(0x14, PCI_CARD_NORMAL, 3, 0, 1, 2); device_add(&i430tx_device); device_add(&piix4_device); - device_add(&fdc37c935_device); + device_add_params(&fdc37c93x_device, (void *) (FDC37C935 | FDC37C93X_NORMAL | FDC37C93X_NO_NVR)); device_add(&intel_flash_bxt_device); spd_register(SPD_TYPE_SDRAM, 0x3, 128); diff --git a/src/machine/m_at_socket7_3v.c b/src/machine/m_at_socket7_3v.c index 4b980f2b0..913c82518 100644 --- a/src/machine/m_at_socket7_3v.c +++ b/src/machine/m_at_socket7_3v.c @@ -455,7 +455,7 @@ machine_at_pb640_init(const machine_t *model) device_add(&piix_rev02_device); if (gfxcard[0] == VID_INTERNAL) - device_add(&gd5440_onboard_pci_device); + device_add(machine_get_vid_device(machine)); device_add(&keyboard_ps2_intel_ami_pci_device); device_add(&pc87306_device); @@ -546,7 +546,7 @@ machine_at_acerm3a_init(const machine_t *model) pci_register_slot(0x10, PCI_CARD_VIDEO, 4, 0, 0, 0); device_add(&i430hx_device); device_add(&piix3_device); - device_add(&fdc37c935_device); + device_add_params(&fdc37c93x_device, (void *) (FDC37C935 | FDC37C93X_NORMAL)); device_add(&sst_flash_29ee010_device); @@ -700,7 +700,7 @@ machine_at_gw2kma_init(const machine_t *model) device_add(&i430vx_device); device_add(&piix3_device); - device_add(&fdc37c932fr_device); + device_add_params(&fdc37c93x_device, (void *) (FDC37C932 | FDC37C93X_FR)); device_add(&intel_flash_bxt_ami_device); return ret; @@ -819,7 +819,7 @@ machine_at_vectra54_init(const machine_t *model) device_add(&i430fx_device); device_add(&piix_device); - device_add(&fdc37c932_device); + device_add_params(&fdc37c93x_device, (void *) (FDC37C932 | FDC37C93X_NORMAL)); device_add(&sst_flash_29ee010_device); return ret; diff --git a/src/machine/m_at_socket8.c b/src/machine/m_at_socket8.c index 935a26fb2..479c4b9fc 100644 --- a/src/machine/m_at_socket8.c +++ b/src/machine/m_at_socket8.c @@ -188,7 +188,7 @@ machine_at_acerv60n_init(const machine_t *model) pci_register_slot(0x0C, PCI_CARD_NORMAL, 2, 3, 4, 1); device_add(&i440fx_device); device_add(&piix3_device); - device_add(&fdc37c935_device); + device_add_params(&fdc37c93x_device, (void *) (FDC37C935 | FDC37C93X_NORMAL)); device_add(&sst_flash_29ee010_device); return ret; @@ -389,7 +389,7 @@ machine_at_m6mi_init(const machine_t *model) pci_register_slot(0x0F, PCI_CARD_NORMAL, 4, 1, 2, 3); device_add(&i440fx_device); device_add(&piix3_device); - device_add(&fdc37c935_device); + device_add_params(&fdc37c93x_device, (void *) (FDC37C935 | FDC37C93X_NORMAL)); device_add(&intel_flash_bxt_device); return ret; diff --git a/src/machine/m_pcjr.c b/src/machine/m_pcjr.c index ca9e72fca..d4d3b09cf 100644 --- a/src/machine/m_pcjr.c +++ b/src/machine/m_pcjr.c @@ -1566,7 +1566,8 @@ machine_pcjr_init(UNUSED(const machine_t *model)) device_add(&fdc_pcjr_device); device_add(&ns8250_pcjr_device); - serial_set_next_inst(SERIAL_MAX); /* So that serial_standalone_init() won't do anything. */ + /* So that serial_standalone_init() won't do anything. */ + serial_set_next_inst(SERIAL_MAX - 1); /* "All the inputs are 'read' with one 'IN' from address hex 201." - PCjr Technical Reference (Nov. 83), p.2-119 diff --git a/src/machine/m_xt_laserxt.c b/src/machine/m_xt_laserxt.c index c0405f99a..d298e726b 100644 --- a/src/machine/m_xt_laserxt.c +++ b/src/machine/m_xt_laserxt.c @@ -1,6 +1,7 @@ /*This is the chipset used in the LaserXT series model*/ #include #include +#include #include #include #include <86box/86box.h> @@ -21,125 +22,411 @@ #include <86box/keyboard.h> #include <86box/plat_unused.h> -static int laserxt_emspage[4]; -static int laserxt_emscontrol[4]; -static mem_mapping_t laserxt_ems_mapping[4]; -static int laserxt_ems_baseaddr_index = 0; -static int laserxt_is_lxt3 = 0; +#define EMS_TOTAL_MAX 0x00100000 -static uint32_t -get_laserxt_ems_addr(uint32_t addr) +typedef struct { - if (laserxt_emspage[(addr >> 14) & 3] & 0x80) { - addr = (!laserxt_is_lxt3 ? 0x70000 + (((mem_size + 64) & 255) << 10) : 0x30000 + (((mem_size + 320) & 511) << 10)) + ((laserxt_emspage[(addr >> 14) & 3] & 0x0F) << 14) + ((laserxt_emspage[(addr >> 14) & 3] & 0x40) << 12) + (addr & 0x3FFF); - } + uint8_t page; + uint8_t ctrl; - return addr; + uint32_t phys; + uint32_t virt; + + mem_mapping_t mapping; + + uint8_t *ram; + + void *parent; +} lxt_ems_t; + +typedef struct +{ + int ems_base_idx; + + lxt_ems_t ems[4]; + + uint16_t io_base; + uint32_t base; + + uint32_t mem_size; + + uint8_t *ram; + + void *parent; +} lxt_ems_board_t; + +typedef struct +{ + int is_lxt3; + + lxt_ems_board_t *ems_boards[2]; +} lxt_t; + +static void +ems_update_virt(lxt_ems_t *dev, uint8_t new_page) +{ + lxt_ems_board_t *board = (lxt_ems_board_t *) dev->parent; + lxt_t *lxt = (lxt_t *) board->parent; + + dev->page = new_page; + + if (new_page & 0x80) { + if (lxt->is_lxt3) { + /* Point invalid pages at 1 MB which is outside the maximum. */ + if ((new_page & 0x7f) >= 0x40) + dev->virt = EMS_TOTAL_MAX; + else + dev->virt = ((new_page & 0x7f) << 14); + } else + dev->virt = ((new_page & 0x0f) << 14) + ((new_page & 0x40) << 12); + + if (dev->virt >= board->mem_size) + dev->virt = EMS_TOTAL_MAX; + } else + dev->virt = EMS_TOTAL_MAX; + + dev->ram = board->ram + dev->virt; + + if ((new_page & 0x80) && (dev->virt != EMS_TOTAL_MAX)) { + mem_mapping_enable(&dev->mapping); + + mem_mapping_set_exec(&dev->mapping, dev->ram); + mem_mapping_set_p(&dev->mapping, dev->ram); + } else + mem_mapping_disable(&dev->mapping); + + flushmmucache(); } static void -laserxt_write(uint16_t port, uint8_t val, UNUSED(void *priv)) +lxt_ems_out(uint16_t port, uint8_t val, void *priv) { - uint32_t paddr; - uint32_t vaddr; - switch (port) { - case 0x0208: - case 0x4208: - case 0x8208: - case 0xC208: - laserxt_emspage[port >> 14] = val; - paddr = 0xC0000 + (port & 0xC000) + (((laserxt_ems_baseaddr_index + (4 - (port >> 14))) & 0x0C) << 14); - if (val & 0x80) { - mem_mapping_enable(&laserxt_ems_mapping[port >> 14]); - vaddr = get_laserxt_ems_addr(paddr); - mem_mapping_set_exec(&laserxt_ems_mapping[port >> 14], ram + vaddr); - } else { - mem_mapping_disable(&laserxt_ems_mapping[port >> 14]); - } - flushmmucache(); - break; - case 0x0209: - case 0x4209: - case 0x8209: - case 0xC209: - laserxt_emscontrol[port >> 14] = val; - laserxt_ems_baseaddr_index = 0; + lxt_ems_board_t *dev = (lxt_ems_board_t *) priv; + uint8_t reg = port >> 14; + uint32_t saddrs[8] = { 0xc4000, 0xc8000, 0xcc000, 0xd0000, + 0xd4000, 0xd8000, 0xdc000, 0xe0000 }; + uint32_t saddr; + + if (port & 0x0001) { + dev->ems[reg].ctrl = val; + + if (reg < 0x03) { + dev->ems_base_idx = (dev->ems_base_idx & ~(0x04 >> (2 - reg))) | + ((dev->ems[reg].ctrl & 0x80) >> (7 - reg)); + + saddr = saddrs[dev->ems_base_idx]; + for (uint8_t i = 0; i < 4; i++) { - laserxt_ems_baseaddr_index |= (laserxt_emscontrol[i] & 0x80) >> (7 - i); + uint32_t base = saddr + (i * 0x4000); + mem_mapping_set_addr(&dev->ems[i].mapping, base, 0x4000); + if (!(dev->ems[i].page & 0x80) || (dev->ems[i].virt == EMS_TOTAL_MAX)) + mem_mapping_disable(&dev->ems[i].mapping); } + } - mem_mapping_set_addr(&laserxt_ems_mapping[0], 0xC0000 + (((laserxt_ems_baseaddr_index + 4) & 0x0C) << 14), 0x4000); - mem_mapping_set_addr(&laserxt_ems_mapping[1], 0xC4000 + (((laserxt_ems_baseaddr_index + 3) & 0x0C) << 14), 0x4000); - mem_mapping_set_addr(&laserxt_ems_mapping[2], 0xC8000 + (((laserxt_ems_baseaddr_index + 2) & 0x0C) << 14), 0x4000); - mem_mapping_set_addr(&laserxt_ems_mapping[3], 0xCC000 + (((laserxt_ems_baseaddr_index + 1) & 0x0C) << 14), 0x4000); - flushmmucache(); - break; - - default: - break; + flushmmucache(); + } else if (!(port & 0x0001)) { + dev->ems[reg].page = val; + ems_update_virt(&dev->ems[reg], val); } } static uint8_t -laserxt_read(uint16_t port, UNUSED(void *priv)) +lxt_ems_in(uint16_t port, void *priv) { - switch (port) { - case 0x0208: - case 0x4208: - case 0x8208: - case 0xC208: - return laserxt_emspage[port >> 14]; - case 0x0209: - case 0x4209: - case 0x8209: - case 0xC209: - return laserxt_emscontrol[port >> 14]; + lxt_ems_board_t *dev = (lxt_ems_board_t *) priv; + uint8_t reg = port >> 14; + uint8_t ret = 0xff; - default: - break; - } - return 0xff; + if (port & 0x0001) + ret = dev->ems[reg].ctrl; + else + ret = dev->ems[reg].page; + + return ret; } static void -mem_write_laserxtems(uint32_t addr, uint8_t val, UNUSED(void *priv)) +lxt_ems_write(uint32_t addr, uint8_t val, void *priv) { - addr = get_laserxt_ems_addr(addr); - if (addr < (mem_size << 10)) - ram[addr] = val; + uint8_t *mem = (uint8_t *) priv; + + mem[addr & 0x3fff] = val; } static uint8_t -mem_read_laserxtems(uint32_t addr, UNUSED(void *priv)) +lxt_ems_read(uint32_t addr, void *priv) { - uint8_t val = 0xFF; - addr = get_laserxt_ems_addr(addr); - if (addr < (mem_size << 10)) - val = ram[addr]; - return val; + uint8_t *mem = (uint8_t *) priv; + uint8_t ret = 0xff; + + ret = mem[addr & 0x3fff]; + + return ret; +} + +static lxt_ems_board_t * +lxt_ems_init(lxt_t *parent, int en, uint16_t io, uint32_t mem) +{ + lxt_ems_board_t *dev = (lxt_ems_board_t *) calloc(1, sizeof(lxt_ems_board_t)); + + if (en) { + dev->parent = parent; + + if (io != 0x0000) { + io_sethandler(io , 0x0002, lxt_ems_in, NULL, NULL, lxt_ems_out, NULL, NULL, dev); + io_sethandler(io | 0x4000, 0x0002, lxt_ems_in, NULL, NULL, lxt_ems_out, NULL, NULL, dev); + io_sethandler(io | 0x8000, 0x0002, lxt_ems_in, NULL, NULL, lxt_ems_out, NULL, NULL, dev); + io_sethandler(io | 0xc000, 0x0002, lxt_ems_in, NULL, NULL, lxt_ems_out, NULL, NULL, dev); + } + + dev->ram = (uint8_t *) calloc(mem, sizeof(uint8_t)); + dev->mem_size = mem; + + for (uint8_t i = 0; i < 4; i++) { + uint8_t *ptr = dev->ram + (i << 14); + + mem_mapping_add(&dev->ems[i].mapping, 0xe0000 + (i << 14), 0x4000, + lxt_ems_read, NULL, NULL, + lxt_ems_write, NULL, NULL, + ptr, 0, ptr); + mem_mapping_disable(&dev->ems[i].mapping); + + dev->ems[i].page = 0x7f; + dev->ems[i].ctrl = (i == 3) ? 0x00 : 0x80; + + dev->ems[i].parent = dev; + + ems_update_virt(&(dev->ems[i]), dev->ems[i].page); + } + } + + return dev; } static void -laserxt_init(int is_lxt3) +lxt_close(void *priv) { - if (mem_size > 640) { - io_sethandler(0x0208, 0x0002, laserxt_read, NULL, NULL, laserxt_write, NULL, NULL, NULL); - io_sethandler(0x4208, 0x0002, laserxt_read, NULL, NULL, laserxt_write, NULL, NULL, NULL); - io_sethandler(0x8208, 0x0002, laserxt_read, NULL, NULL, laserxt_write, NULL, NULL, NULL); - io_sethandler(0xc208, 0x0002, laserxt_read, NULL, NULL, laserxt_write, NULL, NULL, NULL); - mem_mapping_set_addr(&ram_low_mapping, 0, !is_lxt3 ? 0x70000 + (((mem_size + 64) & 255) << 10) : 0x30000 + (((mem_size + 320) & 511) << 10)); + lxt_t *dev = (lxt_t *) priv; + int ems_boards = (1 - dev->is_lxt3) + 1; + + for (int i = 0; i < ems_boards; i++) + if (dev->ems_boards[i] != NULL) { + if (dev->ems_boards[i]->ram != NULL) + free(dev->ems_boards[i]->ram); + free(dev->ems_boards[i]); + } + + free(dev); +} + +static void * +lxt_init(const device_t *info) +{ + lxt_t * dev = (lxt_t *) calloc(1, sizeof(lxt_t)); + int ems_boards = (1 - info->local) + 1; + int ems_en[2] = { 0 }; + uint16_t ems_io[2] = { 0 }; + uint32_t ems_mem[2] = { 0 }; + char conf_str[512] = { 0 }; + + dev->is_lxt3 = info->local; + + for (int i = 0; i < ems_boards; i++) { + sprintf(conf_str, "ems_%i_enable", i + 1); + ems_en[i] = device_get_config_int(conf_str); + + sprintf(conf_str, "ems_%i_base", i + 1); + ems_io[i] = device_get_config_hex16(conf_str); + + sprintf(conf_str, "ems_%i_mem_size", i + 1); + ems_mem[i] = device_get_config_int(conf_str) << 10; + + dev->ems_boards[i] = lxt_ems_init(dev, ems_en[i], ems_io[i], ems_mem[i]); } - for (uint8_t i = 0; i < 4; i++) { - laserxt_emspage[i] = 0x7F; - laserxt_emscontrol[i] = (i == 3) ? 0x00 : 0x80; - mem_mapping_add(&laserxt_ems_mapping[i], 0xE0000 + (i << 14), 0x4000, mem_read_laserxtems, NULL, NULL, mem_write_laserxtems, NULL, NULL, ram + 0xA0000 + (i << 14), 0, NULL); - mem_mapping_disable(&laserxt_ems_mapping[i]); - } mem_set_mem_state(0x0c0000, 0x40000, MEM_READ_EXTANY | MEM_WRITE_EXTANY); - laserxt_is_lxt3 = is_lxt3; + + return dev; } +static const device_config_t laserxt_config[] = { + { + .name = "ems_1_base", + .description = "EMS 1 Address", + .type = CONFIG_HEX16, + .default_string = NULL, + .default_int = 0, + .file_filter = NULL, + .spinner = { 0 }, + .selection = { + { .description = "Disabled", .value = 0 }, + { .description = "0x208", .value = 0x208 }, + { .description = "0x218", .value = 0x218 }, + { .description = "0x258", .value = 0x258 }, + { .description = "0x268", .value = 0x268 }, + { .description = "0x2A8", .value = 0x2a8 }, + { .description = "0x2B8", .value = 0x2b8 }, + { .description = "0x2E8", .value = 0x2e8 }, + { .description = "" } + }, + .bios = { { 0 } } + }, + { + .name = "ems_2_base", + .description = "EMS 2 Address", + .type = CONFIG_HEX16, + .default_string = NULL, + .default_int = 0, + .file_filter = NULL, + .spinner = { 0 }, + .selection = { + { .description = "Disabled", .value = 0 }, + { .description = "0x208", .value = 0x208 }, + { .description = "0x218", .value = 0x218 }, + { .description = "0x258", .value = 0x258 }, + { .description = "0x268", .value = 0x268 }, + { .description = "0x2A8", .value = 0x2a8 }, + { .description = "0x2B8", .value = 0x2b8 }, + { .description = "0x2E8", .value = 0x2e8 }, + { .description = "" } + }, + .bios = { { 0 } } + }, + { + .name = "ems_1_mem_size", + .description = "EMS 1 Memory Size", + .type = CONFIG_SPINNER, + .default_string = NULL, + .default_int = 0, + .file_filter = NULL, + .spinner = { + .min = 0, + .max = 512, + .step = 32 + }, + .selection = { { 0 } }, + .bios = { { 0 } } + }, + { + .name = "ems_2_mem_size", + .description = "EMS 2 Memory Size", + .type = CONFIG_SPINNER, + .default_string = NULL, + .default_int = 0, + .file_filter = NULL, + .spinner = { + .min = 0, + .max = 512, + .step = 32 + }, + .selection = { { 0 } }, + .bios = { { 0 } } + }, + { + .name = "ems_1_enable", + .description = "Enable EMS 1", + .type = CONFIG_BINARY, + .default_string = NULL, + .default_int = 0, + .file_filter = NULL, + .spinner = { 0 }, + .selection = { { 0 } }, + .bios = { { 0 } } + }, + { + .name = "ems_2_enable", + .description = "Enable EMS 2", + .type = CONFIG_BINARY, + .default_string = NULL, + .default_int = 0, + .file_filter = NULL, + .spinner = { 0 }, + .selection = { { 0 } }, + .bios = { { 0 } } + }, + { .name = "", .description = "", .type = CONFIG_END } +}; + +const device_t laserxt_device = { + .name = "VTech Laser Turbo XT", + .internal_name = "laserxt", + .flags = 0, + .local = 0, + .init = lxt_init, + .close = lxt_close, + .reset = NULL, + .available = NULL, + .speed_changed = NULL, + .force_redraw = NULL, + .config = laserxt_config +}; + +static const device_config_t lxt3_config[] = { + { + .name = "ems_1_base", + .description = "EMS Address", + .type = CONFIG_HEX16, + .default_string = NULL, + .default_int = 0, + .file_filter = NULL, + .spinner = { 0 }, + .selection = { + { .description = "Disabled", .value = 0 }, + { .description = "0x208", .value = 0x208 }, + { .description = "0x218", .value = 0x218 }, + { .description = "0x258", .value = 0x258 }, + { .description = "0x268", .value = 0x268 }, + { .description = "0x2A8", .value = 0x2a8 }, + { .description = "0x2B8", .value = 0x2b8 }, + { .description = "0x2E8", .value = 0x2e8 }, + { .description = "" } + }, + .bios = { { 0 } } + }, + { + .name = "ems_1_mem_size", + .description = "EMS Memory Size", + .type = CONFIG_SPINNER, + .default_string = NULL, + .default_int = 0, + .file_filter = NULL, + .spinner = { + .min = 0, + .max = 1024, + .step = 32 + }, + .selection = { { 0 } }, + .bios = { { 0 } } + }, + { + .name = "ems_1_enable", + .description = "Enable EMS", + .type = CONFIG_BINARY, + .default_string = NULL, + .default_int = 0, + .file_filter = NULL, + .spinner = { 0 }, + .selection = { { 0 } }, + .bios = { { 0 } } + }, + { .name = "", .description = "", .type = CONFIG_END } +}; + +const device_t lxt3_device = { + .name = "VTech Laser Turbo XT", + .internal_name = "laserxt", + .flags = 0, + .local = 1, + .init = lxt_init, + .close = lxt_close, + .reset = NULL, + .available = NULL, + .speed_changed = NULL, + .force_redraw = NULL, + .config = lxt3_config +}; + static void machine_xt_laserxt_common_init(const machine_t *model,int is_lxt3) { @@ -153,7 +440,7 @@ machine_xt_laserxt_common_init(const machine_t *model,int is_lxt3) nmi_init(); standalone_gameport_type = &gameport_device; - laserxt_init(is_lxt3); + device_add(is_lxt3 ? &lxt3_device : &laserxt_device); device_add(&keyboard_xt_lxt3_device); } diff --git a/src/machine/m_xt_zenith.c b/src/machine/m_xt_zenith.c index 6c5d556f2..62c6496d1 100644 --- a/src/machine/m_xt_zenith.c +++ b/src/machine/m_xt_zenith.c @@ -146,7 +146,8 @@ machine_xt_z184_init(const machine_t *model) lpt2_remove(); lpt1_setup(LPT2_ADDR); device_add(&ns8250_device); - serial_set_next_inst(SERIAL_MAX); /* So that serial_standalone_init() won't do anything. */ + /* So that serial_standalone_init() won't do anything. */ + serial_set_next_inst(SERIAL_MAX - 1); device_add(&cga_device); diff --git a/src/machine/machine_table.c b/src/machine/machine_table.c index 9c83f4b22..44e93f721 100644 --- a/src/machine/machine_table.c +++ b/src/machine/machine_table.c @@ -1709,7 +1709,6 @@ const machine_t machines[] = { .snd_device = NULL, .net_device = NULL }, -#ifdef USE_LASERXT { .name = "[8088] VTech Laser Turbo XT", .internal_name = "ltxt", @@ -1742,14 +1741,13 @@ const machine_t machines[] = { .kbc_p1 = 0xff, .gpio = 0xffffffff, .gpio_acpi = 0xffffffff, - .device = NULL, + .device = &laserxt_device, .fdc_device = NULL, .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL }, -#endif /* USE_LASERXT */ /* Has a standard PS/2 KBC (so, use IBM PS/2 Type 1). */ { .name = "[8088] Xi8088", @@ -2612,8 +2610,6 @@ const machine_t machines[] = { .snd_device = NULL, .net_device = NULL }, - -#ifdef USE_LASERXT { .name = "[8086] VTech Laser XT3", .internal_name = "lxt3", @@ -2637,23 +2633,22 @@ const machine_t machines[] = { .bus_flags = MACHINE_PC, .flags = MACHINE_FLAGS_NONE, .ram = { - .min = 256, + .min = 512, .max = 640, - .step = 256 + .step = 64 }, .nvrmask = 0, .kbc_device = &keyboard_xt_lxt3_device, .kbc_p1 = 0xff, .gpio = 0xffffffff, .gpio_acpi = 0xffffffff, - .device = NULL, + .device = &lxt3_device, .fdc_device = NULL, .sio_device = NULL, .vid_device = NULL, .snd_device = NULL, .net_device = NULL }, -#endif /* USE_LASERXT */ /* 286 AT machines */ /* Has IBM AT KBC firmware. */ @@ -8156,7 +8151,10 @@ const machine_t machines[] = { .snd_device = NULL, .net_device = NULL }, - /* I'm going to assume this as an AMIKey-2 like the other two 486SP3's. */ + /* + This has an AMIKey (and an on-board NCR 53C810 PCI SCSI controller), thanks, eBay! + The keyboard port is AT. + */ { .name = "[i420TX] ASUS PCI/I-486SP3", .internal_name = "486sp3", @@ -10092,7 +10090,7 @@ const machine_t machines[] = { .max_multi = 1.5 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE | MACHINE_SCSI | MACHINE_APM, + .flags = MACHINE_IDE /*| MACHINE_SCSI */ | MACHINE_APM, .ram = { .min = 2048, .max = 524288, @@ -14593,6 +14591,47 @@ const machine_t machines[] = { }, /* 440FX */ + /* Has a SM(S)C FDC37C935 Super I/O chip with on-chip KBC with Phoenix + MultiKey/42 (version 1.38) KBC firmware. */ + { + .name = "[i440FX] Acer V62X", + .internal_name = "acerv62x", + .type = MACHINE_TYPE_SLOT1, + .chipset = MACHINE_CHIPSET_INTEL_440FX, + .init = machine_at_acerv62x_init, + .p1_handler = NULL, + .gpio_handler = NULL, + .available_flag = MACHINE_AVAILABLE, + .gpio_acpi_handler = NULL, + .cpu = { + .package = CPU_PKG_SLOT1, + .block = CPU_BLOCK_NONE, + .min_bus = 60000000, + .max_bus = 83333333, + .min_voltage = 1800, + .max_voltage = 3500, + .min_multi = 1.5, + .max_multi = 8.0 + }, + .bus_flags = MACHINE_PS2_PCI | MACHINE_BUS_USB, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_USB, + .ram = { + .min = 8192, + .max = 786432, + .step = 8192 + }, + .nvrmask = 511, + .kbc_device = NULL, + .kbc_p1 = 0xff, + .gpio = 0xffffffff, + .gpio_acpi = 0xffffffff, + .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, + .vid_device = NULL, + .snd_device = NULL, + .net_device = NULL + }, /* The base board has a Holtek HT6542B KBC with AMIKey-2 (updated 'H') KBC firmware. */ { .name = "[i440FX] ASUS P/I-P65UP5 (C-PKND)", diff --git a/src/sio/sio_fdc37c93x.c b/src/sio/sio_fdc37c93x.c index 8d8f76cb6..ebc500c96 100644 --- a/src/sio/sio_fdc37c93x.c +++ b/src/sio/sio_fdc37c93x.c @@ -15,8 +15,9 @@ * * Copyright 2016-2018 Miran Grca. */ -#include +#include #include +#include #include #include #include @@ -25,6 +26,7 @@ #include <86box/timer.h> #include <86box/device.h> #include <86box/pci.h> +#include <86box/pic.h> #include <86box/lpt.h> #include <86box/serial.h> #include <86box/hdc.h> @@ -37,20 +39,28 @@ #include <86box/apm.h> #include <86box/access_bus.h> #include <86box/acpi.h> -#include <86box/sio.h> +#include <86box/plat.h> #include <86box/plat_unused.h> +#include <86box/video.h> +#include <86box/sio.h> +#include "cpu.h" typedef struct fdc37c93x_t { uint8_t chip_id; uint8_t is_apm; uint8_t is_compaq; uint8_t has_nvr; + uint8_t max_ld; uint8_t tries; uint8_t port_370; - uint8_t gpio_regs[2]; + uint8_t gpio_reg; + uint8_t gpio_regs[256]; + uint8_t gpio_pulldn[8]; uint8_t auxio_reg; uint8_t regs[48]; + uint8_t alt_regs[3][8]; uint8_t ld_regs[11][256]; + uint16_t kbc_type; uint16_t superio_base; uint16_t fdc_base; uint16_t lpt_base; @@ -73,6 +83,15 @@ typedef struct fdc37c93x_t { static void fdc37c93x_write(uint16_t port, uint8_t val, void *priv); static uint8_t fdc37c93x_read(uint16_t port, void *priv); +static uint8_t gp_func_regs[8][8] = { { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }, /* GP00-GP07 */ + { 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7 }, /* GP10-GP17 */ + { 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef }, /* GP20-GP27 */ + { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }, /* GP30-GP37 */ + { 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7 }, /* GP40-GP47 */ + { 0xc8, 0xc9, 0xff, 0xcb, 0xcc, 0xff, 0xff, 0xff }, /* GP50-GP57 */ + { 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7 }, /* GP60-GP67 */ + { 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf } }; /* GP70-GP77 */ + static uint16_t make_port_superio(const fdc37c93x_t *dev) { @@ -122,14 +141,562 @@ fdc37c93x_auxio_write(UNUSED(uint16_t port), uint8_t val, void *priv) dev->auxio_reg = val; } +static __inline uint8_t +fdc37c93x_do_read_gp(fdc37c93x_t *dev, int reg, int bit) +{ + /* Update bit 2 on the Acer V35N according to the selected graphics card type. */ + if ((reg == 2) && (strstr(machine_get_internal_name(), "acer") != NULL)) + dev->gpio_pulldn[reg] = (dev->gpio_pulldn[reg] & 0xfb) | (video_is_mda() ? 0x00 : 0x04); + + return dev->gpio_regs[reg] & dev->gpio_pulldn[reg] & (1 << bit); +} + +static __inline uint8_t +fdc37c93x_do_read_alt(const fdc37c93x_t *dev, int alt, int reg, int bit) +{ + return dev->alt_regs[alt][reg] & (1 << bit); +} + +static uint8_t +fdc37c93x_read_gp(const fdc37c93x_t *dev, int reg, int bit) +{ + uint8_t gp_reg = gp_func_regs[reg][bit]; + uint8_t gp_func_reg = dev->ld_regs[0x08][gp_reg]; + uint8_t gp_func; + uint8_t ret = 1 << bit; + + if (gp_func_reg & 0x01) switch (reg) { + default: + /* Do nothing, this GP does not exist. */ + break; + case 1: + switch (bit) { + default: + gp_func = (gp_func_reg >> 3) & 0x01; + if (gp_func == 0x00) + ret = fdc37c93x_do_read_gp((fdc37c93x_t *) dev, reg, bit); + else + ret = fdc37c93x_do_read_alt(dev, 0, reg, bit); + break; + case 1: + gp_func = (gp_func_reg >> 3) & 0x03; + if (!(gp_func & 0x01)) { + if (gp_func & 0x02) + ret = fdc37c93x_do_read_alt(dev, 0, reg, bit); + else + ret = fdc37c93x_do_read_gp((fdc37c93x_t *) dev, reg, bit); + } + break; + case 3: + gp_func = (gp_func_reg >> 3) & 0x01; + if (gp_func == 0x01) + /* TODO: Write to power LED if it's ever implemented. */ + ret = fdc37c93x_do_read_alt(dev, 0, reg, bit); + else + ret = fdc37c93x_do_read_gp((fdc37c93x_t *) dev, reg, bit); + break; + case 6: + gp_func = (gp_func_reg >> 3) & 0x03; + switch (gp_func) { + case 0: + ret = fdc37c93x_do_read_gp((fdc37c93x_t *) dev, reg, bit); + break; + case 1 ... 3: + ret = fdc37c93x_do_read_alt(dev, gp_func - 1, reg, bit); + break; + } + break; + } + break; + case 2: + switch (bit) { + default: + gp_func = (gp_func_reg >> 3) & 0x01; + if (gp_func == 0x00) + ret = fdc37c93x_do_read_gp((fdc37c93x_t *) dev, reg, bit); + else + ret = fdc37c93x_do_read_alt(dev, 0, reg, bit); + break; + case 0: + gp_func = (gp_func_reg >> 3) & 0x03; + switch (gp_func) { + case 0: + ret = fdc37c93x_do_read_gp((fdc37c93x_t *) dev, reg, bit); + break; + case 1: + ret = fdc37c93x_do_read_alt(dev, 0, reg, bit); + break; + case 2: + ret = kbc_at_read_p(dev->kbc, 2, 0x01) ? (1 << bit) : 0x00; + break; + } + break; + case 1: case 2: + gp_func = (gp_func_reg >> 3) & 0x03; + switch (gp_func) { + case 0: + ret = fdc37c93x_do_read_gp((fdc37c93x_t *) dev, reg, bit); + break; + case 1: case 2: + ret = fdc37c93x_do_read_alt(dev, gp_func - 1, reg, bit); + break; + } + break; + case 5: + gp_func = (gp_func_reg >> 3) & 0x01; + if (gp_func == 0x00) + ret = fdc37c93x_do_read_gp((fdc37c93x_t *) dev, reg, bit); + else + ret = kbc_at_read_p(dev->kbc, 2, 0x02) ? (1 << bit) : 0x00; + break; + case 6: case 7: + /* Do nothing, these bits do not exist. */ + break; + } + break; + case 4: + gp_func = (gp_func_reg >> 3) & 0x03; + switch (bit) { + default: + switch (gp_func) { + case 0: + ret = fdc37c93x_do_read_alt(dev, 0, reg, bit); + break; + case 1: + ret = fdc37c93x_do_read_gp((fdc37c93x_t *) dev, reg, bit); + break; + } + break; + case 0: case 1: + switch (gp_func) { + case 0: + ret = fdc_get_media_id(dev->fdc, bit ^ 1) ? (1 << bit) : 0x00; + break; + case 1: + ret = fdc37c93x_do_read_gp((fdc37c93x_t *) dev, reg, bit); + break; + } + break; + case 6: + switch (gp_func) { + case 0: + ret = fdc37c93x_do_read_alt(dev, 0, reg, bit); + break; + case 1: + ret = fdc37c93x_do_read_gp((fdc37c93x_t *) dev, reg, bit); + break; + case 2: + /* TODO: Write to power LED if it's ever implemented. */ + ret = fdc37c93x_do_read_alt(dev, 1, reg, bit); + break; + case 3: + ret = fdc37c93x_do_read_alt(dev, 2, reg, bit); + break; + } + break; + case 7: + switch (gp_func) { + case 0: + ret = fdc37c93x_do_read_alt(dev, 0, reg, bit); + break; + case 1: + ret = fdc37c93x_do_read_gp((fdc37c93x_t *) dev, reg, bit); + break; + case 2: + ret = fdc37c93x_do_read_alt(dev, 1, reg, bit); + break; + } + break; + } + break; + case 5: + gp_func = (gp_func_reg >> 3) & 0x03; + switch (bit) { + default: + break; + case 0: case 3: case 4: + switch (gp_func) { + case 0: + ret = fdc37c93x_do_read_alt(dev, 0, reg, bit); + break; + case 1: + ret = fdc37c93x_do_read_gp((fdc37c93x_t *) dev, reg, bit); + break; + } + break; + case 1: + switch (gp_func) { + case 0: + ret = fdc37c93x_do_read_alt(dev, 0, reg, bit); + break; + case 1: + ret = fdc37c93x_do_read_gp((fdc37c93x_t *) dev, reg, bit); + break; + } + break; + } + break; + case 6: + gp_func = (gp_func_reg >> 3) & 0x03; + switch (bit) { + default: + switch (gp_func) { + case 0: + ret = fdc37c93x_do_read_alt(dev, 0, reg, bit); + break; + case 1: + ret = fdc37c93x_do_read_gp((fdc37c93x_t *) dev, reg, bit); + break; + case 2: + ret = kbc_at_read_p(dev->kbc, 1, 1 << bit); + break; + } + break; + case 0: + switch (gp_func) { + case 0: + ret = fdc37c93x_do_read_alt(dev, 0, reg, bit); + break; + case 1: + ret = fdc37c93x_do_read_gp((fdc37c93x_t *) dev, reg, bit); + break; + case 2: + /* TODO: Write to power LED if it's ever implemented. */ + ret = fdc37c93x_do_read_alt(dev, 1, reg, bit); + break; + } + break; + case 1: + switch (gp_func) { + case 0: + ret = fdc37c93x_do_read_alt(dev, 0, reg, bit); + break; + case 1: + ret = fdc37c93x_do_read_gp((fdc37c93x_t *) dev, reg, bit); + break; + case 2: + ret = fdc37c93x_do_read_alt(dev, 1, reg, bit); + break; + } + break; + } + break; + case 7: + gp_func = (gp_func_reg >> 3) & 0x03; + switch (bit) { + default: + switch (gp_func) { + case 0: + ret = fdc37c93x_do_read_alt(dev, 0, reg, bit); + break; + case 1: + ret = fdc37c93x_do_read_gp((fdc37c93x_t *) dev, reg, bit); + break; + } + break; + } + break; + } + + if (gp_func_reg & 0x02) + ret ^= (1 << bit); + + return ret; +} + +static __inline void +fdc37c93x_do_write_gp(fdc37c93x_t *dev, int reg, int bit, int set) +{ + dev->gpio_regs[reg] = (dev->gpio_regs[reg] & ~(1 << bit)) | + (set << bit); +} + +static __inline void +fdc37c93x_do_write_alt(fdc37c93x_t *dev, int alt, int reg, int bit, int set) +{ + dev->alt_regs[alt][reg] = (dev->alt_regs[alt][reg] & ~(1 << bit)) | + (set << bit); +} + +static void +fdc37c93x_write_gp(fdc37c93x_t *dev, int reg, int bit, int set) +{ + uint8_t gp_func_reg = dev->ld_regs[0x08][gp_func_regs[reg][bit]]; + uint8_t gp_func; + + if (gp_func_reg & 0x02) + set = !set; + + if (!(gp_func_reg & 0x01)) switch (reg) { + default: + /* Do nothing, this GP does not exist. */ + break; + case 1: + switch (bit) { + default: + gp_func = (gp_func_reg >> 3) & 0x01; + if (gp_func == 0x00) + fdc37c93x_do_write_gp(dev, reg, bit, set); + else + fdc37c93x_do_write_alt(dev, 0, reg, bit, set); + break; + case 1: + gp_func = (gp_func_reg >> 3) & 0x03; + if (!(gp_func & 0x01)) { + if (gp_func & 0x02) { + set ? picint(1 << 13) : picintc(1 << 13); + fdc37c93x_do_write_alt(dev, 0, reg, bit, set); + } else + fdc37c93x_do_write_gp(dev, reg, bit, set); + } + break; + case 3: + gp_func = (gp_func_reg >> 3) & 0x01; + if (gp_func == 0x01) + /* TODO: Write to power LED if it's ever implemented. */ + fdc37c93x_do_write_alt(dev, 0, reg, bit, set); + else + fdc37c93x_do_write_gp(dev, reg, bit, set); + break; + case 6: + gp_func = (gp_func_reg >> 3) & 0x03; + switch (gp_func) { + case 0: + fdc37c93x_do_write_gp(dev, reg, bit, set); + break; + case 1 ... 3: + fdc37c93x_do_write_alt(dev, gp_func - 1, reg, bit, set); + break; + } + break; + } + break; + case 2: + switch (bit) { + default: + gp_func = (gp_func_reg >> 3) & 0x01; + if (gp_func == 0x00) + fdc37c93x_do_write_gp(dev, reg, bit, set); + else + fdc37c93x_do_write_alt(dev, 0, reg, bit, set); + break; + case 0: + gp_func = (gp_func_reg >> 3) & 0x03; + switch (gp_func) { + case 0: + fdc37c93x_do_write_gp(dev, reg, bit, set); + break; + case 1: + fdc37c93x_do_write_alt(dev, 0, reg, bit, set); + break; + case 2: + kbc_at_write_p(dev->kbc, 2, 0xfe, set); + break; + } + break; + case 1: case 2: + gp_func = (gp_func_reg >> 3) & 0x03; + switch (gp_func) { + case 0: + fdc37c93x_do_write_gp(dev, reg, bit, set); + break; + case 1: case 2: + fdc37c93x_do_write_alt(dev, gp_func - 1, reg, bit, set); + break; + } + break; + case 5: + gp_func = (gp_func_reg >> 3) & 0x01; + if (gp_func == 0x00) + fdc37c93x_do_write_gp(dev, reg, bit, set); + else + kbc_at_write_p(dev->kbc, 2, 0xfd, set << 1); + break; + case 6: case 7: + /* Do nothing, these bits do not exist. */ + break; + } + break; + case 4: + gp_func = (gp_func_reg >> 3) & 0x03; + switch (bit) { + default: + switch (gp_func) { + case 0: + fdc37c93x_do_write_alt(dev, 0, reg, bit, set); + break; + case 1: + fdc37c93x_do_write_gp(dev, reg, bit, set); + break; + } + break; + case 0: case 1: + switch (gp_func) { + case 0: + fdc_set_media_id(dev->fdc, bit ^ 1, set); + break; + case 1: + fdc37c93x_do_write_gp(dev, reg, bit, set); + break; + } + break; + case 6: + switch (gp_func) { + case 0: + fdc37c93x_do_write_alt(dev, 0, reg, bit, set); + break; + case 1: + fdc37c93x_do_write_gp(dev, reg, bit, set); + break; + case 2: + /* TODO: Write to power LED if it's ever implemented. */ + fdc37c93x_do_write_alt(dev, 1, reg, bit, set); + break; + case 3: + fdc37c93x_do_write_alt(dev, 2, reg, bit, set); + break; + } + break; + case 7: + switch (gp_func) { + case 0: + fdc37c93x_do_write_alt(dev, 0, reg, bit, set); + break; + case 1: + fdc37c93x_do_write_gp(dev, reg, bit, set); + break; + case 2: + fdc37c93x_do_write_alt(dev, 1, reg, bit, set); + if (!set) + smi_raise(); + break; + } + break; + } + break; + case 5: + gp_func = (gp_func_reg >> 3) & 0x03; + switch (bit) { + default: + break; + case 0: case 3: case 4: + switch (gp_func) { + case 0: + fdc37c93x_do_write_alt(dev, 0, reg, bit, set); + break; + case 1: + fdc37c93x_do_write_gp(dev, reg, bit, set); + break; + } + break; + case 1: + switch (gp_func) { + case 0: + fdc37c93x_do_write_alt(dev, 0, reg, bit, set); + if (set) + plat_power_off(); + break; + case 1: + fdc37c93x_do_write_gp(dev, reg, bit, set); + break; + } + break; + } + break; + case 6: + gp_func = (gp_func_reg >> 3) & 0x03; + switch (bit) { + default: + switch (gp_func) { + case 0: + fdc37c93x_do_write_alt(dev, 0, reg, bit, set); + break; + case 1: + fdc37c93x_do_write_gp(dev, reg, bit, set); + break; + case 2: + kbc_at_write_p(dev->kbc, 1, ~(1 << bit), set << bit); + break; + } + break; + case 0: + switch (gp_func) { + case 0: + fdc37c93x_do_write_alt(dev, 0, reg, bit, set); + break; + case 1: + fdc37c93x_do_write_gp(dev, reg, bit, set); + break; + case 2: + /* TODO: Write to power LED if it's ever implemented. */ + fdc37c93x_do_write_alt(dev, 1, reg, bit, set); + break; + } + break; + case 1: + switch (gp_func) { + case 0: + fdc37c93x_do_write_alt(dev, 0, reg, bit, set); + break; + case 1: + fdc37c93x_do_write_gp(dev, reg, bit, set); + break; + case 2: + fdc37c93x_do_write_alt(dev, 1, reg, bit, set); + break; + } + break; + } + break; + case 7: + gp_func = (gp_func_reg >> 3) & 0x03; + switch (bit) { + default: + switch (gp_func) { + case 0: + fdc37c93x_do_write_alt(dev, 0, reg, bit, set); + break; + case 1: + fdc37c93x_do_write_gp(dev, reg, bit, set); + break; + } + break; + } + break; + } +} + static uint8_t fdc37c93x_gpio_read(uint16_t port, void *priv) { const fdc37c93x_t *dev = (fdc37c93x_t *) priv; uint8_t ret = 0xff; - if (strcmp(machine_get_internal_name(), "vectra54")) - ret = dev->gpio_regs[port & 1]; + if (dev->locked) { + if (dev->is_compaq) + ret = fdc37c93x_read(port & 0x0001, priv); + } else if (port & 0x0001) switch (dev->gpio_reg) { + case 0x01: case 0x02: + ret = 0x00; + for (uint8_t i = 0; i < 8; i++) + ret |= fdc37c93x_read_gp(dev, dev->gpio_reg, i); + break; + case 0x03: + ret = dev->ld_regs[0x08][0xf4]; + break; + case 0x04 ... 0x07: + if (dev->chip_id >= FDC37C93X_FR) { + ret = 0x00; + for (uint8_t i = 0; i < 8; i++) + ret |= fdc37c93x_read_gp(dev, dev->gpio_reg, i); + } + break; + case 0x08 ... 0x0f: + if (dev->chip_id >= FDC37C93X_FR) + ret = dev->ld_regs[0x08][0xb0 + dev->gpio_reg - 0x08]; + break; + } else + ret = dev->gpio_reg; return ret; } @@ -139,8 +706,52 @@ fdc37c93x_gpio_write(uint16_t port, uint8_t val, void *priv) { fdc37c93x_t *dev = (fdc37c93x_t *) priv; - if (!(port & 1)) - dev->gpio_regs[0] = (dev->gpio_regs[0] & 0xfc) | (val & 0x03); + if (dev->locked) { + if (dev->is_compaq) + fdc37c93x_write(port & 0x0001, val, priv); + } else if (port & 0x0001) switch (dev->gpio_reg) { + case 0x01: case 0x02: + for (uint8_t i = 0; i < 8; i++) + fdc37c93x_write_gp(dev, dev->gpio_reg, i, val & (1 << i)); + break; + case 0x03: + if (dev->chip_id >= FDC37C93X_FR) + dev->ld_regs[0x08][0xf4] = val & 0xef; + else + dev->ld_regs[0x08][0xf4] = val & 0x0f; + break; + case 0x04 ... 0x07: + if (dev->chip_id >= FDC37C93X_FR) + for (uint8_t i = 0; i < 8; i++) + fdc37c93x_write_gp(dev, dev->gpio_reg, i, val & (1 << i)); + break; + case 0x08: case 0x0a: + case 0x0c: case 0x0e: + if (dev->chip_id >= FDC37C93X_FR) + dev->ld_regs[0x08][0xb0 + dev->gpio_reg - 0x08] = val; + break; + case 0x09: + if (dev->chip_id >= FDC37C93X_FR) + dev->ld_regs[0x08][0xb0 + dev->gpio_reg - 0x08] = val & 0xd3; + break; + case 0x0b: + if (dev->chip_id >= FDC37C93X_FR) + dev->ld_regs[0x08][0xb0 + dev->gpio_reg - 0x08] = val & 0x17; + break; + case 0x0d: + if (dev->chip_id == FDC37C93X_APM) + dev->ld_regs[0x08][0xb0 + dev->gpio_reg - 0x08] = val; + else if (dev->chip_id == FDC37C93X_FR) + dev->ld_regs[0x08][0xb0 + dev->gpio_reg - 0x08] = val & 0xbf; + break; + case 0x0f: + if (dev->chip_id == FDC37C93X_APM) + dev->ld_regs[0x08][0xb0 + dev->gpio_reg - 0x08] = val & 0x7f; + else if (dev->chip_id == FDC37C93X_FR) + dev->ld_regs[0x08][0xb0 + dev->gpio_reg - 0x08] = val & 0x3f; + break; + } else + dev->gpio_reg = val; } static void @@ -226,7 +837,14 @@ fdc37c93x_serial_handler(fdc37c93x_t *dev, const int uart) serial_setup(dev->uart[uart], dev->uart_base[uart], dev->ld_regs[uart_no][0x70]); } - serial_irq(dev->uart[uart], dev->ld_regs[uart_no][0x70]); + /* + TODO: If UART 2's own IRQ pin is also enabled when shared, + it should also be asserted. + */ + if ((dev->chip_id >= FDC37C93X_FR) && (dev->ld_regs[4][0xf0] & 0x80)) + serial_irq(dev->uart[uart], dev->ld_regs[4][0x70]); + else + serial_irq(dev->uart[uart], dev->ld_regs[uart_no][0x70]); } static void @@ -304,7 +922,8 @@ fdc37c93x_auxio_handler(fdc37c93x_t *dev) static void fdc37c93x_gpio_handler(fdc37c93x_t *dev) { - const uint8_t local_enable = !dev->locked && !!(dev->regs[0x03] & 0x80); + const uint8_t local_enable = !!(dev->regs[0x03] & 0x80) || + (dev->is_compaq && dev->locked); const uint16_t old_base = dev->gpio_base; dev->gpio_base = 0x0000; @@ -383,23 +1002,15 @@ static void fdc37c93x_write(uint16_t port, uint8_t val, void *priv) { fdc37c93x_t *dev = (fdc37c93x_t *) priv; - uint8_t index = (port & 1) ? 0 : 1; + uint8_t index = !(port & 1); uint8_t valxor; - /* Compaq Presario 4500: Unlock at FB, Register at EA, Data at EB, Lock at F9. */ - if (port == 0xea) - index = 1; - else if (port == 0xeb) - index = 0; - - if (port == 0xfb) { + if (port == 0x00fb) { fdc37c93x_state_change(dev, 1); dev->tries = 0; - return; - } else if (port == 0xf9) { + } else if (port == 0x00f9) fdc37c93x_state_change(dev, 0); - return; - } else if (index) { + else if (index) { if ((!dev->is_compaq) && (val == 0x55) && !dev->locked) { if (dev->tries) { fdc37c93x_state_change(dev, 1); @@ -407,338 +1018,480 @@ fdc37c93x_write(uint16_t port, uint8_t val, void *priv) } else dev->tries++; } else if (dev->locked) { - if ((!dev->is_compaq) && (val == 0xaa)) { + if ((!dev->is_compaq) && (val == 0xaa)) fdc37c93x_state_change(dev, 0); - return; - } - dev->cur_reg = val; + else + dev->cur_reg = val; } else if ((!dev->is_compaq) && dev->tries) dev->tries = 0; - return; - } else { - if (dev->locked) { - if (dev->cur_reg < 48) { - valxor = val ^ dev->regs[dev->cur_reg]; - if ((val == 0x20) || (val == 0x21)) - return; - dev->regs[dev->cur_reg] = val; - } else { - uint8_t keep = 0x00; + } else if (dev->locked) { + if (dev->cur_reg < 0x30) { + valxor = val ^ dev->regs[dev->cur_reg]; - valxor = val ^ dev->ld_regs[dev->regs[7]][dev->cur_reg]; - if (((dev->cur_reg & 0xF0) == 0x70) && (dev->regs[7] < 4)) - return; - /* Block writes to some logical devices. */ - if (dev->regs[7] > 0x0a) - return; - else - switch (dev->regs[7]) { - // case 0x01: - // case 0x02: - // return; - case 0x06: - if (!dev->has_nvr) - return; - /* Bits 0 to 3 of logical device 6 (RTC) register F0h must stay set - once they are set. */ - else if (dev->cur_reg == 0xf0) - keep = dev->ld_regs[dev->regs[7]][dev->cur_reg] & 0x0f; - break; - case 0x09: - /* If we're on the FDC37C935, return as this is not a valid - logical device there. */ - if (!dev->is_apm && (dev->chip_id == 0x02)) - return; - break; - case 0x0a: - /* If we're not on the FDC37C931APM, return as this is not a - valid logical device there. */ - if (!dev->is_apm) - return; - break; - - default: - break; - } - dev->ld_regs[dev->regs[7]][dev->cur_reg] = val | keep; - } - } else - return; - } - - if (dev->cur_reg < 48) { - switch (dev->cur_reg) { - case 0x02: - if (val == 0x02) - fdc37c93x_state_change(dev, 0); - break; - case 0x03: - dev->regs[0x03] &= 0x83; - break; - case 0x22: - if (valxor & 0x01) - fdc37c93x_fdc_handler(dev); - if (valxor & 0x08) - fdc37c93x_lpt_handler(dev); - if (valxor & 0x10) - fdc37c93x_serial_handler(dev, 0); - if (valxor & 0x20) - fdc37c93x_serial_handler(dev, 1); - if ((valxor & 0x40) && (dev->chip_id != 0x02)) - fdc37c93x_access_bus_handler(dev); - break; - - case 0x27: - if (dev->chip_id != 0x02) - fdc37c93x_superio_handler(dev); - break; - - default: - break; - } - - return; - } - - switch (dev->regs[7]) { - case 0: - /* FDD */ switch (dev->cur_reg) { - case 0x30: - case 0x60: - case 0x61: - if ((dev->cur_reg == 0x30) && (val & 0x01)) - dev->regs[0x22] |= 0x01; - if (valxor) - fdc37c93x_fdc_handler(dev); + case 0x02: + dev->regs[dev->cur_reg] = val; + if (val == 0x02) + fdc37c93x_state_change(dev, 0); break; - case 0xF0: + case 0x03: + dev->regs[dev->cur_reg] = val & 0x83; + break; + case 0x07: case 0x26: + case 0x2e ... 0x2f: + dev->regs[dev->cur_reg] = val; + break; + case 0x22: + if (dev->chip_id >= FDC37C93X_FR) + dev->regs[dev->cur_reg] = val & 0x7f; + else + dev->regs[dev->cur_reg] = val & 0x6f; + if (valxor & 0x01) - fdc_update_enh_mode(dev->fdc, val & 0x01); - if (valxor & 0x10) - fdc_set_swap(dev->fdc, (val & 0x10) >> 4); - break; - case 0xF1: - if (valxor & 0xC) - fdc_update_densel_force(dev->fdc, (val & 0xc) >> 2); - break; - case 0xF2: - if (valxor & 0xC0) - fdc_update_rwc(dev->fdc, 3, (val & 0xc0) >> 6); - if (valxor & 0x30) - fdc_update_rwc(dev->fdc, 2, (val & 0x30) >> 4); - if (valxor & 0x0C) - fdc_update_rwc(dev->fdc, 1, (val & 0x0c) >> 2); - if (valxor & 0x03) - fdc_update_rwc(dev->fdc, 0, (val & 0x03)); - break; - case 0xF4: - if (valxor & 0x18) - fdc_update_drvrate(dev->fdc, 0, (val & 0x18) >> 3); - break; - case 0xF5: - if (valxor & 0x18) - fdc_update_drvrate(dev->fdc, 1, (val & 0x18) >> 3); - break; - case 0xF6: - if (valxor & 0x18) - fdc_update_drvrate(dev->fdc, 2, (val & 0x18) >> 3); - break; - case 0xF7: - if (valxor & 0x18) - fdc_update_drvrate(dev->fdc, 3, (val & 0x18) >> 3); - break; - - default: - break; - } - break; - case 3: - /* Parallel port */ - switch (dev->cur_reg) { - case 0x30: - case 0x60: - case 0x61: - case 0x70: - if ((dev->cur_reg == 0x30) && (val & 0x01)) - dev->regs[0x22] |= 0x08; - if (valxor) + fdc37c93x_fdc_handler(dev); + if (valxor & 0x08) fdc37c93x_lpt_handler(dev); - break; - - default: - break; - } - break; - case 4: - /* Serial port 1 */ - switch (dev->cur_reg) { - case 0x30: - case 0x60: - case 0x61: - case 0x70: - if ((dev->cur_reg == 0x30) && (val & 0x01)) - dev->regs[0x22] |= 0x10; - if (valxor) + if (valxor & 0x10) fdc37c93x_serial_handler(dev, 0); - break; - - default: - break; - } - break; - case 5: - /* Serial port 2 */ - switch (dev->cur_reg) { - case 0x30: - case 0x60: - case 0x61: - case 0x70: - if ((dev->cur_reg == 0x30) && (val & 0x01)) - dev->regs[0x22] |= 0x20; - if (valxor) + if (valxor & 0x20) fdc37c93x_serial_handler(dev, 1); - break; - - default: - break; - } - break; - case 6: - /* RTC/NVR */ - if (!dev->has_nvr) - return; - switch (dev->cur_reg) { - case 0x30: - if (valxor) { - fdc37c93x_nvr_pri_handler(dev); - if (dev->chip_id != 0x02) - fdc37c93x_nvr_sec_handler(dev); - } - break; - case 0x62: - case 0x63: - if ((dev->chip_id != 0x02) && valxor) - fdc37c93x_nvr_sec_handler(dev); - break; - case 0xf0: - if (valxor) { - nvr_lock_set(0x80, 0x20, !!(dev->ld_regs[6][dev->cur_reg] & 0x01), dev->nvr); - nvr_lock_set(0xa0, 0x20, !!(dev->ld_regs[6][dev->cur_reg] & 0x02), dev->nvr); - nvr_lock_set(0xc0, 0x20, !!(dev->ld_regs[6][dev->cur_reg] & 0x04), dev->nvr); - nvr_lock_set(0xe0, 0x20, !!(dev->ld_regs[6][dev->cur_reg] & 0x08), dev->nvr); - if ((dev->chip_id == 0x02) && (dev->ld_regs[6][dev->cur_reg] & 0x80)) - nvr_bank_set(0, 1, dev->nvr); - else if ((dev->chip_id != 0x02) && (dev->ld_regs[6][dev->cur_reg] & 0x80)) - switch ((dev->ld_regs[6][dev->cur_reg] >> 4) & 0x07) { - default: - case 0x00: - nvr_bank_set(0, 0xff, dev->nvr); - nvr_bank_set(1, 1, dev->nvr); - break; - case 0x01: - nvr_bank_set(0, 0, dev->nvr); - nvr_bank_set(1, 1, dev->nvr); - break; - case 0x02: - case 0x04: - nvr_bank_set(0, 0xff, dev->nvr); - nvr_bank_set(1, 0xff, dev->nvr); - break; - case 0x03: - case 0x05: - nvr_bank_set(0, 0, dev->nvr); - nvr_bank_set(1, 0xff, dev->nvr); - break; - case 0x06: - nvr_bank_set(0, 0xff, dev->nvr); - nvr_bank_set(1, 2, dev->nvr); - break; - case 0x07: - nvr_bank_set(0, 0, dev->nvr); - nvr_bank_set(1, 2, dev->nvr); - break; - } - else { - nvr_bank_set(0, 0, dev->nvr); - if (dev->chip_id != 0x02) - nvr_bank_set(1, 0xff, dev->nvr); - } - - fdc37c93x_nvr_pri_handler(dev); - if (dev->chip_id != 0x02) - fdc37c93x_nvr_sec_handler(dev); - } - break; - - default: - break; - } - break; - case 7: - /* Keyboard */ - switch (dev->cur_reg) { - case 0x30: - if (valxor) - fdc37c93x_kbc_handler(dev); - break; - - default: - break; - } - break; - case 8: - /* Auxiliary I/O */ - switch (dev->cur_reg) { - case 0x30: - case 0x60: - case 0x61: - case 0x70: - if (valxor) - fdc37c93x_auxio_handler(dev); - break; - - default: - break; - } - break; - case 9: - /* Access bus (FDC37C932FR and FDC37C931APM only) */ - switch (dev->cur_reg) { - case 0x30: - case 0x60: - case 0x61: - case 0x70: - if ((dev->cur_reg == 0x30) && (val & 0x01)) - dev->regs[0x22] |= 0x40; - if (valxor) + if ((dev->chip_id >= FDC37C93X_FR) && (valxor & 0x40)) fdc37c93x_access_bus_handler(dev); break; + case 0x23: + if (dev->chip_id >= FDC37C93X_FR) + dev->regs[dev->cur_reg] = val & 0x7f; + else + dev->regs[dev->cur_reg] = val & 0x6f; + break; + case 0x24: + if (dev->chip_id >= FDC37C93X_FR) + dev->regs[dev->cur_reg] = val & 0xcf; + else + dev->regs[dev->cur_reg] = val & 0xcc; + + if ((dev->chip_id >= FDC37C93X_FR) && (valxor & 0x01)) { + serial_set_clock_src(dev->uart[0], (val & 0x01) ? + 48000000.0 : 24000000.0); + serial_set_clock_src(dev->uart[1], (val & 0x01) ? + 48000000.0 : 24000000.0); + } + break; + case 0x27: + if (dev->chip_id >= FDC37C93X_FR) { + dev->regs[dev->cur_reg] = val; + + fdc37c93x_superio_handler(dev); + } + break; + case 0x28: + if (dev->chip_id >= FDC37C93X_FR) + dev->regs[dev->cur_reg] = val & 0x1f; + break; default: break; } - break; - case 10: - /* Access bus (FDC37C931APM only) */ - switch (dev->cur_reg) { - case 0x30: - case 0x60: - case 0x61: - case 0x62: - case 0x63: - case 0x70: - if (valxor) - fdc37c93x_acpi_handler(dev); - break; + } else { + valxor = val ^ dev->ld_regs[dev->regs[7]][dev->cur_reg]; - default: + if ((dev->regs[7] <= dev->max_ld) && ((dev->regs[7] != 0x08) || + (dev->cur_reg < 0xb0) || (dev->cur_reg > 0xdf) || + (dev->chip_id >= FDC37C93X_FR))) switch (dev->regs[7]) { + case 0x00: /* FDD */ + switch (dev->cur_reg) { + case 0x30: + case 0x60: case 0x61: + case 0x70: + case 0x74: + dev->ld_regs[dev->regs[7]][dev->cur_reg] = val; + + if ((dev->cur_reg == 0x30) && (val & 0x01)) + dev->regs[0x22] |= 0x01; + if (valxor) + fdc37c93x_fdc_handler(dev); + break; + case 0xf0: + dev->ld_regs[dev->regs[7]][dev->cur_reg] = val & 0x1f; + + if (valxor & 0x01) + fdc_update_enh_mode(dev->fdc, val & 0x01); + if (valxor & 0x10) + fdc_set_swap(dev->fdc, (val & 0x10) >> 4); + break; + case 0xf1: + dev->ld_regs[dev->regs[7]][dev->cur_reg] = val & 0xfc; + + if (valxor & 0x0c) + fdc_update_densel_force(dev->fdc, (val & 0xc) >> 2); + break; + case 0xf2: + dev->ld_regs[dev->regs[7]][dev->cur_reg] = val; + + if (valxor & 0xc0) + fdc_update_rwc(dev->fdc, 3, (val & 0xc0) >> 6); + if (valxor & 0x30) + fdc_update_rwc(dev->fdc, 2, (val & 0x30) >> 4); + if (valxor & 0x0c) + fdc_update_rwc(dev->fdc, 1, (val & 0x0c) >> 2); + if (valxor & 0x03) + fdc_update_rwc(dev->fdc, 0, (val & 0x03)); + break; + case 0xf4 ... 0xf7: + dev->ld_regs[dev->regs[7]][dev->cur_reg] = val & 0x5b; + + if (valxor & 0x18) + fdc_update_drvrate(dev->fdc, dev->cur_reg - 0xf4, + (val & 0x18) >> 3); + break; + } + break; + case 0x01: /* IDE1 */ + switch (dev->cur_reg) { + case 0x30: + case 0x60: case 0x61: + case 0x62: case 0x63: + case 0x70: + dev->ld_regs[dev->regs[7]][dev->cur_reg] = val; + + if ((dev->cur_reg == 0x30) && (val & 0x01)) + dev->regs[0x22] |= 0x02; + break; + case 0xf0: case 0xf1: + if (dev->chip_id >= FDC37C93X_FR) + dev->ld_regs[dev->regs[7]][dev->cur_reg] = val & 0x1f; + else if (dev->cur_reg == 0xf0) + dev->ld_regs[dev->regs[7]][dev->cur_reg] = val; + break; + } + break; + case 0x02: /* IDE2 */ + switch (dev->cur_reg) { + case 0x30: + case 0x60: case 0x61: + case 0x62: case 0x63: + case 0x70: + dev->ld_regs[dev->regs[7]][dev->cur_reg] = val; + + if ((dev->cur_reg == 0x30) && (val & 0x01)) + dev->regs[0x22] |= 0x04; + break; + case 0xf0: + dev->ld_regs[dev->regs[7]][dev->cur_reg] = val & 0x01; + break; + } + break; + case 0x03: /* Parallel Port */ + switch (dev->cur_reg) { + case 0x30: + case 0x60: case 0x61: + case 0x70: + case 0x74: + dev->ld_regs[dev->regs[7]][dev->cur_reg] = val; + + if ((dev->cur_reg == 0x30) && (val & 0x01)) + dev->regs[0x22] |= 0x08; + if (valxor) + fdc37c93x_lpt_handler(dev); + break; + case 0xf0: + dev->ld_regs[dev->regs[7]][dev->cur_reg] = val; + break; + case 0xf1: + if (dev->chip_id >= FDC37C93X_FR) + dev->ld_regs[dev->regs[7]][dev->cur_reg] = val & 0x03; + break; + } + break; + case 0x04: /* Serial port 1 */ + switch (dev->cur_reg) { + case 0x30: + case 0x60: case 0x61: + case 0x70: + dev->ld_regs[dev->regs[7]][dev->cur_reg] = val; + + if ((dev->cur_reg == 0x30) && (val & 0x01)) + dev->regs[0x22] |= 0x10; + if (valxor) + fdc37c93x_serial_handler(dev, 0); + break; + /* TODO: Bit 0 = MIDI Mode, Bit 1 = High speed. */ + case 0xf0: + if (dev->chip_id >= FDC37C93X_FR) { + dev->ld_regs[dev->regs[7]][dev->cur_reg] = val & 0x83; + } else + dev->ld_regs[dev->regs[7]][dev->cur_reg] = val & 0x03; + + if (valxor & 0x83) { + fdc37c93x_serial_handler(dev, 0); + fdc37c93x_serial_handler(dev, 1); + } + break; + } + break; + case 0x05: /* Serial port 2 */ + switch (dev->cur_reg) { + case 0x30: + case 0x60: case 0x61: + case 0x62: case 0x63: + case 0x70: + case 0x74: + if (((dev->cur_reg != 0x62) && (dev->cur_reg != 0x63)) || + (dev->chip_id == FDC37C93X_FR)) { + dev->ld_regs[dev->regs[7]][dev->cur_reg] = val; + + if ((dev->cur_reg == 0x30) && (val & 0x01)) + dev->regs[0x22] |= 0x20; + if (valxor) + fdc37c93x_serial_handler(dev, 1); + } + break; + /* TODO: Bit 0 = MIDI Mode, Bit 1 = High speed. */ + case 0xf0: + dev->ld_regs[dev->regs[7]][dev->cur_reg] = val & 0x03; + + if (valxor & 0x03) { + fdc37c93x_serial_handler(dev, 0); + fdc37c93x_serial_handler(dev, 1); + } + break; + case 0xf1: + dev->ld_regs[dev->regs[7]][dev->cur_reg] = val & 0x7f; + break; + case 0xf2: + if (dev->chip_id >= FDC37C93X_FR) + dev->ld_regs[dev->regs[7]][dev->cur_reg] = val; + break; + } + break; + case 0x06: /* RTC */ + switch (dev->cur_reg) { + case 0x30: + // case 0x60: case 0x61: + case 0x62: case 0x63: + case 0x70: + if (((dev->cur_reg != 0x62) && (dev->cur_reg != 0x63)) || + (dev->chip_id >= FDC37C93X_FR)) { + dev->ld_regs[dev->regs[7]][dev->cur_reg] = val; + + if (valxor) { + fdc37c93x_nvr_pri_handler(dev); + + if (dev->chip_id >= FDC37C93X_FR) + fdc37c93x_nvr_sec_handler(dev); + } + } + break; + case 0xf0: + if (dev->chip_id >= FDC37C93X_FR) + dev->ld_regs[dev->regs[7]][dev->cur_reg] = val; + else + dev->ld_regs[dev->regs[7]][dev->cur_reg] = val & 0x8f; + + if (valxor) { + nvr_lock_set(0x80, 0x20, !!(dev->ld_regs[6][dev->cur_reg] & 0x01), dev->nvr); + nvr_lock_set(0xa0, 0x20, !!(dev->ld_regs[6][dev->cur_reg] & 0x02), dev->nvr); + nvr_lock_set(0xc0, 0x20, !!(dev->ld_regs[6][dev->cur_reg] & 0x04), dev->nvr); + nvr_lock_set(0xe0, 0x20, !!(dev->ld_regs[6][dev->cur_reg] & 0x08), dev->nvr); + if (dev->ld_regs[6][dev->cur_reg] & 0x80) { + if (dev->chip_id == FDC37C93X_NORMAL) + nvr_bank_set(0, 1, dev->nvr); + else switch ((dev->ld_regs[6][dev->cur_reg] >> 4) & 0x07) { + case 0x00: + default: + nvr_bank_set(0, 0xff, dev->nvr); + nvr_bank_set(1, 1, dev->nvr); + break; + case 0x01: + nvr_bank_set(0, 0, dev->nvr); + nvr_bank_set(1, 1, dev->nvr); + break; + case 0x02: case 0x04: + nvr_bank_set(0, 0xff, dev->nvr); + nvr_bank_set(1, 0xff, dev->nvr); + break; + case 0x03: case 0x05: + nvr_bank_set(0, 0, dev->nvr); + nvr_bank_set(1, 0xff, dev->nvr); + break; + case 0x06: + nvr_bank_set(0, 0xff, dev->nvr); + nvr_bank_set(1, 2, dev->nvr); + break; + case 0x07: + nvr_bank_set(0, 0, dev->nvr); + nvr_bank_set(1, 2, dev->nvr); + break; + } + } else { + nvr_bank_set(0, 0, dev->nvr); + if (dev->chip_id >= FDC37C93X_FR) + nvr_bank_set(1, 0xff, dev->nvr); + } + + fdc37c93x_nvr_pri_handler(dev); + if (dev->chip_id >= FDC37C93X_FR) + fdc37c93x_nvr_sec_handler(dev); + } + break; + case 0xf1: + dev->ld_regs[dev->regs[7]][dev->cur_reg] = val & 0x1f; + break; + case 0xf2: case 0xf3: + dev->ld_regs[dev->regs[7]][dev->cur_reg] = val; + break; + case 0xf4: + dev->ld_regs[dev->regs[7]][dev->cur_reg] = val & 0x83; + break; + } + break; + case 0x07: /* Keyboard */ + switch (dev->cur_reg) { + case 0x30: + case 0x70: case 0x71: + dev->ld_regs[dev->regs[7]][dev->cur_reg] = val; + + if (valxor) + fdc37c93x_kbc_handler(dev); + break; + case 0xf0: + dev->ld_regs[dev->regs[7]][dev->cur_reg] = val & 0x87; + break; + } + break; + case 0x08: /* Aux. I/O */ + switch (dev->cur_reg) { + case 0x30: + case 0x60: case 0x61: + case 0x62: case 0x63: + case 0x70: + dev->ld_regs[dev->regs[7]][dev->cur_reg] = val; + + if (valxor) + fdc37c93x_auxio_handler(dev); + break; + case 0xb0: case 0xb2: + case 0xb4: case 0xb6: + case 0xe0: case 0xe1: + case 0xe9: case 0xf2: + case 0xf3: + case 0xc0 ... 0xc9: + case 0xcb ... 0xcc: + case 0xd0 ... 0xdf: + dev->ld_regs[dev->regs[7]][dev->cur_reg] = val; + break; + case 0xb1: + dev->ld_regs[dev->regs[7]][dev->cur_reg] = val & 0xd3; + break; + case 0xb3: + dev->ld_regs[dev->regs[7]][dev->cur_reg] = val & 0x17; + break; + case 0xb5: + if (dev->chip_id == FDC37C93X_APM) + dev->ld_regs[dev->regs[7]][dev->cur_reg] = val; + else + dev->ld_regs[dev->regs[7]][dev->cur_reg] = val & 0xbf; + break; + case 0xb7: + if (dev->chip_id == FDC37C93X_APM) + dev->ld_regs[dev->regs[7]][dev->cur_reg] = val & 0x7f; + else + dev->ld_regs[dev->regs[7]][dev->cur_reg] = val & 0x3f; + break; + case 0xb8: + dev->ld_regs[dev->regs[7]][dev->cur_reg] = val & 0x3f; + break; + case 0x18: + dev->ld_regs[dev->regs[7]][dev->cur_reg] = val & 0x18; + break; + case 0xe2 ... 0xe5: + case 0xe7: + case 0xeb ... 0xed: + dev->ld_regs[dev->regs[7]][dev->cur_reg] = val & 0x0f; + break; + case 0xe6: case 0xe8: + dev->ld_regs[dev->regs[7]][dev->cur_reg] = val & 0x1f; + break; + case 0xea: + dev->ld_regs[dev->regs[7]][dev->cur_reg] = val & 0x9f; + break; + case 0xef: + if (dev->chip_id >= FDC37C93X_FR) + dev->ld_regs[dev->regs[7]][dev->cur_reg] = val & 0xf8; + break; + case 0xf1: + if (dev->chip_id >= FDC37C93X_FR) + dev->ld_regs[dev->regs[7]][dev->cur_reg] = val & 0x83; + else + dev->ld_regs[dev->regs[7]][dev->cur_reg] = val & 0x03; + break; + case 0xf4: + if (dev->chip_id >= FDC37C93X_FR) + dev->ld_regs[dev->regs[7]][dev->cur_reg] = val & 0xef; + else + dev->ld_regs[dev->regs[7]][dev->cur_reg] = val & 0x0f; + break; + case 0xf6: + if (dev->chip_id >= FDC37C93X_FR) + for (uint8_t i = 0; i < 8; i++) + fdc37c93x_write_gp(dev, 1, i, val & (1 << i)); + break; + case 0xf7: + if (dev->chip_id >= FDC37C93X_FR) + for (uint8_t i = 0; i < 8; i++) + fdc37c93x_write_gp(dev, 2, i, val & (1 << i)); + break; + case 0xf8: + if (dev->chip_id >= FDC37C93X_FR) + for (uint8_t i = 0; i < 8; i++) + fdc37c93x_write_gp(dev, 4, i, val & (1 << i)); + break; + case 0xf9: + if (dev->chip_id >= FDC37C93X_FR) + for (uint8_t i = 0; i < 8; i++) + fdc37c93x_write_gp(dev, 5, i, val & (1 << i)); + break; + case 0xfa: + if (dev->chip_id >= FDC37C93X_FR) + for (uint8_t i = 0; i < 8; i++) + fdc37c93x_write_gp(dev, 6, i, val & (1 << i)); + break; + case 0xfb: + if (dev->chip_id >= FDC37C93X_FR) + for (uint8_t i = 0; i < 8; i++) + fdc37c93x_write_gp(dev, 7, i, val & (1 << i)); + break; + } + break; + case 0x09: /* Access.Bus */ + switch (dev->cur_reg) { + case 0x30: + case 0x60: case 0x61: + case 0x70: + dev->ld_regs[dev->regs[7]][dev->cur_reg] = val; + + if ((dev->cur_reg == 0x30) && (val & 0x01)) + dev->regs[0x22] |= 0x40; + if (valxor) + fdc37c93x_access_bus_handler(dev); + break; + } + break; + case 0x0a: /* ACPI */ + switch (dev->cur_reg) { + case 0x30: + case 0x60: case 0x61: + case 0x62: case 0x63: + case 0x70: + dev->ld_regs[dev->regs[7]][dev->cur_reg] = val; + + if (valxor) + fdc37c93x_acpi_handler(dev); + break; + } break; } - break; - - default: - break; + } } } @@ -764,11 +1517,58 @@ fdc37c93x_read(uint16_t port, void *priv) ret = dev->chip_id; else ret = dev->regs[dev->cur_reg]; - } else { - if ((dev->regs[7] == 0) && (dev->cur_reg == 0xF2)) { - ret = (fdc_get_rwc(dev->fdc, 0) | (fdc_get_rwc(dev->fdc, 1) << 2) | (fdc_get_rwc(dev->fdc, 2) << 4) | (fdc_get_rwc(dev->fdc, 3) << 6)); - } else + } else if (dev->regs[7] <= dev->max_ld) { + if ((dev->regs[7] == 0x00) && (dev->cur_reg == 0xf2)) + ret = (fdc_get_rwc(dev->fdc, 0) | (fdc_get_rwc(dev->fdc, 1) << 2) | + (fdc_get_rwc(dev->fdc, 2) << 4) | (fdc_get_rwc(dev->fdc, 3) << 6)); + else if ((dev->regs[7] != 0x06) || (dev->cur_reg != 0xf3)) ret = dev->ld_regs[dev->regs[7]][dev->cur_reg]; + else if ((dev->regs[7] == 0x08) && (dev->cur_reg >= 0xf6) && + (dev->cur_reg <= 0xfb) && + (dev->chip_id >= FDC37C93X_FR)) switch (dev->cur_reg) { + case 0xf6: + if (dev->chip_id >= FDC37C93X_FR) { + ret = 0x00; + for (uint8_t i = 0; i < 8; i++) + ret |= fdc37c93x_read_gp(dev, 1, i); + } + break; + case 0xf7: + if (dev->chip_id >= FDC37C93X_FR) { + ret = 0x00; + for (uint8_t i = 0; i < 8; i++) + ret |= fdc37c93x_read_gp(dev, 2, i); + } + break; + case 0xf8: + if (dev->chip_id >= FDC37C93X_FR) { + ret = 0x00; + for (uint8_t i = 0; i < 8; i++) + ret |= fdc37c93x_read_gp(dev, 4, i); + } + break; + case 0xf9: + if (dev->chip_id >= FDC37C93X_FR) { + ret = 0x00; + for (uint8_t i = 0; i < 8; i++) + ret |= fdc37c93x_read_gp(dev, 5, i); + } + break; + case 0xfa: + if (dev->chip_id >= FDC37C93X_FR) { + ret = 0x00; + for (uint8_t i = 0; i < 8; i++) + ret |= fdc37c93x_read_gp(dev, 6, i); + } + break; + case 0xfb: + if (dev->chip_id >= FDC37C93X_FR) { + ret = 0x00; + for (uint8_t i = 0; i < 8; i++) + ret |= fdc37c93x_read_gp(dev, 7, i); + } + break; + } } } } @@ -786,10 +1586,12 @@ fdc37c93x_reset(fdc37c93x_t *dev) dev->regs[0x21] = 0x01; dev->regs[0x22] = 0x39; dev->regs[0x24] = 0x04; - dev->regs[0x26] = dev->port_370 ? 0x70 : 0xf0; + if (dev->chip_id >= FDC37C93X_FR) + dev->regs[0x26] = dev->port_370 ? 0x70 : 0xf0; dev->regs[0x27] = 0x03; - memset(dev->ld_regs, 0x00, sizeof(dev->ld_regs)); + for (uint8_t i = 0; i <= 0x0a; i++) + memset(dev->ld_regs[i], 0x00, 256); /* Logical device 0: FDD */ dev->ld_regs[0x00][0x30] = 0x00; @@ -807,7 +1609,8 @@ fdc37c93x_reset(fdc37c93x_t *dev) dev->ld_regs[0x01][0x62] = 0x03; dev->ld_regs[0x01][0x63] = 0xf6; dev->ld_regs[0x01][0x70] = 0x0e; - dev->ld_regs[0x01][0xf0] = 0x0c; + if (dev->chip_id >= FDC37C93X_FR) + dev->ld_regs[0x01][0xf0] = 0x0c; /* Logical device 2: IDE2 */ dev->ld_regs[0x02][0x30] = 0x00; @@ -840,7 +1643,8 @@ fdc37c93x_reset(fdc37c93x_t *dev) dev->ld_regs[0x05][0x70] = 0x03; dev->ld_regs[0x05][0x74] = 0x04; dev->ld_regs[0x05][0xf1] = 0x02; - dev->ld_regs[0x05][0xf2] = 0x03; + if (dev->chip_id >= FDC37C93X_FR) + dev->ld_regs[0x05][0xf2] = 0x03; serial_irq(dev->uart[1], dev->ld_regs[5][0x70]); /* Logical device 6: RTC */ @@ -858,16 +1662,34 @@ fdc37c93x_reset(fdc37c93x_t *dev) dev->ld_regs[0x08][0x30] = 0x00; dev->ld_regs[0x08][0x60] = 0x00; dev->ld_regs[0x08][0x61] = 0x00; + if (dev->chip_id >= FDC37C93X_FR) { + dev->ld_regs[0x08][0xb1] = 0x80; + dev->ld_regs[0x08][0xc0] = 0x01; + dev->ld_regs[0x08][0xc1] = 0x01; + dev->ld_regs[0x08][0xc5] = 0x01; + dev->ld_regs[0x08][0xc6] = 0x01; + dev->ld_regs[0x08][0xc7] = 0x01; + dev->ld_regs[0x08][0xc8] = 0x01; + dev->ld_regs[0x08][0xc9] = 0x80; + dev->ld_regs[0x08][0xcb] = 0x01; + dev->ld_regs[0x08][0xcc] = 0x01; + memset(&(dev->ld_regs[0x08][0xd0]), 0x01, 16); + } + memset(&(dev->ld_regs[0x08][0xe0]), 0x01, 14); /* Logical device 9: ACCESS.bus */ - dev->ld_regs[0x09][0x30] = 0x00; - dev->ld_regs[0x09][0x60] = 0x00; - dev->ld_regs[0x09][0x61] = 0x00; + if (dev->chip_id >= FDC37C93X_FR) { + dev->ld_regs[0x09][0x30] = 0x00; + dev->ld_regs[0x09][0x60] = 0x00; + dev->ld_regs[0x09][0x61] = 0x00; + } /* Logical device A: ACPI */ - dev->ld_regs[0x0a][0x30] = 0x00; - dev->ld_regs[0x0a][0x60] = 0x00; - dev->ld_regs[0x0a][0x61] = 0x00; + if (dev->chip_id == FDC37C93X_APM) { + dev->ld_regs[0x0a][0x30] = 0x00; + dev->ld_regs[0x0a][0x60] = 0x00; + dev->ld_regs[0x0a][0x61] = 0x00; + } fdc37c93x_gpio_handler(dev); fdc37c93x_lpt_handler(dev); @@ -899,6 +1721,62 @@ fdc37c93x_reset(fdc37c93x_t *dev) if (dev->chip_id != 0x02) fdc37c93x_superio_handler(dev); + if (dev->chip_id >= FDC37C93X_FR) { + serial_set_clock_src(dev->uart[0], 24000000.0); + serial_set_clock_src(dev->uart[1], 24000000.0); + } + + memset(dev->gpio_regs, 0xff, 256); + memset(dev->gpio_pulldn, 0xff, 8); + + /* Acer V62X requires bit 0 to be clear to not be stuck in "clear password" mode. */ + if (!strcmp(machine_get_internal_name(), "vectra54")) { + dev->gpio_pulldn[1] = 0x40; + + /* + HP Vectra VL/5 Series 4 GPIO + (TODO: Find how multipliers > 3.0 are defined): + + Bit 6: 1 = can boot, 0 = no; + Bit 7, 1 = multiplier (00 = 2.5, 01 = 2.0, + 10 = 3.0, 11 = 1.5); + Bit 5, 4 = bus speed (00 = 50 MHz, 01 = 66 MHz, + 10 = 60 MHz, 11 = ????): + Bit 7, 5, 4, 1: 0000 = 125 MHz, 0010 = 166 MHz, + 0100 = 150 MHz, 0110 = ??? MHz; + 0001 = 100 MHz, 0011 = 133 MHz, + 0101 = 120 MHz, 0111 = ??? MHz; + 1000 = 150 MHz, 1010 = 200 MHz, + 1100 = 180 MHz, 1110 = ??? MHz; + 1001 = 75 MHz, 1011 = 100 MHz, + 1101 = 90 MHz, 1111 = ??? MHz + */ + if (cpu_busspeed <= 40000000) + dev->gpio_pulldn[1] |= 0x30; + else if ((cpu_busspeed > 40000000) && (cpu_busspeed <= 50000000)) + dev->gpio_pulldn[1] |= 0x00; + else if ((cpu_busspeed > 50000000) && (cpu_busspeed <= 60000000)) + dev->gpio_pulldn[1] |= 0x20; + else if (cpu_busspeed > 60000000) + dev->gpio_pulldn[1] |= 0x10; + + if (cpu_dmulti <= 1.5) + dev->gpio_pulldn[1] |= 0x82; + else if ((cpu_dmulti > 1.5) && (cpu_dmulti <= 2.0)) + dev->gpio_pulldn[1] |= 0x02; + else if ((cpu_dmulti > 2.0) && (cpu_dmulti <= 2.5)) + dev->gpio_pulldn[1] |= 0x00; + else if (cpu_dmulti > 2.5) + dev->gpio_pulldn[1] |= 0x80; + } else if (!strcmp(machine_get_internal_name(), "acerv62x")) + dev->gpio_pulldn[1] = 0xfe; + else + dev->gpio_pulldn[1] = (dev->chip_id == 0x30) ? 0xff : 0xfd; + + if (strstr(machine_get_internal_name(), "acer") != NULL) + /* Bit 2 on the Acer V35N is the text/graphics toggle, bits 1 and 3 = ????. */ + dev->gpio_pulldn[2] = 0x10; + dev->locked = 0; } @@ -920,41 +1798,59 @@ fdc37c93x_init(const device_t *info) dev->uart[0] = device_add_inst(&ns16550_device, 1); dev->uart[1] = device_add_inst(&ns16550_device, 2); - dev->chip_id = info->local & 0xff; - dev->is_apm = (info->local >> 8) & 0x01; - dev->is_compaq = (info->local >> 8) & 0x02; - dev->has_nvr = !((info->local >> 8) & 0x04); - dev->port_370 = ((info->local >> 8) & 0x08); + dev->chip_id = info->local & FDC37C93X_CHIP_ID; + dev->kbc_type = info->local & FDC37C93X_KBC; - dev->gpio_regs[0] = 0xff; -#if 0 - dev->gpio_regs[1] = (info->local == 0x0030) ? 0xff : 0xfd; -#endif - dev->gpio_regs[1] = (dev->chip_id == 0x30) ? 0xff : 0xfd; + dev->is_apm = (dev->chip_id == FDC37C93X_APM); + dev->is_compaq = (dev->kbc_type == FDC37C931); + + dev->has_nvr = !(info->local & FDC37C93X_NO_NVR); + dev->port_370 = !!(info->local & FDC37C93X_370); if (dev->has_nvr) { - dev->nvr = device_add(&at_nvr_device); + dev->nvr = device_add(&amstrad_megapc_nvr_device); nvr_bank_set(0, 0, dev->nvr); nvr_bank_set(1, 0xff, dev->nvr); } - if (dev->is_apm || (dev->chip_id == 0x03)) - dev->access_bus = device_add(&access_bus_device); + dev->max_ld = 8; - if (dev->is_apm) + if (dev->chip_id >= FDC37C93X_FR) { + dev->access_bus = device_add(&access_bus_device); + dev->max_ld++; + } + + if (dev->chip_id == FDC37C93X_APM) { dev->acpi = device_add(&acpi_smc_device); + dev->max_ld++; + } if (dev->is_compaq) { - io_sethandler(0x0ea, 0x0002, - fdc37c93x_read, NULL, NULL, fdc37c93x_write, NULL, NULL, dev); io_sethandler(0x0f9, 0x0001, fdc37c93x_read, NULL, NULL, fdc37c93x_write, NULL, NULL, dev); io_sethandler(0x0fb, 0x0001, fdc37c93x_read, NULL, NULL, fdc37c93x_write, NULL, NULL, dev); } - dev->kbc = device_add(&keyboard_ps2_ami_pci_device); + switch (dev->kbc_type) { + case FDC37C931: + dev->kbc = device_add(&keyboard_ps2_compaq_device); + break; + case FDC37C932: + dev->kbc = device_add(&keyboard_ps2_intel_ami_pci_device); + break; + case FDC37C933: + default: + dev->kbc = device_add(&keyboard_ps2_pci_device); + break; + case FDC37C935: + dev->kbc = device_add(&keyboard_ps2_phoenix_device); + break; + case FDC37C937: + dev->kbc = device_add(&keyboard_ps2_phoenix_pci_device); + break; + } /* Set the defaults here so the ports can be removed by fdc37c93x_reset(). */ dev->fdc_base = 0x03f0; @@ -978,109 +1874,11 @@ fdc37c93x_init(const device_t *info) return dev; } -const device_t fdc37c931apm_device = { - .name = "SMC FDC37C931APM Super I/O", - .internal_name = "fdc37c931apm", +const device_t fdc37c93x_device = { + .name = "SMC FDC37C93x Super I/O", + .internal_name = "fdc37c93x", .flags = 0, - .local = 0x130, /* Share the same ID with the 932QF. */ - .init = fdc37c93x_init, - .close = fdc37c93x_close, - .reset = NULL, - .available = NULL, - .speed_changed = NULL, - .force_redraw = NULL, - .config = NULL -}; - -const device_t fdc37c931apm_compaq_device = { - .name = "SMC FDC37C931APM Super I/O (Compaq Presario 4500)", - .internal_name = "fdc37c931apm_compaq", - .flags = 0, - .local = 0x330, /* Share the same ID with the 932QF. */ - .init = fdc37c93x_init, - .close = fdc37c93x_close, - .reset = NULL, - .available = NULL, - .speed_changed = NULL, - .force_redraw = NULL, - .config = NULL -}; - -const device_t fdc37c932_device = { - .name = "SMC FDC37C932 Super I/O", - .internal_name = "fdc37c932", - .flags = 0, - .local = 0x02, - .init = fdc37c93x_init, - .close = fdc37c93x_close, - .reset = NULL, - .available = NULL, - .speed_changed = NULL, - .force_redraw = NULL, - .config = NULL -}; - -const device_t fdc37c932fr_device = { - .name = "SMC FDC37C932FR Super I/O", - .internal_name = "fdc37c932fr", - .flags = 0, - .local = 0x03, - .init = fdc37c93x_init, - .close = fdc37c93x_close, - .reset = NULL, - .available = NULL, - .speed_changed = NULL, - .force_redraw = NULL, - .config = NULL -}; - -const device_t fdc37c932qf_device = { - .name = "SMC FDC37C932QF Super I/O", - .internal_name = "fdc37c932qf", - .flags = 0, - .local = 0x30, - .init = fdc37c93x_init, - .close = fdc37c93x_close, - .reset = NULL, - .available = NULL, - .speed_changed = NULL, - .force_redraw = NULL, - .config = NULL -}; - -const device_t fdc37c935_device = { - .name = "SMC FDC37C935 Super I/O", - .internal_name = "fdc37c935", - .flags = 0, - .local = 0x02, - .init = fdc37c93x_init, - .close = fdc37c93x_close, - .reset = NULL, - .available = NULL, - .speed_changed = NULL, - .force_redraw = NULL, - .config = NULL -}; - -const device_t fdc37c935_370_device = { - .name = "SMC FDC37C935 Super I/O (Port 370h)", - .internal_name = "fdc37c935_370", - .flags = 0, - .local = 0x802, - .init = fdc37c93x_init, - .close = fdc37c93x_close, - .reset = NULL, - .available = NULL, - .speed_changed = NULL, - .force_redraw = NULL, - .config = NULL -}; - -const device_t fdc37c935_no_nvr_device = { - .name = "SMC FDC37C935 Super I/O", - .internal_name = "fdc37c935", - .flags = 0, - .local = 0x402, + .local = 0, .init = fdc37c93x_init, .close = fdc37c93x_close, .reset = NULL, From 76ae3eff56269fbe8c41137caf0fb56979e9be3f Mon Sep 17 00:00:00 2001 From: OBattler Date: Mon, 5 May 2025 05:12:17 +0200 Subject: [PATCH 114/180] And the root CMakeLists.txt. --- CMakeLists.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 007c1ffd8..5b78295fd 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -180,7 +180,6 @@ cmake_dependent_option(GUSMAX "Gravis UltraSound MAX" cmake_dependent_option(ISAMEM_RAMPAGE "AST Rampage" ON "DEV_BRANCH" OFF) cmake_dependent_option(ISAMEM_IAB "Intel Above Board" ON "DEV_BRANCH" OFF) cmake_dependent_option(ISAMEM_BRAT "BocaRAM/AT" ON "DEV_BRANCH" OFF) -cmake_dependent_option(LASERXT "VTech Laser XT" ON "DEV_BRANCH" OFF) cmake_dependent_option(OLIVETTI "Olivetti M290" ON "DEV_BRANCH" OFF) cmake_dependent_option(OPEN_AT "OpenAT" ON "DEV_BRANCH" OFF) cmake_dependent_option(OPL4ML "OPL4-ML daughterboard" ON "DEV_BRANCH" OFF) From ebb52490c32fed37442a8fc167d5a5ad2936a9a3 Mon Sep 17 00:00:00 2001 From: OBattler Date: Mon, 5 May 2025 05:14:56 +0200 Subject: [PATCH 115/180] Properly un-dev-branch the Laser XT stuff in the keyboard files. --- src/device/keyboard_xt.c | 2 -- src/include/86box/keyboard.h | 2 -- 2 files changed, 4 deletions(-) diff --git a/src/device/keyboard_xt.c b/src/device/keyboard_xt.c index 3c616a2ab..bafc80d88 100644 --- a/src/device/keyboard_xt.c +++ b/src/device/keyboard_xt.c @@ -1312,7 +1312,6 @@ const device_t keyboard_xt_t1x00_device = { .config = NULL }; -#ifdef USE_LASERXT const device_t keyboard_xt_lxt3_device = { .name = "VTech Laser Turbo XT Keyboard", .internal_name = "keyboard_xt_lxt", @@ -1326,7 +1325,6 @@ const device_t keyboard_xt_lxt3_device = { .force_redraw = NULL, .config = NULL }; -#endif /* USE_LASERXT */ const device_t keyboard_xt_olivetti_device = { .name = "Olivetti XT Keyboard", diff --git a/src/include/86box/keyboard.h b/src/include/86box/keyboard.h index 583960e80..024b16169 100644 --- a/src/include/86box/keyboard.h +++ b/src/include/86box/keyboard.h @@ -224,9 +224,7 @@ extern const device_t keyboard_xt86_device; extern const device_t keyboard_xt_compaq_device; extern const device_t keyboard_xt_t1x00_device; extern const device_t keyboard_tandy_device; -# ifdef USE_LASERXT extern const device_t keyboard_xt_lxt3_device; -# endif /* USE_LASERXT */ extern const device_t keyboard_xt_olivetti_device; extern const device_t keyboard_xt_zenith_device; extern const device_t keyboard_xt_hyundai_device; From 1e81473d34f254cab13019b62e948c6e9a950b53 Mon Sep 17 00:00:00 2001 From: OBattler Date: Mon, 5 May 2025 05:59:20 +0200 Subject: [PATCH 116/180] Fix MMX_ENTER() exceptions. --- src/cpu/x86_ops_mmx.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/cpu/x86_ops_mmx.h b/src/cpu/x86_ops_mmx.h index 338948af5..9a2d797a8 100644 --- a/src/cpu/x86_ops_mmx.h +++ b/src/cpu/x86_ops_mmx.h @@ -22,12 +22,12 @@ } #define MMX_ENTER() \ - if (!cpu_has_feature(CPU_FEATURE_MMX)) { \ + if (!cpu_has_feature(CPU_FEATURE_MMX) || (cr0 & 0x4)) { \ cpu_state.pc = cpu_state.oldpc; \ x86illegal(); \ return 1; \ } \ - if (cr0 & 0xc) { \ + if (cr0 & 0x8) { \ x86_int(7); \ return 1; \ } \ From c91796c388e481f759b3286f5d3d7e8f83c27251 Mon Sep 17 00:00:00 2001 From: toggo9 <121191375+toggo9@users.noreply.github.com> Date: Mon, 5 May 2025 19:57:41 +0200 Subject: [PATCH 117/180] Add the Micro Firmware/Phoenix 4.05 BIOS for the PB450. --- src/machine/m_at_386dx_486.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/machine/m_at_386dx_486.c b/src/machine/m_at_386dx_486.c index 5b746e3ef..ed8f75a84 100644 --- a/src/machine/m_at_386dx_486.c +++ b/src/machine/m_at_386dx_486.c @@ -700,6 +700,8 @@ static const device_config_t pb450_config[] = { .files_no = 1, .local = 0, .size = 131072, .files = { "roms/machines/pb450/OPTI802.bin", "" } }, { .name = "PNP 1.1A", .internal_name = "pnp11a", .bios_type = BIOS_NORMAL, .files_no = 1, .local = 0, .size = 131072, .files = { "roms/machines/pb450/PNP11A.bin", "" } }, + { .name = "P4HS20 (Micro Firmware/Phoenix 4.05)", .internal_name = "p4hs20", .bios_type = BIOS_NORMAL, + .files_no = 1, .local = 0, .size = 131072, .files = { "roms/machines/pb450/p4hs20.bin", "" } }, { .files_no = 0 } }, }, From ab75f222fe04d44fc4f1cb552f78d216a028ec30 Mon Sep 17 00:00:00 2001 From: OBattler Date: Tue, 6 May 2025 03:17:05 +0200 Subject: [PATCH 118/180] Acer V60N and V62X: Fix RAM limits. --- src/machine/machine_table.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/machine/machine_table.c b/src/machine/machine_table.c index 44e93f721..bb912cf9a 100644 --- a/src/machine/machine_table.c +++ b/src/machine/machine_table.c @@ -14166,7 +14166,7 @@ const machine_t machines[] = { .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_USB, .ram = { .min = 8192, - .max = 786432, + .max = 532480, .step = 8192 }, .nvrmask = 511, @@ -14617,7 +14617,7 @@ const machine_t machines[] = { .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_USB, .ram = { .min = 8192, - .max = 786432, + .max = 540672, .step = 8192 }, .nvrmask = 511, From a0b80e04cd41bc28b27036bb13c96431b687fef9 Mon Sep 17 00:00:00 2001 From: OBattler Date: Tue, 6 May 2025 03:18:46 +0200 Subject: [PATCH 119/180] Remove the unused mmu_perm stuff. --- src/cpu/x86.c | 1 - src/cpu/x86_ops_mov_ctrl.h | 4 --- src/cpu/x86_ops_mov_ctrl_2386.h | 4 --- src/include/86box/mem.h | 1 - src/mem/mem.c | 59 ++++----------------------------- src/mem/mmu_2386.c | 2 -- 6 files changed, 6 insertions(+), 65 deletions(-) diff --git a/src/cpu/x86.c b/src/cpu/x86.c index a8ab9d866..1b0de661b 100644 --- a/src/cpu/x86.c +++ b/src/cpu/x86.c @@ -326,7 +326,6 @@ reset_common(int hard) resetreadlookup(); makemod1table(); cpu_set_edx(); - mmu_perm = 4; } x86seg_reset(); #ifdef USE_DYNAREC diff --git a/src/cpu/x86_ops_mov_ctrl.h b/src/cpu/x86_ops_mov_ctrl.h index 253dc059e..3f5d6a4d7 100644 --- a/src/cpu/x86_ops_mov_ctrl.h +++ b/src/cpu/x86_ops_mov_ctrl.h @@ -201,8 +201,6 @@ opMOV_CRx_r_a16(uint32_t fetchdat) cr0 = cpu_state.regs[cpu_rm].l; if (cpu_16bitbus) cr0 |= 0x10; - if (!(cr0 & 0x80000000)) - mmu_perm = 4; if (hascache && !(cr0 & (1 << 30))) cpu_cache_int_enabled = 1; else @@ -267,8 +265,6 @@ opMOV_CRx_r_a32(uint32_t fetchdat) cr0 = cpu_state.regs[cpu_rm].l; if (cpu_16bitbus) cr0 |= 0x10; - if (!(cr0 & 0x80000000)) - mmu_perm = 4; if (hascache && !(cr0 & (1 << 30))) cpu_cache_int_enabled = 1; else diff --git a/src/cpu/x86_ops_mov_ctrl_2386.h b/src/cpu/x86_ops_mov_ctrl_2386.h index 8827d29b2..0d13cc833 100644 --- a/src/cpu/x86_ops_mov_ctrl_2386.h +++ b/src/cpu/x86_ops_mov_ctrl_2386.h @@ -193,8 +193,6 @@ opMOV_CRx_r_a16(uint32_t fetchdat) cr0 = cpu_state.regs[cpu_rm].l; if (cpu_16bitbus) cr0 |= 0x10; - if (!(cr0 & 0x80000000)) - mmu_perm = 4; if (hascache && !(cr0 & (1 << 30))) cpu_cache_int_enabled = 1; else @@ -255,8 +253,6 @@ opMOV_CRx_r_a32(uint32_t fetchdat) cr0 = cpu_state.regs[cpu_rm].l; if (cpu_16bitbus) cr0 |= 0x10; - if (!(cr0 & 0x80000000)) - mmu_perm = 4; if (hascache && !(cr0 & (1 << 30))) cpu_cache_int_enabled = 1; else diff --git a/src/include/86box/mem.h b/src/include/86box/mem.h index f8d0f659a..62cb493a5 100644 --- a/src/include/86box/mem.h +++ b/src/include/86box/mem.h @@ -300,7 +300,6 @@ extern int writelnum; extern int memspeed[11]; -extern int mmu_perm; extern uint8_t high_page; /* if a high (> 4 gb) page was detected */ extern uint8_t *_mem_exec[MEM_MAPPINGS_NO]; diff --git a/src/mem/mem.c b/src/mem/mem.c index 8c2cfd6cc..07d897172 100644 --- a/src/mem/mem.c +++ b/src/mem/mem.c @@ -108,7 +108,6 @@ int mem_a20_alt = 0; int mem_a20_state = 0; int mmuflush = 0; -int mmu_perm = 4; #ifdef USE_NEW_DYNAREC uint64_t *byte_dirty_mask; @@ -125,10 +124,6 @@ mem_mapping_t *write_mapping[MEM_MAPPINGS_NO]; uint8_t *_mem_exec[MEM_MAPPINGS_NO]; -/* FIXME: re-do this with a 'mem_ops' struct. */ -static uint8_t *page_lookupp; /* pagetable mmu_perm lookup */ -static uint8_t *readlookupp; -static uint8_t *writelookupp; static mem_mapping_t *base_mapping; static mem_mapping_t *last_mapping; static mem_mapping_t *read_mapping_bus[MEM_MAPPINGS_NO]; @@ -187,10 +182,8 @@ resetreadlookup(void) /* Initialize the tables for high (> 1024K) RAM. */ memset(readlookup2, 0xff, (1 << 20) * sizeof(uintptr_t)); - memset(readlookupp, 0x04, (1 << 20) * sizeof(uint8_t)); memset(writelookup2, 0xff, (1 << 20) * sizeof(uintptr_t)); - memset(writelookupp, 0x04, (1 << 20) * sizeof(uint8_t)); readlnext = 0; writelnext = 0; @@ -204,14 +197,11 @@ flushmmucache(void) for (uint16_t c = 0; c < 256; c++) { if (readlookup[c] != (int) 0xffffffff) { readlookup2[readlookup[c]] = LOOKUP_INV; - readlookupp[readlookup[c]] = 4; readlookup[c] = 0xffffffff; } if (writelookup[c] != (int) 0xffffffff) { page_lookup[writelookup[c]] = NULL; - page_lookupp[writelookup[c]] = 4; writelookup2[writelookup[c]] = LOOKUP_INV; - writelookupp[writelookup[c]] = 4; writelookup[c] = 0xffffffff; } } @@ -231,9 +221,7 @@ flushmmucache_write(void) for (uint16_t c = 0; c < 256; c++) { if (writelookup[c] != (int) 0xffffffff) { page_lookup[writelookup[c]] = NULL; - page_lookupp[writelookup[c]] = 4; writelookup2[writelookup[c]] = LOOKUP_INV; - writelookupp[writelookup[c]] = 4; writelookup[c] = 0xffffffff; } } @@ -259,14 +247,11 @@ flushmmucache_nopc(void) for (uint16_t c = 0; c < 256; c++) { if (readlookup[c] != (int) 0xffffffff) { readlookup2[readlookup[c]] = LOOKUP_INV; - readlookupp[readlookup[c]] = 4; readlookup[c] = 0xffffffff; } if (writelookup[c] != (int) 0xffffffff) { page_lookup[writelookup[c]] = NULL; - page_lookupp[writelookup[c]] = 4; writelookup2[writelookup[c]] = LOOKUP_INV; - writelookupp[writelookup[c]] = 4; writelookup[c] = 0xffffffff; } } @@ -348,7 +333,6 @@ mmutranslatereal_normal(uint32_t addr, int rw) return 0xffffffffffffffffULL; } - mmu_perm = temp & 4; rammap(addr2) |= (rw ? 0x60 : 0x20); uint64_t page = temp & ~0x3fffff; @@ -371,7 +355,6 @@ mmutranslatereal_normal(uint32_t addr, int rw) return 0xffffffffffffffffULL; } - mmu_perm = temp & 4; rammap(addr2) |= 0x20; rammap((temp2 & ~0xfff) + ((addr >> 10) & 0xffc)) |= (rw ? 0x60 : 0x20); @@ -435,7 +418,6 @@ mmutranslatereal_pae(uint32_t addr, int rw) return 0xffffffffffffffffULL; } - mmu_perm = temp & 4; rammap64(addr3) |= (rw ? 0x60 : 0x20); return ((temp & ~0x1fffffULL) + (addr & 0x1fffffULL)) & 0x000000ffffffffffULL; @@ -456,7 +438,6 @@ mmutranslatereal_pae(uint32_t addr, int rw) return 0xffffffffffffffffULL; } - mmu_perm = temp & 4; rammap64(addr3) |= 0x20; rammap64(addr4) |= (rw ? 0x60 : 0x20); @@ -631,7 +612,6 @@ addreadlookup(uint32_t virt, uint32_t phys) else readlookup2[virt >> 12] = (uintptr_t) &ram[a]; #endif - readlookupp[virt >> 12] = mmu_perm; readlookup[readlnext++] = virt >> 12; readlnext &= (cachesize - 1); @@ -671,7 +651,6 @@ addwritelookup(uint32_t virt, uint32_t phys) # endif #endif page_lookup[virt >> 12] = &pages[phys >> 12]; - page_lookupp[virt >> 12] = mmu_perm; } else { #if (defined __amd64__ || defined _M_X64 || defined __aarch64__ || defined _M_ARM64) writelookup2[virt >> 12] = (uintptr_t) &ram[(uintptr_t) (phys & ~0xFFF) - (uintptr_t) (virt & ~0xfff)]; @@ -684,7 +663,6 @@ addwritelookup(uint32_t virt, uint32_t phys) writelookup2[virt >> 12] = (uintptr_t) &ram[a]; #endif } - writelookupp[virt >> 12] = mmu_perm; writelookup[writelnext++] = virt >> 12; writelnext &= (cachesize - 1); @@ -973,10 +951,8 @@ readmemwl(uint32_t addr) } return readmembl_no_mmut(addr, addr64a[0]) | (((uint16_t) readmembl_no_mmut(addr + 1, addr64a[1])) << 8); - } else if (readlookup2[addr >> 12] != (uintptr_t) LOOKUP_INV) { - mmu_perm = readlookupp[addr >> 12]; + } else if (readlookup2[addr >> 12] != (uintptr_t) LOOKUP_INV) return *(uint16_t *) (readlookup2[addr >> 12] + addr); - } } if (cr0 >> 31) { @@ -1044,7 +1020,6 @@ writememwl(uint32_t addr, uint16_t val) writemembl_no_mmut(addr + 1, addr64a[1], val >> 8); return; } else if (writelookup2[addr >> 12] != (uintptr_t) LOOKUP_INV) { - mmu_perm = writelookupp[addr >> 12]; *(uint16_t *) (writelookup2[addr >> 12] + addr) = val; return; } @@ -1052,7 +1027,6 @@ writememwl(uint32_t addr, uint16_t val) if (page_lookup[addr >> 12] && page_lookup[addr >> 12]->write_w) { page_lookup[addr >> 12]->write_w(addr, val, page_lookup[addr >> 12]); - mmu_perm = page_lookupp[addr >> 12]; return; } @@ -1100,10 +1074,8 @@ readmemwl_no_mmut(uint32_t addr, uint32_t *a64) } return readmembl_no_mmut(addr, a64[0]) | (((uint16_t) readmembl_no_mmut(addr + 1, a64[1])) << 8); - } else if (readlookup2[addr >> 12] != (uintptr_t) LOOKUP_INV) { - mmu_perm = readlookupp[addr >> 12]; + } else if (readlookup2[addr >> 12] != (uintptr_t) LOOKUP_INV) return *(uint16_t *) (readlookup2[addr >> 12] + addr); - } } if (cr0 >> 31) { @@ -1149,14 +1121,12 @@ writememwl_no_mmut(uint32_t addr, uint32_t *a64, uint16_t val) writemembl_no_mmut(addr + 1, a64[1], val >> 8); return; } else if (writelookup2[addr >> 12] != (uintptr_t) LOOKUP_INV) { - mmu_perm = writelookupp[addr >> 12]; *(uint16_t *) (writelookup2[addr >> 12] + addr) = val; return; } } if (page_lookup[addr >> 12] && page_lookup[addr >> 12]->write_w) { - mmu_perm = page_lookupp[addr >> 12]; page_lookup[addr >> 12]->write_w(addr, val, page_lookup[addr >> 12]); return; } @@ -1231,10 +1201,8 @@ readmemll(uint32_t addr) /* No need to waste precious CPU host cycles on mmutranslate's that were already done, just pass their result as a parameter to be used if needed. */ return readmemwl_no_mmut(addr, addr64a) | (((uint32_t) readmemwl_no_mmut(addr + 2, &(addr64a[2]))) << 16); - } else if (readlookup2[addr >> 12] != (uintptr_t) LOOKUP_INV) { - mmu_perm = readlookupp[addr >> 12]; + } else if (readlookup2[addr >> 12] != (uintptr_t) LOOKUP_INV) return *(uint32_t *) (readlookup2[addr >> 12] + addr); - } } if (cr0 >> 31) { @@ -1316,14 +1284,12 @@ writememll(uint32_t addr, uint32_t val) writememwl_no_mmut(addr + 2, &(addr64a[2]), val >> 16); return; } else if (writelookup2[addr >> 12] != (uintptr_t) LOOKUP_INV) { - mmu_perm = writelookupp[addr >> 12]; *(uint32_t *) (writelookup2[addr >> 12] + addr) = val; return; } } if (page_lookup[addr >> 12] && page_lookup[addr >> 12]->write_l) { - mmu_perm = page_lookupp[addr >> 12]; page_lookup[addr >> 12]->write_l(addr, val, page_lookup[addr >> 12]); return; } @@ -1378,10 +1344,8 @@ readmemll_no_mmut(uint32_t addr, uint32_t *a64) } return readmemwl_no_mmut(addr, a64) | ((uint32_t) (readmemwl_no_mmut(addr + 2, &(a64[2]))) << 16); - } else if (readlookup2[addr >> 12] != (uintptr_t) LOOKUP_INV) { - mmu_perm = readlookupp[addr >> 12]; + } else if (readlookup2[addr >> 12] != (uintptr_t) LOOKUP_INV) return *(uint32_t *) (readlookup2[addr >> 12] + addr); - } } if (cr0 >> 31) { @@ -1429,14 +1393,12 @@ writememll_no_mmut(uint32_t addr, uint32_t *a64, uint32_t val) writememwl_no_mmut(addr + 2, &(a64[2]), val >> 16); return; } else if (writelookup2[addr >> 12] != (uintptr_t) LOOKUP_INV) { - mmu_perm = writelookupp[addr >> 12]; *(uint32_t *) (writelookup2[addr >> 12] + addr) = val; return; } } if (page_lookup[addr >> 12] && page_lookup[addr >> 12]->write_l) { - mmu_perm = page_lookupp[addr >> 12]; page_lookup[addr >> 12]->write_l(addr, val, page_lookup[addr >> 12]); return; } @@ -1516,10 +1478,8 @@ readmemql(uint32_t addr) /* No need to waste precious CPU host cycles on mmutranslate's that were already done, just pass their result as a parameter to be used if needed. */ return readmemll_no_mmut(addr, addr64a) | (((uint64_t) readmemll_no_mmut(addr + 4, &(addr64a[4]))) << 32); - } else if (readlookup2[addr >> 12] != (uintptr_t) LOOKUP_INV) { - mmu_perm = readlookupp[addr >> 12]; + } else if (readlookup2[addr >> 12] != (uintptr_t) LOOKUP_INV) return *(uint64_t *) (readlookup2[addr >> 12] + addr); - } } if (cr0 >> 31) { @@ -1611,14 +1571,12 @@ writememql(uint32_t addr, uint64_t val) writememll_no_mmut(addr + 4, &(addr64a[4]), val >> 32); return; } else if (writelookup2[addr >> 12] != (uintptr_t) LOOKUP_INV) { - mmu_perm = writelookupp[addr >> 12]; *(uint64_t *) (writelookup2[addr >> 12] + addr) = val; return; } } if (page_lookup[addr >> 12] && page_lookup[addr >> 12]->write_l) { - mmu_perm = page_lookupp[addr >> 12]; page_lookup[addr >> 12]->write_l(addr, val, page_lookup[addr >> 12]); page_lookup[addr >> 12]->write_l(addr + 4, val >> 32, page_lookup[addr >> 12]); return; @@ -1702,8 +1660,7 @@ do_mmutranslate(uint32_t addr, uint32_t *a64, int num, int write) a = (a & 0xfffffffffffff000ULL) | ((uint64_t) (addr & 0xfff)); a64[i] = (uint32_t) a; } - } else - mmu_perm = page_lookupp[addr >> 12]; + } addr++; } @@ -2914,7 +2871,6 @@ mem_reset(void) pages = (page_t *) malloc(m * sizeof(page_t)); memset(page_lookup, 0x00, (1 << 20) * sizeof(page_t *)); - memset(page_lookupp, 0x04, (1 << 20) * sizeof(uint8_t)); memset(pages, 0x00, pages_sz * sizeof(page_t)); @@ -3033,11 +2989,8 @@ mem_init(void) /* Allocate the lookup tables. */ page_lookup = (page_t **) malloc((1 << 20) * sizeof(page_t *)); - page_lookupp = (uint8_t *) malloc((1 << 20) * sizeof(uint8_t)); readlookup2 = malloc((1 << 20) * sizeof(uintptr_t)); - readlookupp = malloc((1 << 20) * sizeof(uint8_t)); writelookup2 = malloc((1 << 20) * sizeof(uintptr_t)); - writelookupp = malloc((1 << 20) * sizeof(uint8_t)); } static void diff --git a/src/mem/mmu_2386.c b/src/mem/mmu_2386.c index 1a2782237..ebf062d95 100644 --- a/src/mem/mmu_2386.c +++ b/src/mem/mmu_2386.c @@ -211,7 +211,6 @@ mmutranslatereal_2386(uint32_t addr, int rw) return 0xffffffffffffffffULL; } - mmu_perm = temp & 4; mem_writel_map(addr2, mem_readl_map(addr2) | (rw ? 0x60 : 0x20)); return (temp & ~0x3fffff) + (addr & 0x3fffff); @@ -231,7 +230,6 @@ mmutranslatereal_2386(uint32_t addr, int rw) return 0xffffffffffffffffULL; } - mmu_perm = temp & 4; mem_writel_map(addr2, mem_readl_map(addr2) | 0x20); mem_writel_map((temp2 & ~0xfff) + ((addr >> 10) & 0xffc), mem_readl_map((temp2 & ~0xfff) + ((addr >> 10) & 0xffc)) | (rw ? 0x60 : 0x20)); From c3debc5e27dd70e94c393d06420b8845ca9187dd Mon Sep 17 00:00:00 2001 From: OBattler Date: Tue, 6 May 2025 03:21:54 +0200 Subject: [PATCH 120/180] Implement the RZ-1000 PCI IDE controller needed by some Intel machines. --- src/disk/CMakeLists.txt | 1 + src/disk/hdc_ide_rz1000.c | 322 +++++++++++++++++++++++++++++++++++++ src/include/86box/hdc.h | 6 + src/machine/m_at_socket4.c | 3 +- src/machine/m_at_socket5.c | 2 +- 5 files changed, 332 insertions(+), 2 deletions(-) create mode 100644 src/disk/hdc_ide_rz1000.c diff --git a/src/disk/CMakeLists.txt b/src/disk/CMakeLists.txt index 3f6a4d018..bdbb9e74c 100644 --- a/src/disk/CMakeLists.txt +++ b/src/disk/CMakeLists.txt @@ -31,6 +31,7 @@ add_library(hdd OBJECT hdc_ide_opti611.c hdc_ide_cmd640.c hdc_ide_cmd646.c + hdc_ide_rz1000.c hdc_ide_sff8038i.c hdc_ide_um8673f.c hdc_ide_w83769f.c diff --git a/src/disk/hdc_ide_rz1000.c b/src/disk/hdc_ide_rz1000.c new file mode 100644 index 000000000..d93e83859 --- /dev/null +++ b/src/disk/hdc_ide_rz1000.c @@ -0,0 +1,322 @@ +/* + * 86Box A hypervisor and IBM PC system emulator that specializes in + * running old operating systems and software designed for IBM + * PC systems and compatibles from 1981 through fairly recent + * system designs based on the PCI bus. + * + * This file is part of the 86Box distribution. + * + * Implementation of the PC Technology RZ-1000 controller. + * + * Authors: Miran Grca, + * + * Copyright 2025 Miran Grca. + */ +#include +#include +#include +#include +#include +#include +#define HAVE_STDARG_H +#include <86box/86box.h> +#include <86box/cdrom.h> +#include <86box/scsi_device.h> +#include <86box/scsi_cdrom.h> +#include <86box/dma.h> +#include <86box/io.h> +#include <86box/device.h> +#include <86box/keyboard.h> +#include <86box/mem.h> +#include <86box/pci.h> +#include <86box/pic.h> +#include <86box/timer.h> +#include <86box/hdc.h> +#include <86box/hdc_ide.h> +#include <86box/hdc_ide_sff8038i.h> +#include <86box/zip.h> +#include <86box/mo.h> + +typedef struct rz1000_t { + uint8_t vlb_idx; + uint8_t id; + uint8_t in_cfg; + uint8_t channels; + uint8_t pci; + uint8_t irq_state; + uint8_t pci_slot; + uint8_t pad0; + uint8_t regs[256]; + uint32_t local; + int irq_mode[2]; + int irq_pin; + int irq_line; +} rz1000_t; + +static int next_id = 0; + +#define ENABLE_RZ1000_LOG 1 +#ifdef ENABLE_RZ1000_LOG +int rz1000_do_log = ENABLE_RZ1000_LOG; + +static void +rz1000_log(const char *fmt, ...) +{ + va_list ap; + + if (rz1000_do_log) { + va_start(ap, fmt); + pclog_ex(fmt, ap); + va_end(ap); + } +} +#else +# define rz1000_log(fmt, ...) +#endif + +static void +rz1000_ide_handlers(rz1000_t *dev) +{ + uint16_t main; + uint16_t side; + + if (dev->channels & 0x01) { + ide_pri_disable(); + + main = 0x1f0; + side = 0x3f6; + + ide_set_base(0, main); + ide_set_side(0, side); + + if (dev->regs[0x04] & 0x01) + ide_pri_enable(); + } + + if (dev->channels & 0x02) { + ide_sec_disable(); + + main = 0x170; + side = 0x376; + + ide_set_base(1, main); + ide_set_side(1, side); + + if (dev->regs[0x04] & 0x01) + ide_sec_enable(); + } +} + +static void +rz1000_pci_write(int func, int addr, uint8_t val, void *priv) +{ + rz1000_t *dev = (rz1000_t *) priv; + + rz1000_log("rz1000_pci_write(%i, %02X, %02X)\n", func, addr, val); + + if (func == 0x00) + switch (addr) { + case 0x04: + dev->regs[addr] = (val & 0x41); + rz1000_ide_handlers(dev); + break; + case 0x07: + dev->regs[addr] &= ~(val & 0x80); + break; + case 0x09: + if ((dev->regs[addr] & 0x0a) == 0x0a) { + dev->regs[addr] = (dev->regs[addr] & 0x0a) | (val & 0x05); + dev->irq_mode[0] = !!(val & 0x01); + dev->irq_mode[1] = !!(val & 0x04); + rz1000_ide_handlers(dev); + } + break; + case 0x10: + dev->regs[0x10] = (val & 0xf8) | 1; + rz1000_ide_handlers(dev); + break; + case 0x11: + dev->regs[0x11] = val; + rz1000_ide_handlers(dev); + break; + case 0x14: + dev->regs[0x14] = (val & 0xfc) | 1; + rz1000_ide_handlers(dev); + break; + case 0x15: + dev->regs[0x15] = val; + rz1000_ide_handlers(dev); + break; + case 0x18: + dev->regs[0x18] = (val & 0xf8) | 1; + rz1000_ide_handlers(dev); + break; + case 0x19: + dev->regs[0x19] = val; + rz1000_ide_handlers(dev); + break; + case 0x1c: + dev->regs[0x1c] = (val & 0xfc) | 1; + rz1000_ide_handlers(dev); + break; + case 0x1d: + dev->regs[0x1d] = val; + rz1000_ide_handlers(dev); + break; + case 0x40 ... 0x4f: + dev->regs[addr] = val; + break; + } +} + +static uint8_t +rz1000_pci_read(int func, int addr, void *priv) +{ + rz1000_t *dev = (rz1000_t *) priv; + uint8_t ret = 0xff; + + if (func == 0x00) + ret = dev->regs[addr]; + + rz1000_log("rz1000_pci_read(%i, %02X, %02X)\n", func, addr, ret); + + return ret; +} + +static void +rz1000_reset(void *priv) +{ + rz1000_t *dev = (rz1000_t *) priv; + int i = 0; + int min_channel; + int max_channel; + + switch (dev->channels) { + default: + case 0x00: + min_channel = max_channel = 0; + break; + case 0x01: + min_channel = 0; + max_channel = 1; + break; + case 0x02: + min_channel = 2; + max_channel = 3; + break; + case 0x03: + min_channel = 0; + max_channel = 3; + break; + } + + for (i = 0; i < CDROM_NUM; i++) { + if ((cdrom[i].bus_type == CDROM_BUS_ATAPI) && (cdrom[i].ide_channel >= min_channel) && + (cdrom[i].ide_channel <= max_channel) && cdrom[i].priv) + scsi_cdrom_reset((scsi_common_t *) cdrom[i].priv); + } + for (i = 0; i < ZIP_NUM; i++) { + if ((zip_drives[i].bus_type == ZIP_BUS_ATAPI) && (zip_drives[i].ide_channel >= min_channel) && + (zip_drives[i].ide_channel <= max_channel) && zip_drives[i].priv) + zip_reset((scsi_common_t *) zip_drives[i].priv); + } + for (i = 0; i < MO_NUM; i++) { + if ((mo_drives[i].bus_type == MO_BUS_ATAPI) && (mo_drives[i].ide_channel >= min_channel) && + (mo_drives[i].ide_channel <= max_channel) && mo_drives[i].priv) + mo_reset((scsi_common_t *) mo_drives[i].priv); + } + + memset(dev->regs, 0x00, sizeof(dev->regs)); + + rz1000_log("dev->local = %08X\n", dev->local); + + dev->regs[0x00] = 0x42; /* PC Technology */ + dev->regs[0x01] = 0x10; + dev->regs[0x02] = 0x00; /* RZ-1000 */ + dev->regs[0x03] = 0x10; + dev->regs[0x04] = 0x01; + dev->regs[0x07] = 0x02; /* DEVSEL timing: 01 medium */ + dev->regs[0x08] = 0x02; /* Revision 02 */ + dev->regs[0x09] = dev->local; /* Programming interface */ + dev->regs[0x0a] = 0x01; /* IDE controller */ + dev->regs[0x0b] = 0x01; /* Mass storage controller */ + + dev->regs[0x3c] = 0x14; /* IRQ 14 */ + dev->regs[0x3d] = 0x01; /* INTA */ + + dev->irq_mode[0] = dev->irq_mode[1] = 0; + dev->irq_pin = PCI_INTA; + dev->irq_line = 14; + + rz1000_ide_handlers(dev); +} + +static void +rz1000_close(void *priv) +{ + rz1000_t *dev = (rz1000_t *) priv; + + free(dev); + + next_id = 0; +} + +static void * +rz1000_init(const device_t *info) +{ + rz1000_t *dev = (rz1000_t *) calloc(1, sizeof(rz1000_t)); + + dev->id = next_id | 0x60; + + dev->pci = !!(info->flags & DEVICE_PCI); + dev->local = info->local; + + dev->channels = ((info->local & 0x60000) >> 17) & 0x03; + + device_add(&ide_pci_2ch_device); + + if (info->local & 0x80000) + pci_add_card(PCI_ADD_NORMAL, rz1000_pci_read, rz1000_pci_write, dev, &dev->pci_slot); + else + pci_add_card(PCI_ADD_IDE, rz1000_pci_read, rz1000_pci_write, dev, &dev->pci_slot); + + if (dev->channels & 0x01) + ide_board_set_force_ata3(0, 1); + + if (dev->channels & 0x02) + ide_board_set_force_ata3(1, 1); + + next_id++; + + rz1000_reset(dev); + + return dev; +} + +const device_t ide_rz1000_pci_device = { + .name = "PC Technology RZ-1000 PCI", + .internal_name = "ide_rz1000_pci", + .flags = DEVICE_PCI, + .local = 0x6000a, + .init = rz1000_init, + .close = rz1000_close, + .reset = rz1000_reset, + .available = NULL, + .speed_changed = NULL, + .force_redraw = NULL, + .config = NULL +}; + +const device_t ide_rz1000_pci_single_channel_device = { + .name = "PC Technology RZ-1000 PCI", + .internal_name = "ide_rz1000_pci_single_channel", + .flags = DEVICE_PCI, + .local = 0x2000a, + .init = rz1000_init, + .close = rz1000_close, + .reset = rz1000_reset, + .available = NULL, + .speed_changed = NULL, + .force_redraw = NULL, + .config = NULL +}; diff --git a/src/include/86box/hdc.h b/src/include/86box/hdc.h index 71f83e5e6..0a5985370 100644 --- a/src/include/86box/hdc.h +++ b/src/include/86box/hdc.h @@ -60,6 +60,8 @@ extern const device_t ide_pci_device; /* pci_ide */ extern const device_t ide_pci_sec_device; /* pci_ide sec */ extern const device_t ide_pci_2ch_device; /* pci_ide_2ch */ +extern const device_t ide_pci_ter_qua_2ch_device; /* pci_ide_ter_qua_2ch */ + extern const device_t ide_ali1489_device; /* ALi M1489 */ extern const device_t ide_ali5213_device; /* ALi M5213 */ @@ -76,10 +78,14 @@ extern const device_t ide_cmd640_pci_single_channel_sec_device; /* CMD PCI-640B extern const device_t ide_cmd646_device; /* CMD PCI-646 */ extern const device_t ide_cmd646_legacy_only_device; /* CMD PCI-646 (Legacy Mode Only) */ extern const device_t ide_cmd646_single_channel_device; /* CMD PCI-646 (Only primary channel) */ +extern const device_t ide_cmd646_ter_qua_device; /* CMD PCI-646 (Tertiary and quaternary channels) */ extern const device_t ide_opti611_vlb_device; /* OPTi 82c611/611A VLB */ extern const device_t ide_opti611_vlb_sec_device; /* OPTi 82c611/611A VLB (Secondary channel) */ +extern const device_t ide_rz1000_pci_device; /* PC Technology RZ-1000 PCI */ +extern const device_t ide_rz1000_pci_single_channel_device; /* PC Technology RZ-1000 PCI (Only primary channel) */ + extern const device_t ide_um8673f_device; /* UMC UM8673F */ extern const device_t ide_um8886af_device; /* UMC UM8886AF */ diff --git a/src/machine/m_at_socket4.c b/src/machine/m_at_socket4.c index c747d8cc0..92f88fbe6 100644 --- a/src/machine/m_at_socket4.c +++ b/src/machine/m_at_socket4.c @@ -58,7 +58,8 @@ machine_at_premiere_common_init(const machine_t *model, int pci_switch) pci_register_slot(0x02, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 0); device_add(&keyboard_ps2_phoenix_device); device_add(&sio_zb_device); - device_add(&fdc37c665_device); + device_add(&ide_rz1000_pci_single_channel_device); + device_add(&fdc37c665_ide_sec_device); device_add(&intel_flash_bxt_ami_device); } diff --git a/src/machine/m_at_socket5.c b/src/machine/m_at_socket5.c index 02922b425..0d748b85e 100644 --- a/src/machine/m_at_socket5.c +++ b/src/machine/m_at_socket5.c @@ -169,8 +169,8 @@ machine_at_tek932_init(const machine_t *model) device_add(&keyboard_ps2_intel_ami_pci_device); device_add(&i430nx_device); device_add(&sio_zb_device); - device_add(&fdc37c665_ide_device); device_add(&ide_vlb_device); + device_add(&fdc37c665_ide_pri_device); device_add(&intel_flash_bxt_ami_device); return ret; From fc3a6379b59e897cff7cde478ef79b5d83a552c7 Mon Sep 17 00:00:00 2001 From: OBattler Date: Tue, 6 May 2025 03:36:05 +0200 Subject: [PATCH 121/180] A small sanity check in the VISO code. --- src/cdrom/cdrom_image_viso.c | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/src/cdrom/cdrom_image_viso.c b/src/cdrom/cdrom_image_viso.c index 4bf976794..cf132c560 100644 --- a/src/cdrom/cdrom_image_viso.c +++ b/src/cdrom/cdrom_image_viso.c @@ -782,9 +782,8 @@ viso_close(void *priv) if (viso->entry_map) free(viso->entry_map); - if (tf->log != NULL) { - - } + if (tf->log != NULL) + log_close(tf->log); free(viso); } @@ -1607,10 +1606,12 @@ end: return &viso->tf; } else { - image_viso_log(viso->tf.log, "Initialization failed\n"); - if (data) - free(data); - viso_close(&viso->tf); + if (viso != NULL) { + image_viso_log(viso->tf.log, "Initialization failed\n"); + if (data) + free(data); + viso_close(&viso->tf); + } return NULL; } } From c438073d689f8bce2071b9c2932f630be2cd9293 Mon Sep 17 00:00:00 2001 From: OBattler Date: Tue, 6 May 2025 03:41:33 +0200 Subject: [PATCH 122/180] CD-ROM Image: Actually close image if ret = 0 also in case of a cue sheet, and also warn if ret = 0, closes #5552. --- src/cdrom/cdrom_image.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/cdrom/cdrom_image.c b/src/cdrom/cdrom_image.c index 519afaa4c..6bc284fd3 100644 --- a/src/cdrom/cdrom_image.c +++ b/src/cdrom/cdrom_image.c @@ -2016,6 +2016,10 @@ image_open(cdrom_t *dev, const char *path) img->has_audio = 0; else if (ret) img->has_audio = 1; + else { + image_close(img); + img = NULL; + } } else { ret = image_load_iso(img, path); @@ -2033,7 +2037,8 @@ image_open(cdrom_t *dev, const char *path) img->log = log_open(n); dev->ops = &image_ops; - } + } else + warning("Unable to load CD-ROM image: %s\n", path); } return img; From 813a19aad87988a79c5d623c81411c488e00ec7d Mon Sep 17 00:00:00 2001 From: OBattler Date: Tue, 6 May 2025 03:44:50 +0200 Subject: [PATCH 123/180] Acer V60N and V62X: limit to 384 MB. --- src/machine/machine_table.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/machine/machine_table.c b/src/machine/machine_table.c index bb912cf9a..23409d6db 100644 --- a/src/machine/machine_table.c +++ b/src/machine/machine_table.c @@ -14166,7 +14166,7 @@ const machine_t machines[] = { .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_USB, .ram = { .min = 8192, - .max = 532480, + .max = 393216, .step = 8192 }, .nvrmask = 511, @@ -14617,7 +14617,7 @@ const machine_t machines[] = { .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_USB, .ram = { .min = 8192, - .max = 540672, + .max = 393216, .step = 8192 }, .nvrmask = 511, From eb82f9bcca6f01a31b7ebfca04620e0bc37e9fc9 Mon Sep 17 00:00:00 2001 From: OBattler Date: Tue, 6 May 2025 04:51:59 +0200 Subject: [PATCH 124/180] Added the TriGem Delhi III (AMI VIA MVP3 machine). --- src/acpi.c | 8 ++++++++ src/include/86box/machine.h | 1 + src/machine/m_at_sockets7.c | 32 +++++++++++++++++++++++++++++ src/machine/machine_table.c | 41 +++++++++++++++++++++++++++++++++++++ 4 files changed, 82 insertions(+) diff --git a/src/acpi.c b/src/acpi.c index ccd51ebca..e9549adb0 100644 --- a/src/acpi.c +++ b/src/acpi.c @@ -2387,6 +2387,14 @@ acpi_reset(void *priv) dev->regs.gpi_val = 0xfff57fc1; if (!strcmp(machine_get_internal_name(), "ficva503a") || !strcmp(machine_get_internal_name(), "6via90ap")) dev->regs.gpi_val |= 0x00000004; + /* + TriGem Delhi-III second GPI word: + - Bit 7 = Save CMOS (must be set); + - Bit 6 = Password jumper (must be set); + - Bit 5 = Enable Setup (must be set). + */ + else if (!strcmp(machine_get_internal_name(), "delhi3")) + dev->regs.gpi_val |= 0x00008000; } if (acpi_power_on) { diff --git a/src/include/86box/machine.h b/src/include/86box/machine.h index d62947848..fb979172c 100644 --- a/src/include/86box/machine.h +++ b/src/include/86box/machine.h @@ -782,6 +782,7 @@ extern int machine_at_ax59pro_init(const machine_t *); extern int machine_at_mvp3_init(const machine_t *); extern int machine_at_ficva503a_init(const machine_t *); extern int machine_at_5emapro_init(const machine_t *); +extern int machine_at_delhi3_init(const machine_t *); extern int machine_at_5sg100_init(const machine_t *); diff --git a/src/machine/m_at_sockets7.c b/src/machine/m_at_sockets7.c index 0360b5650..b7ffc03b3 100644 --- a/src/machine/m_at_sockets7.c +++ b/src/machine/m_at_sockets7.c @@ -343,6 +343,38 @@ machine_at_5emapro_init(const machine_t *model) return ret; } +int +machine_at_delhi3_init(const machine_t *model) +{ + int ret; + + ret = bios_load_linear("roms/machines/delhi3/DELHI3.ROM", + 0x000c0000, 262144, 0); + + if (bios_only || !ret) + return ret; + + machine_at_common_init_ex(model, 2); + + pci_init(PCI_CONFIG_TYPE_1); + pci_register_slot(0x00, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); + pci_register_slot(0x07, PCI_CARD_SOUTHBRIDGE, 1, 2, 3, 4); + pci_register_slot(0x13, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x12, PCI_CARD_NORMAL, 2, 3, 4, 1); + + device_add(&via_mvp3_device); + device_add(&via_vt82c596a_device); + device_add(&keyboard_ps2_ami_pci_device); + device_add(&w83877tf_device); + device_add(&sst_flash_39sf020_device); + spd_register(SPD_TYPE_SDRAM, 0x3, 256); + + if ((sound_card_current[0] == SOUND_INTERNAL) && machine_get_snd_device(machine)) + device_add(machine_get_snd_device(machine)); + + return ret; +} + int machine_at_5sg100_init(const machine_t *model) { diff --git a/src/machine/machine_table.c b/src/machine/machine_table.c index 23409d6db..bf4c7fa1b 100644 --- a/src/machine/machine_table.c +++ b/src/machine/machine_table.c @@ -14013,6 +14013,47 @@ const machine_t machines[] = { .snd_device = NULL, .net_device = NULL }, + /* Has the VIA VT82C596A southbridge with on-chip KBC identical to the VIA + VT82C42N. */ + { + .name = "[VIA MVP3] TriGem Delhi-III", + .internal_name = "delhi3", + .type = MACHINE_TYPE_SOCKETS7, + .chipset = MACHINE_CHIPSET_VIA_APOLLO_MVP3, + .init = machine_at_delhi3_init, + .p1_handler = NULL, + .gpio_handler = NULL, + .available_flag = MACHINE_AVAILABLE, + .gpio_acpi_handler = NULL, + .cpu = { + .package = CPU_PKG_SOCKET5_7, + .block = CPU_BLOCK_NONE, + .min_bus = 66666667, + .max_bus = 124242424, + .min_voltage = 2000, + .max_voltage = 3520, + .min_multi = 1.5, + .max_multi = 5.5 + }, + .bus_flags = MACHINE_PS2_AGP | MACHINE_BUS_USB, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI | MACHINE_SOUND | MACHINE_USB, + .ram = { + .min = 8192, + .max = 524288, + .step = 8192 + }, + .nvrmask = 255, + .kbc_device = NULL, + .kbc_p1 = 0xff, + .gpio = 0xffffffff, + .gpio_acpi = 0xffffffff, + .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, + .vid_device = NULL, + .snd_device = &cs4235_device, + .net_device = NULL + }, /* SiS 5591 */ /* Has the SiS 5591 chipset with on-chip KBC. */ From 0d8779da649c42a8ee899f202764e7c784d277a8 Mon Sep 17 00:00:00 2001 From: borisvolk117 <141923951+borisvolk117@users.noreply.github.com> Date: Tue, 6 May 2025 13:52:29 +0800 Subject: [PATCH 125/180] Delhi III bus change and update internal device note for Delhi III and NEC Mate NXMA30D --- src/machine/machine_table.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/machine/machine_table.c b/src/machine/machine_table.c index bf4c7fa1b..ccffc4a03 100644 --- a/src/machine/machine_table.c +++ b/src/machine/machine_table.c @@ -14035,7 +14035,7 @@ const machine_t machines[] = { .min_multi = 1.5, .max_multi = 5.5 }, - .bus_flags = MACHINE_PS2_AGP | MACHINE_BUS_USB, + .bus_flags = MACHINE_PS2_PCI | MACHINE_BUS_USB, /* Has internal video: ATI 3D Rage IIc AGP (Rage 2) */ .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI | MACHINE_SOUND | MACHINE_USB, .ram = { .min = 8192, @@ -14860,7 +14860,7 @@ const machine_t machines[] = { .min_multi = 1.5, .max_multi = 8.0 }, - .bus_flags = MACHINE_PS2_PCI | MACHINE_BUS_USB, + .bus_flags = MACHINE_PS2_PCI | MACHINE_BUS_USB, /* Has internal video: SGS Thompson Riva 128 AGP and sound: OAK Audia 3D (OTI-610) */ .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI | MACHINE_USB, .ram = { .min = 8192, From 5b959937e3211923eddac3ae5c9e7492daf2d7b0 Mon Sep 17 00:00:00 2001 From: borisvolk117 <141923951+borisvolk117@users.noreply.github.com> Date: Tue, 6 May 2025 14:32:14 +0800 Subject: [PATCH 126/180] Update machine_table.c --- 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 ccffc4a03..e0a2cfc10 100644 --- a/src/machine/machine_table.c +++ b/src/machine/machine_table.c @@ -14860,7 +14860,7 @@ const machine_t machines[] = { .min_multi = 1.5, .max_multi = 8.0 }, - .bus_flags = MACHINE_PS2_PCI | MACHINE_BUS_USB, /* Has internal video: SGS Thompson Riva 128 AGP and sound: OAK Audia 3D (OTI-610) */ + .bus_flags = MACHINE_PS2_PCI | MACHINE_BUS_USB, /* Has internal video: SGS Thompson Riva 128 AGP, network: NEC PK-UG-X006 (Intel 82558B chip) sound: OAK Audia 3D (OTI-610) */ .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI | MACHINE_USB, .ram = { .min = 8192, From 17211e4564b92b97a1d9cca28e7c21a8b0876d1a Mon Sep 17 00:00:00 2001 From: borisvolk117 <141923951+borisvolk117@users.noreply.github.com> Date: Tue, 6 May 2025 14:32:48 +0800 Subject: [PATCH 127/180] Update machine_table.c --- 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 e0a2cfc10..032fd6483 100644 --- a/src/machine/machine_table.c +++ b/src/machine/machine_table.c @@ -14860,7 +14860,7 @@ const machine_t machines[] = { .min_multi = 1.5, .max_multi = 8.0 }, - .bus_flags = MACHINE_PS2_PCI | MACHINE_BUS_USB, /* Has internal video: SGS Thompson Riva 128 AGP, network: NEC PK-UG-X006 (Intel 82558B chip) sound: OAK Audia 3D (OTI-610) */ + .bus_flags = MACHINE_PS2_PCI | MACHINE_BUS_USB, /* Has internal video: SGS Thompson Riva 128 AGP, network: NEC PK-UG-X006 (Intel 82558B chip) and sound: OAK Audia 3D (OTI-610) */ .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI | MACHINE_USB, .ram = { .min = 8192, From c84266d41adcf90ea11d05987d4a52acaae987f8 Mon Sep 17 00:00:00 2001 From: OBattler Date: Tue, 6 May 2025 08:43:39 +0200 Subject: [PATCH 128/180] VTech Laser TX: Fix RAM step, fixes #5554. --- 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 bf4c7fa1b..a636ca3ba 100644 --- a/src/machine/machine_table.c +++ b/src/machine/machine_table.c @@ -1734,7 +1734,7 @@ const machine_t machines[] = { .ram = { .min = 256, .max = 640, - .step = 256 + .step = 64 }, .nvrmask = 0, .kbc_device = &keyboard_xt_device, From 3d233fc4b44b9881df2b03f9289862a57707d3f3 Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Tue, 6 May 2025 13:06:44 +0600 Subject: [PATCH 129/180] Use icons for the indicators --- src/qt/icons/caps_lock_off.ico | Bin 0 -> 9622 bytes src/qt/icons/caps_lock_on.ico | Bin 0 -> 9622 bytes src/qt/icons/kana_lock_off.ico | Bin 0 -> 9622 bytes src/qt/icons/kana_lock_on.ico | Bin 0 -> 9622 bytes src/qt/icons/num_lock_off.ico | Bin 0 -> 9622 bytes src/qt/icons/num_lock_on.ico | Bin 0 -> 9622 bytes src/qt/icons/scroll_lock_off.ico | Bin 0 -> 9622 bytes src/qt/icons/scroll_lock_on.ico | Bin 0 -> 9622 bytes src/qt/qt_mainwindow.cpp | 37 ++++++++++++++++++++----------- src/qt/qt_mainwindow.hpp | 3 +++ src/qt_resources.qrc | 8 +++++++ 11 files changed, 35 insertions(+), 13 deletions(-) create mode 100644 src/qt/icons/caps_lock_off.ico create mode 100644 src/qt/icons/caps_lock_on.ico create mode 100644 src/qt/icons/kana_lock_off.ico create mode 100644 src/qt/icons/kana_lock_on.ico create mode 100644 src/qt/icons/num_lock_off.ico create mode 100644 src/qt/icons/num_lock_on.ico create mode 100644 src/qt/icons/scroll_lock_off.ico create mode 100644 src/qt/icons/scroll_lock_on.ico diff --git a/src/qt/icons/caps_lock_off.ico b/src/qt/icons/caps_lock_off.ico new file mode 100644 index 0000000000000000000000000000000000000000..6895c735cf1d2d0cdc497f20bd810e9d2ef22892 GIT binary patch literal 9622 zcmZQzU}Run5D);-3Je)63=D1z3=AS75dID}28MMk3=9$y5PkOtZl8X1Gc zK=L4rOFu|G$Q}Rx|HlYRm>5V6KK=Fe^&q8KF~|*s^n?5fGXta^nGMoQ$o-V+2iXBK zqpq$F?gx-NK;j^~K{P)9gXGE857Gz2Aag)|huIC{!!R!UVS3SNkUo$Yhz4O$+5usZ z*|78rig#i$NG}MJs~=v$yhN)z5s;*85pJ90mUaJ7-T;vJYeAp3R`NK2Qt&n&h9@5!^{QI*f7XW zm^g?H!^rLfnFqq4bO^%8=@P_8#vnORo&#Z!x%kWjsR8K)*#)9ud}KCA4kQl3gv^uhGN^nuI)VQgg$$Q&5PWgbW` z%uJ9P7)BNY*$Z+vG5!UahwK)RJCQNSd{WEnkUWS6VM6W$sl|ms z`eAY)HVA|AJHGS>O4FoZka;jSg8YD;bVs@dCmiHVA|4BiDS8ThPM^#0OzqW`pz)>wb`0Y-WMPsbxOM zEOa~YnGI4;iu*z8(ai^iH@0vGsRdzD%?IfL*#U}UkhvfXvI8UzOEVxg3=g#VAh%+} zAoqd79_DrsA6XrU55k1pkE{n58)Oc;97qg=LG=fyYy)ACThPllQ2wC=gUpBdffnY2 z+y*iqglT0y%np$Gpw4n zT!Jje#8k5z8g|5*N7Hs1D6QkeAh&|z0~YU~w1rPSwdIiQ2e|>1hd>zQ4q9Mz_oLfS zYc~*MKgbQB@`{=mR9}EFEKFhUz~+B+`(foNsqR762eKQ4NwFWK9%LuTjUWu-gD^-8 zABL#`=>cI7AA~`ANURk{9nFSJqnFV5F!ytcStFu9BhnoGk{DLnGu=yRP zo>c#1vmYb|3QG`;4O7#8m_6ubg3|K+Yd6E7)&ku z$#DZVyFuoV_L2T?FZ?_<_3@$2oqyB$P8-R z4>FTp_T#dPSighxQ{sP+er$fFr~TO6Kq$?D^uREs{s)u419dAze?7y0hJ9$dL4H9u5h{jNKa%|obq)VP0BQ%!tso&V8{}80 z9KwDq`oS8|2#`KP`awRaud4^^1goz{ut9Q!+z(cROmqlV=MDO zWAVp|IYxg>A-x5X$%ZF%mbMTb0f%IAPh1StQTr8 z$Za4D79+wum>Z$$LB>Jy51Hm6yAfm<*j%VtAUTlRKo~4eg!{mHaFqXGIcNxyVjfsu z9klF6avNBjO!Gi`v0;#3K^Vn-pmG~jPk=Be&5(%kng`0mq+pockn|3V5lCGKawjM) zl7c~cKp0^XRau}kb%4SCe*=R&MHplT$ShF3CBeYJV1U#*@0|6C@zrs z_}EajAhSUjtN9>1pk|2HOdXU>xxaQV+r?@c@l~YMKwS1KB)K_@IXiNDT;s z+z!H|xF4(!8V^u?Ambrv3F;q^8W0AV4Z=`$kPspeJ|KM{4D$oXaIk(fvq5S=W`i(T z9%4G)b{|L&48!7qR_2530oeg|8y2^N<*D3G0-1@7L16>JU^l?R2h^?rwV6N|R0dIq z@tO~+11P~Tw}I*dnEOFA$PXY4N=uYrkQpEhGLsG%l-3R~F#m60V5BMrnF%r*)D8oU zQ92;C!x}&XmvrzOnN~o`4M_abgN<+|QacXRMxr&QbvqA~5Ak7;|4_;SP`-iYO?>*O zC5P31P#FYu19G`VO*YK^IPC|OF(5bKD5EKL3tsy{cEd1|{Rwdih`fL#PLx}qc?oO= zQX3Ad|6z86Xe4_;^%kf+0by{OL6XDg25kDs@jo_m@YxHK!`5aX$9|A`*vtZnoGofhrNptJ(QU^%4pLW%vzVE{6l7)(w3(Zhg{{pfas z^i$%0uzqM;8)P@gd{93J)TRevP(KKSL2@7rk_YKQ#+2F*G7BReK;sveI7kl+Q^S7b zbb#zfdf5;13%XtCe2^M!m>T{EnTs91jX6Z^&Ul$Zn8&YWg2+9$I+-62ph7Z9m8^P&^Rhcd%M$AD5K&2S^{aFfIH~ zirWa<4{8I0+FzhHD2*`84d6I~^?*SAUXa}&46>ib803b5v>&{t1=41Lg#h{UGoZc` fDHs&iAdIkiKv|%2^8f<_a{~hdBRw(5PLSOIz;P#J literal 0 HcmV?d00001 diff --git a/src/qt/icons/kana_lock_off.ico b/src/qt/icons/kana_lock_off.ico new file mode 100644 index 0000000000000000000000000000000000000000..27c9b88c25d39dde2f48fe5fbf5283fec9dd1541 GIT binary patch literal 9622 zcmZQzU}Run5D);-3Je)63=D1z3=AS75dID}28MMk3=9$y5PkEXtBnQGEaS#Tv zK^VjaVGtXHap?!yRbOBK9|k~r(D@)W`1FJ1L4E<50n(3+k550ypCAmg7i0!98)P0X z{UE=AFh~yw!`y((#-|@72eS*L7afDl0ja@dKS&OQL1rL_0f-O6AUTlxaOns68-_t@ zL3%)Tg2X_4kX{f?jDCaQ^sJ^gHrB* z;*%1L91oyy1z~EL2Z}2@JG=iN3^EslL1u$!WDF7mVVD?*4a3Op1DOZHpmYes$Y~Q< z3?vRp^B@c|mymfNbs!9~4`dFA4Z|QY5Qg!IF%M)0$gQAq0Hhb>9*`I)UxLIy7$go7 zgSibvgTz4T6Qmc0L26(aB!;XPB#tfyG6#kUnFn$gx_)#%%q$R%%RG=dFbwk}NG(VV znGbR=$Q&33sX_NIESy1dFbwlEI-eNxKx$xa0GWdegUkl0g}DtxgT&C?2T}vVpl|}2 z3!*`0g4DwJAR43w^d+4B~?@D8GZk4unB=qK6+Syhyr zP+CLApm+dIZvjEzo%XH5EeM0e(cK9W2Vs~$ zKxTpTfy{+rkQhGmLF%!Y0rLYkIhffXni%szc7QOtJ7IR9`we6+4C68%zAiF?%V0@4m2!r?_vqAnQCjEoL6&-`jfSC`H1DOY+VHjjK2oqyIx?YeOAa@cn zAEb|1^FeBnF|zr{;^=Hb=7Zdd4TH=9g%K$HLGmCzh=yShAB4#@AK4rj8<_@~4Z@)M z17G?9g##rRWIoIfAitugPfE;&=>?e&!n86UWDm@IP-_L`2N1^Ah9XA{WEKd6%x+*{ zq((ajs~I4(LG3Wm7^MSJJFEdTa0#*;6Js?86wWlpG;OEB(mO61AYc4InXOvytUt?nGBZuKghYf^c139mr@f289E<`MBHwQU}81+7Hr8$bOJK z2xD_2NIwWuVn0YfF7sjWKuDg}_TzISNRCqbL1qy0BQAN6UTWA6G6y-G5lV+Jd5}I* z?Fab<8%9rKAT=QKK{N=X%Y)=Vm=ybAX$s_iY#5vg|AXdNu+Og|%Y*C&VN&b|sYecH zn0chqAh(0e0^y-%KPWCiVStQ5aSOt*Z~*xa#79%j4pc<9}>s!NLIK4p97q)WE_R#Kwh* zwI5_Yu^40*A+;biAUx3a!`k+Q+Ml2{C@nC^eh?lg`$2vJ*$;{bkQ+d02iE@r$<8h2vLED6nEjxxI4BH2n4B>Ma`b@g0%4Hd4WMOAAjSY-klg@Xm{xlL literal 0 HcmV?d00001 diff --git a/src/qt/icons/kana_lock_on.ico b/src/qt/icons/kana_lock_on.ico new file mode 100644 index 0000000000000000000000000000000000000000..ec171b52bdab0120f9dbd1f7b9fedc2ec7e9eceb GIT binary patch literal 9622 zcmZQzU}Run5D);-3Je)63=D1z3=AS75dID}28MMk3=9$y5Pku419dAze?7y0hJ9$dVSa&`ip0mNAIbiPx`zKS0J5jPt{%n(yBp+J zkT}G01_lO@{Yd&jE@`NTm;qMzpW%N)1AI7#Jq7QQ#obwZhT@xirE?63Zb_IRL|;G>xlVf~g^u2AK&; z`)~(>(giFXA*E+fnkIx{c4L?aN{b*f(ai&;Pi$gPalGb%%tX=)%7dV^0=63}4ikfk zlVTpouQ2^6W+IiDq?!jd6G=aqk5uN8V;*w(3o;M63?|w* z=E1@ZtPuwRGMiZQK>h-m3C2j_1@b$n4g-mU)j;cZkl85d8I)E)7@96XYGD|p7vw~+ z9yEDU+=px)$V_UP2QwENjn#diavM}nfH260}S^68yMs%!XPt1W`XK02?hoR1EltG0w-0SOsZkvd<>0W zYOoRZQ&6vg(i}1d)k)N@=a9_@u|ak~!vW$4P&$L9ZM1R#Ti(Mb1~MOnG0X?$2ap}u z%m?KWY~mm>kQ@ku*r0YgiRB!qJOZUhuzR3pz}yd$LzV}*9fZN^A)$llKY;vzW(LSC zm^olQX!0;Qm>nRqK^Ux-Nb?EV0jdiIyZInLAiER9hhb1XMydNjX5lg)SsWDhAWT&F zgVG%uhPe}}A6|~Y#6f0*FjO8A!=U^HN;@D7O&`eV0;HE13^EgBHVA{*5W|uBw@BuL z!UJRn7}q!a2ZaGjAGfalKPcS6xUS(pNF7)YiTMkp2Zlj*fcyb=8`PgLIT#IcI|zf- zz&wB@d|>L4X^=@rG(;iBYd)wB zpajF*2FaH&ACTX!0;N4<3h=F(eE?`2d49@&lPYN%m9viZ2;0hb%8VL!-^ zxXcI1fiNyNQp-O@Sp(s42b6oGwP9{h+V~g#ic; zg#SVIlZvSs|D@UtQcuu+P#YN31_ZT1X@p^J0LK}m^$+PogX{)jko`2qAU6!8{opk% skop1^0+28O_5VSAAzEUP9UzRbc|cj9GV}lg19Jld10y{#$WD;m0BH0!vH$=8 literal 0 HcmV?d00001 diff --git a/src/qt/icons/num_lock_off.ico b/src/qt/icons/num_lock_off.ico new file mode 100644 index 0000000000000000000000000000000000000000..5b14da1d4c3490e38cbda89bc89a53fc493b890f GIT binary patch literal 9622 zcmZQzU}Run5D);-3Je)63=D1z3=AS75dID}28MMk3=9$y5Pk**hC$*92?_r}7-T-k&FK0;axe^155gcdAQ~nP zqH*a5sYAvfH~s(r9~`d8;^gQD*$Xp+82uoB*VosBtOwgqjDClI zD+Z@UkiRL!DCG_)J}JQ`ss!$e57(K>E=!NI%G(AR2^0@*o<7$uSS4AA~{rK{N=1*dPqb z@A&c?$Zw=zka;jSg3LhGxKzczKWL5)% z{C@@peyU)QS)h7Lf`Ng-0I7YPzzMPmE2dVxg>DX2>oHh*gVD(G3W^sHhRIQbMm8T5 z_nE=7ZuDWIhNZ`vWA7jtS*2 zkQw+e$UKlgKs2&C5Fdo8VLr0CFgD0+5C+vB_{wLH|0%&B^I?7frD;(6f)ewv=>?e& z!n86UWGBpgP-_L`2N1^Ah9XA{WEKd6%x+*{L~pZDjSn&#)D8oUQ92;C!x}&XmmteA zG1cq_#SICVrtLIXddEeB+zE;gSiFPc9+z5Lh$Gt%aswz2fiTD&w7}?oK)0XPZXm{f zkQ+ed6*V!at_5LOn8MtF&Htp>4=ZDlX>9HW*$u*!+7B`VgwgE)`2&Pu;vh934CBLS zO6`Z4gG|@e)q$#IFowASo82Hi^spb7-PE=p7U$Uf53&mzrndh zWj+QZkBq79e~{Uu_Cw~PKyd)ef1q%|hKED=gVH<TI16y_j|>~E0WAWRSYL4E_-55nkfpqKr)+(1wJk=+1F z4KcFj$RmKKL`(${UCqB><4wlL16&G;?eIpy}KI literal 0 HcmV?d00001 diff --git a/src/qt/icons/num_lock_on.ico b/src/qt/icons/num_lock_on.ico new file mode 100644 index 0000000000000000000000000000000000000000..0dd08d7ae4594ca8f076a41145181800c344c140 GIT binary patch literal 9622 zcmZQzU}Run5D);-3Je)63=D1z3=AS75dID}28MMk3=9$y5Pku419dAze?7y0hJAQ+gZzbLI#&HS>~E-V_zwbL`=DmfQ-6J3J;-`U zc# $lnYMWb1FJgZLd}0NMVBnnA99P^^O70it0TBm5~%KOp@FplJ}4j*u}ZU4Sr5 z48#UuNZ3NsABY5*0m7iPh!2C*fG|i86)-4n4lw`!-@r&32I&Fm1(h=*43P4M5nS3Z zFic>hg2RY60+O~N;Ykh~VH1hv5GWnNFsS^(RW8BQkV=Eh1gCqL3qk1umX4r#8J4CA z(J;F)%mbxGkeT?*1BES`JYMraW}>Nwxer@;2$CBt=3y%@2Zj4UalpXvzrG%`JSWF} zpfVAZe?jR1MuW_OVRGUFW+t`F1GxoeCdi#2J`9uNKDgex28`56iFq({k!h^vfy!-A zJpsa?JVGJ{nF$UDSb2bK9w-l!f?;+;(iO}^1_qFsAPg#NNWmaIAdE1Hsw_~NI>2E6 zzkxxXA`CJEWEQC2l3-w9FhFV_CvZ~L$)p-aPThr155j&5>NQZBL&l&wiQ4rXviTr3 z$PScr4oZixw2hH-k#ikkHpqMs#xNh0A3$~xYd$F7U{MP)8-%f%53&P`9&}gZsv|+_ zKxTvRU^X9D9XeFpKh(pYChiBNcM$&1@V}t}(ys%jLA3M?N}C`ImV=c*p!^F;`yh;_ z9+W0P7`dLu)y4sk z1r|Oa8srBM2IU1xFvtuL2AN3*3`)lb7?}SzFfdXTgUke(4Qhvh#wZ<-+F=c#flE60 zjZ7=>wYg{^hj1oRI}X%FqBW*f z=>fUt|NsBsFa_~J`am=Y6VhK_Uk}m>$1rz*^nx%U{UCqC%z)`7#ePcl!|aB60OSUc znIN}=Fd_GY)Q}T?AUlvT$Q>X)$UGPgV&k$Oqy`;>)WgI;Y!C*e9S{cj3zmLC?j;t3 z^nx(C`a$-<^n-FU$PFMYFE9U}7z|Pi!XUj3jG#119tPEeIT{iFi0=5IEW9zp!|+6zk&Qm3I>@6b0a8?!pbXB z%s^KQG7p5QWgf_Un0cVmALK?5CZL2(aCqaX~j2O9?2iA@|?45S8z z(ai_h0m@srFeo45k^_}RAPlmLRP#alK<0wn1EOJk5F3U;VjxVa`5-rgFsN(-m7nqKgiu6J}53h zcB5l*+z&DXly+g}gZQ}cU^5>S79dQ^@If~p6gJcfe~`OD7!>v}4B~_08Jj)igg?kU znAsp2m)RiuNHrf6HXsbM1E1N%m=7`w7Y5k@k^`9oqLDF341@`}A6XAJHpmQI;vhLt z{eiE12IV74FvxtEA3$LVYF|)d9yYxo^Ff$a=7a2nnGb5MfcyZ$*xFF!h=I%kVUXDk z42-JrN30n@ad221a_XplQW@d1l>P~78E zOAB#i`$291;_?K+YfR-2!regnGd4zVQSeA@;As{P@N3IAT~&hkQ*qqA7lpz*VWa5tVO}ZxPemp zL17E3%TX*w;(*)$QiCfTD77D--7sh1a|5OJgZu`{AE59DVPrc&e2^SS4K7Tn{h+vq zVUT^u_JhQ6*$We=)P9gTAbUU&_(?S?f}_|%?*^=4>A{@8}Qi; z(o3oR*y0}Me~{fEd2Id$*$u*!+7B`VWCsXiOMm$62I-}S{UCEd_Jc4eE28k2G z#M%!sj}#2D7oU2NJP6auetdR=H!o!t4ii#X(^J!sLu8kfR4=7YKvwZU8M~0x<>vgX{(Xr%WZ^ literal 0 HcmV?d00001 diff --git a/src/qt/icons/scroll_lock_on.ico b/src/qt/icons/scroll_lock_on.ico new file mode 100644 index 0000000000000000000000000000000000000000..33476406a5a559008e9628c0772333e9fd7b08e3 GIT binary patch literal 9622 zcmZQzU}Run5D);-3Je)63=D1z3=AS75dID}28MMk3=9$y5Pku419dAze?7y0hJ846gZzYMGFJUq>~E-R_zwbLyO7KvMn6n1NIwW8 zn?a0zkZOoo|VMU_-l2_%KKf2!r%c0fQ3A0p|bz8yHE$AUzqjvc|I?Eg0~$Ww$tW`N8B)mst_3=9TH?c)Sa8aSMI zBVlQoS~S9D3hFgbnnT8*I*Ho#9J2W!HpmW?bPh^~u(XX0IW z?EOKQ+d(wQ?I28!`)O_dPz`@jT7u zL3IEn80I!mJpl_J5DoGJ2!qOMN-)R_5C)k^2MkKj2N;D{}sMS6r)*OU0k=k*fHWIBdt=oB^e25Q&{D)EwfbtDAZ{pKOEjg_A zgUTSN8wizUQYS@p@Zjk*TjLQwwupgA3L2dxyy1F`$bzls# z6C?)0AT`)9wd{wPjokJG*$)%PMN`{;Sib-i0HgNf3U!3|a0~wdOMkF3AHDpAiQ_1T zsS*C5{0&O)_%N=#Kn?prsR^GOaM=yk2OZnSTK~i9UJ#8V{6J>FFg7>fvm2z3TK)%_ z1;WT~AY?aKJr(^AG7p47ZUA8rn-He9{|VWLEHV-HZRE{5DU|?=wU|^&t J2H6R+8vt4;^acO` literal 0 HcmV?d00001 diff --git a/src/qt/qt_mainwindow.cpp b/src/qt/qt_mainwindow.cpp index aee23b18d..905a100f4 100644 --- a/src/qt/qt_mainwindow.cpp +++ b/src/qt/qt_mainwindow.cpp @@ -187,16 +187,24 @@ MainWindow::MainWindow(QWidget *parent) ui->stackedWidget->setMouseTracking(true); statusBar()->setVisible(!hide_status_bar); + num_icon = QIcon(":/settings/qt/icons/num_lock_on.ico"); + num_icon_off = QIcon(":/settings/qt/icons/num_lock_off.ico"); + scroll_icon = QIcon(":/settings/qt/icons/scroll_lock_on.ico"); + scroll_icon_off = QIcon(":/settings/qt/icons/scroll_lock_off.ico"); + caps_icon = QIcon(":/settings/qt/icons/caps_lock_on.ico"); + caps_icon_off = QIcon(":/settings/qt/icons/caps_lock_off.ico"); + /* TODO: Add Kana indicator here after the keyboard type work is done. */ + num_label = new QLabel; - num_label->setText(" NUM "); + num_label->setPixmap(num_icon_off.pixmap(QSize(16, 16))); statusBar()->addPermanentWidget(num_label); caps_label = new QLabel; - caps_label->setText(" CAPS "); + caps_label->setPixmap(caps_icon_off.pixmap(QSize(16, 16))); statusBar()->addPermanentWidget(caps_label); scroll_label = new QLabel; - scroll_label->setText(" SCRL "); + scroll_label->setPixmap(scroll_icon_off.pixmap(QSize(16, 16))); statusBar()->addPermanentWidget(scroll_label); QTimer* ledKeyboardTimer = new QTimer(this); @@ -205,10 +213,13 @@ MainWindow::MainWindow(QWidget *parent) connect(ledKeyboardTimer, &QTimer::timeout, this, [this] () { uint8_t caps, num, scroll; keyboard_get_states(&caps, &num, &scroll); - - num_label->setStyleSheet(num ? "QLabel { background: green; }" : ""); - caps_label->setStyleSheet(caps ? "QLabel { background: green; }" : ""); - scroll_label->setStyleSheet(scroll ? "QLabel { background: green; }" : ""); + + if (num_label->isVisible()) + num_label->setPixmap(num ? this->num_icon.pixmap(QSize(16, 16)) : this->num_icon_off.pixmap(QSize(16, 16))); + if (caps_label->isVisible()) + caps_label->setPixmap(caps ? this->caps_icon.pixmap(QSize(16, 16)) : this->caps_icon_off.pixmap(QSize(16, 16))); + if (scroll_label->isVisible()) + scroll_label->setPixmap(scroll ? this->scroll_icon.pixmap(QSize(16, 16)) : this->scroll_icon_off.pixmap(QSize(16, 16))); }); ledKeyboardTimer->start(); @@ -239,9 +250,9 @@ MainWindow::MainWindow(QWidget *parent) connect(this, &MainWindow::hardResetCompleted, this, [this]() { ui->actionMCA_devices->setVisible(machine_has_bus(machine, MACHINE_BUS_MCA)); - num_label->setVisible(machine_has_bus(machine, MACHINE_AT) > 0); - scroll_label->setVisible(machine_has_bus(machine, MACHINE_AT) > 0); - caps_label->setVisible(machine_has_bus(machine, MACHINE_AT) > 0); + 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)); while (QApplication::overrideCursor()) QApplication::restoreOverrideCursor(); #ifdef USE_WACOM @@ -1485,9 +1496,9 @@ MainWindow::refreshMediaMenu() ui->actionMCA_devices->setVisible(machine_has_bus(machine, MACHINE_BUS_MCA)); ui->actionACPI_Shutdown->setEnabled(!!acpi_enabled); - num_label->setVisible(machine_has_bus(machine, MACHINE_AT) > 0); - scroll_label->setVisible(machine_has_bus(machine, MACHINE_AT) > 0); - caps_label->setVisible(machine_has_bus(machine, MACHINE_AT) > 0); + 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)); } void diff --git a/src/qt/qt_mainwindow.hpp b/src/qt/qt_mainwindow.hpp index 2ba29c128..421b9ce15 100644 --- a/src/qt/qt_mainwindow.hpp +++ b/src/qt/qt_mainwindow.hpp @@ -7,6 +7,7 @@ #include #include #include +#include #include #include @@ -191,6 +192,8 @@ private: friend class WindowsRawInputFilter; // Needed to reload renderers on style sheet changes. QLabel *caps_label, *scroll_label, *num_label; + QIcon caps_icon, scroll_icon, num_icon; + QIcon caps_icon_off, scroll_icon_off, num_icon_off; bool isShowMessage = false; }; diff --git a/src/qt_resources.qrc b/src/qt_resources.qrc index bc553ac61..a5963c152 100644 --- a/src/qt_resources.qrc +++ b/src/qt_resources.qrc @@ -34,6 +34,14 @@ qt/icons/86Box-green.ico qt/icons/86Box-red.ico qt/icons/86Box-yellow.ico + qt/icons/caps_lock_off.ico + qt/icons/caps_lock_on.ico + qt/icons/kana_lock_off.ico + qt/icons/kana_lock_on.ico + qt/icons/num_lock_off.ico + qt/icons/num_lock_on.ico + qt/icons/scroll_lock_off.ico + qt/icons/scroll_lock_on.ico qt/icons/acpi_shutdown.ico From 8508a048256944da709d68f83edc75fadffcf5e2 Mon Sep 17 00:00:00 2001 From: OBattler Date: Tue, 6 May 2025 19:06:30 +0200 Subject: [PATCH 130/180] CL-GD 54xx: Remove an excess logging line. --- src/video/vid_cl54xx.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/video/vid_cl54xx.c b/src/video/vid_cl54xx.c index 4988b3797..43c4e22b2 100644 --- a/src/video/vid_cl54xx.c +++ b/src/video/vid_cl54xx.c @@ -4141,8 +4141,6 @@ gd54xx_reset(void *priv) gd54xx_t *gd54xx = (gd54xx_t *) priv; svga_t *svga = &gd54xx->svga; - pclog("gd54xx_reset()\n"); - memset(svga->crtc, 0x00, sizeof(svga->crtc)); memset(svga->seqregs, 0x00, sizeof(svga->seqregs)); memset(svga->gdcreg, 0x00, sizeof(svga->gdcreg)); From 0c97a1f7f6060aa547cd3070b2ec17fd615b8e91 Mon Sep 17 00:00:00 2001 From: OBattler Date: Tue, 6 May 2025 19:08:16 +0200 Subject: [PATCH 131/180] Acer V60N and V62X: Tell the DRB filler the slot limits to avoid unsupported DRAM row combinations, fixes black screen on PCI graphics cards on some RAM sizes. --- src/machine/m_at_slot1.c | 1 + src/machine/m_at_socket8.c | 1 + 2 files changed, 2 insertions(+) diff --git a/src/machine/m_at_slot1.c b/src/machine/m_at_slot1.c index bd3a4833f..b2f05d33e 100644 --- a/src/machine/m_at_slot1.c +++ b/src/machine/m_at_slot1.c @@ -65,6 +65,7 @@ machine_at_acerv62x_init(const machine_t *model) device_add(&piix3_device); device_add_params(&fdc37c93x_device, (void *) (FDC37C935 | FDC37C93X_APM)); device_add(&sst_flash_29ee020_device); + spd_register(SPD_TYPE_SDRAM, 0x7, 128); return ret; } diff --git a/src/machine/m_at_socket8.c b/src/machine/m_at_socket8.c index 479c4b9fc..f604c4f01 100644 --- a/src/machine/m_at_socket8.c +++ b/src/machine/m_at_socket8.c @@ -190,6 +190,7 @@ machine_at_acerv60n_init(const machine_t *model) device_add(&piix3_device); device_add_params(&fdc37c93x_device, (void *) (FDC37C935 | FDC37C93X_NORMAL)); device_add(&sst_flash_29ee010_device); + spd_register(SPD_TYPE_SDRAM, 0x7, 128); return ret; } From 3b149759ae2cec3df911622783ebca002f86b1e1 Mon Sep 17 00:00:00 2001 From: OBattler Date: Tue, 6 May 2025 19:14:56 +0200 Subject: [PATCH 132/180] LG IBM x61: Remove some left-over commented out lines. --- src/machine/m_at_socket8.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/machine/m_at_socket8.c b/src/machine/m_at_socket8.c index f604c4f01..006e0f419 100644 --- a/src/machine/m_at_socket8.c +++ b/src/machine/m_at_socket8.c @@ -217,9 +217,7 @@ machine_at_lgibmx61_init(const machine_t *model) pci_register_slot(0x0F, PCI_CARD_NORMAL, 4, 1, 2, 3); device_add(&i440fx_device); device_add(&piix3_device); - // device_add(&keyboard_ps2_ami_pci_device); device_add(&keyboard_ps2_ami_device); - // device_add(&w83787f_device); device_add(&w83877f_president_device); device_add(&sst_flash_29ee010_device); From ef3f57b338e58e2443e2dedf4fc06e85f4937955 Mon Sep 17 00:00:00 2001 From: OBattler Date: Tue, 6 May 2025 19:26:26 +0200 Subject: [PATCH 133/180] S3 Trio32 On-Board VLB: Actually use the DEC Venturis 4xx video BIOS. --- src/video/vid_s3.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/video/vid_s3.c b/src/video/vid_s3.c index d6b91903a..595ec3a17 100644 --- a/src/video/vid_s3.c +++ b/src/video/vid_s3.c @@ -58,6 +58,7 @@ #define ROM_PHOENIX_VISION864 "roms/video/s3/86c864p.bin" #define ROM_DIAMOND_STEALTH64_964 "roms/video/s3/964_107h.rom" #define ROM_PHOENIX_TRIO32 "roms/video/s3/86c732p.bin" +#define ROM_PHOENIX_TRIO32_ONBOARD_VLB "roms/machines/dvent/Venturis466_VIDEO.BIN" #define ROM_SPEA_MIRAGE_P64 "roms/video/s3/S3_764VL_SPEAMirageP64VL_ver5_03.BIN" #define ROM_NUMBER9_9FX "roms/video/s3/s3_764.bin" #define ROM_PHOENIX_TRIO64 "roms/video/s3/86c764x1.bin" @@ -9946,7 +9947,7 @@ s3_init(const device_t *info) video_inform(VIDEO_FLAG_TYPE_SPECIAL, &timing_s3_trio32_vlb); break; case S3_PHOENIX_TRIO32_ONBOARD: - bios_fn = NULL; + bios_fn = ROM_PHOENIX_TRIO32_ONBOARD_VLB; chip = S3_TRIO32; if (info->flags & DEVICE_PCI) video_inform(VIDEO_FLAG_TYPE_SPECIAL, &timing_s3_trio32_pci); From 93025cc1156f7cb5c7d9121a15003e45aab28e13 Mon Sep 17 00:00:00 2001 From: OBattler Date: Tue, 6 May 2025 19:29:30 +0200 Subject: [PATCH 134/180] SM(S)C FDC 37c6xx: Return 0xFF on out of bound register read, fixes segmentation fault on the DEC Venturis 4xx. --- src/sio/sio_fdc37c6xx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sio/sio_fdc37c6xx.c b/src/sio/sio_fdc37c6xx.c index 0f3460565..3afd92e4c 100644 --- a/src/sio/sio_fdc37c6xx.c +++ b/src/sio/sio_fdc37c6xx.c @@ -232,7 +232,7 @@ fdc37c6xx_read(uint16_t port, void *priv) uint8_t ret = 0xff; if (dev->tries == 2) { - if (port == 0x3f1) + if ((port == 0x3f1) && (dev->cur_reg <= dev->max_reg)) ret = dev->regs[dev->cur_reg]; } From 4a417da09bc5bdc80e463da3750a71261d560575 Mon Sep 17 00:00:00 2001 From: OBattler Date: Tue, 6 May 2025 19:34:14 +0200 Subject: [PATCH 135/180] S3: Revert the video BIOS change, it was not necessary. --- src/video/vid_s3.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/video/vid_s3.c b/src/video/vid_s3.c index 595ec3a17..d6b91903a 100644 --- a/src/video/vid_s3.c +++ b/src/video/vid_s3.c @@ -58,7 +58,6 @@ #define ROM_PHOENIX_VISION864 "roms/video/s3/86c864p.bin" #define ROM_DIAMOND_STEALTH64_964 "roms/video/s3/964_107h.rom" #define ROM_PHOENIX_TRIO32 "roms/video/s3/86c732p.bin" -#define ROM_PHOENIX_TRIO32_ONBOARD_VLB "roms/machines/dvent/Venturis466_VIDEO.BIN" #define ROM_SPEA_MIRAGE_P64 "roms/video/s3/S3_764VL_SPEAMirageP64VL_ver5_03.BIN" #define ROM_NUMBER9_9FX "roms/video/s3/s3_764.bin" #define ROM_PHOENIX_TRIO64 "roms/video/s3/86c764x1.bin" @@ -9947,7 +9946,7 @@ s3_init(const device_t *info) video_inform(VIDEO_FLAG_TYPE_SPECIAL, &timing_s3_trio32_vlb); break; case S3_PHOENIX_TRIO32_ONBOARD: - bios_fn = ROM_PHOENIX_TRIO32_ONBOARD_VLB; + bios_fn = NULL; chip = S3_TRIO32; if (info->flags & DEVICE_PCI) video_inform(VIDEO_FLAG_TYPE_SPECIAL, &timing_s3_trio32_pci); From d27bd54bfae36b17a843189fed6ce9601e053e2d Mon Sep 17 00:00:00 2001 From: OBattler Date: Tue, 6 May 2025 19:48:50 +0200 Subject: [PATCH 136/180] SiS 85c4xx: Gate two 471-specific changes in a 471 check, fixes the SiS 461 DECpc machine. --- src/chipset/sis_85c4xx.c | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/src/chipset/sis_85c4xx.c b/src/chipset/sis_85c4xx.c index 1c1e0614b..f715c5272 100644 --- a/src/chipset/sis_85c4xx.c +++ b/src/chipset/sis_85c4xx.c @@ -595,12 +595,14 @@ sis_85c4xx_out(uint16_t port, uint8_t val, void *priv) switch (rel_reg) { case 0x00: - if (val & 0x01) { - kbc_at_set_fast_reset(0); - cpu_cpurst_on_sr = 1; - } else { - kbc_at_set_fast_reset(1); - cpu_cpurst_on_sr = 0; + if (dev->is_471) { + if (val & 0x01) { + kbc_at_set_fast_reset(0); + cpu_cpurst_on_sr = 1; + } else { + kbc_at_set_fast_reset(1); + cpu_cpurst_on_sr = 0; + } } break; @@ -614,7 +616,7 @@ sis_85c4xx_out(uint16_t port, uint8_t val, void *priv) case 0x08: if (valxor) sis_85c4xx_recalcmapping(dev); - if (rel_reg == 0x08) + if ((rel_reg == 0x08) && dev->is_471) flushmmucache(); break; From bb7454120a71295a49d5b6298f35261946444441 Mon Sep 17 00:00:00 2001 From: OBattler Date: Tue, 6 May 2025 19:58:43 +0200 Subject: [PATCH 137/180] TriGem Delhi-III: Rename to eMachines eTower 3xxc. --- 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 6223f1eb7..47320e6fe 100644 --- a/src/machine/machine_table.c +++ b/src/machine/machine_table.c @@ -14016,7 +14016,7 @@ const machine_t machines[] = { /* Has the VIA VT82C596A southbridge with on-chip KBC identical to the VIA VT82C42N. */ { - .name = "[VIA MVP3] TriGem Delhi-III", + .name = "[VIA MVP3] eMachines eTower 3xxc", .internal_name = "delhi3", .type = MACHINE_TYPE_SOCKETS7, .chipset = MACHINE_CHIPSET_VIA_APOLLO_MVP3, From 1b1d6bcf458f8629937ac065abe0a0b8f107be4d Mon Sep 17 00:00:00 2001 From: TC1995 Date: Tue, 6 May 2025 20:17:23 +0200 Subject: [PATCH 138/180] Some cleanup to the recent fixes on the S3 code (May 6th, 2025) See above. --- src/video/vid_s3.c | 114 ++++++++++++++++++++++++++++----------------- 1 file changed, 71 insertions(+), 43 deletions(-) diff --git a/src/video/vid_s3.c b/src/video/vid_s3.c index d6b91903a..6897aed60 100644 --- a/src/video/vid_s3.c +++ b/src/video/vid_s3.c @@ -288,9 +288,11 @@ typedef struct s3_t { int color_16bit_check; int color_16bit_check_pixtrans; int16_t minus; + int16_t minus_src_24bpp; int rd_mask_16bit_check; int start; int mix_dat_upper; + int overflow; /*For non-threaded FIFO*/ int setup_fifo_slot; @@ -661,13 +663,15 @@ s3_accel_out_pixtrans_w(s3_t *s3, uint16_t val) s3->accel_start(16, 1, val | (val << 16), 0, s3); } else { - if ((s3->accel.cmd == 0x53f1) || (s3->accel.cmd == 0x53b1)) { - if (s3->accel.cur_x & 0x400) + if (s3->accel.rd_mask_16bit_check) { + if ((s3->accel.cmd == 0x53f1) || (s3->accel.cmd == 0x53b1)) { + if (s3->accel.cur_x & 0x400) + val = (val >> 8) | (val << 8); + + s3->accel_start(2, 1, 0xffffffff, val | (val << 16), s3); + val = (val >> 8) | (val << 8); - - s3->accel_start(2, 1, 0xffffffff, val | (val << 16), s3); - - val = (val >> 8) | (val << 8); + } } s3->accel_start(2, 1, 0xffffffff, val | (val << 16), s3); } @@ -803,6 +807,7 @@ s3_accel_out_fifo(s3_t *s3, uint16_t port, uint8_t val) case 0x82e9: s3->accel.cur_y = (s3->accel.cur_y & 0xff) | ((val & 0x0f) << 8); s3->accel.poly_cy = s3->accel.cur_y; + s3_log("[%04X:%08X] OUT PORTB=%04x, valy=%d.\n", CS, cpu_state.pc, port - 1, s3->accel.cur_y); break; case 0x814a: case 0x82ea: @@ -828,7 +833,7 @@ s3_accel_out_fifo(s3_t *s3, uint16_t port, uint8_t val) s3->accel.cur_x_overflow = (s3->accel.cur_x_overflow & 0xff) | (val << 8); s3->accel.poly_cx = s3->accel.poly_x = s3->accel.cur_x << 20; s3->accel.poly_x = s3->accel.poly_cx >> 20; - s3_log("[%04X:%08X] OUT PORTB=%04x, val=%04x.\n", CS, cpu_state.pc, port - 1, s3->accel.cur_x); + s3_log("[%04X:%08X] OUT PORTB=%04x, valx=%d, valxover=%d.\n", CS, cpu_state.pc, port - 1, s3->accel.cur_x, s3->accel.cur_x_overflow); break; case 0x854a: case 0x86ea: @@ -921,6 +926,7 @@ s3_accel_out_fifo(s3_t *s3, uint16_t port, uint8_t val) case 0x9459: case 0x96e9: s3->accel.maj_axis_pcnt = (s3->accel.maj_axis_pcnt & 0xff) | ((val & 0x0f) << 8); + s3_log("[%04X:%08X] OUT PORTB=%04x, valmajx=%d.\n", CS, cpu_state.pc, port - 1, s3->accel.maj_axis_pcnt); break; case 0x954a: case 0x96ea: @@ -2965,7 +2971,7 @@ s3_out(uint16_t addr, uint8_t val, void *priv) break; case 0x40: - s3->enable_8514 = (val & 0x01); + s3->enable_8514 = val & 0x01; break; case 0x50: @@ -5798,18 +5804,20 @@ s3_accel_in_w(uint16_t port, void *priv) s3->accel_start(8, 1, temp | (temp << 16), 0, s3); } else { if ((s3->bpp == 0) && s3->color_16bit) { - if (s3->accel.cur_x & 0x400) - temp = ((temp >> 8) | (temp << 8)) & 0xffff; - + if (s3->accel.rd_mask_16bit_check) { + if (s3->accel.cur_x & 0x400) + temp = (temp >> 8) | (temp << 8); + } s3->accel_start(2, 1, 0xffffffff, temp | (temp << 16), s3); } else s3->accel_start(1, 1, 0xffffffff, temp | (temp << 16), s3); } } else { if ((s3->bpp == 0) && s3->color_16bit) { - if (s3->accel.cur_x & 0x400) - temp = ((temp >> 8) | (temp << 8)) & 0xffff; - + if (s3->accel.rd_mask_16bit_check) { + if (s3->accel.cur_x & 0x400) + temp = (temp >> 8) | (temp << 8); + } s3->accel_start(2, 1, 0xffffffff, temp | (temp << 16), s3); } else s3->accel_start(1, 1, 0xffffffff, temp | (temp << 16), s3); @@ -8021,18 +8029,30 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi case 1: /*Draw line*/ if (!cpu_input) { + s3->accel.rd_mask_16bit_check = 0; s3->accel.minus = 0; s3->accel.color_16bit_check_pixtrans = 0; s3->accel.cx = s3->accel.cur_x & 0xfff; s3->accel.cy = s3->accel.cur_y & 0xfff; - s3->accel.sy = s3->accel.maj_axis_pcnt; - if ((s3->bpp == 0) && s3->color_16bit) - s3->accel.rd_mask_16bit_check = ((rd_mask & 0xff00) != 0xff00); - else - s3->accel.rd_mask_16bit_check = 0; - if ((s3->bpp == 0) && s3->color_16bit && (s3->accel.cur_x & 0x400) && s3->accel.rd_mask_16bit_check) - s3->accel.minus = 0x400; + s3->accel.sy = s3->accel.maj_axis_pcnt; + if ((s3->bpp == 0) && s3->color_16bit) { + s3->accel.rd_mask_16bit_check = ((rd_mask & 0xff00) != 0xff00); + if (s3->accel.rd_mask_16bit_check) { + if ((s3->accel.cur_x_overflow & 0xc00) == 0xc00) + s3->accel.start = 1; + else { + if (s3->accel.start) { + s3->accel.start = 0; + s3->accel.minus = 0x400; + } else { + s3->accel.start = 0; + if (s3->accel.cur_x_overflow & 0x400) + s3->accel.minus = 0x400; + } + } + } + } if (s3_cpu_src(s3)) return; /*Wait for data from CPU*/ @@ -8041,7 +8061,7 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi if (s3->accel.cmd & 0x08) { /*Radial*/ if ((s3->bpp == 0) && s3->color_16bit) { if (s3->accel.rd_mask_16bit_check) { - if (s3->accel.cur_x & 0x400) { + if (s3->accel.minus) { wrt_mask = (s3->accel.wrt_mask_actual[1] << 8); frgd_color = (s3->accel.frgd_color_actual[1] << 8); bkgd_color = (s3->accel.bkgd_color_actual[1] << 8); @@ -8108,11 +8128,11 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi cpu_dat >>= 16; if (!s3->accel.sy) { - if ((s3->bpp == 0) && s3->color_16bit) { - if (!(s3->accel.cur_x & 0x400)) - s3->accel.color_16bit_check = 1; - else + if (s3->accel.rd_mask_16bit_check) { + if (s3->accel.minus) s3->accel.color_16bit_check = 0; + else + s3->accel.color_16bit_check = 1; } break; } @@ -8162,7 +8182,7 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi s3->accel.temp_cnt = 16; if ((s3->bpp == 0) && s3->color_16bit) { if (s3->accel.rd_mask_16bit_check) { - if (s3->accel.cur_x & 0x400) { + if (s3->accel.minus) { wrt_mask = (s3->accel.wrt_mask_actual[1] << 8); frgd_color = (s3->accel.frgd_color_actual[1] << 8); bkgd_color = (s3->accel.bkgd_color_actual[1] << 8); @@ -8178,7 +8198,7 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi } else { if ((s3->bpp == 0) && s3->color_16bit) { if (s3->accel.rd_mask_16bit_check) { - if (s3->accel.cur_x & 0x400) { + if (s3->accel.minus) { wrt_mask = (s3->accel.wrt_mask_actual[1] << 8); frgd_color = (s3->accel.frgd_color_actual[1] << 8); bkgd_color = (s3->accel.bkgd_color_actual[1] << 8); @@ -8193,12 +8213,18 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi } } - while (count-- && s3->accel.sy >= 0) { + if (!s3->accel.b2e8_pix) + s3_log("CMDFULL=%04x, FRGDMIX=%x, FRGDCOLR=%04x, RDMASK=%04x, MINUS=%d, WRTMASK=%04X, MIX=%04x, CX=%d, CY=%d, SX=%d, SY=%d, PIXCNTL=%02x, 16BITCOLOR=%x, RDCHECK=%x, CLIPL=%d, CLIPR=%d, CLIPT=%d, CLIPB=%d.\n", s3->accel.cmd, frgd_mix, s3->accel.frgd_color, rd_mask, s3->accel.minus, wrt_mask, mix_dat & 0xffff, s3->accel.cx, s3->accel.cy, s3->accel.sx, s3->accel.sy, s3->accel.multifunc[0x0a] & 0xc4, s3->accel.color_16bit_check, s3->accel.rd_mask_16bit_check, clip_l, clip_r, clip_t, clip_b); + + while (count-- && (s3->accel.sy >= 0)) { if (s3->accel.b2e8_pix && s3_cpu_src(s3) && !s3->accel.temp_cnt) { mix_dat >>= 16; s3->accel.temp_cnt = 16; } + if (s3->accel.minus) + s3_log("Total pixel cx=%d, cy=%d.\n", s3->accel.cx - s3->accel.minus, s3->accel.cy); + if ((s3->accel.cx & 0xfff) >= clip_l && (s3->accel.cx & 0xfff) <= clip_r && (s3->accel.cy & 0xfff) >= clip_t && (s3->accel.cy & 0xfff) <= clip_b) { switch ((mix_dat & mix_mask) ? frgd_mix : bkgd_mix) { case 0: @@ -8260,11 +8286,11 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi cpu_dat >>= 16; if (!s3->accel.sy) { - if ((s3->bpp == 0) && s3->color_16bit) { - if (!(s3->accel.cur_x & 0x400)) - s3->accel.color_16bit_check = 1; - else + if (s3->accel.rd_mask_16bit_check) { + if (s3->accel.minus) s3->accel.color_16bit_check = 0; + else + s3->accel.color_16bit_check = 1; } break; } @@ -8358,7 +8384,7 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi } } else { if (s3->accel.cmd & 0x100) { - if (!(s3->accel.cmd & 0x200)) { + if (mix_mask == 0x80) { if (s3->accel.cur_x & 0x400) s3->accel.minus = 0x400; else @@ -8458,8 +8484,7 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi } } - if (s3->accel.mix_dat_upper) - s3_log("CMDFULL=%04x, FRGDMIX=%x, BKGDCOLR=%04x, RDMASK=%04x, MINUS=%d, WRTMASK=%04X, MIX=%04x, CX=%d, CY=%d, SX=%d, SY=%d, PIXCNTL=%02x, 16BITCOLOR=%x, RDCHECK=%x, OVERFLOW=%d.\n", s3->accel.cmd, s3->accel.frgd_mix & 0x0f, s3->accel.bkgd_color, rd_mask, s3->accel.minus, wrt_mask, mix_dat & 0xffff, s3->accel.cx, s3->accel.cy, s3->accel.sx, s3->accel.sy, s3->accel.multifunc[0x0a] & 0xc4, s3->accel.color_16bit_check, s3->accel.rd_mask_16bit_check, (s3->accel.cur_x_overflow & 0xc00) == 0xc00); + s3_log("CMDFULL=%04x, FRGDSEL=%x, BKGDSEL=%x, FRGDMIX=%02x, BKGDMIX=%02x, MASKCHECK=%x, RDMASK=%04x, MINUS=%d, WRTMASK=%04X, MIX=%04x, CX=%d, CY=%d, DX=%d, DY=%d, SX=%d, SY=%d, PIXCNTL=%02x, 16BITCOLOR=%x, RDCHECK=%x, CLIPL=%d, CLIPR=%d, OVERFLOW=%d, pitch=%d.\n", s3->accel.cmd, frgd_mix, bkgd_mix, s3->accel.frgd_mix & 0x0f, s3->accel.bkgd_mix & 0x0f, s3->accel.rd_mask_16bit_check, rd_mask, s3->accel.minus, wrt_mask, mix_dat & 0xffff, s3->accel.cx, s3->accel.cy, s3->accel.dx, s3->accel.dy, s3->accel.sx, s3->accel.sy, s3->accel.multifunc[0x0a] & 0xc4, s3->accel.color_16bit_check, s3->accel.rd_mask_16bit_check, clip_l, clip_r, (s3->accel.destx_overflow & 0xc00) == 0xc00, s3->width); while (count-- && (s3->accel.sy >= 0)) { if (s3->accel.b2e8_pix && s3_cpu_src(s3) && !s3->accel.temp_cnt) { @@ -8716,16 +8741,20 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi case 6: /*BitBlt*/ if (!cpu_input) { /*!cpu_input is trigger to start operation*/ s3->accel.minus = 0; + s3->accel.minus_src_24bpp = 0; s3->accel.sx = s3->accel.maj_axis_pcnt & 0xfff; s3->accel.sy = s3->accel.multifunc[0] & 0xfff; s3->accel.dx = s3->accel.destx_distp & 0xfff; s3->accel.dy = s3->accel.desty_axstp & 0xfff; + s3->accel.cx = s3->accel.cur_x & 0xfff; + s3->accel.cy = s3->accel.cur_y & 0xfff; + if ((s3->bpp == 0) && s3->color_16bit) { s3->accel.rd_mask_16bit_check = ((rd_mask & 0xff00) != 0xff00); if (s3->accel.rd_mask_16bit_check) { - if (!(s3->accel.cmd & 0x40) && !(clip_r & 0x400)) + if (!(clip_r & 0x400)) s3->accel.start = 1; else { if (s3->accel.start) { @@ -8745,10 +8774,6 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi } else { s3_log("BitBLT + 0 FULLCMD=%04x: frgdcolor=%04x, s=%d,%d, d=%d,%d, frmix=%x, bkmix=%x, pixcntl=%02x.\n", s3->accel.cmd, frgd_color, s3->accel.sx, s3->accel.sy, s3->accel.dx, s3->accel.dy, frgd_mix, bkgd_mix, s3->accel.multifunc[0xa] & 0xc0); } - - s3->accel.cx = s3->accel.cur_x & 0xfff; - s3->accel.cy = s3->accel.cur_y & 0xfff; - s3->accel.src = srcbase + s3->accel.cy * s3->width; s3->accel.dest = dstbase + s3->accel.dy * s3->width; s3_log("BitBLT: D(%d,%d).\n", s3->accel.dx, s3->accel.dy); @@ -8773,10 +8798,11 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi break; } - if (!vram_mask && (frgd_mix == 3)) - s3_log("CMDFULL=%04x, FRGDMIX=%x, BKGDMIX=%x, RDMASK=%04x, MINUS=%d, WRTMASK=%04X, MIX=%04x, CX=%d, CY=%d, DX=%d, DY=%d, SX=%d, SY=%d, PIXCNTL=%02x, 16BITCOLOR=%x, RDCHECK=%x, CLIPL=%d, CLIPR=%d, OVERFLOW=%d.\n", s3->accel.cmd, frgd_mix, bkgd_mix, rd_mask, s3->accel.minus, wrt_mask, mix_dat & 0xffff, s3->accel.cx, s3->accel.cy, s3->accel.dx, s3->accel.dy, s3->accel.sx, s3->accel.sy, s3->accel.multifunc[0x0a] & 0xc4, s3->accel.color_16bit_check, s3->accel.rd_mask_16bit_check, clip_l, clip_r, (s3->accel.destx_overflow & 0xc00) == 0xc00); + s3_log("CMDFULL=%04x, FRGDSEL=%x, BKGDSEL=%x, FRGDMIX=%02x, BKGDMIX=%02x, MASKCHECK=%x, RDMASK=%04x, MINUS=%d, WRTMASK=%04X, MIX=%04x, CX=%d, CY=%d, DX=%d, DY=%d, SX=%d, SY=%d, PIXCNTL=%02x, 16BITCOLOR=%x, RDCHECK=%x, CLIPL=%d, CLIPR=%d, OVERFLOW=%d, pitch=%d.\n", s3->accel.cmd, frgd_mix, bkgd_mix, s3->accel.frgd_mix & 0x0f, s3->accel.bkgd_mix & 0x0f, s3->accel.rd_mask_16bit_check, rd_mask, s3->accel.minus, wrt_mask, mix_dat & 0xffff, s3->accel.cx, s3->accel.cy, s3->accel.dx, s3->accel.dy, s3->accel.sx, s3->accel.sy, s3->accel.multifunc[0x0a] & 0xc4, s3->accel.color_16bit_check, s3->accel.rd_mask_16bit_check, clip_l, clip_r, (s3->accel.destx_overflow & 0xc00) == 0xc00, s3->width); if (!cpu_input && (frgd_mix == 3) && !vram_mask && !(s3->accel.multifunc[0xe] & 0x100) && ((s3->accel.cmd & 0xa0) == 0xa0) && ((s3->accel.frgd_mix & 0xf) == 7) && ((s3->accel.bkgd_mix & 0xf) == 7)) { + s3_log("Special BitBLT.\n"); + while (1) { if ((s3->accel.dx >= clip_l) && (s3->accel.dx <= clip_r) && (s3->accel.dy >= clip_t) && (s3->accel.dy <= clip_b)) { READ(s3->accel.src + s3->accel.cx - s3->accel.minus, src_dat); @@ -8820,6 +8846,7 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi } } } else { + s3_log("Normal blit.\n"); while (count-- && (s3->accel.sy >= 0)) { if ((s3->accel.dx >= clip_l) && (s3->accel.dx <= clip_r) && (s3->accel.dy >= clip_t) && (s3->accel.dy <= clip_b)) { if (vram_mask && (s3->accel.cmd & 0x10)) { @@ -8912,6 +8939,7 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi s3->accel.cy--; s3->accel.dy--; } + s3->accel.src = srcbase + s3->accel.cy * s3->width; s3->accel.dest = dstbase + s3->accel.dy * s3->width; From 477956d74328c7ff16a2aafe41e8ad825806bc8b Mon Sep 17 00:00:00 2001 From: OBattler Date: Wed, 7 May 2025 01:08:02 +0200 Subject: [PATCH 139/180] QT: Rework light/dark mode switches, fixes #5560. --- src/qt/qt_winrawinputfilter.cpp | 54 ++++++++++++++++++--------------- 1 file changed, 29 insertions(+), 25 deletions(-) diff --git a/src/qt/qt_winrawinputfilter.cpp b/src/qt/qt_winrawinputfilter.cpp index 306da575f..e94101a77 100644 --- a/src/qt/qt_winrawinputfilter.cpp +++ b/src/qt/qt_winrawinputfilter.cpp @@ -64,6 +64,8 @@ extern void win_keyboard_handle(uint32_t scancode, int up, int e0, int e1); #include "qt_rendererstack.hpp" #include "ui_qt_mainwindow.h" +static bool NewDarkMode = FALSE; + bool windows_is_light_theme() { // based on https://stackoverflow.com/questions/51334674/how-to-detect-windows-10-light-dark-mode-in-win32-application @@ -220,6 +222,14 @@ WindowsRawInputFilter::nativeEventFilter(const QByteArray &eventType, void *mess if ((((void *) msg->lParam) != nullptr) && (wcscmp(L"ImmersiveColorSet", (wchar_t*)msg->lParam) == 0)) { + bool OldDarkMode = NewDarkMode; +#if 0 + if (do_auto_pause && !dopause) { + auto_paused = 1; + plat_pause(1); + } +#endif + if (!windows_is_light_theme()) { QFile f(":qdarkstyle/dark/darkstyle.qss"); @@ -228,45 +238,39 @@ WindowsRawInputFilter::nativeEventFilter(const QByteArray &eventType, void *mess else { f.open(QFile::ReadOnly | QFile::Text); QTextStream ts(&f); - qApp->setStyleSheet(ts.readAll()); + qApp->setStyleSheet(ts.readAll()); } - QTimer::singleShot(1000, [this] () { - BOOL DarkMode = TRUE; - auto vid_stack = (RendererStack::Renderer) vid_api; - DwmSetWindowAttribute((HWND) window->winId(), - DWMWA_USE_IMMERSIVE_DARK_MODE, - (LPCVOID) &DarkMode, - sizeof(DarkMode)); - window->ui->stackedWidget->switchRenderer(vid_stack); - for (int i = 1; i < MONITORS_NUM; i++) { - if ((window->renderers[i] != nullptr) && - !window->renderers[i]->isHidden()) - window->renderers[i]->switchRenderer(vid_stack); - } - }); + NewDarkMode = TRUE; } else { qApp->setStyleSheet(""); - QTimer::singleShot(1000, [this] () { - BOOL DarkMode = FALSE; - DwmSetWindowAttribute((HWND) window->winId(), - DWMWA_USE_IMMERSIVE_DARK_MODE, - (LPCVOID) &DarkMode, - sizeof(DarkMode)); - }); + NewDarkMode = FALSE; } - QTimer::singleShot(1000, [this] () { + if (NewDarkMode != OldDarkMode) QTimer::singleShot(1000, [this] () { + BOOL DarkMode = NewDarkMode; + DwmSetWindowAttribute((HWND) window->winId(), + DWMWA_USE_IMMERSIVE_DARK_MODE, + (LPCVOID) &DarkMode, + sizeof(DarkMode)); + window->resizeContents(monitors[0].mon_scrnsz_x, monitors[0].mon_scrnsz_y); + for (int i = 1; i < MONITORS_NUM; i++) { auto mon = &(monitors[i]); if ((window->renderers[i] != nullptr) && !window->renderers[i]->isHidden()) window->resizeContentsMonitor(mon->mon_scrnsz_x, - mon->mon_scrnsz_y, - i); + mon->mon_scrnsz_y, i); } + +#if 0 + if (auto_paused) { + plat_pause(0); + auto_paused = 0; + } +#endif }); } break; From a48f9bc7ba2410376a6bc4afc16675e14ce98bc2 Mon Sep 17 00:00:00 2001 From: OBattler Date: Wed, 7 May 2025 01:54:34 +0200 Subject: [PATCH 140/180] Implement the Kana lock LED for AX machines. --- src/device/keyboard.c | 11 ++++++++--- src/device/keyboard_at.c | 10 +++++----- src/device/keyboard_xt.c | 2 +- src/include/86box/keyboard.h | 4 ++-- src/include/86box/machine.h | 2 +- src/machine/machine_table.c | 2 +- src/qt/qt_mainwindow.cpp | 23 +++++++++++++++++++---- src/qt/qt_mainwindow.hpp | 6 +++--- 8 files changed, 40 insertions(+), 20 deletions(-) diff --git a/src/device/keyboard.c b/src/device/keyboard.c index 30b6f53a8..800e7fb8e 100644 --- a/src/device/keyboard.c +++ b/src/device/keyboard.c @@ -67,6 +67,7 @@ static scancode *scan_table; /* scancode table for keyboard */ static volatile uint8_t caps_lock = 0; static volatile uint8_t num_lock = 0; static volatile uint8_t scroll_lock = 0; +static volatile uint8_t kana_lock = 0; static uint8_t shift = 0; static int key5576mode = 0; @@ -108,6 +109,7 @@ keyboard_init(void) num_lock = 0; caps_lock = 0; scroll_lock = 0; + kana_lock = 0; shift = 0; memset(recv_key, 0x00, sizeof(recv_key)); @@ -370,11 +372,12 @@ keyboard_do_break(uint16_t scan) Caps Lock, Num Lock, and Scroll Lock when receving the "Set keyboard LEDs" command. */ void -keyboard_update_states(uint8_t cl, uint8_t nl, uint8_t sl) +keyboard_update_states(uint8_t cl, uint8_t nl, uint8_t sl, uint8_t kl) { caps_lock = cl; num_lock = nl; scroll_lock = sl; + kana_lock = kl; } uint8_t @@ -384,7 +387,7 @@ keyboard_get_shift(void) } void -keyboard_get_states(uint8_t *cl, uint8_t *nl, uint8_t *sl) +keyboard_get_states(uint8_t *cl, uint8_t *nl, uint8_t *sl, uint8_t *kl) { if (cl) *cl = caps_lock; @@ -392,6 +395,8 @@ keyboard_get_states(uint8_t *cl, uint8_t *nl, uint8_t *sl) *nl = num_lock; if (sl) *sl = scroll_lock; + if (kl) + *kl = kana_lock; } /* Called by the UI to update the states of Caps Lock, Num Lock, and Scroll Lock. */ @@ -435,7 +440,7 @@ keyboard_set_states(uint8_t cl, uint8_t nl, uint8_t sl) } } - keyboard_update_states(cl, nl, sl); + keyboard_update_states(cl, nl, sl, kana_lock); } int diff --git a/src/device/keyboard_at.c b/src/device/keyboard_at.c index 605f51e90..fbf167e3f 100644 --- a/src/device/keyboard_at.c +++ b/src/device/keyboard_at.c @@ -3276,7 +3276,7 @@ add_data_kbd(uint16_t val) dev->ignore = 1; - keyboard_get_states(NULL, &num_lock, NULL); + keyboard_get_states(NULL, &num_lock, NULL, NULL); shift_states = keyboard_get_shift() & STATE_SHIFT_MASK; switch (val) { @@ -3476,7 +3476,7 @@ keyboard_at_bat(void *priv) keyboard_scan = 1; - keyboard_update_states(0, 0, 0); + keyboard_update_states(0, 0, 0, 0); kbc_at_dev_queue_add(dev, 0xaa, 0); } else { bat_counter--; @@ -3511,7 +3511,7 @@ keyboard_at_write(void *priv) switch (dev->command) { case 0xed: /* Set/reset LEDs */ kbc_at_dev_queue_add(dev, 0xfa, 0); - keyboard_update_states(!!(val & 0x4), !!(val & 0x2), val & 0x1); + keyboard_update_states(!!(val & 0x4), !!(val & 0x2), val & 0x1, !!(val & 0x8)); keyboard_at_log("%s: Set/reset LEDs [%02X]\n", dev->name, val); break; @@ -3769,7 +3769,7 @@ keyboard_at_init(const device_t *info) keyboard_send = add_data_kbd; SavedKbd = dev; - keyboard_update_states(0, 0, 0); + keyboard_update_states(0, 0, 0, 0); inv_cmd_response = (dev->type & FLAG_PS2) ? 0xfe : 0xfa; @@ -3788,7 +3788,7 @@ keyboard_at_close(void *priv) /* Disable the scancode maps. */ keyboard_set_table(NULL); - keyboard_update_states(0, 0, 0); + keyboard_update_states(0, 0, 0, 0); SavedKbd = NULL; diff --git a/src/device/keyboard_xt.c b/src/device/keyboard_xt.c index bafc80d88..7e419b39d 100644 --- a/src/device/keyboard_xt.c +++ b/src/device/keyboard_xt.c @@ -742,7 +742,7 @@ kbd_adddata_process(uint16_t val, void (*adddata)(uint16_t val)) if (!adddata) return; - keyboard_get_states(NULL, &num_lock, NULL); + keyboard_get_states(NULL, &num_lock, NULL, NULL); shift_states = keyboard_get_shift() & STATE_LSHIFT; if (is_amstrad) diff --git a/src/include/86box/keyboard.h b/src/include/86box/keyboard.h index 024b16169..f62896106 100644 --- a/src/include/86box/keyboard.h +++ b/src/include/86box/keyboard.h @@ -271,9 +271,9 @@ extern void keyboard_process(void); extern uint16_t keyboard_convert(int ch); extern void keyboard_input(int down, uint16_t scan); extern void keyboard_all_up(void); -extern void keyboard_update_states(uint8_t cl, uint8_t nl, uint8_t sl); +extern void keyboard_update_states(uint8_t cl, uint8_t nl, uint8_t sl, uint8_t kl); extern uint8_t keyboard_get_shift(void); -extern void keyboard_get_states(uint8_t *cl, uint8_t *nl, uint8_t *sl); +extern void keyboard_get_states(uint8_t *cl, uint8_t *nl, uint8_t *sl, uint8_t *kl); extern void keyboard_set_states(uint8_t cl, uint8_t nl, uint8_t sl); extern int keyboard_recv(uint16_t key); extern int keyboard_recv_ui(uint16_t key); diff --git a/src/include/86box/machine.h b/src/include/86box/machine.h index fb979172c..d8c213d53 100644 --- a/src/include/86box/machine.h +++ b/src/include/86box/machine.h @@ -101,7 +101,7 @@ #define MACHINE_GAMEPORT 0x00008000 /* sys has int game port */ #define MACHINE_SOUND 0x00010000 /* sys has int sound */ #define MACHINE_NIC 0x00020000 /* sys has int NIC */ -#define MACHINE_MODEM 0x00040000 /* sys has int modem */ +#define MACHINE_AX 0x00040000 /* sys adheres to Japanese AX standard */ /* Feature flags for advanced devices. */ #define MACHINE_APM 0x00080000 /* sys has APM */ #define MACHINE_ACPI 0x00100000 /* sys has ACPI */ diff --git a/src/machine/machine_table.c b/src/machine/machine_table.c index 47320e6fe..7e0ae8d64 100644 --- a/src/machine/machine_table.c +++ b/src/machine/machine_table.c @@ -4804,7 +4804,7 @@ const machine_t machines[] = { .max_multi = 0 }, .bus_flags = MACHINE_AT, - .flags = MACHINE_VIDEO_FIXED, + .flags = MACHINE_VIDEO_FIXED | MACHINE_AX, .ram = { .min = 1024, .max = 4096, diff --git a/src/qt/qt_mainwindow.cpp b/src/qt/qt_mainwindow.cpp index 905a100f4..e966e043a 100644 --- a/src/qt/qt_mainwindow.cpp +++ b/src/qt/qt_mainwindow.cpp @@ -193,7 +193,8 @@ MainWindow::MainWindow(QWidget *parent) scroll_icon_off = QIcon(":/settings/qt/icons/scroll_lock_off.ico"); caps_icon = QIcon(":/settings/qt/icons/caps_lock_on.ico"); caps_icon_off = QIcon(":/settings/qt/icons/caps_lock_off.ico"); - /* TODO: Add Kana indicator here after the keyboard type work is done. */ + kana_icon = QIcon(":/settings/qt/icons/kana_lock_on.ico"); + kana_icon_off = QIcon(":/settings/qt/icons/kana_lock_off.ico"); num_label = new QLabel; num_label->setPixmap(num_icon_off.pixmap(QSize(16, 16))); @@ -207,19 +208,28 @@ MainWindow::MainWindow(QWidget *parent) scroll_label->setPixmap(scroll_icon_off.pixmap(QSize(16, 16))); statusBar()->addPermanentWidget(scroll_label); + kana_label = new QLabel; + kana_label->setPixmap(kana_icon_off.pixmap(QSize(16, 16))); + statusBar()->addPermanentWidget(kana_label); + QTimer* ledKeyboardTimer = new QTimer(this); ledKeyboardTimer->setTimerType(Qt::CoarseTimer); ledKeyboardTimer->setInterval(1); connect(ledKeyboardTimer, &QTimer::timeout, this, [this] () { - uint8_t caps, num, scroll; - keyboard_get_states(&caps, &num, &scroll); + uint8_t caps, num, scroll, kana; + keyboard_get_states(&caps, &num, &scroll, &kana); if (num_label->isVisible()) num_label->setPixmap(num ? this->num_icon.pixmap(QSize(16, 16)) : this->num_icon_off.pixmap(QSize(16, 16))); if (caps_label->isVisible()) caps_label->setPixmap(caps ? this->caps_icon.pixmap(QSize(16, 16)) : this->caps_icon_off.pixmap(QSize(16, 16))); if (scroll_label->isVisible()) - scroll_label->setPixmap(scroll ? this->scroll_icon.pixmap(QSize(16, 16)) : this->scroll_icon_off.pixmap(QSize(16, 16))); + scroll_label->setPixmap(scroll ? this->scroll_icon.pixmap(QSize(16, 16)) : + this->scroll_icon_off.pixmap(QSize(16, 16))); + + if (kana_label->isVisible()) + kana_label->setPixmap(kana ? this->kana_icon.pixmap(QSize(16, 16)) : + this->kana_icon_off.pixmap(QSize(16, 16))); }); ledKeyboardTimer->start(); @@ -253,6 +263,9 @@ MainWindow::MainWindow(QWidget *parent) 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)); + /* TODO: Base this on keyboard type instead when that's done. */ + kana_label->setVisible(machine_has_bus(machine, MACHINE_BUS_PS2_PORTS | MACHINE_BUS_AT_KBD) && + machine_has_flags(machine, MACHINE_AX)); while (QApplication::overrideCursor()) QApplication::restoreOverrideCursor(); #ifdef USE_WACOM @@ -1499,6 +1512,8 @@ MainWindow::refreshMediaMenu() 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)); + kana_label->setVisible(machine_has_bus(machine, MACHINE_BUS_PS2_PORTS | MACHINE_BUS_AT_KBD) && + machine_has_flags(machine, MACHINE_AX)); } void diff --git a/src/qt/qt_mainwindow.hpp b/src/qt/qt_mainwindow.hpp index 421b9ce15..917fd43f5 100644 --- a/src/qt/qt_mainwindow.hpp +++ b/src/qt/qt_mainwindow.hpp @@ -191,9 +191,9 @@ private: friend class RendererStack; // For UI variable access by non-primary renderer windows. friend class WindowsRawInputFilter; // Needed to reload renderers on style sheet changes. - QLabel *caps_label, *scroll_label, *num_label; - QIcon caps_icon, scroll_icon, num_icon; - QIcon caps_icon_off, scroll_icon_off, num_icon_off; + QLabel *caps_label, *scroll_label, *num_label, *kana_label; + QIcon caps_icon, scroll_icon, num_icon, kana_icon; + QIcon caps_icon_off, scroll_icon_off, num_icon_off, kana_icon_off; bool isShowMessage = false; }; From 6fb01cf592ec78fac1924d69b8a239c6b9d8875b Mon Sep 17 00:00:00 2001 From: MaxwellS04 Date: Wed, 7 May 2025 10:11:51 +0700 Subject: [PATCH 141/180] Added ISA-specific 86c805 (ELSA Winner 1000) Ported from my ELSA_Winner_Series branch. --- src/include/86box/video.h | 1 + src/video/vid_s3.c | 33 ++++++++++++++++++++++++++++++++- src/video/vid_table.c | 1 + 3 files changed, 34 insertions(+), 1 deletion(-) diff --git a/src/include/86box/video.h b/src/include/86box/video.h index d55275359..1b50d86f8 100644 --- a/src/include/86box/video.h +++ b/src/include/86box/video.h @@ -488,6 +488,7 @@ extern const device_t s3_metheus_86c928_isa_device; extern const device_t s3_metheus_86c928_vlb_device; extern const device_t s3_spea_mercury_lite_86c928_pci_device; extern const device_t s3_spea_mirage_86c801_isa_device; +extern const device_t s3_winner1000_805_isa_device; extern const device_t s3_86c805_onboard_vlb_device; extern const device_t s3_spea_mirage_86c805_vlb_device; extern const device_t s3_mirocrystal_8s_805_vlb_device; diff --git a/src/video/vid_s3.c b/src/video/vid_s3.c index 6897aed60..1f1ab5ede 100644 --- a/src/video/vid_s3.c +++ b/src/video/vid_s3.c @@ -54,6 +54,7 @@ #define ROM_MIROCRYSTAL20SV_964_PCI "roms/video/s3/mirocrystal.VBI" #define ROM_MIROCRYSTAL20SD_864_VLB "roms/video/s3/Miro20SD.BIN" #define ROM_PHOENIX_86C80X "roms/video/s3/805.VBI" +#define ROM_WINNER1000_805 "roms/video/s3/v01_05_00-C.BIN.bin" #define ROM_PARADISE_BAHAMAS64 "roms/video/s3/bahamas64.bin" #define ROM_PHOENIX_VISION864 "roms/video/s3/86c864p.bin" #define ROM_DIAMOND_STEALTH64_964 "roms/video/s3/964_107h.rom" @@ -117,7 +118,8 @@ enum { S3_NUMBER9_9FX_771, S3_SPEA_MERCURY_LITE_PCI, S3_86C805_ONBOARD, - S3_DIAMOND_STEALTH64_968 + S3_DIAMOND_STEALTH64_968, + S3_WINNER1000_805 }; enum { @@ -3782,6 +3784,7 @@ s3_recalctimings(svga_t *svga) switch (s3->card_type) { case S3_MIROCRYSTAL8S_805: case S3_MIROCRYSTAL10SD_805: + case S3_WINNER1000_805: case S3_PHOENIX_86C805: case S3_86C805_ONBOARD: svga->hdisp >>= 1; @@ -3950,6 +3953,7 @@ s3_recalctimings(svga_t *svga) switch (s3->card_type) { case S3_MIROCRYSTAL8S_805: case S3_MIROCRYSTAL10SD_805: + case S3_WINNER1000_805: case S3_PHOENIX_86C805: case S3_86C805_ONBOARD: svga->hdisp >>= 1; @@ -4122,6 +4126,7 @@ s3_recalctimings(svga_t *svga) switch (s3->card_type) { case S3_MIROCRYSTAL8S_805: case S3_MIROCRYSTAL10SD_805: + case S3_WINNER1000_805: case S3_PHOENIX_86C805: case S3_SPEA_MIRAGE_86C805: case S3_86C805_ONBOARD: @@ -9835,6 +9840,11 @@ s3_init(const device_t *info) chip = S3_86C801; video_inform(VIDEO_FLAG_TYPE_SPECIAL, &timing_s3_86c801); break; + case S3_WINNER1000_805: + bios_fn = ROM_WINNER1000_805; + chip = S3_86C805; + video_inform(VIDEO_FLAG_TYPE_SPECIAL, &timing_s3_86c805); + break; case S3_86C805_ONBOARD: bios_fn = NULL; chip = S3_86C805; @@ -10316,6 +10326,7 @@ s3_init(const device_t *info) case S3_PHOENIX_86C801: case S3_PHOENIX_86C805: + case S3_WINNER1000_805: svga->decode_mask = (2 << 20) - 1; stepping = 0xa0; /*86C801/86C805*/ s3->id = stepping; @@ -10585,6 +10596,12 @@ s3_phoenix_86c80x_available(void) return rom_present(ROM_PHOENIX_86C80X); } +static int +s3_winner1000_805_available(void) +{ + return rom_present(ROM_WINNER1000_805); +} + static int s3_mirocrystal_8s_805_available(void) { @@ -10974,6 +10991,20 @@ const device_t s3_spea_mirage_86c801_isa_device = { .config = s3_9fx_config }; +const device_t s3_winner1000_805_isa_device = { + .name = "S3 86c805 ISA (ELSA Winner 1000)", + .internal_name = "winner1000_805_isa", + .flags = DEVICE_ISA16, + .local = S3_WINNER1000_805, + .init = s3_init, + .close = s3_close, + .reset = s3_reset, + .available = s3_winner1000_805_available, + .speed_changed = s3_speed_changed, + .force_redraw = s3_force_redraw, + .config = s3_9fx_config +}; + const device_t s3_86c805_onboard_vlb_device = { .name = "S3 86c805 VLB On-Board", .internal_name = "px_s3_805_onboard_vlb", diff --git a/src/video/vid_table.c b/src/video/vid_table.c index 36573e9f9..e0ef7ada6 100644 --- a/src/video/vid_table.c +++ b/src/video/vid_table.c @@ -115,6 +115,7 @@ video_cards[] = { { .device = &s3_metheus_86c928_isa_device, .flags = VIDEO_FLAG_TYPE_NONE }, { .device = &s3_phoenix_86c801_isa_device, .flags = VIDEO_FLAG_TYPE_NONE }, { .device = &s3_spea_mirage_86c801_isa_device, .flags = VIDEO_FLAG_TYPE_NONE }, + { .device = &s3_winner1000_805_isa_device, .flags = VIDEO_FLAG_TYPE_NONE }, { .device = &sigma_device, .flags = VIDEO_FLAG_TYPE_NONE }, { .device = &tvga8900b_device, .flags = VIDEO_FLAG_TYPE_NONE }, { .device = &tvga8900d_device, .flags = VIDEO_FLAG_TYPE_NONE }, From 5d929c7735b0758ee155c07f622f97ad5d859e8e Mon Sep 17 00:00:00 2001 From: MaxwellS04 Date: Wed, 7 May 2025 10:39:22 +0700 Subject: [PATCH 142/180] Move Winner 1000's RAMDAC to ATT491 --- src/video/vid_s3.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/video/vid_s3.c b/src/video/vid_s3.c index 1f1ab5ede..23713c98b 100644 --- a/src/video/vid_s3.c +++ b/src/video/vid_s3.c @@ -10297,6 +10297,7 @@ s3_init(const device_t *info) case S3_SPEA_MIRAGE_86C801: case S3_SPEA_MIRAGE_86C805: + case S3_WINNER1000_805: svga->decode_mask = (2 << 20) - 1; stepping = 0xa2; /*86C801/86C805*/ s3->id = stepping; @@ -10326,7 +10327,6 @@ s3_init(const device_t *info) case S3_PHOENIX_86C801: case S3_PHOENIX_86C805: - case S3_WINNER1000_805: svga->decode_mask = (2 << 20) - 1; stepping = 0xa0; /*86C801/86C805*/ s3->id = stepping; From 1f40db5d9e09092d6610103ef0196047fdc6b6c7 Mon Sep 17 00:00:00 2001 From: MaxwellS04 Date: Wed, 7 May 2025 11:29:11 +0700 Subject: [PATCH 143/180] Fixed ROM path --- src/video/vid_s3.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/video/vid_s3.c b/src/video/vid_s3.c index 23713c98b..e88bbe58f 100644 --- a/src/video/vid_s3.c +++ b/src/video/vid_s3.c @@ -54,7 +54,7 @@ #define ROM_MIROCRYSTAL20SV_964_PCI "roms/video/s3/mirocrystal.VBI" #define ROM_MIROCRYSTAL20SD_864_VLB "roms/video/s3/Miro20SD.BIN" #define ROM_PHOENIX_86C80X "roms/video/s3/805.VBI" -#define ROM_WINNER1000_805 "roms/video/s3/v01_05_00-C.BIN.bin" +#define ROM_WINNER1000_805 "roms/video/s3/v01_05_00-C.BIN" #define ROM_PARADISE_BAHAMAS64 "roms/video/s3/bahamas64.bin" #define ROM_PHOENIX_VISION864 "roms/video/s3/86c864p.bin" #define ROM_DIAMOND_STEALTH64_964 "roms/video/s3/964_107h.rom" From 20d04c7c0834fbff8b0d4ae162e04e46c3ba707d Mon Sep 17 00:00:00 2001 From: OBattler Date: Wed, 7 May 2025 07:20:54 +0200 Subject: [PATCH 144/180] Added the ASUS ISA-486C. --- src/chipset/CMakeLists.txt | 1 + src/device/postcard.c | 2 ++ src/include/86box/chipset.h | 3 +++ src/include/86box/machine.h | 1 + src/machine/m_at_386dx_486.c | 29 ++++++++++++++++++++++++++ src/machine/machine_table.c | 40 ++++++++++++++++++++++++++++++++++++ 6 files changed, 76 insertions(+) diff --git a/src/chipset/CMakeLists.txt b/src/chipset/CMakeLists.txt index 6018dd045..94ef408f6 100644 --- a/src/chipset/CMakeLists.txt +++ b/src/chipset/CMakeLists.txt @@ -39,6 +39,7 @@ add_library(chipset OBJECT intel_i450kx.c intel_sio.c intel_piix.c + isa486c.c ../ioapic.c neat.c opti283.c diff --git a/src/device/postcard.c b/src/device/postcard.c index 9e2c629c1..b91d8b402 100644 --- a/src/device/postcard.c +++ b/src/device/postcard.c @@ -158,6 +158,8 @@ postcard_init(UNUSED(const device_t *info)) postcard_port = 0x84; /* ISA Compaq machines */ else if (strstr(machines[machine].name, "Olivetti")) postcard_port = 0x378; /* Olivetti machines */ + else if (!strcmp(machines[machine].internal_name, "isa486c")) + postcard_port = 0x5080; /* ASUS ISA-486C */ else postcard_port = 0x80; /* AT and clone machines */ postcard_log("POST card initializing on port %04Xh\n", postcard_port); diff --git a/src/include/86box/chipset.h b/src/include/86box/chipset.h index 3a65bbce9..fe088b209 100644 --- a/src/include/86box/chipset.h +++ b/src/include/86box/chipset.h @@ -37,6 +37,9 @@ extern const device_t ali6117d_device; /* AMD */ extern const device_t amd640_device; +/* ASUS */ +extern const device_t isa486c_device; + /* Compaq */ extern const device_t compaq_386_device; extern const device_t compaq_genoa_device; diff --git a/src/include/86box/machine.h b/src/include/86box/machine.h index d8c213d53..996f2bf5f 100644 --- a/src/include/86box/machine.h +++ b/src/include/86box/machine.h @@ -508,6 +508,7 @@ extern int machine_at_pc916sx_init(const machine_t *); sure this appear here (and in the .c file) in the order and position in which they appear in the machine table. */ extern int machine_at_dataexpert386wb_init(const machine_t *); +extern int machine_at_isa486c_init(const machine_t *); extern int machine_at_genoa486_init(const machine_t *); extern int machine_at_ga486l_init(const machine_t *); extern int machine_at_cougar_init(const machine_t *); diff --git a/src/machine/m_at_386dx_486.c b/src/machine/m_at_386dx_486.c index ed8f75a84..f50e8af42 100644 --- a/src/machine/m_at_386dx_486.c +++ b/src/machine/m_at_386dx_486.c @@ -2445,6 +2445,35 @@ machine_at_dataexpert386wb_init(const machine_t *model) return ret; } +int +machine_at_isa486c_init(const machine_t *model) +{ + int ret; + +#if 0 + ret = bios_load_linear("roms/machines/isa486c/asus-isa-486c-401a0-040591-657e2c17a0218417632602.bin", + 0x000f0000, 65536, 0); +#else + ret = bios_load_linear("roms/machines/isa486c/128k.bin", + 0x000e0000, 131072, 0); +#endif + + if (bios_only || !ret) + return ret; + + machine_at_common_init(model); + + device_add(&isa486c_device); + device_add(&port_92_key_device); + + device_add(&keyboard_at_ami_device); + + if (fdc_current[0] == FDC_INTERNAL) + device_add(&fdc_at_device); + + return ret; +} + int machine_at_genoa486_init(const machine_t *model) { diff --git a/src/machine/machine_table.c b/src/machine/machine_table.c index 7e0ae8d64..adf132a5d 100644 --- a/src/machine/machine_table.c +++ b/src/machine/machine_table.c @@ -5998,6 +5998,46 @@ const machine_t machines[] = { }, /* 486 machines - Socket 1 */ + /* Has Award KBC firmware. */ + { + .name = "[ZyMOS Poach] ASUS ISA-486C", + .internal_name = "isa486c", + .type = MACHINE_TYPE_486, + .chipset = MACHINE_CHIPSET_ZYMOS_POACH, + .init = machine_at_isa486c_init, + .p1_handler = NULL, + .gpio_handler = NULL, + .available_flag = MACHINE_AVAILABLE, + .gpio_acpi_handler = NULL, + .cpu = { + .package = CPU_PKG_SOCKET1, + .block = CPU_BLOCK_NONE, + .min_bus = 0, + .max_bus = 0, + .min_voltage = 0, + .max_voltage = 0, + .min_multi = 0, + .max_multi = 0 + }, + .bus_flags = MACHINE_AT, + .flags = MACHINE_APM, + .ram = { + .min = 1024, + .max = 16384, + .step = 1024 + }, + .nvrmask = 127, + .kbc_device = NULL, + .kbc_p1 = 0xff, + .gpio = 0xffffffff, + .gpio_acpi = 0xffffffff, + .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, + .vid_device = NULL, + .snd_device = NULL, + .net_device = NULL + }, /* Has AMI KF KBC firmware. */ { .name = "[ZyMOS Poach] Genoa Unknown 486", From 9ac25992649e14fe8128067d61ae95b08a0368f1 Mon Sep 17 00:00:00 2001 From: OBattler Date: Wed, 7 May 2025 07:21:26 +0200 Subject: [PATCH 145/180] Correct the BIOS. --- src/machine/m_at_386dx_486.c | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/machine/m_at_386dx_486.c b/src/machine/m_at_386dx_486.c index f50e8af42..e3838ce32 100644 --- a/src/machine/m_at_386dx_486.c +++ b/src/machine/m_at_386dx_486.c @@ -2450,13 +2450,8 @@ machine_at_isa486c_init(const machine_t *model) { int ret; -#if 0 ret = bios_load_linear("roms/machines/isa486c/asus-isa-486c-401a0-040591-657e2c17a0218417632602.bin", 0x000f0000, 65536, 0); -#else - ret = bios_load_linear("roms/machines/isa486c/128k.bin", - 0x000e0000, 131072, 0); -#endif if (bios_only || !ret) return ret; From 572c9e176bc5d2b6051aed74cdd9a91e1087e7c6 Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Wed, 7 May 2025 17:41:59 +0600 Subject: [PATCH 146/180] Implement keyboard grabbing for Wayland --- src/qt/CMakeLists.txt | 1 + src/qt/qt_main.cpp | 10 ++ src/qt/qt_mainwindow.cpp | 25 ++- src/qt/wl_mouse.cpp | 37 ++++- ...keyboard-shortcuts-inhibit-unstable-v1.xml | 143 ++++++++++++++++++ 5 files changed, 209 insertions(+), 7 deletions(-) create mode 100644 wl_protocols/keyboard-shortcuts-inhibit-unstable-v1.xml diff --git a/src/qt/CMakeLists.txt b/src/qt/CMakeLists.txt index 4231034d5..df13d42e2 100644 --- a/src/qt/CMakeLists.txt +++ b/src/qt/CMakeLists.txt @@ -453,6 +453,7 @@ if (UNIX AND NOT APPLE AND NOT HAIKU) set(WL_SOURCE_VAR) ecm_add_wayland_client_protocol(WL_SOURCE_VAR PROTOCOL ${CMAKE_SOURCE_DIR}/wl_protocols/relative-pointer-unstable-v1.xml BASENAME relative-pointer-unstable-v1) ecm_add_wayland_client_protocol(WL_SOURCE_VAR PROTOCOL ${CMAKE_SOURCE_DIR}/wl_protocols/pointer-constraints-unstable-v1.xml BASENAME pointer-constraints-unstable-v1) + ecm_add_wayland_client_protocol(WL_SOURCE_VAR PROTOCOL ${CMAKE_SOURCE_DIR}/wl_protocols/keyboard-shortcuts-inhibit-unstable-v1.xml BASENAME keyboard-shortcuts-inhibit-unstable-v1) target_include_directories(ui PRIVATE ${CMAKE_CURRENT_BINARY_DIR} ${Qt${QT_MAJOR}Gui_PRIVATE_INCLUDE_DIRS}) target_sources(ui PRIVATE ${WL_SOURCE_VAR} wl_mouse.cpp) if (XKBCOMMON_FOUND) diff --git a/src/qt/qt_main.cpp b/src/qt/qt_main.cpp index 1f1dd6b49..5cea8c698 100644 --- a/src/qt/qt_main.cpp +++ b/src/qt/qt_main.cpp @@ -672,6 +672,16 @@ main(int argc, char *argv[]) } else { main_window->show(); } +#ifdef __unix__ + if (QApplication::platformName().contains("wayland")) { + /* Force a sync. */ + (void)main_window->winId(); + QApplication::sync(); + extern void wl_keyboard_grab(QWindow *window); + wl_keyboard_grab(main_window->windowHandle()); + } +#endif + app.installEventFilter(main_window); diff --git a/src/qt/qt_mainwindow.cpp b/src/qt/qt_mainwindow.cpp index e966e043a..3e0f9f001 100644 --- a/src/qt/qt_mainwindow.cpp +++ b/src/qt/qt_mainwindow.cpp @@ -322,7 +322,8 @@ MainWindow::MainWindow(QWidget *parent) if (ui->stackedWidget->mouse_capture_func) ui->stackedWidget->mouse_capture_func(this->windowHandle()); } else { - this->releaseKeyboard(); + if (!(windowState() & Qt::WindowActive)) + this->releaseKeyboard(); if (ui->stackedWidget->mouse_uncapture_func) { ui->stackedWidget->mouse_uncapture_func(); } @@ -1492,8 +1493,26 @@ MainWindow::eventFilter(QObject *receiver, QEvent *event) curdopause = dopause; plat_pause(isShowMessage ? 2 : 1); emit setMouseCapture(false); + releaseKeyboard(); } else if (event->type() == QEvent::WindowUnblocked) { plat_pause(curdopause); +#ifdef __unix__ + if (!QApplication::platformName().contains("wayland") && (this->windowState() & Qt::WindowActive)) { + this->grabKeyboard(); + } +#endif + } else if (event->type() == QEvent::WindowActivate) { +#ifdef __unix__ + if (!QApplication::platformName().contains("wayland")) { + this->grabKeyboard(); + } +#endif + } else if (event->type() == QEvent::WindowDeactivate) { +#ifdef __unix__ + if (!QApplication::platformName().contains("wayland")) { + this->releaseKeyboard(); + } +#endif } } @@ -1611,13 +1630,13 @@ MainWindow::getRenderWidgetSize() void MainWindow::focusInEvent(QFocusEvent *event) { - this->grabKeyboard(); + //this->grabKeyboard(); } void MainWindow::focusOutEvent(QFocusEvent *event) { - this->releaseKeyboard(); + //this->releaseKeyboard(); } void diff --git a/src/qt/wl_mouse.cpp b/src/qt/wl_mouse.cpp index 5d6d95a0a..9201c4ec8 100644 --- a/src/qt/wl_mouse.cpp +++ b/src/qt/wl_mouse.cpp @@ -20,6 +20,7 @@ #include #include #include +#include #include #include @@ -30,10 +31,12 @@ extern "C" { #include <86box/plat.h> } -static zwp_relative_pointer_manager_v1 *rel_manager = nullptr; -static zwp_relative_pointer_v1 *rel_pointer = nullptr; -static zwp_pointer_constraints_v1 *conf_pointer_interface = nullptr; -static zwp_locked_pointer_v1 *conf_pointer = nullptr; +static zwp_relative_pointer_manager_v1 *rel_manager = nullptr; +static zwp_relative_pointer_v1 *rel_pointer = nullptr; +static zwp_pointer_constraints_v1 *conf_pointer_interface = nullptr; +static zwp_locked_pointer_v1 *conf_pointer = nullptr; +static zwp_keyboard_shortcuts_inhibit_manager_v1 *kbd_manager = nullptr; +static zwp_keyboard_shortcuts_inhibitor_v1 *kbd_inhibitor = nullptr; static bool wl_init_ok = false; @@ -47,6 +50,12 @@ static struct zwp_relative_pointer_v1_listener rel_listener = { rel_mouse_event }; +static struct zwp_keyboard_shortcuts_inhibitor_v1_listener kbd_listener +{ + [](void *data, struct zwp_keyboard_shortcuts_inhibitor_v1 *zwp_keyboard_shortcuts_inhibitor_v1) -> void {}, + [](void *data, struct zwp_keyboard_shortcuts_inhibitor_v1 *zwp_keyboard_shortcuts_inhibitor_v1) -> void {} +}; + static void display_handle_global(void *data, struct wl_registry *registry, uint32_t id, const char *interface, uint32_t version) @@ -57,16 +66,25 @@ display_handle_global(void *data, struct wl_registry *registry, uint32_t id, if (!strcmp(interface, "zwp_pointer_constraints_v1")) { conf_pointer_interface = (zwp_pointer_constraints_v1 *) wl_registry_bind(registry, id, &zwp_pointer_constraints_v1_interface, version); } + if (!strcmp(interface, "zwp_keyboard_shortcuts_inhibit_manager_v1")) { + kbd_manager = (zwp_keyboard_shortcuts_inhibit_manager_v1 *) wl_registry_bind(registry, id, &zwp_keyboard_shortcuts_inhibit_manager_v1_interface, version); + } } static void display_global_remove(void *data, struct wl_registry *wl_registry, uint32_t name) { plat_mouse_capture(0); + if (kbd_inhibitor) { + zwp_keyboard_shortcuts_inhibitor_v1_destroy(kbd_inhibitor); + kbd_inhibitor = nullptr; + } + zwp_keyboard_shortcuts_inhibit_manager_v1_destroy(kbd_manager); zwp_relative_pointer_manager_v1_destroy(rel_manager); zwp_pointer_constraints_v1_destroy(conf_pointer_interface); rel_manager = nullptr; conf_pointer_interface = nullptr; + kbd_manager = nullptr; } static const struct wl_registry_listener registry_listener = { @@ -90,9 +108,20 @@ wl_init() } } +void +wl_keyboard_grab(QWindow *window) +{ + if (!kbd_inhibitor && kbd_manager) { + kbd_inhibitor = zwp_keyboard_shortcuts_inhibit_manager_v1_inhibit_shortcuts(kbd_manager, (wl_surface *) QGuiApplication::platformNativeInterface()->nativeResourceForWindow("surface", window), (wl_seat *) QGuiApplication::platformNativeInterface()->nativeResourceForIntegration("wl_seat")); + } +} + void wl_mouse_capture(QWindow *window) { + if (!kbd_inhibitor) { + kbd_inhibitor = zwp_keyboard_shortcuts_inhibit_manager_v1_inhibit_shortcuts(kbd_manager, (wl_surface *) QGuiApplication::platformNativeInterface()->nativeResourceForWindow("surface", window), (wl_seat *) QGuiApplication::platformNativeInterface()->nativeResourceForIntegration("wl_seat")); + } if (rel_manager) { rel_pointer = zwp_relative_pointer_manager_v1_get_relative_pointer(rel_manager, (wl_pointer *) QGuiApplication::platformNativeInterface()->nativeResourceForIntegration("wl_pointer")); zwp_relative_pointer_v1_add_listener(rel_pointer, &rel_listener, nullptr); diff --git a/wl_protocols/keyboard-shortcuts-inhibit-unstable-v1.xml b/wl_protocols/keyboard-shortcuts-inhibit-unstable-v1.xml new file mode 100644 index 000000000..27748764d --- /dev/null +++ b/wl_protocols/keyboard-shortcuts-inhibit-unstable-v1.xml @@ -0,0 +1,143 @@ + + + + + Copyright © 2017 Red Hat Inc. + + Permission is hereby granted, free of charge, to any person obtaining a + copy of this software and associated documentation files (the "Software"), + to deal in the Software without restriction, including without limitation + the rights to use, copy, modify, merge, publish, distribute, sublicense, + and/or sell copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice (including the next + paragraph) shall be included in all copies or substantial portions of the + Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + + + + This protocol specifies a way for a client to request the compositor + to ignore its own keyboard shortcuts for a given seat, so that all + key events from that seat get forwarded to a surface. + + Warning! The protocol described in this file is experimental and + backward incompatible changes may be made. Backward compatible + changes may be added together with the corresponding interface + version bump. + Backward incompatible changes are done by bumping the version + number in the protocol and interface names and resetting the + interface version. Once the protocol is to be declared stable, + the 'z' prefix and the version number in the protocol and + interface names are removed and the interface version number is + reset. + + + + + A global interface used for inhibiting the compositor keyboard shortcuts. + + + + + Destroy the keyboard shortcuts inhibitor manager. + + + + + + Create a new keyboard shortcuts inhibitor object associated with + the given surface for the given seat. + + If shortcuts are already inhibited for the specified seat and surface, + a protocol error "already_inhibited" is raised by the compositor. + + + + + + + + + + + + + + A keyboard shortcuts inhibitor instructs the compositor to ignore + its own keyboard shortcuts when the associated surface has keyboard + focus. As a result, when the surface has keyboard focus on the given + seat, it will receive all key events originating from the specified + seat, even those which would normally be caught by the compositor for + its own shortcuts. + + The Wayland compositor is however under no obligation to disable + all of its shortcuts, and may keep some special key combo for its own + use, including but not limited to one allowing the user to forcibly + restore normal keyboard events routing in the case of an unwilling + client. The compositor may also use the same key combo to reactivate + an existing shortcut inhibitor that was previously deactivated on + user request. + + When the compositor restores its own keyboard shortcuts, an + "inactive" event is emitted to notify the client that the keyboard + shortcuts inhibitor is not effectively active for the surface and + seat any more, and the client should not expect to receive all + keyboard events. + + When the keyboard shortcuts inhibitor is inactive, the client has + no way to forcibly reactivate the keyboard shortcuts inhibitor. + + The user can chose to re-enable a previously deactivated keyboard + shortcuts inhibitor using any mechanism the compositor may offer, + in which case the compositor will send an "active" event to notify + the client. + + If the surface is destroyed, unmapped, or loses the seat's keyboard + focus, the keyboard shortcuts inhibitor becomes irrelevant and the + compositor will restore its own keyboard shortcuts but no "inactive" + event is emitted in this case. + + + + + Remove the keyboard shortcuts inhibitor from the associated wl_surface. + + + + + + This event indicates that the shortcut inhibitor is active. + + The compositor sends this event every time compositor shortcuts + are inhibited on behalf of the surface. When active, the client + may receive input events normally reserved by the compositor + (see zwp_keyboard_shortcuts_inhibitor_v1). + + This occurs typically when the initial request "inhibit_shortcuts" + first becomes active or when the user instructs the compositor to + re-enable and existing shortcuts inhibitor using any mechanism + offered by the compositor. + + + + + + This event indicates that the shortcuts inhibitor is inactive, + normal shortcuts processing is restored by the compositor. + + + + From e1a6ebac08b1575da8e4e570c03fca46d807613b Mon Sep 17 00:00:00 2001 From: OBattler Date: Wed, 7 May 2025 15:23:50 +0200 Subject: [PATCH 147/180] The forgotten chipset/is486c.c. --- src/chipset/isa486c.c | 131 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 131 insertions(+) create mode 100644 src/chipset/isa486c.c diff --git a/src/chipset/isa486c.c b/src/chipset/isa486c.c new file mode 100644 index 000000000..6494ed1b8 --- /dev/null +++ b/src/chipset/isa486c.c @@ -0,0 +1,131 @@ +#include +#include +#include +#include +#include +#include +#define HAVE_STDARG_H +#include <86box/86box.h> +#include "cpu.h" +#include <86box/io.h> +#include <86box/device.h> +#include <86box/mem.h> +#include <86box/plat_unused.h> +#include <86box/chipset.h> + +typedef struct isa486c_t { + uint8_t regs[3]; +} isa486c_t; + +static void +isa486c_recalcmapping(isa486c_t *dev) +{ + uint32_t shflags = 0; + uint32_t bases[5] = { 0x000c0000, 0x000c8000, 0x000d0000, 0x000d8000, 0x000e0000 }; + uint32_t sizes[5] = { 0x00008000, 0x00008000, 0x00008000, 0x00008000, 0x00020000 }; + + if (dev->regs[1] & 0x20) + shflags = MEM_READ_EXTANY | MEM_WRITE_INTERNAL; + else + shflags = MEM_READ_INTERNAL | MEM_WRITE_EXTANY; + + shadowbios = 0; + shadowbios_write = 0; + + for (uint8_t i = 0; i < 5; i++) + if (dev->regs[1] & (1 << i)) { + if (i == 4) { + shadowbios = 1; + shadowbios_write = !!(dev->regs[1] & 0x20); + } + + mem_set_mem_state_both(bases[i], sizes[i], shflags); + } else + mem_set_mem_state_both(bases[i], sizes[i], MEM_READ_EXTANY | MEM_WRITE_EXTANY); + + flushmmucache_nopc(); +} + +static void +isa486c_write(uint16_t addr, uint8_t val, void *priv) +{ + isa486c_t *dev = (isa486c_t *) priv; + + switch (addr) { + case 0x0023: + dev->regs[0] = val; + break; + /* + Port 25h: + - Bit 0 = Video BIOS (C000-C7FF) shadow enabled; + - Bit 1 = C800-C8FF shadow enabled; + - Bit 2 = D000-D7FF shadow enabled; + - Bit 3 = D800-DFFF shadow enabled; + - Bit 4 = E000-FFFF shadow enabled (or F0000-FFFFF?); + - Bit 5 = If set, read from ROM, write to shadow; + - Bit 6 = KEN Video & BIOS enabled (cacheability!). + */ + case 0x0025: + dev->regs[1] = val; + isa486c_recalcmapping(dev); + break; + case 0x0027: + dev->regs[2] = val; + break; + } +} + +static uint8_t +isa486c_read(uint16_t addr, void *priv) +{ + isa486c_t *dev = (isa486c_t *) priv; + uint8_t ret = 0xff; + + switch (addr) { + case 0x0023: + ret = dev->regs[0]; + break; + case 0x0025: + ret = dev->regs[1]; + break; + case 0x0027: + ret = dev->regs[2]; + break; + } + + return ret; +} + +static void +isa486c_close(void *priv) +{ + isa486c_t *dev = (isa486c_t *) priv; + + free(dev); +} + +static void * +isa486c_init(UNUSED(const device_t *info)) +{ + isa486c_t *dev = (isa486c_t *) calloc(1, sizeof(isa486c_t)); + + io_sethandler(0x0023, 0x0001, isa486c_read, NULL, NULL, isa486c_write, NULL, NULL, dev); + io_sethandler(0x0025, 0x0001, isa486c_read, NULL, NULL, isa486c_write, NULL, NULL, dev); + io_sethandler(0x0027, 0x0001, isa486c_read, NULL, NULL, isa486c_write, NULL, NULL, dev); + + return dev; +} + +const device_t isa486c_device = { + .name = "ASUS ISA-486C Gate Array", + .internal_name = "isa486c", + .flags = 0, + .local = 0, + .init = isa486c_init, + .close = isa486c_close, + .reset = NULL, + .available = NULL, + .speed_changed = NULL, + .force_redraw = NULL, + .config = NULL +}; From 39fdda6dd9ef4ccda98f6d61db0a41eb7b077c8e Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Wed, 7 May 2025 20:22:38 +0600 Subject: [PATCH 148/180] Fix compilation without extra-cmake-modules --- src/qt/qt_main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/qt/qt_main.cpp b/src/qt/qt_main.cpp index 5cea8c698..3f8476374 100644 --- a/src/qt/qt_main.cpp +++ b/src/qt/qt_main.cpp @@ -672,7 +672,7 @@ main(int argc, char *argv[]) } else { main_window->show(); } -#ifdef __unix__ +#ifdef WAYLAND if (QApplication::platformName().contains("wayland")) { /* Force a sync. */ (void)main_window->winId(); From 5918356719158636b24aa14bfa1aef17d44ea050 Mon Sep 17 00:00:00 2001 From: Alexander Babikov Date: Wed, 7 May 2025 19:03:10 +0500 Subject: [PATCH 149/180] Fix keybinds being saved in native/localized form MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Keybinds are now both saved and read in portable form and only converted to native one for display purposes, fixing them not being read correctly when certain languages are set. Also get rid of qPrintable() due to it using the system 8-bit codepage instead of UTF-8, and some unnecessary QString ↔ C string conversions Co-Authored-by: Cacodemon345 --- src/include/86box/plat.h | 4 ++-- src/qt/languages/86box.pot | 2 +- src/qt/languages/ca-ES.po | 12 ++++++------ src/qt/languages/cs-CZ.po | 12 ++++++------ src/qt/languages/de-DE.po | 15 ++++++--------- src/qt/languages/es-ES.po | 12 ++++++------ src/qt/languages/fi-FI.po | 12 ++++++------ src/qt/languages/fr-FR.po | 12 ++++++------ src/qt/languages/hr-HR.po | 12 ++++++------ src/qt/languages/hu-HU.po | 12 ++++++------ src/qt/languages/it-IT.po | 12 ++++++------ src/qt/languages/ja-JP.po | 12 ++++++------ src/qt/languages/ko-KR.po | 12 ++++++------ src/qt/languages/nl-NL.po | 12 ++++++------ src/qt/languages/pl-PL.po | 12 ++++++------ src/qt/languages/pt-BR.po | 12 ++++++------ src/qt/languages/pt-PT.po | 12 ++++++------ src/qt/languages/ru-RU.po | 12 ++++++------ src/qt/languages/sk-SK.po | 12 ++++++------ src/qt/languages/sl-SI.po | 12 ++++++------ src/qt/languages/sv-SE.po | 12 ++++++------ src/qt/languages/tr-TR.po | 12 ++++++------ src/qt/languages/uk-UA.po | 12 ++++++------ src/qt/languages/vi-VN.po | 12 ++++++------ src/qt/languages/zh-CN.po | 12 ++++++------ src/qt/languages/zh-TW.po | 12 ++++++------ src/qt/qt_keybind.cpp | 2 +- src/qt/qt_mainwindow.cpp | 7 +++---- src/qt/qt_platform.cpp | 13 +++---------- src/qt/qt_settingsinput.cpp | 10 +++++----- 30 files changed, 159 insertions(+), 170 deletions(-) diff --git a/src/include/86box/plat.h b/src/include/86box/plat.h index bbc673dcf..e6a366f4c 100644 --- a/src/include/86box/plat.h +++ b/src/include/86box/plat.h @@ -32,8 +32,8 @@ /* String ID numbers. */ enum { STRING_MOUSE_CAPTURE, /* "Click to capture mouse" */ - STRING_MOUSE_RELEASE, /* "Press F8+F12 to release mouse" */ - STRING_MOUSE_RELEASE_MMB, /* "Press F8+F12 or middle button to release mouse" */ + STRING_MOUSE_RELEASE, /* "Press %1 to release mouse" */ + STRING_MOUSE_RELEASE_MMB, /* "Press %1 or middle button to release mouse" */ STRING_INVALID_CONFIG, /* "Invalid configuration" */ STRING_NO_ST506_ESDI_CDROM, /* "MFM/RLL or ESDI CD-ROM drives never existed" */ STRING_NET_ERROR, /* "Failed to initialize network driver" */ diff --git a/src/qt/languages/86box.pot b/src/qt/languages/86box.pot index 6e6dd3fc3..d5152cd3d 100644 --- a/src/qt/languages/86box.pot +++ b/src/qt/languages/86box.pot @@ -630,7 +630,7 @@ msgstr "" msgid " - PAUSED" msgstr "" -msgid "Press Ctrl+Alt+PgDn to return to windowed mode." +msgid "Press %1 to return to windowed mode." msgstr "" msgid "Speed" diff --git a/src/qt/languages/ca-ES.po b/src/qt/languages/ca-ES.po index 4851106cd..7fe87eb1a 100644 --- a/src/qt/languages/ca-ES.po +++ b/src/qt/languages/ca-ES.po @@ -630,8 +630,8 @@ msgstr "Error fatal" msgid " - PAUSED" msgstr " - EN PAUSA" -msgid "Press %s to return to windowed mode." -msgstr "Premeu %s per tornar al mode de finestra." +msgid "Press %1 to return to windowed mode." +msgstr "Premeu %1 per tornar al mode de finestra." msgid "Speed" msgstr "Velocitat" @@ -717,11 +717,11 @@ msgstr "Altres perifèrics" msgid "Click to capture mouse" msgstr "Feu clic per capturar el ratolí" -msgid "Press %s to release mouse" -msgstr "Premeu %s per alliberar el ratolí" +msgid "Press %1 to release mouse" +msgstr "Premeu %1 per alliberar el ratolí" -msgid "Press %s or middle button to release mouse" -msgstr "Premeu %s o el botó central per alliberar el ratolí" +msgid "Press %1 or middle button to release mouse" +msgstr "Premeu %1 o el botó central per alliberar el ratolí" msgid "Bus" msgstr "Bus" diff --git a/src/qt/languages/cs-CZ.po b/src/qt/languages/cs-CZ.po index 352fafc31..59a582ca6 100644 --- a/src/qt/languages/cs-CZ.po +++ b/src/qt/languages/cs-CZ.po @@ -630,8 +630,8 @@ msgstr "Kritická chyba" msgid " - PAUSED" msgstr " - POZASTAVENO" -msgid "Press %s to return to windowed mode." -msgstr "Stiskněte %s pro návrat z režimu celé obrazovky." +msgid "Press %1 to return to windowed mode." +msgstr "Stiskněte %1 pro návrat z režimu celé obrazovky." msgid "Speed" msgstr "Rychlost" @@ -717,11 +717,11 @@ msgstr "Jiné příslušenství" msgid "Click to capture mouse" msgstr "Klikněte pro zabraní myši" -msgid "Press %s to release mouse" -msgstr "Stiskněte %s pro uvolnění myši" +msgid "Press %1 to release mouse" +msgstr "Stiskněte %1 pro uvolnění myši" -msgid "Press %s or middle button to release mouse" -msgstr "Stiskněte %s nebo prostřední tlačítko pro uvolnění myši" +msgid "Press %1 or middle button to release mouse" +msgstr "Stiskněte %1 nebo prostřední tlačítko pro uvolnění myši" msgid "Bus" msgstr "Sběrnice" diff --git a/src/qt/languages/de-DE.po b/src/qt/languages/de-DE.po index ce7d52d55..0615dada4 100644 --- a/src/qt/languages/de-DE.po +++ b/src/qt/languages/de-DE.po @@ -630,8 +630,8 @@ msgstr "Fataler Fehler" msgid " - PAUSED" msgstr " - PAUSIERT" -msgid "Press %s to return to windowed mode." -msgstr "%s ab, zur Rückkehr in den Fenstermodus." +msgid "Press %1 to return to windowed mode." +msgstr "%1 ab, zur Rückkehr in den Fenstermodus." msgid "Speed" msgstr "Geschwindigkeit" @@ -717,14 +717,11 @@ msgstr "Andere Peripheriegeräte" msgid "Click to capture mouse" msgstr "Klicken zum Einfangen des Mauszeigers" -msgid "Press %s to release mouse" -msgstr "Drücke %s zur Mausfreigabe" +msgid "Press %1 to release mouse" +msgstr "Drücke %1 zur Mausfreigabe" -msgid "Press %s or middle button to release mouse" -msgstr "Drücke %s oder die mittlere Maustaste zur Mausfreigabe" - -msgid "Ctrl+End" -msgstr "Strg+Ende" +msgid "Press %1 or middle button to release mouse" +msgstr "Drücke %1 oder die mittlere Maustaste zur Mausfreigabe" msgid "Bus" msgstr "Bus" diff --git a/src/qt/languages/es-ES.po b/src/qt/languages/es-ES.po index 177d08d18..1f9cf10b2 100644 --- a/src/qt/languages/es-ES.po +++ b/src/qt/languages/es-ES.po @@ -630,8 +630,8 @@ msgstr "Error fatal" msgid " - PAUSED" msgstr " - EN PAUSA" -msgid "Press %s to return to windowed mode." -msgstr "Pulsa %s para volver a modo ventana." +msgid "Press %1 to return to windowed mode." +msgstr "Pulsa %1 para volver a modo ventana." msgid "Speed" msgstr "Velocidad" @@ -717,11 +717,11 @@ msgstr "Otros periféricos" msgid "Click to capture mouse" msgstr "Haga click para capturar el ratón" -msgid "Press %s to release mouse" -msgstr "Pulse %s para liberar el ratón" +msgid "Press %1 to release mouse" +msgstr "Pulse %1 para liberar el ratón" -msgid "Press %s or middle button to release mouse" -msgstr "Pulse %s o el botón central para liberar el ratón" +msgid "Press %1 or middle button to release mouse" +msgstr "Pulse %1 o el botón central para liberar el ratón" msgid "Bus" msgstr "Bus" diff --git a/src/qt/languages/fi-FI.po b/src/qt/languages/fi-FI.po index a77b3f6ef..4979332ac 100644 --- a/src/qt/languages/fi-FI.po +++ b/src/qt/languages/fi-FI.po @@ -630,8 +630,8 @@ msgstr "Vakava virhe" msgid " - PAUSED" msgstr " - TAUKO" -msgid "Press %s to return to windowed mode." -msgstr "Paina %s palataksesi ikkunoituun tilaan." +msgid "Press %1 to return to windowed mode." +msgstr "Paina %1 palataksesi ikkunoituun tilaan." msgid "Speed" msgstr "Nopeus" @@ -717,11 +717,11 @@ msgstr "Muut oheislaitteet" msgid "Click to capture mouse" msgstr "Kaappaa hiiri klikkaamalla" -msgid "Press %s to release mouse" -msgstr "Paina %s vapauttaaksesi hiiren" +msgid "Press %1 to release mouse" +msgstr "Paina %1 vapauttaaksesi hiiren" -msgid "Press %s or middle button to release mouse" -msgstr "Paina %s tai keskipainiketta vapauttaaksesi hiiren" +msgid "Press %1 or middle button to release mouse" +msgstr "Paina %1 tai keskipainiketta vapauttaaksesi hiiren" msgid "Bus" msgstr "Väylä" diff --git a/src/qt/languages/fr-FR.po b/src/qt/languages/fr-FR.po index fe3dc4bb4..58de2e4d1 100644 --- a/src/qt/languages/fr-FR.po +++ b/src/qt/languages/fr-FR.po @@ -630,8 +630,8 @@ msgstr "Erreur fatale" msgid " - PAUSED" msgstr " - EN PAUSE" -msgid "Press %s to return to windowed mode." -msgstr "Appuyez sur %s pour revenir au mode fenêtré." +msgid "Press %1 to return to windowed mode." +msgstr "Appuyez sur %1 pour revenir au mode fenêtré." msgid "Speed" msgstr "Vitesse" @@ -717,11 +717,11 @@ msgstr "Autres périfériques" msgid "Click to capture mouse" msgstr "Cliquer pour capturer la souris" -msgid "Press %s to release mouse" -msgstr "Appuyer sur %s pour libérer la souris" +msgid "Press %1 to release mouse" +msgstr "Appuyer sur %1 pour libérer la souris" -msgid "Press %s or middle button to release mouse" -msgstr "Appuyer sur %s ou le bouton central pour libérer la souris" +msgid "Press %1 or middle button to release mouse" +msgstr "Appuyer sur %1 ou le bouton central pour libérer la souris" msgid "Bus" msgstr "Bus" diff --git a/src/qt/languages/hr-HR.po b/src/qt/languages/hr-HR.po index 1eecaa2d0..5f0e60b21 100644 --- a/src/qt/languages/hr-HR.po +++ b/src/qt/languages/hr-HR.po @@ -630,8 +630,8 @@ msgstr "Fatalna greška" msgid " - PAUSED" msgstr " - ZASTAO" -msgid "Press %s to return to windowed mode." -msgstr "Pritisnite %s za povratak u prozorski način rada." +msgid "Press %1 to return to windowed mode." +msgstr "Pritisnite %1 za povratak u prozorski način rada." msgid "Speed" msgstr "Brzina" @@ -717,11 +717,11 @@ msgstr "Ostali periferni uređaji" msgid "Click to capture mouse" msgstr "Kliknite da uhvatite miš" -msgid "Press %s to release mouse" -msgstr "Pritisnite %s za otpustanje miša" +msgid "Press %1 to release mouse" +msgstr "Pritisnite %1 za otpustanje miša" -msgid "Press %s or middle button to release mouse" -msgstr "Pritisnite %s ili srednji gumb miša za otpuštanje miša" +msgid "Press %1 or middle button to release mouse" +msgstr "Pritisnite %1 ili srednji gumb miša za otpuštanje miša" msgid "Bus" msgstr "Bus" diff --git a/src/qt/languages/hu-HU.po b/src/qt/languages/hu-HU.po index 43a1fd9ba..3398859d2 100644 --- a/src/qt/languages/hu-HU.po +++ b/src/qt/languages/hu-HU.po @@ -630,8 +630,8 @@ msgstr "Végzetes hiba" msgid " - PAUSED" msgstr " - SZÜNETELT" -msgid "Press %s to return to windowed mode." -msgstr "Használja a %s gombokat az ablakhoz való visszatéréshez." +msgid "Press %1 to return to windowed mode." +msgstr "Használja a %1 gombokat az ablakhoz való visszatéréshez." msgid "Speed" msgstr "Sebesség" @@ -717,11 +717,11 @@ msgstr "Egyéb perifériák" msgid "Click to capture mouse" msgstr "Kattintson az egér elfogásához" -msgid "Press %s to release mouse" -msgstr "Nyomja meg az %s-t az egér elengédéséhez" +msgid "Press %1 to release mouse" +msgstr "Nyomja meg az %1-t az egér elengédéséhez" -msgid "Press %s or middle button to release mouse" -msgstr "Nyomja meg az %s-t vagy a középső gombot az egér elengédéséhez" +msgid "Press %1 or middle button to release mouse" +msgstr "Nyomja meg az %1-t vagy a középső gombot az egér elengédéséhez" msgid "Bus" msgstr "Busz" diff --git a/src/qt/languages/it-IT.po b/src/qt/languages/it-IT.po index b8ded74de..d45a0080b 100644 --- a/src/qt/languages/it-IT.po +++ b/src/qt/languages/it-IT.po @@ -630,8 +630,8 @@ msgstr "Errore fatale" msgid " - PAUSED" msgstr " - IN PAUSA" -msgid "Press %s to return to windowed mode." -msgstr "Usa %s per tornare alla modalità finestra." +msgid "Press %1 to return to windowed mode." +msgstr "Usa %1 per tornare alla modalità finestra." msgid "Speed" msgstr "Velocità" @@ -717,11 +717,11 @@ msgstr "Altre periferiche" msgid "Click to capture mouse" msgstr "Fare clic per catturare mouse" -msgid "Press %s to release mouse" -msgstr "Premi %s per rilasciare il mouse" +msgid "Press %1 to release mouse" +msgstr "Premi %1 per rilasciare il mouse" -msgid "Press %s or middle button to release mouse" -msgstr "Premi %s o pulsante centrale per rilasciare il mouse" +msgid "Press %1 or middle button to release mouse" +msgstr "Premi %1 o pulsante centrale per rilasciare il mouse" msgid "Bus" msgstr "Bus" diff --git a/src/qt/languages/ja-JP.po b/src/qt/languages/ja-JP.po index dc000b175..7883f8a5a 100644 --- a/src/qt/languages/ja-JP.po +++ b/src/qt/languages/ja-JP.po @@ -630,8 +630,8 @@ msgstr "致命的なエラー" msgid " - PAUSED" msgstr " - 一時停止" -msgid "Press %s to return to windowed mode." -msgstr "%sでウィンドウ モードに戻ります。" +msgid "Press %1 to return to windowed mode." +msgstr "%1でウィンドウ モードに戻ります。" msgid "Speed" msgstr "速度" @@ -717,11 +717,11 @@ msgstr "他の周辺デバイス" msgid "Click to capture mouse" msgstr "左クリックでマウスをキャプチャします" -msgid "Press %s to release mouse" -msgstr "%sキーでマウスを解放します" +msgid "Press %1 to release mouse" +msgstr "%1キーでマウスを解放します" -msgid "Press %s or middle button to release mouse" -msgstr "%sキーまたは中クリックでマウスを解放します" +msgid "Press %1 or middle button to release mouse" +msgstr "%1キーまたは中クリックでマウスを解放します" msgid "Bus" msgstr "バス" diff --git a/src/qt/languages/ko-KR.po b/src/qt/languages/ko-KR.po index 3ef901789..a9ed452d6 100644 --- a/src/qt/languages/ko-KR.po +++ b/src/qt/languages/ko-KR.po @@ -630,8 +630,8 @@ msgstr "치명적인 오류" msgid " - PAUSED" msgstr " - 일시 중지됨" -msgid "Press %s to return to windowed mode." -msgstr "%s 키를 누르면 창 모드로 전환합니다." +msgid "Press %1 to return to windowed mode." +msgstr "%1 키를 누르면 창 모드로 전환합니다." msgid "Speed" msgstr "속도" @@ -717,11 +717,11 @@ msgstr "기타 주변기기" msgid "Click to capture mouse" msgstr "이 창을 클릭하면 마우스를 사용합니다" -msgid "Press %s to release mouse" -msgstr "%s키를 누르면 마우스를 해제합니다" +msgid "Press %1 to release mouse" +msgstr "%1키를 누르면 마우스를 해제합니다" -msgid "Press %s or middle button to release mouse" -msgstr "%s키 또는 가운데 버튼을 클릭하면 마우스를 해제합니다" +msgid "Press %1 or middle button to release mouse" +msgstr "%1키 또는 가운데 버튼을 클릭하면 마우스를 해제합니다" msgid "Bus" msgstr "버스" diff --git a/src/qt/languages/nl-NL.po b/src/qt/languages/nl-NL.po index 49a32506b..2859916d7 100644 --- a/src/qt/languages/nl-NL.po +++ b/src/qt/languages/nl-NL.po @@ -630,8 +630,8 @@ msgstr "Fatale fout" msgid " - PAUSED" msgstr " - GEPAUZEERD" -msgid "Press %s to return to windowed mode." -msgstr "Druk op %s om terug te gaan naar de venstermodus." +msgid "Press %1 to return to windowed mode." +msgstr "Druk op %1 om terug te gaan naar de venstermodus." msgid "Speed" msgstr "Snelheid" @@ -717,11 +717,11 @@ msgstr "Andere randapparatuur" msgid "Click to capture mouse" msgstr "Klik om muis vast te leggen" -msgid "Press %s to release mouse" -msgstr "Druk op %s om de muis los te laten" +msgid "Press %1 to release mouse" +msgstr "Druk op %1 om de muis los te laten" -msgid "Press %s or middle button to release mouse" -msgstr "Druk op %s of middelste knop om de muis los te laten" +msgid "Press %1 or middle button to release mouse" +msgstr "Druk op %1 of middelste knop om de muis los te laten" msgid "Bus" msgstr "Bus" diff --git a/src/qt/languages/pl-PL.po b/src/qt/languages/pl-PL.po index d5b5ec3ea..02bdc26fe 100644 --- a/src/qt/languages/pl-PL.po +++ b/src/qt/languages/pl-PL.po @@ -630,8 +630,8 @@ msgstr "Fatalny błąd" msgid " - PAUSED" msgstr " - PAUSED" -msgid "Press %s to return to windowed mode." -msgstr "Naciśnij klawisze %s aby wrócić to trybu okna." +msgid "Press %1 to return to windowed mode." +msgstr "Naciśnij klawisze %1 aby wrócić to trybu okna." msgid "Speed" msgstr "Szybkość" @@ -717,11 +717,11 @@ msgstr "Inne urządzenia peryferyjne" msgid "Click to capture mouse" msgstr "Kliknij w celu przechwycenia myszy" -msgid "Press %s to release mouse" -msgstr "Naciśnij klawisze %s w celu uwolnienia myszy" +msgid "Press %1 to release mouse" +msgstr "Naciśnij klawisze %1 w celu uwolnienia myszy" -msgid "Press %s or middle button to release mouse" -msgstr "Naciśnij klawisze %s lub środkowy przycisk w celu uwolnienia myszy" +msgid "Press %1 or middle button to release mouse" +msgstr "Naciśnij klawisze %1 lub środkowy przycisk w celu uwolnienia myszy" msgid "Bus" msgstr "Magistrala" diff --git a/src/qt/languages/pt-BR.po b/src/qt/languages/pt-BR.po index e33630ccf..4fb974f4d 100644 --- a/src/qt/languages/pt-BR.po +++ b/src/qt/languages/pt-BR.po @@ -630,8 +630,8 @@ msgstr "Erro fatal" msgid " - PAUSED" msgstr " - PAUSADO" -msgid "Press %s to return to windowed mode." -msgstr "Use %s para retornar ao modo janela." +msgid "Press %1 to return to windowed mode." +msgstr "Use %1 para retornar ao modo janela." msgid "Speed" msgstr "Velocidade" @@ -717,11 +717,11 @@ msgstr "Outros periféricos" msgid "Click to capture mouse" msgstr "Clique para capturar o mouse" -msgid "Press %s to release mouse" -msgstr "Aperte %s para liberar o mouse" +msgid "Press %1 to release mouse" +msgstr "Aperte %1 para liberar o mouse" -msgid "Press %s or middle button to release mouse" -msgstr "Aperte %s ou botão do meio para liberar o mouse" +msgid "Press %1 or middle button to release mouse" +msgstr "Aperte %1 ou botão do meio para liberar o mouse" msgid "Bus" msgstr "Barramento" diff --git a/src/qt/languages/pt-PT.po b/src/qt/languages/pt-PT.po index ba1c6976c..86c40fc40 100644 --- a/src/qt/languages/pt-PT.po +++ b/src/qt/languages/pt-PT.po @@ -630,8 +630,8 @@ msgstr "Erro fatal" msgid " - PAUSED" msgstr " - EM PAUSA" -msgid "Press %s to return to windowed mode." -msgstr "Pressione %s para voltar ao modo de janela." +msgid "Press %1 to return to windowed mode." +msgstr "Pressione %1 para voltar ao modo de janela." msgid "Speed" msgstr "Velocidade" @@ -717,11 +717,11 @@ msgstr "Outros dispositivos" msgid "Click to capture mouse" msgstr "Clique para capturar o rato" -msgid "Press %s to release mouse" -msgstr "Pressione %s para soltar o rato" +msgid "Press %1 to release mouse" +msgstr "Pressione %1 para soltar o rato" -msgid "Press %s or middle button to release mouse" -msgstr "Pressione %s ou tecla média para soltar o rato" +msgid "Press %1 or middle button to release mouse" +msgstr "Pressione %1 ou tecla média para soltar o rato" msgid "Bus" msgstr "Barramento" diff --git a/src/qt/languages/ru-RU.po b/src/qt/languages/ru-RU.po index e88f4f0fc..899b905ac 100644 --- a/src/qt/languages/ru-RU.po +++ b/src/qt/languages/ru-RU.po @@ -630,8 +630,8 @@ msgstr "Неустранимая ошибка" msgid " - PAUSED" msgstr " - ПАУЗА" -msgid "Press %s to return to windowed mode." -msgstr "Нажмите %s для возврата в оконный режим." +msgid "Press %1 to return to windowed mode." +msgstr "Нажмите %1 для возврата в оконный режим." msgid "Speed" msgstr "Скорость" @@ -717,11 +717,11 @@ msgstr "Другая периферия" msgid "Click to capture mouse" msgstr "Щёлкните мышью для захвата курсора" -msgid "Press %s to release mouse" -msgstr "Нажмите %s, чтобы освободить курсор" +msgid "Press %1 to release mouse" +msgstr "Нажмите %1, чтобы освободить курсор" -msgid "Press %s or middle button to release mouse" -msgstr "Нажмите %s или среднюю кнопку мыши, чтобы освободить курсор" +msgid "Press %1 or middle button to release mouse" +msgstr "Нажмите %1 или среднюю кнопку мыши, чтобы освободить курсор" msgid "Bus" msgstr "Шина" diff --git a/src/qt/languages/sk-SK.po b/src/qt/languages/sk-SK.po index f11f335d4..624715f76 100644 --- a/src/qt/languages/sk-SK.po +++ b/src/qt/languages/sk-SK.po @@ -630,8 +630,8 @@ msgstr "Kritická chyba" msgid " - PAUSED" msgstr " - POZASTAVENÝ" -msgid "Press %s to return to windowed mode." -msgstr "Stlačte %s pre návrat z režimu celej obrazovky." +msgid "Press %1 to return to windowed mode." +msgstr "Stlačte %1 pre návrat z režimu celej obrazovky." msgid "Speed" msgstr "Rýchlosť" @@ -717,11 +717,11 @@ msgstr "Iné príslušenstvo" msgid "Click to capture mouse" msgstr "Kliknite pre zabráni myši" -msgid "Press %s to release mouse" -msgstr "Stlačte %s pre uvoľnenie myši" +msgid "Press %1 to release mouse" +msgstr "Stlačte %1 pre uvoľnenie myši" -msgid "Press %s or middle button to release mouse" -msgstr "Stlačte %s alebo prostredné tlačidlo na uvoľnenie myši" +msgid "Press %1 or middle button to release mouse" +msgstr "Stlačte %1 alebo prostredné tlačidlo na uvoľnenie myši" msgid "Bus" msgstr "Zbernica" diff --git a/src/qt/languages/sl-SI.po b/src/qt/languages/sl-SI.po index dcb3dbf50..d07a1eac4 100644 --- a/src/qt/languages/sl-SI.po +++ b/src/qt/languages/sl-SI.po @@ -630,8 +630,8 @@ msgstr "Kritična napaka" msgid " - PAUSED" msgstr " - ZAUSTAVLJEN" -msgid "Press %s to return to windowed mode." -msgstr "Pritisnite %s za povratek iz celozaslonskega načina." +msgid "Press %1 to return to windowed mode." +msgstr "Pritisnite %1 za povratek iz celozaslonskega načina." msgid "Speed" msgstr "Hitrost" @@ -717,11 +717,11 @@ msgstr "Druga periferija" msgid "Click to capture mouse" msgstr "Kliknite za zajem miške" -msgid "Press %s to release mouse" -msgstr "Pritisnite %s za izpust miške" +msgid "Press %1 to release mouse" +msgstr "Pritisnite %1 za izpust miške" -msgid "Press %s or middle button to release mouse" -msgstr "Pritisnite %s ali srednji gumb za izpust miške" +msgid "Press %1 or middle button to release mouse" +msgstr "Pritisnite %1 ali srednji gumb za izpust miške" msgid "Bus" msgstr "Vodilo" diff --git a/src/qt/languages/sv-SE.po b/src/qt/languages/sv-SE.po index 61152c663..e33dbfe21 100644 --- a/src/qt/languages/sv-SE.po +++ b/src/qt/languages/sv-SE.po @@ -630,8 +630,8 @@ msgstr "Allvarligt fel" msgid " - PAUSED" msgstr " - PAUSAD" -msgid "Press %s to return to windowed mode." -msgstr "Tryck på %s för att återvända till fönsterläge." +msgid "Press %1 to return to windowed mode." +msgstr "Tryck på %1 för att återvända till fönsterläge." msgid "Speed" msgstr "Hastighet" @@ -717,11 +717,11 @@ msgstr "Andra tillbehör" msgid "Click to capture mouse" msgstr "Klicka för att fånga upp musen" -msgid "Press %s to release mouse" -msgstr "Tryck på %s för att släppa musen" +msgid "Press %1 to release mouse" +msgstr "Tryck på %1 för att släppa musen" -msgid "Press %s or middle button to release mouse" -msgstr "Tryck på %s eller mellersta musknappen för att släppa musen" +msgid "Press %1 or middle button to release mouse" +msgstr "Tryck på %1 eller mellersta musknappen för att släppa musen" msgid "Bus" msgstr "Buss" diff --git a/src/qt/languages/tr-TR.po b/src/qt/languages/tr-TR.po index de111c59b..24c1c0ba0 100644 --- a/src/qt/languages/tr-TR.po +++ b/src/qt/languages/tr-TR.po @@ -630,8 +630,8 @@ msgstr "Kritik hata" msgid " - PAUSED" msgstr " - DURAKLATILDI" -msgid "Press %s to return to windowed mode." -msgstr "Pencere moduna geri dönmek için %s tuşlarına basın." +msgid "Press %1 to return to windowed mode." +msgstr "Pencere moduna geri dönmek için %1 tuşlarına basın." msgid "Speed" msgstr "Hız" @@ -717,11 +717,11 @@ msgstr "Diğer cihazlar" msgid "Click to capture mouse" msgstr "Farenin yakalanması için tıklayın" -msgid "Press %s to release mouse" -msgstr "Farenin bırakılması için %s tuşlarına basın" +msgid "Press %1 to release mouse" +msgstr "Farenin bırakılması için %1 tuşlarına basın" -msgid "Press %s or middle button to release mouse" -msgstr "Farenin bırakılması için %s tuşlarına veya tekerlek tuşuna basın" +msgid "Press %1 or middle button to release mouse" +msgstr "Farenin bırakılması için %1 tuşlarına veya tekerlek tuşuna basın" msgid "Bus" msgstr "Veri yolu" diff --git a/src/qt/languages/uk-UA.po b/src/qt/languages/uk-UA.po index db9b73491..68b50771a 100644 --- a/src/qt/languages/uk-UA.po +++ b/src/qt/languages/uk-UA.po @@ -630,8 +630,8 @@ msgstr "Непереробна помилка" msgid " - PAUSED" msgstr " - ПРИЗУПИНЕННЯ" -msgid "Press %s to return to windowed mode." -msgstr "Натисніть %s для повернення у віконний режим." +msgid "Press %1 to return to windowed mode." +msgstr "Натисніть %1 для повернення у віконний режим." msgid "Speed" msgstr "Швидкість" @@ -717,11 +717,11 @@ msgstr "Інша периферія" msgid "Click to capture mouse" msgstr "Клацніть мишею для захвату курсора" -msgid "Press %s to release mouse" -msgstr "Натисніть %s, щоб звільнити курсор" +msgid "Press %1 to release mouse" +msgstr "Натисніть %1, щоб звільнити курсор" -msgid "Press %s or middle button to release mouse" -msgstr "Натисніть %s або середню кнопку миші, щоб звільнити курсор" +msgid "Press %1 or middle button to release mouse" +msgstr "Натисніть %1 або середню кнопку миші, щоб звільнити курсор" msgid "Bus" msgstr "Шина" diff --git a/src/qt/languages/vi-VN.po b/src/qt/languages/vi-VN.po index e21466a18..8632234df 100644 --- a/src/qt/languages/vi-VN.po +++ b/src/qt/languages/vi-VN.po @@ -630,8 +630,8 @@ msgstr "Lỗi nghiêm trọng" msgid " - PAUSED" msgstr " - TẠM DỪNG" -msgid "Press %s to return to windowed mode." -msgstr "Bấm %s để quay lại chế độ cửa sổ." +msgid "Press %1 to return to windowed mode." +msgstr "Bấm %1 để quay lại chế độ cửa sổ." msgid "Speed" msgstr "Vận tốc" @@ -717,11 +717,11 @@ msgstr "Thiết bị ngoại vi khác" msgid "Click to capture mouse" msgstr "Nhấp vào khung hình để 'nhốt' chuột vào" -msgid "Press %s to release mouse" -msgstr "Nhấn %s để thả chuột" +msgid "Press %1 to release mouse" +msgstr "Nhấn %1 để thả chuột" -msgid "Press %s or middle button to release mouse" -msgstr "Nhấn %s hoặc nhấp chuột giữa để thả chuột" +msgid "Press %1 or middle button to release mouse" +msgstr "Nhấn %1 hoặc nhấp chuột giữa để thả chuột" msgid "Bus" msgstr "Bus" diff --git a/src/qt/languages/zh-CN.po b/src/qt/languages/zh-CN.po index c29e40dfb..194db4f3d 100644 --- a/src/qt/languages/zh-CN.po +++ b/src/qt/languages/zh-CN.po @@ -630,8 +630,8 @@ msgstr "致命错误" msgid " - PAUSED" msgstr " - 已暂停" -msgid "Press Ctrl+Alt+PgDn to return to windowed mode." -msgstr "按下 Ctrl+Alt+PgDn 返回到窗口模式。" +msgid "Press %1 to return to windowed mode." +msgstr "按下 %1 返回到窗口模式。" msgid "Speed" msgstr "速度" @@ -717,11 +717,11 @@ msgstr "其他外围设备" msgid "Click to capture mouse" msgstr "单击窗口捕捉鼠标" -msgid "Press %s to release mouse" -msgstr "按下 %s 释放鼠标" +msgid "Press %1 to release mouse" +msgstr "按下 %1 释放鼠标" -msgid "Press %s or middle button to release mouse" -msgstr "按下 %s 或鼠标中键释放鼠标" +msgid "Press %1 or middle button to release mouse" +msgstr "按下 %1 或鼠标中键释放鼠标" msgid "Bus" msgstr "总线" diff --git a/src/qt/languages/zh-TW.po b/src/qt/languages/zh-TW.po index 7de6f8cd3..3bdf6b823 100644 --- a/src/qt/languages/zh-TW.po +++ b/src/qt/languages/zh-TW.po @@ -630,8 +630,8 @@ msgstr "致命錯誤" msgid " - PAUSED" msgstr " - 已暫停" -msgid "Press Ctrl+Alt+PgDn to return to windowed mode." -msgstr "按下 Ctrl+Alt+PgDn 返回到視窗模式。" +msgid "Press %1 to return to windowed mode." +msgstr "按下 %1 返回到視窗模式。" msgid "Speed" msgstr "速度" @@ -717,11 +717,11 @@ msgstr "其他周邊裝置" msgid "Click to capture mouse" msgstr "點擊視窗捕捉滑鼠" -msgid "Press %s to release mouse" -msgstr "按下 %s 釋放滑鼠" +msgid "Press %1 to release mouse" +msgstr "按下 %1 釋放滑鼠" -msgid "Press %s or middle button to release mouse" -msgstr "按下 %s 或滑鼠中鍵釋放滑鼠" +msgid "Press %1 or middle button to release mouse" +msgstr "按下 %1 或滑鼠中鍵釋放滑鼠" msgid "Bus" msgstr "匯流排" diff --git a/src/qt/qt_keybind.cpp b/src/qt/qt_keybind.cpp index c7ed894b3..e6e87a5e2 100644 --- a/src/qt/qt_keybind.cpp +++ b/src/qt/qt_keybind.cpp @@ -90,7 +90,7 @@ KeyBinder::BindKey(QWidget* widget, QString CurValue) KeyBinder kb(widget); kb.setWindowTitle(tr("Bind Key")); kb.setFixedSize(kb.minimumSizeHint()); - kb.findChild()->setKeySequence(QKeySequence::fromString(CurValue)); + kb.findChild()->setKeySequence(QKeySequence::fromString(CurValue, QKeySequence::NativeText)); kb.setEnabled(true); if (kb.exec() == QDialog::Accepted) { diff --git a/src/qt/qt_mainwindow.cpp b/src/qt/qt_mainwindow.cpp index e966e043a..3aa29f7f4 100644 --- a/src/qt/qt_mainwindow.cpp +++ b/src/qt/qt_mainwindow.cpp @@ -1347,10 +1347,9 @@ MainWindow::on_actionFullscreen_triggered() if (video_fullscreen_first) { bool wasCaptured = mouse_capture == 1; - char strFullscreen[100]; - sprintf(strFullscreen, qPrintable(tr("Press %s to return to windowed mode.")), acc_keys[FindAccelerator("fullscreen")].seq); - - QMessageBox questionbox(QMessageBox::Icon::Information, tr("Entering fullscreen mode"), QString(strFullscreen), QMessageBox::Ok, this); + QMessageBox questionbox(QMessageBox::Icon::Information, tr("Entering fullscreen mode"), + tr("Press %1 to return to windowed mode.").arg(QKeySequence(acc_keys[FindAccelerator("fullscreen")].seq, QKeySequence::PortableText).toString(QKeySequence::NativeText)), + QMessageBox::Ok, this); QCheckBox *chkbox = new QCheckBox(tr("Don't show this message again")); questionbox.setCheckBox(chkbox); chkbox->setChecked(!video_fullscreen_first); diff --git a/src/qt/qt_platform.cpp b/src/qt/qt_platform.cpp index be40452fd..a8c25bc2d 100644 --- a/src/qt/qt_platform.cpp +++ b/src/qt/qt_platform.cpp @@ -43,6 +43,7 @@ #include #include #include +#include #include #include @@ -571,8 +572,6 @@ c16stombs(char dst[], const uint16_t src[], int len) } #endif -# define MOUSE_CAPTURE_KEYSEQ "F8+F12" - #ifdef _WIN32 # if defined(__amd64__) || defined(_M_X64) || defined(__aarch64__) || defined(_M_ARM64) # define LIB_NAME_GS "gsdll64.dll" @@ -595,14 +594,8 @@ ProgSettings::reloadStrings() { translatedstrings.clear(); translatedstrings[STRING_MOUSE_CAPTURE] = QCoreApplication::translate("", "Click to capture mouse").toStdWString(); - - char mouseCaptureKeyseq[100]; - sprintf(mouseCaptureKeyseq, qPrintable(QCoreApplication::translate("", "Press %s to release mouse")), acc_keys[FindAccelerator("release_mouse")].seq); - translatedstrings[STRING_MOUSE_RELEASE] = QString(mouseCaptureKeyseq).toStdWString(); - - sprintf(mouseCaptureKeyseq, qPrintable(QCoreApplication::translate("", "Press %s or middle button to release mouse")), acc_keys[FindAccelerator("release_mouse")].seq); - translatedstrings[STRING_MOUSE_RELEASE_MMB] = QString(mouseCaptureKeyseq).toStdWString(); - + translatedstrings[STRING_MOUSE_RELEASE] = QCoreApplication::translate("", "Press %1 to release mouse").arg(QKeySequence(acc_keys[FindAccelerator("release_mouse")].seq, QKeySequence::PortableText).toString(QKeySequence::NativeText)).toStdWString(); + translatedstrings[STRING_MOUSE_RELEASE_MMB] = QCoreApplication::translate("", "Press %1 or middle button to release mouse").arg(QKeySequence(acc_keys[FindAccelerator("release_mouse")].seq, QKeySequence::PortableText).toString(QKeySequence::NativeText)).toStdWString(); translatedstrings[STRING_INVALID_CONFIG] = QCoreApplication::translate("", "Invalid configuration").toStdWString(); translatedstrings[STRING_NO_ST506_ESDI_CDROM] = QCoreApplication::translate("", "MFM/RLL or ESDI CD-ROM drives never existed").toStdWString(); translatedstrings[STRING_PCAP_ERROR_NO_DEVICES] = QCoreApplication::translate("", "No PCap devices found").toStdWString(); diff --git a/src/qt/qt_settingsinput.cpp b/src/qt/qt_settingsinput.cpp index f3729ab3f..a7000414c 100644 --- a/src/qt/qt_settingsinput.cpp +++ b/src/qt/qt_settingsinput.cpp @@ -162,7 +162,7 @@ SettingsInput::refreshInputList() for (int x=0;xtableKeys->setItem(x, 0, new QTableWidgetItem(tr(acc_keys_t[x].desc))); - ui->tableKeys->setItem(x, 1, new QTableWidgetItem(acc_keys_t[x].seq)); + ui->tableKeys->setItem(x, 1, new QTableWidgetItem(QKeySequence(acc_keys_t[x].seq, QKeySequence::PortableText).toString(QKeySequence::NativeText))); ui->tableKeys->setItem(x, 2, new QTableWidgetItem(acc_keys_t[x].name)); } } @@ -201,7 +201,7 @@ SettingsInput::on_tableKeys_cellDoubleClicked(int row, int col) // so we don't test against shortcuts the user already changed. for(int x=0;xshowMessage(MBX_ANSI & MBX_INFO, "Bind conflict", "This key combo is already in use", false); @@ -212,12 +212,12 @@ SettingsInput::on_tableKeys_cellDoubleClicked(int row, int col) // Go ahead and apply the bind. // Find the correct accelerator key entry - int accKeyID = FindAccelerator(qPrintable(ui->tableKeys->item(row,2)->text())); + int accKeyID = FindAccelerator(ui->tableKeys->item(row,2)->text().toUtf8().constData()); if (accKeyID < 0) return; // this should never happen // Make the change cell->setText(keyseq.toString(QKeySequence::NativeText)); - strcpy(acc_keys_t[accKeyID].seq, qPrintable(keyseq.toString(QKeySequence::NativeText))); + strcpy(acc_keys_t[accKeyID].seq, keyseq.toString(QKeySequence::PortableText).toUtf8().constData()); refreshInputList(); } @@ -242,7 +242,7 @@ SettingsInput::on_pushButtonClearBind_clicked() cell->setText(""); // Find the correct accelerator key entry - int accKeyID = FindAccelerator(qPrintable(ui->tableKeys->item(cell->row(),2)->text())); + int accKeyID = FindAccelerator(ui->tableKeys->item(cell->row(),2)->text().toUtf8().constData()); if (accKeyID < 0) return; // this should never happen // Make the change From 44376db7f243e6f890411dd8a2383a359de437be Mon Sep 17 00:00:00 2001 From: OBattler Date: Wed, 7 May 2025 19:29:15 +0200 Subject: [PATCH 150/180] Ambra DP60: It is the original Batman, so no RZ-1000, and FDC37C665 controlling primary IDE. --- src/machine/m_at_socket4.c | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/src/machine/m_at_socket4.c b/src/machine/m_at_socket4.c index 92f88fbe6..03ff03a23 100644 --- a/src/machine/m_at_socket4.c +++ b/src/machine/m_at_socket4.c @@ -219,7 +219,22 @@ machine_at_ambradp60_init(const machine_t *model) if (bios_only || !ret) return ret; - machine_at_premiere_common_init(model, 0); + machine_at_common_init_ex(model, 2); + + device_add(&amstrad_megapc_nvr_device); + device_add(&ide_pci_device); + + pci_init(PCI_CONFIG_TYPE_2); + pci_register_slot(0x00, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); + pci_register_slot(0x01, PCI_CARD_IDE, 0, 0, 0, 0); + pci_register_slot(0x06, PCI_CARD_NORMAL, 3, 2, 1, 4); + pci_register_slot(0x0E, PCI_CARD_NORMAL, 2, 1, 3, 4); + pci_register_slot(0x0C, PCI_CARD_NORMAL, 1, 3, 2, 4); + pci_register_slot(0x02, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 0); + device_add(&keyboard_ps2_phoenix_device); + device_add(&sio_zb_device); + device_add(&fdc37c665_ide_pri_device); + device_add(&intel_flash_bxt_ami_device); device_add(&i430lx_device); From c42f1e4d122efc15c832858f264683cea844d598 Mon Sep 17 00:00:00 2001 From: Alexander Babikov Date: Wed, 7 May 2025 21:01:43 +0500 Subject: [PATCH 151/180] Remove the fullscreen hotkey message No longer needed after the hotkeys to enter and exit full screen mode were merged into one --- src/86box.c | 1 - src/config.c | 8 -------- src/include/86box/86box.h | 1 - src/include/86box/video.h | 1 - src/qt/languages/86box.pot | 11 +---------- src/qt/languages/ca-ES.po | 13 ++----------- src/qt/languages/cs-CZ.po | 13 ++----------- src/qt/languages/de-DE.po | 13 ++----------- src/qt/languages/en-GB.po | 4 ++-- src/qt/languages/es-ES.po | 13 ++----------- src/qt/languages/fi-FI.po | 13 ++----------- src/qt/languages/fr-FR.po | 13 ++----------- src/qt/languages/hr-HR.po | 13 ++----------- src/qt/languages/hu-HU.po | 13 ++----------- src/qt/languages/it-IT.po | 13 ++----------- src/qt/languages/ja-JP.po | 13 ++----------- src/qt/languages/ko-KR.po | 13 ++----------- src/qt/languages/nl-NL.po | 13 ++----------- src/qt/languages/pl-PL.po | 13 ++----------- src/qt/languages/pt-BR.po | 13 ++----------- src/qt/languages/pt-PT.po | 13 ++----------- src/qt/languages/ru-RU.po | 13 ++----------- src/qt/languages/sk-SK.po | 13 ++----------- src/qt/languages/sl-SI.po | 13 ++----------- src/qt/languages/sv-SE.po | 13 ++----------- src/qt/languages/tr-TR.po | 13 ++----------- src/qt/languages/uk-UA.po | 13 ++----------- src/qt/languages/vi-VN.po | 13 ++----------- src/qt/languages/zh-CN.po | 13 ++----------- src/qt/languages/zh-TW.po | 13 ++----------- src/qt/qt_mainwindow.cpp | 20 -------------------- src/qt/qt_progsettings.cpp | 2 -- src/qt/qt_progsettings.ui | 7 ------- 33 files changed, 51 insertions(+), 316 deletions(-) diff --git a/src/86box.c b/src/86box.c index 1d7a73060..25dc0e6e9 100644 --- a/src/86box.c +++ b/src/86box.c @@ -168,7 +168,6 @@ int vid_api = 0; /* (C) video r int vid_cga_contrast = 0; /* (C) video */ int video_fullscreen = 0; /* (C) video */ int video_fullscreen_scale = 0; /* (C) video */ -int video_fullscreen_first = 0; /* (C) video */ int enable_overscan = 0; /* (C) video */ int force_43 = 0; /* (C) video */ int video_filter_method = 1; /* (C) video */ diff --git a/src/config.c b/src/config.c index 52a80763a..dfe0190ac 100644 --- a/src/config.c +++ b/src/config.c @@ -128,8 +128,6 @@ load_general(void) video_fullscreen_scale = ini_section_get_int(cat, "video_fullscreen_scale", 1); - video_fullscreen_first = ini_section_get_int(cat, "video_fullscreen_first", 1); - video_filter_method = ini_section_get_int(cat, "video_filter_method", 1); inhibit_multimedia_keys = ini_section_get_int(cat, "inhibit_multimedia_keys", 0); @@ -1832,7 +1830,6 @@ config_load(void) gfxcard[0] = video_get_video_from_internal_name("cga"); vid_api = plat_vidapi("default"); vid_resize = 0; - video_fullscreen_first = 1; video_fullscreen_scale = 1; time_sync = TIME_SYNC_ENABLED; hdc_current[0] = hdc_get_from_internal_name("none"); @@ -1955,11 +1952,6 @@ save_general(void) else ini_section_set_int(cat, "video_fullscreen_scale", video_fullscreen_scale); - if (video_fullscreen_first == 1) - ini_section_delete_var(cat, "video_fullscreen_first"); - else - ini_section_set_int(cat, "video_fullscreen_first", video_fullscreen_first); - if (video_filter_method == 1) ini_section_delete_var(cat, "video_filter_method"); else diff --git a/src/include/86box/86box.h b/src/include/86box/86box.h index e19665535..76f311d17 100644 --- a/src/include/86box/86box.h +++ b/src/include/86box/86box.h @@ -121,7 +121,6 @@ extern int dpi_scale; /* (C) DPI scaling of the emulated s extern int vid_api; /* (C) video renderer */ extern int vid_cga_contrast; /* (C) video */ extern int video_fullscreen; /* (C) video */ -extern int video_fullscreen_first; /* (C) video */ extern int video_fullscreen_scale; /* (C) video */ extern int enable_overscan; /* (C) video */ extern int force_43; /* (C) video */ diff --git a/src/include/86box/video.h b/src/include/86box/video.h index 1b50d86f8..bbcc94fe7 100644 --- a/src/include/86box/video.h +++ b/src/include/86box/video.h @@ -189,7 +189,6 @@ extern uint32_t pal_lookup[256]; #endif extern int video_fullscreen; extern int video_fullscreen_scale; -extern int video_fullscreen_first; extern uint8_t fontdat[2048][8]; extern uint8_t fontdatm[2048][16]; extern uint8_t fontdat2[2048][8]; diff --git a/src/qt/languages/86box.pot b/src/qt/languages/86box.pot index d5152cd3d..ac379b171 100644 --- a/src/qt/languages/86box.pot +++ b/src/qt/languages/86box.pot @@ -630,9 +630,6 @@ msgstr "" msgid " - PAUSED" msgstr "" -msgid "Press %1 to return to windowed mode." -msgstr "" - msgid "Speed" msgstr "" @@ -864,9 +861,6 @@ msgstr "" msgid "%1 is required for automatic conversion of PCL files to PDF.\n\nAny documents sent to the generic PCL printer will be saved as Printer Command Language (.pcl) files." msgstr "" -msgid "Entering fullscreen mode" -msgstr "" - msgid "Don't show this message again" msgstr "" @@ -1305,7 +1299,7 @@ msgstr "" msgid "\nFalling back to software rendering." msgstr "" -msgid "<html><head/><body><p>When selecting media images (CD-ROM, floppy, etc.) the open dialog will start in the same directory as the 86Box configuration file. This setting will likely only make a difference on macOS.</p></body></html>" +msgid "

When selecting media images (CD-ROM, floppy, etc.) the open dialog will start in the same directory as the 86Box configuration file. This setting will likely only make a difference on macOS.

" msgstr "" msgid "This machine might have been moved or copied." @@ -2112,9 +2106,6 @@ msgstr "" msgid "Ask for confirmation before quitting" msgstr "" -msgid "Display hotkey message when entering full-screen mode" -msgstr "" - msgid "Options" msgstr "" diff --git a/src/qt/languages/ca-ES.po b/src/qt/languages/ca-ES.po index 7fe87eb1a..632af979a 100644 --- a/src/qt/languages/ca-ES.po +++ b/src/qt/languages/ca-ES.po @@ -630,9 +630,6 @@ msgstr "Error fatal" msgid " - PAUSED" msgstr " - EN PAUSA" -msgid "Press %1 to return to windowed mode." -msgstr "Premeu %1 per tornar al mode de finestra." - msgid "Speed" msgstr "Velocitat" @@ -864,9 +861,6 @@ msgstr "%1 és necessària per a la conversió automàtica de fitxers PostScript msgid "%1 is required for automatic conversion of PCL files to PDF.\n\nAny documents sent to the generic PCL printer will be saved as Printer Command Language (.pcl) files." msgstr "%1 és necessària per a la conversió automàtica de fitxers PCL a PDF.\n\nQualsevol document enviat a la impressora genèrica PCL es desarà com a fitxer Printer Command Language (.pcl)." -msgid "Entering fullscreen mode" -msgstr "Entrant en mode pantalla completa" - msgid "Don't show this message again" msgstr "No mostreu més aquest missatge" @@ -1305,8 +1299,8 @@ msgstr "Error en inicialitzar OpenGL" msgid "\nFalling back to software rendering." msgstr "\nTornant al renderitzador software." -msgid "<html><head/><body><p>When selecting media images (CD-ROM, floppy, etc.) the open dialog will start in the same directory as the 86Box configuration file. This setting will likely only make a difference on macOS.</p></body></html>" -msgstr "<html><head/><body><p>Quan seleccioneu imatges de suports (CD-ROM, disquet, etc.), el diàleg obert s’iniciarà al mateix directori que el fitxer de configuració 86Box. Aquesta configuració només farà una diferència en les macOS.</p></body></html>" +msgid "

When selecting media images (CD-ROM, floppy, etc.) the open dialog will start in the same directory as the 86Box configuration file. This setting will likely only make a difference on macOS.

" +msgstr "

Quan seleccioneu imatges de suports (CD-ROM, disquet, etc.), el diàleg obert s’iniciarà al mateix directori que el fitxer de configuració 86Box. Aquesta configuració només farà una diferència en les macOS.

" msgid "This machine might have been moved or copied." msgstr "Aquesta màquina podria haver estat moguda o copiada." @@ -2106,9 +2100,6 @@ msgstr "" msgid "Ask for confirmation before quitting" msgstr "" -msgid "Display hotkey message when entering full-screen mode" -msgstr "" - msgid "Options" msgstr "" diff --git a/src/qt/languages/cs-CZ.po b/src/qt/languages/cs-CZ.po index 59a582ca6..593020962 100644 --- a/src/qt/languages/cs-CZ.po +++ b/src/qt/languages/cs-CZ.po @@ -630,9 +630,6 @@ msgstr "Kritická chyba" msgid " - PAUSED" msgstr " - POZASTAVENO" -msgid "Press %1 to return to windowed mode." -msgstr "Stiskněte %1 pro návrat z režimu celé obrazovky." - msgid "Speed" msgstr "Rychlost" @@ -864,9 +861,6 @@ msgstr "%1 je potřeba pro automatický převod PostScript dokumentů do PDF.\n\ msgid "%1 is required for automatic conversion of PCL files to PDF.\n\nAny documents sent to the generic PCL printer will be saved as Printer Command Language (.pcl) files." msgstr "%1 je potřeba pro automatický převod PCL dokumentů do PDF.\n\nJakékoliv dokumenty vytisknuté přes obecnou PCL-ovou tiskárnu budou uloženy jako Printer Command Language (.pcl) soubory." -msgid "Entering fullscreen mode" -msgstr "Vstup do režimu celé obrazovky" - msgid "Don't show this message again" msgstr "Nezobrazovat dále tuto zprávu" @@ -1305,8 +1299,8 @@ msgstr "Chyba při inicializaci OpenGL" msgid "\nFalling back to software rendering." msgstr "\nNávrat k softwarovému vykreslování." -msgid "<html><head/><body><p>When selecting media images (CD-ROM, floppy, etc.) the open dialog will start in the same directory as the 86Box configuration file. This setting will likely only make a difference on macOS.</p></body></html>" -msgstr "<html><head/><body><p>Při výběru obrazů médií (CD-ROM, disketa atd.) se otevřené dialogové okno spustí ve stejném adresáři jako konfigurační soubor 86Box. Toto nastavení bude mít pravděpodobně význam pouze v systému MacOS.</p></body></html>" +msgid "

When selecting media images (CD-ROM, floppy, etc.) the open dialog will start in the same directory as the 86Box configuration file. This setting will likely only make a difference on macOS.

" +msgstr "

Při výběru obrazů médií (CD-ROM, disketa atd.) se otevřené dialogové okno spustí ve stejném adresáři jako konfigurační soubor 86Box. Toto nastavení bude mít pravděpodobně význam pouze v systému MacOS.

" msgid "This machine might have been moved or copied." msgstr "Tento počítač mohl být přemístěn nebo zkopírován." @@ -2106,9 +2100,6 @@ msgstr "" msgid "Ask for confirmation before quitting" msgstr "" -msgid "Display hotkey message when entering full-screen mode" -msgstr "" - msgid "Options" msgstr "" diff --git a/src/qt/languages/de-DE.po b/src/qt/languages/de-DE.po index 0615dada4..439346608 100644 --- a/src/qt/languages/de-DE.po +++ b/src/qt/languages/de-DE.po @@ -630,9 +630,6 @@ msgstr "Fataler Fehler" msgid " - PAUSED" msgstr " - PAUSIERT" -msgid "Press %1 to return to windowed mode." -msgstr "%1 ab, zur Rückkehr in den Fenstermodus." - msgid "Speed" msgstr "Geschwindigkeit" @@ -864,9 +861,6 @@ msgstr "%1 wird zur automatischen Konvertierung von PostScript-Dateien ins PDF-F msgid "%1 is required for automatic conversion of PCL files to PDF.\n\nAny documents sent to the generic PCL printer will be saved as Printer Command Language (.pcl) files." msgstr "%1 wird zur automatischen Konvertierung von PCL-Dateien ins PDF-Format benötigt.\n\nSämtliche an den generischen PCL-Drucker gesendete Dateien werden als Printer Command Language (*.pcl) Dateien gesichert." -msgid "Entering fullscreen mode" -msgstr "Vollbildmodus wird aktiviert" - msgid "Don't show this message again" msgstr "Diese Nachricht nicht mehr anzeigen" @@ -1305,8 +1299,8 @@ msgstr "Fehler beim Initialisieren von OpenGL" msgid "\nFalling back to software rendering." msgstr "\nRückgriff auf Software-Rendering." -msgid "<html><head/><body><p>When selecting media images (CD-ROM, floppy, etc.) the open dialog will start in the same directory as the 86Box configuration file. This setting will likely only make a difference on macOS.</p></body></html>" -msgstr "<html><head/><body><p>Bei der Auswahl von Medien-Abbildern (CD-ROM, Diskette usw.) wird der Öffnungsdialog im selben Verzeichnis wie die 86Box-Konfigurationsdatei gestartet. Diese Einstellung macht wahrscheinlich nur unter macOS einen Unterschied.</p></body></html>" +msgid "

When selecting media images (CD-ROM, floppy, etc.) the open dialog will start in the same directory as the 86Box configuration file. This setting will likely only make a difference on macOS.

" +msgstr "

Bei der Auswahl von Medien-Abbildern (CD-ROM, Diskette usw.) wird der Öffnungsdialog im selben Verzeichnis wie die 86Box-Konfigurationsdatei gestartet. Diese Einstellung macht wahrscheinlich nur unter macOS einen Unterschied.

" msgid "This machine might have been moved or copied." msgstr "Dieses System wurde möglicherweise verschoben oder kopiert." @@ -2106,9 +2100,6 @@ msgstr "" msgid "Ask for confirmation before quitting" msgstr "" -msgid "Display hotkey message when entering full-screen mode" -msgstr "" - msgid "Options" msgstr "" diff --git a/src/qt/languages/en-GB.po b/src/qt/languages/en-GB.po index 8cc29a71a..550bc3ab4 100644 --- a/src/qt/languages/en-GB.po +++ b/src/qt/languages/en-GB.po @@ -39,8 +39,8 @@ msgstr "Synchronise with video" msgid "Error initializing OpenGL" msgstr "Error initialising OpenGL" -msgid "<html><head/><body><p>When selecting media images (CD-ROM, floppy, etc.) the open dialog will start in the same directory as the 86Box configuration file. This setting will likely only make a difference on macOS.</p></body></html>" -msgstr "<html><head/><body><p>When selecting media images (CD-ROM, floppy, etc.) the open dialogue will start in the same directory as the 86Box configuration file. This setting will likely only make a difference on macOS.</p></body></html>" +msgid "

When selecting media images (CD-ROM, floppy, etc.) the open dialog will start in the same directory as the 86Box configuration file. This setting will likely only make a difference on macOS.

" +msgstr "

When selecting media images (CD-ROM, floppy, etc.) the open dialogue will start in the same directory as the 86Box configuration file. This setting will likely only make a difference on macOS.

" msgid "Color (generic)" msgstr "Colour (generic)" diff --git a/src/qt/languages/es-ES.po b/src/qt/languages/es-ES.po index 1f9cf10b2..363d56c45 100644 --- a/src/qt/languages/es-ES.po +++ b/src/qt/languages/es-ES.po @@ -630,9 +630,6 @@ msgstr "Error fatal" msgid " - PAUSED" msgstr " - EN PAUSA" -msgid "Press %1 to return to windowed mode." -msgstr "Pulsa %1 para volver a modo ventana." - msgid "Speed" msgstr "Velocidad" @@ -864,9 +861,6 @@ msgstr "%1 es necesaria para la conversión automática de archivos PostScript a msgid "%1 is required for automatic conversion of PCL files to PDF.\n\nAny documents sent to the generic PCL printer will be saved as Printer Command Language (.pcl) files." msgstr "%1 es necesaria para la conversión automática de archivos PCL a PDF.\n\nCualquier documento enviado a la impresora genérica PCL se guardará como archivo Printer Command Language (.pcl)." -msgid "Entering fullscreen mode" -msgstr "Entrando en modo pantalla completa" - msgid "Don't show this message again" msgstr "No mostrar más este mensaje" @@ -1304,8 +1298,8 @@ msgstr "Error al inicializar OpenGL" msgid "\nFalling back to software rendering." msgstr "\nRecurrir al renderizado por software." -msgid "<html><head/><body><p>When selecting media images (CD-ROM, floppy, etc.) the open dialog will start in the same directory as the 86Box configuration file. This setting will likely only make a difference on macOS.</p></body></html>" -msgstr "<html><head/><body><p>Al seleccionar imágenes multimedia (CD-ROM, disquete, etc.), el diálogo de apertura se iniciará en el mismo directorio que el archivo de configuración de 86Box. Es probable que este ajuste sólo suponga una diferencia en macOS.</p></body></html>" +msgid "

When selecting media images (CD-ROM, floppy, etc.) the open dialog will start in the same directory as the 86Box configuration file. This setting will likely only make a difference on macOS.

" +msgstr "

Al seleccionar imágenes multimedia (CD-ROM, disquete, etc.), el diálogo de apertura se iniciará en el mismo directorio que el archivo de configuración de 86Box. Es probable que este ajuste sólo suponga una diferencia en macOS.

" msgid "This machine might have been moved or copied." msgstr "Esta máquina puede haber sido movida o copiado." @@ -2105,9 +2099,6 @@ msgstr "" msgid "Ask for confirmation before quitting" msgstr "" -msgid "Display hotkey message when entering full-screen mode" -msgstr "" - msgid "Options" msgstr "" diff --git a/src/qt/languages/fi-FI.po b/src/qt/languages/fi-FI.po index 4979332ac..ae4f78bb5 100644 --- a/src/qt/languages/fi-FI.po +++ b/src/qt/languages/fi-FI.po @@ -630,9 +630,6 @@ msgstr "Vakava virhe" msgid " - PAUSED" msgstr " - TAUKO" -msgid "Press %1 to return to windowed mode." -msgstr "Paina %1 palataksesi ikkunoituun tilaan." - msgid "Speed" msgstr "Nopeus" @@ -864,9 +861,6 @@ msgstr "%1 vaaditaan PostScript-tiedostojen automaattiseen muuntamiseen PDF-tied msgid "%1 is required for automatic conversion of PCL files to PDF.\n\nAny documents sent to the generic PCL printer will be saved as Printer Command Language (.pcl) files." msgstr "%1 vaaditaan PCL-tiedostojen automaattiseen muuntamiseen PDF-tiedostoiksi.\n\nKaikki geneeriselle PCL-tulostimelle lähetetyt asiakirjat tallennetaan Printer Command Language (.ps) -tiedostoina." -msgid "Entering fullscreen mode" -msgstr "Siirrytään koko näytön tilaan" - msgid "Don't show this message again" msgstr "Älä näytä tätä viestiä uudelleen" @@ -1308,8 +1302,8 @@ msgstr "Virhe OpenGL:n alustamisessa" msgid "\nFalling back to software rendering." msgstr "\nPaluu ohjelmistoalustusöintiin." -msgid "<html><head/><body><p>When selecting media images (CD-ROM, floppy, etc.) the open dialog will start in the same directory as the 86Box configuration file. This setting will likely only make a difference on macOS.</p></body></html>" -msgstr "<html><head/><body><p>Kun valitset mediakuvia (CD-ROM, levykkeet jne.), avausikkuna käynnistyy samaan hakemistoon kuin 86Boxin konfigurointitiedosto. Tällä asetuksella on todennäköisesti merkitystä vain macOS-käyttöjärjestelmässä.</p></body></html>" +msgid "

When selecting media images (CD-ROM, floppy, etc.) the open dialog will start in the same directory as the 86Box configuration file. This setting will likely only make a difference on macOS.

" +msgstr "

Kun valitset mediakuvia (CD-ROM, levykkeet jne.), avausikkuna käynnistyy samaan hakemistoon kuin 86Boxin konfigurointitiedosto. Tällä asetuksella on todennäköisesti merkitystä vain macOS-käyttöjärjestelmässä.

" msgid "This machine might have been moved or copied." msgstr "Kone on saatettu siirtää tai kopioida." @@ -2109,9 +2103,6 @@ msgstr "" msgid "Ask for confirmation before quitting" msgstr "" -msgid "Display hotkey message when entering full-screen mode" -msgstr "" - msgid "Options" msgstr "" diff --git a/src/qt/languages/fr-FR.po b/src/qt/languages/fr-FR.po index 58de2e4d1..87530590a 100644 --- a/src/qt/languages/fr-FR.po +++ b/src/qt/languages/fr-FR.po @@ -630,9 +630,6 @@ msgstr "Erreur fatale" msgid " - PAUSED" msgstr " - EN PAUSE" -msgid "Press %1 to return to windowed mode." -msgstr "Appuyez sur %1 pour revenir au mode fenêtré." - msgid "Speed" msgstr "Vitesse" @@ -864,9 +861,6 @@ msgstr "%1 est nécessaire pour la conversion automatique des fichiers PostScrip msgid "%1 is required for automatic conversion of PCL files to PDF.\n\nAny documents sent to the generic PCL printer will be saved as Printer Command Language (.pcl) files." msgstr "%1 est nécessaire pour la conversion automatique des fichiers PCL en PDF.\n\nTous les documents envoyés à l'imprimante générique PCL seront sauvés en tant quefichiers Printer Command Language (.pcl)." -msgid "Entering fullscreen mode" -msgstr "Entrer en mode plein écran" - msgid "Don't show this message again" msgstr "Ne pas montrer ce message à nouveau" @@ -1305,8 +1299,8 @@ msgstr "Erreur d'initialisation d'OpenGL" msgid "\nFalling back to software rendering." msgstr "\nSe rabattre sur le rendu logiciel." -msgid "<html><head/><body><p>When selecting media images (CD-ROM, floppy, etc.) the open dialog will start in the same directory as the 86Box configuration file. This setting will likely only make a difference on macOS.</p></body></html>" -msgstr "<html><head/><body><p>Lors de la sélection d'images multimédia (CD-ROM, disquette, etc.), la boîte de dialogue d'ouverture démarrera dans le même répertoire que le fichier de configuration de 86Box. Ce paramètre ne fera probablement une différence que sur macOS.</p></body></html>" +msgid "

When selecting media images (CD-ROM, floppy, etc.) the open dialog will start in the same directory as the 86Box configuration file. This setting will likely only make a difference on macOS.

" +msgstr "

Lors de la sélection d'images multimédia (CD-ROM, disquette, etc.), la boîte de dialogue d'ouverture démarrera dans le même répertoire que le fichier de configuration de 86Box. Ce paramètre ne fera probablement une différence que sur macOS.

" msgid "This machine might have been moved or copied." msgstr "Cette machine peut avoir été déplacée ou copiée." @@ -2106,9 +2100,6 @@ msgstr "Demander confirmation avant Hard Reset" msgid "Ask for confirmation before quitting" msgstr "Demander confirmation avant de quitter" -msgid "Display hotkey message when entering full-screen mode" -msgstr "Afficher Raccourcis Clavier avant de passer en plein écran" - msgid "Options" msgstr "Options" diff --git a/src/qt/languages/hr-HR.po b/src/qt/languages/hr-HR.po index 5f0e60b21..50dd298c2 100644 --- a/src/qt/languages/hr-HR.po +++ b/src/qt/languages/hr-HR.po @@ -630,9 +630,6 @@ msgstr "Fatalna greška" msgid " - PAUSED" msgstr " - ZASTAO" -msgid "Press %1 to return to windowed mode." -msgstr "Pritisnite %1 za povratak u prozorski način rada." - msgid "Speed" msgstr "Brzina" @@ -864,9 +861,6 @@ msgstr "%1 je potrebno za automatsku konverziju PostScript datoteke u PDF datote msgid "%1 is required for automatic conversion of PCL files to PDF.\n\nAny documents sent to the generic PCL printer will be saved as Printer Command Language (.pcl) files." msgstr "%1 je potrebno za automatsku konverziju PCL datoteke u PDF datoteke.\n\nSvi dokumenti poslani na generički PCL pisač bit će spremljeni kao Printer Command Language (.pcl) datoteke." -msgid "Entering fullscreen mode" -msgstr "Ulazim u cijelozaslonski način" - msgid "Don't show this message again" msgstr "Ne pokazi više ovu poruku" @@ -1305,8 +1299,8 @@ msgstr "Nije moguće inicijalizirati OpenGL" msgid "\nFalling back to software rendering." msgstr "\nVraća se na softverski renderer." -msgid "<html><head/><body><p>When selecting media images (CD-ROM, floppy, etc.) the open dialog will start in the same directory as the 86Box configuration file. This setting will likely only make a difference on macOS.</p></body></html>" -msgstr "<html><head/><body><p>Prilikom odabira medijskih slika (CD-ROM, diskete itd.), otvoreni dijalog zopočet će u istom direktoriju kao i konfiguracijska datoteka 86Box-a. Razlika će vjerojatno biti primjetna samo na macOS-u.</p></body></html>" +msgid "

When selecting media images (CD-ROM, floppy, etc.) the open dialog will start in the same directory as the 86Box configuration file. This setting will likely only make a difference on macOS.

" +msgstr "

Prilikom odabira medijskih slika (CD-ROM, diskete itd.), otvoreni dijalog zopočet će u istom direktoriju kao i konfiguracijska datoteka 86Box-a. Razlika će vjerojatno biti primjetna samo na macOS-u.

" msgid "This machine might have been moved or copied." msgstr "Ovaj je sistem mogao biti premješten ili kopiran." @@ -2106,9 +2100,6 @@ msgstr "" msgid "Ask for confirmation before quitting" msgstr "" -msgid "Display hotkey message when entering full-screen mode" -msgstr "" - msgid "Options" msgstr "" diff --git a/src/qt/languages/hu-HU.po b/src/qt/languages/hu-HU.po index 3398859d2..981edad71 100644 --- a/src/qt/languages/hu-HU.po +++ b/src/qt/languages/hu-HU.po @@ -630,9 +630,6 @@ msgstr "Végzetes hiba" msgid " - PAUSED" msgstr " - SZÜNETELT" -msgid "Press %1 to return to windowed mode." -msgstr "Használja a %1 gombokat az ablakhoz való visszatéréshez." - msgid "Speed" msgstr "Sebesség" @@ -864,9 +861,6 @@ msgstr "%1 szükséges a PostScript fájlok PDF formátumba való automatikus ko msgid "%1 is required for automatic conversion of PCL files to PDF.\n\nAny documents sent to the generic PCL printer will be saved as Printer Command Lnaugage (.pcl) files." msgstr "%1 szükséges a PCL fájlok PDF formátumba való automatikus konvertálásához.\n\nAz általános PCL nyomtatóra küldött dokumentumok Printer Command Language (.pcl) fájlként kerülnek mentésre." -msgid "Entering fullscreen mode" -msgstr "Teljes képernyős módra váltás" - msgid "Don't show this message again" msgstr "Ne jelenítse meg újra ezt az üzenetet " @@ -1305,8 +1299,8 @@ msgstr "Hiba az OpenGL inicializálásában" msgid "\nFalling back to software rendering." msgstr "\nVisszatérés a szoftveres rendereléshez." -msgid "<html><head/><body><p>When selecting media images (CD-ROM, floppy, etc.) the open dialog will start in the same directory as the 86Box configuration file. This setting will likely only make a difference on macOS.</p></body></html>" -msgstr "<html><head/><body><p>A médiaképek (CD-ROM, floppy stb.) kiválasztásakor a megnyitási párbeszédpanel ugyanabban a könyvtárban indul, mint a 86Box konfigurációs fájl. Ez a beállítás valószínűleg csak a macOS rendszerben jelent különbséget.</p></body></html>" +msgid "

When selecting media images (CD-ROM, floppy, etc.) the open dialog will start in the same directory as the 86Box configuration file. This setting will likely only make a difference on macOS.

" +msgstr "

A médiaképek (CD-ROM, floppy stb.) kiválasztásakor a megnyitási párbeszédpanel ugyanabban a könyvtárban indul, mint a 86Box konfigurációs fájl. Ez a beállítás valószínűleg csak a macOS rendszerben jelent különbséget.

" msgid "This machine might have been moved or copied." msgstr "Lehet, hogy ezt a gépet áthelyezték vagy lemásolták." @@ -2106,9 +2100,6 @@ msgstr "" msgid "Ask for confirmation before quitting" msgstr "" -msgid "Display hotkey message when entering full-screen mode" -msgstr "" - msgid "Options" msgstr "" diff --git a/src/qt/languages/it-IT.po b/src/qt/languages/it-IT.po index d45a0080b..877032c85 100644 --- a/src/qt/languages/it-IT.po +++ b/src/qt/languages/it-IT.po @@ -630,9 +630,6 @@ msgstr "Errore fatale" msgid " - PAUSED" msgstr " - IN PAUSA" -msgid "Press %1 to return to windowed mode." -msgstr "Usa %1 per tornare alla modalità finestra." - msgid "Speed" msgstr "Velocità" @@ -864,9 +861,6 @@ msgstr "%1 è richiesto per la conversione automatica di file PostScript a file msgid "%1 is required for automatic conversion of PCL files to PDF.\n\nAny documents sent to the generic PostScript printer will be saved as Printer Command Language (.pcl) files." msgstr "%1 è richiesto per la conversione automatica di file PCL a file PDF.\n\nQualsiasi documento mandato alla stampante generica PCL sarà salvato come file Printer Command Language (.cl)." -msgid "Entering fullscreen mode" -msgstr "Entrando nella modalità schermo intero" - msgid "Don't show this message again" msgstr "Non mostrare più questo messaggio" @@ -1305,8 +1299,8 @@ msgstr "Errore nell'inizializzazione di OpenGL" msgid "\nFalling back to software rendering." msgstr "\nRicaduta sul rendering software." -msgid "<html><head/><body><p>When selecting media images (CD-ROM, floppy, etc.) the open dialog will start in the same directory as the 86Box configuration file. This setting will likely only make a difference on macOS.</p></body></html>" -msgstr "<html><head/><body><p>Quando si selezionano immagini multimediali (CD-ROM, floppy, ecc.) la finestra di dialogo di apertura si avvia nella stessa directory del file di configurazione di 86Box. Questa impostazione probabilmente farà la differenza solo su macOS.</p></body></html>" +msgid "

When selecting media images (CD-ROM, floppy, etc.) the open dialog will start in the same directory as the 86Box configuration file. This setting will likely only make a difference on macOS.

" +msgstr "

Quando si selezionano immagini multimediali (CD-ROM, floppy, ecc.) la finestra di dialogo di apertura si avvia nella stessa directory del file di configurazione di 86Box. Questa impostazione probabilmente farà la differenza solo su macOS.

" msgid "This machine might have been moved or copied." msgstr "Questa macchina potrebbe essere stata spostata o copiata." @@ -2106,9 +2100,6 @@ msgstr "" msgid "Ask for confirmation before quitting" msgstr "" -msgid "Display hotkey message when entering full-screen mode" -msgstr "" - msgid "Options" msgstr "" diff --git a/src/qt/languages/ja-JP.po b/src/qt/languages/ja-JP.po index 7883f8a5a..5efd599ed 100644 --- a/src/qt/languages/ja-JP.po +++ b/src/qt/languages/ja-JP.po @@ -630,9 +630,6 @@ msgstr "致命的なエラー" msgid " - PAUSED" msgstr " - 一時停止" -msgid "Press %1 to return to windowed mode." -msgstr "%1でウィンドウ モードに戻ります。" - msgid "Speed" msgstr "速度" @@ -864,9 +861,6 @@ msgstr "PostScriptファイルをPDFに自動変換するには%1が必要です msgid "%1 is required for automatic conversion of PCL files to PDF.\n\nAny documents sent to the generic PCL printer will be saved as Printer Command Language (.pcl) files." msgstr "PCLファイルをPDFに自動変換するには%1が必要です。\n\n汎用PCLプリンターに送信された文書は、Printer Command Language (.pcl) ファイルとして保存されます。" -msgid "Entering fullscreen mode" -msgstr "全画面モードを入力" - msgid "Don't show this message again" msgstr "今後、このメッセージを表示しない" @@ -1305,8 +1299,8 @@ msgstr "OpenGLの初期化エラー" msgid "\nFalling back to software rendering." msgstr "\nソフトウェアレンダリングに逆戻り。" -msgid "<html><head/><body><p>When selecting media images (CD-ROM, floppy, etc.) the open dialog will start in the same directory as the 86Box configuration file. This setting will likely only make a difference on macOS.</p></body></html>" -msgstr "<html><head/><body><p>メディアイメージ(CD-ROM、フロッピーなど)を選択するとき、オープンダイアログは86Box設定ファイルと同じディレクトリで開始します。この設定は、おそらく macOS でのみ違いがあります。</p></body></html>" +msgid "

When selecting media images (CD-ROM, floppy, etc.) the open dialog will start in the same directory as the 86Box configuration file. This setting will likely only make a difference on macOS.

" +msgstr "

メディアイメージ(CD-ROM、フロッピーなど)を選択するとき、オープンダイアログは86Box設定ファイルと同じディレクトリで開始します。この設定は、おそらく macOS でのみ違いがあります。

" msgid "This machine might have been moved or copied." msgstr "このマシンは移動されたかコピーされた可能性がある。" @@ -2106,9 +2100,6 @@ msgstr "" msgid "Ask for confirmation before quitting" msgstr "" -msgid "Display hotkey message when entering full-screen mode" -msgstr "" - msgid "Options" msgstr "" diff --git a/src/qt/languages/ko-KR.po b/src/qt/languages/ko-KR.po index a9ed452d6..89dbf5809 100644 --- a/src/qt/languages/ko-KR.po +++ b/src/qt/languages/ko-KR.po @@ -630,9 +630,6 @@ msgstr "치명적인 오류" msgid " - PAUSED" msgstr " - 일시 중지됨" -msgid "Press %1 to return to windowed mode." -msgstr "%1 키를 누르면 창 모드로 전환합니다." - msgid "Speed" msgstr "속도" @@ -864,9 +861,6 @@ msgstr "%1은(는) PostScript 파일을 PDF로 자동변환하는 데에 필요 msgid "%1 is required for automatic conversion of PCL files to PDF.\n\nAny documents sent to the generic PCL printer will be saved as Printer Command Language (.pcl) files." msgstr "%1은(는) PCL 파일을 PDF로 자동변환하는 데에 필요합니다.\n\n표준 PCL 프린터로 보내신 임의의 문서는 Printer Command Language (.pcl) 파일로 저장됩니다." -msgid "Entering fullscreen mode" -msgstr "전체 화면으로 전환" - msgid "Don't show this message again" msgstr "이 메시지 그만 보기" @@ -1305,8 +1299,8 @@ msgstr "OpenGL 초기화 중 오류 발생" msgid "\nFalling back to software rendering." msgstr "\n소프트웨어 렌더링으로 돌아가기." -msgid "<html><head/><body><p>When selecting media images (CD-ROM, floppy, etc.) the open dialog will start in the same directory as the 86Box configuration file. This setting will likely only make a difference on macOS.</p></body></html>" -msgstr "<html><head/><body><p>미디어 이미지(CD-ROM, 플로피 등)를 선택하면 86Box 구성 파일과 동일한 디렉터리에서 열기 대화 상자가 시작됩니다. 이 설정은 macOS에서만 차이가 있을 수 있습니다.</p></body></html>" +msgid "

When selecting media images (CD-ROM, floppy, etc.) the open dialog will start in the same directory as the 86Box configuration file. This setting will likely only make a difference on macOS.

" +msgstr "

미디어 이미지(CD-ROM, 플로피 등)를 선택하면 86Box 구성 파일과 동일한 디렉터리에서 열기 대화 상자가 시작됩니다. 이 설정은 macOS에서만 차이가 있을 수 있습니다.

" msgid "This machine might have been moved or copied." msgstr "이 컴퓨터가 이동되었거나 복사되었을 수 있습니다." @@ -2106,9 +2100,6 @@ msgstr "" msgid "Ask for confirmation before quitting" msgstr "" -msgid "Display hotkey message when entering full-screen mode" -msgstr "" - msgid "Options" msgstr "" diff --git a/src/qt/languages/nl-NL.po b/src/qt/languages/nl-NL.po index 2859916d7..aa87cd37d 100644 --- a/src/qt/languages/nl-NL.po +++ b/src/qt/languages/nl-NL.po @@ -630,9 +630,6 @@ msgstr "Fatale fout" msgid " - PAUSED" msgstr " - GEPAUZEERD" -msgid "Press %1 to return to windowed mode." -msgstr "Druk op %1 om terug te gaan naar de venstermodus." - msgid "Speed" msgstr "Snelheid" @@ -864,9 +861,6 @@ msgstr "%1 is vereist voor automatische conversie van PostScript-bestanden naar msgid "%1 is required for automatic conversion of PCL files to PDF.\n\nAny documents sent to the generic PCL printer will be saved as Printer Command Language (.pcl) files." msgstr "%1 is vereist voor automatische conversie van PCL-bestanden naar PDF.\n\nAlle documenten die naar de generieke PCL-printer worden gestuurd, worden opgeslagen als Printer Command Language (.pcl) bestanden." -msgid "Entering fullscreen mode" -msgstr "Volledig scherm modus openen" - msgid "Don't show this message again" msgstr "Dit bericht niet meer tonen" @@ -1305,8 +1299,8 @@ msgstr "Fout bij het initialiseren van OpenGL" msgid "\nFalling back to software rendering." msgstr "\nTerugvallen op software rendering." -msgid "<html><head/><body><p>When selecting media images (CD-ROM, floppy, etc.) the open dialog will start in the same directory as the 86Box configuration file. This setting will likely only make a difference on macOS.</p></body></html>" -msgstr "<html><head/><body><p>Bij het selecteren van media-images (CD-ROM, floppy, etc.) zal de \"open dialoog\" starten in dezelfde map als het 86Box configuratiebestand. Deze instelling is doet er waarschijnlijk alleen toe op macOS.</p></body></html>" +msgid "

When selecting media images (CD-ROM, floppy, etc.) the open dialog will start in the same directory as the 86Box configuration file. This setting will likely only make a difference on macOS.

" +msgstr "

Bij het selecteren van media-images (CD-ROM, floppy, etc.) zal de \"open dialoog\" starten in dezelfde map als het 86Box configuratiebestand. Deze instelling is doet er waarschijnlijk alleen toe op macOS.

" msgid "This machine might have been moved or copied." msgstr "Deze machine is misschien verplaatst of gekopieerd." @@ -2106,9 +2100,6 @@ msgstr "Vraag om bevestiging voor een harde reset" msgid "Ask for confirmation before quitting" msgstr "Vraag om bevestiging voor afsluiten" -msgid "Display hotkey message when entering full-screen mode" -msgstr "Toon een sneltoetsmelding bij het openen van de volledigschermmodus" - msgid "Options" msgstr "Opties" diff --git a/src/qt/languages/pl-PL.po b/src/qt/languages/pl-PL.po index 02bdc26fe..7433c1d65 100644 --- a/src/qt/languages/pl-PL.po +++ b/src/qt/languages/pl-PL.po @@ -630,9 +630,6 @@ msgstr "Fatalny błąd" msgid " - PAUSED" msgstr " - PAUSED" -msgid "Press %1 to return to windowed mode." -msgstr "Naciśnij klawisze %1 aby wrócić to trybu okna." - msgid "Speed" msgstr "Szybkość" @@ -864,9 +861,6 @@ msgstr "%1 jest wymagany do automatycznej konwersji plików PostScript do PDF.\n msgid "%1 is required for automatic conversion of PCL files to PDF.\n\nAny documents sent to the generic PCL printer will be saved as Printer Command Language (.pcl) files." msgstr "%1 jest wymagany do automatycznej konwersji plików PCL do PDF.\n\nDokumenty wysłane do generycznej drukarki PCL zostaną zapisane jako pliki Printer Command Language (.pcl)." -msgid "Entering fullscreen mode" -msgstr "Przechodzenie do trybu pełnoekranowego" - msgid "Don't show this message again" msgstr "Nie pokazuj więcej tego komunikatu" @@ -1305,8 +1299,8 @@ msgstr "Błąd inicjalizacji OpenGL" msgid "\nFalling back to software rendering." msgstr "\nPowrót do renderowania oprogramowania." -msgid "<html><head/><body><p>When selecting media images (CD-ROM, floppy, etc.) the open dialog will start in the same directory as the 86Box configuration file. This setting will likely only make a difference on macOS.</p></body></html>" -msgstr "<html><head/><body><p>Podczas wybierania obrazów nośników (CD-ROM, dyskietka itp.) otwarte okno dialogowe rozpocznie się w tym samym katalogu, co plik konfiguracyjny 86Box. To ustawienie prawdopodobnie będzie miało znaczenie tylko na macOS.</p></body></html>" +msgid "

When selecting media images (CD-ROM, floppy, etc.) the open dialog will start in the same directory as the 86Box configuration file. This setting will likely only make a difference on macOS.

" +msgstr "

Podczas wybierania obrazów nośników (CD-ROM, dyskietka itp.) otwarte okno dialogowe rozpocznie się w tym samym katalogu, co plik konfiguracyjny 86Box. To ustawienie prawdopodobnie będzie miało znaczenie tylko na macOS.

" msgid "This machine might have been moved or copied." msgstr "To urządzenie mogło zostać przeniesione lub skopiowane." @@ -2106,9 +2100,6 @@ msgstr "" msgid "Ask for confirmation before quitting" msgstr "" -msgid "Display hotkey message when entering full-screen mode" -msgstr "" - msgid "Options" msgstr "" diff --git a/src/qt/languages/pt-BR.po b/src/qt/languages/pt-BR.po index 4fb974f4d..70e6d7b29 100644 --- a/src/qt/languages/pt-BR.po +++ b/src/qt/languages/pt-BR.po @@ -630,9 +630,6 @@ msgstr "Erro fatal" msgid " - PAUSED" msgstr " - PAUSADO" -msgid "Press %1 to return to windowed mode." -msgstr "Use %1 para retornar ao modo janela." - msgid "Speed" msgstr "Velocidade" @@ -864,9 +861,6 @@ msgstr "%1 é necessário para a conversão automática de arquivos PostScript p msgid "%1 is required for automatic conversion of PCL files to PDF.\n\nAny documents sent to the generic PCL printer will be saved as Printer Command Language (.pcl) files." msgstr "%1 é necessário para a conversão automática de arquivos PCL para PDF.\n\nQualquer documento enviado para a impressora genérica PCL será salvo como arquivos Printer Command Language (.pcl)." -msgid "Entering fullscreen mode" -msgstr "Entrando no modo de tela cheia" - msgid "Don't show this message again" msgstr "Não exibir esta mensagem novamente" @@ -1305,8 +1299,8 @@ msgstr "Erro ao inicializar o OpenGL" msgid "\nFalling back to software rendering." msgstr "\nVoltando à renderização de software." -msgid "<html><head/><body><p>When selecting media images (CD-ROM, floppy, etc.) the open dialog will start in the same directory as the 86Box configuration file. This setting will likely only make a difference on macOS.</p></body></html>" -msgstr "<html><head/><body><p>Ao selecionar imagens de mídia (CD-ROM, disquete, etc.), a caixa de diálogo de abertura será iniciada no mesmo diretório do arquivo de configuração do 86Box. Essa configuração provavelmente só fará diferença no macOS.</p></body></html>" +msgid "

When selecting media images (CD-ROM, floppy, etc.) the open dialog will start in the same directory as the 86Box configuration file. This setting will likely only make a difference on macOS.

" +msgstr "

Ao selecionar imagens de mídia (CD-ROM, disquete, etc.), a caixa de diálogo de abertura será iniciada no mesmo diretório do arquivo de configuração do 86Box. Essa configuração provavelmente só fará diferença no macOS.

" msgid "This machine might have been moved or copied." msgstr "Essa máquina pode ter sido movida ou copiada." @@ -2106,9 +2100,6 @@ msgstr "Perguntar antes de reinicialização completa" msgid "Ask for confirmation before quitting" msgstr "Perguntar antes de sair" -msgid "Display hotkey message when entering full-screen mode" -msgstr "Mostrar mensagem de atalho quando entrar em tela cheia" - msgid "Options" msgstr "Opções" diff --git a/src/qt/languages/pt-PT.po b/src/qt/languages/pt-PT.po index 86c40fc40..795d44e2b 100644 --- a/src/qt/languages/pt-PT.po +++ b/src/qt/languages/pt-PT.po @@ -630,9 +630,6 @@ msgstr "Erro fatal" msgid " - PAUSED" msgstr " - EM PAUSA" -msgid "Press %1 to return to windowed mode." -msgstr "Pressione %1 para voltar ao modo de janela." - msgid "Speed" msgstr "Velocidade" @@ -864,9 +861,6 @@ msgstr "%1 é requerido para a conversão automática de ficheiros PostScript pa msgid "%1 is required for automatic conversion of PCL files to PDF.\n\nAny documents sent to the generic PCL printer will be saved as Printer Command Language (.pcl) files." msgstr "%1 é requerido para a conversão automática de ficheiros PCL para ficheiros PDF.\n\nQualquer documento enviado para a impressora PCL genérica será gravado como um ficheiro Printer Command Language (.pcl)." -msgid "Entering fullscreen mode" -msgstr "A entrar no modo de tela cheia" - msgid "Don't show this message again" msgstr "Não mostrar mais esta mensagem" @@ -1305,8 +1299,8 @@ msgstr "Erro ao inicializar o OpenGL" msgid "\nFalling back to software rendering." msgstr "\nRecuando para a renderização de software." -msgid "<html><head/><body><p>When selecting media images (CD-ROM, floppy, etc.) the open dialog will start in the same directory as the 86Box configuration file. This setting will likely only make a difference on macOS.</p></body></html>" -msgstr "<html><head/><body><p>Ao selecionar imagens multimédia (CD-ROM, disquete, etc.) a caixa de diálogo de abertura irá começar no mesmo diretório que o ficheiro de configuração da 86Box. Esta configuração provavelmente só fará diferença no macOS.</p></body></html>" +msgid "

When selecting media images (CD-ROM, floppy, etc.) the open dialog will start in the same directory as the 86Box configuration file. This setting will likely only make a difference on macOS.

" +msgstr "

Ao selecionar imagens multimédia (CD-ROM, disquete, etc.) a caixa de diálogo de abertura irá começar no mesmo diretório que o ficheiro de configuração da 86Box. Esta configuração provavelmente só fará diferença no macOS.

" msgid "This machine might have been moved or copied." msgstr "Esta máquina pode ter sido deslocada ou copiada." @@ -2106,9 +2100,6 @@ msgstr "" msgid "Ask for confirmation before quitting" msgstr "" -msgid "Display hotkey message when entering full-screen mode" -msgstr "" - msgid "Options" msgstr "" diff --git a/src/qt/languages/ru-RU.po b/src/qt/languages/ru-RU.po index 899b905ac..af427d670 100644 --- a/src/qt/languages/ru-RU.po +++ b/src/qt/languages/ru-RU.po @@ -630,9 +630,6 @@ msgstr "Неустранимая ошибка" msgid " - PAUSED" msgstr " - ПАУЗА" -msgid "Press %1 to return to windowed mode." -msgstr "Нажмите %1 для возврата в оконный режим." - msgid "Speed" msgstr "Скорость" @@ -864,9 +861,6 @@ msgstr "Для автоматического преобразования фа msgid "%1 is required for automatic conversion of PCL files to PDF.\n\nAny documents sent to the generic PCL printer will be saved as Printer Command Language (.pcl) files." msgstr "Для автоматического преобразования файлов PCL в PDF требуется %1.\n\nВсе документы, отправленные на стандартный принтер PCL, будут сохранены в виде файлов Printer Command Language (.pcl)." -msgid "Entering fullscreen mode" -msgstr "Вход в полноэкранный режим" - msgid "Don't show this message again" msgstr "Больше не показывать это сообщение" @@ -1305,8 +1299,8 @@ msgstr "Ошибка инициализации OpenGL" msgid "\nFalling back to software rendering." msgstr "\nПереключение на программный рендеринг." -msgid "<html><head/><body><p>When selecting media images (CD-ROM, floppy, etc.) the open dialog will start in the same directory as the 86Box configuration file. This setting will likely only make a difference on macOS.</p></body></html>" -msgstr "<html><head/><body><p>При выборе образов носителей (CD-ROM, дискет и т. д.) диалог открытия будет запускаться в том же каталоге, что и файл конфигурации 86Box. Эта настройка, скорее всего, будет иметь значение только на macOS.</p></body></html>" +msgid "

When selecting media images (CD-ROM, floppy, etc.) the open dialog will start in the same directory as the 86Box configuration file. This setting will likely only make a difference on macOS.

" +msgstr "

При выборе образов носителей (CD-ROM, дискет и т. д.) диалог открытия будет запускаться в том же каталоге, что и файл конфигурации 86Box. Эта настройка, скорее всего, будет иметь значение только на macOS.

" msgid "This machine might have been moved or copied." msgstr "Возможно, эта машина была перемещена или скопирована." @@ -2112,9 +2106,6 @@ msgstr "Запрашивать подтверждение перед холод msgid "Ask for confirmation before quitting" msgstr "Запрашивать подтверждение перед выходом" -msgid "Display hotkey message when entering full-screen mode" -msgstr "Показывать сообщение о горячей клавише при входе в полноэкранный режим" - msgid "Options" msgstr "Параметры" diff --git a/src/qt/languages/sk-SK.po b/src/qt/languages/sk-SK.po index 624715f76..ef89f831a 100644 --- a/src/qt/languages/sk-SK.po +++ b/src/qt/languages/sk-SK.po @@ -630,9 +630,6 @@ msgstr "Kritická chyba" msgid " - PAUSED" msgstr " - POZASTAVENÝ" -msgid "Press %1 to return to windowed mode." -msgstr "Stlačte %1 pre návrat z režimu celej obrazovky." - msgid "Speed" msgstr "Rýchlosť" @@ -864,9 +861,6 @@ msgstr "%1 je potrebná pre automatický prevod PostScript dokumentov do PDF.\n\ msgid "%1 is required for automatic conversion of PCL files to PDF.\n\nAny documents sent to the generic PCL printer will be saved as Printer Command Lnaugage (.pcl) files." msgstr "%1 je potrebná pre automatický prevod PCL dokumentov do PDF.\n\nAkékoľvek dokumenty vytlačené cez všeobecnú PCLovú tlačiareň budú uložené ako Printer Command Language (.pcl) súbory." -msgid "Entering fullscreen mode" -msgstr "Vstup do režimu celej obrazovky" - msgid "Don't show this message again" msgstr "Nezobrazovať ďalej túto správu" @@ -1306,8 +1300,8 @@ msgstr "Chyba pri inicializácii OpenGL" msgid "\nFalling back to software rendering." msgstr "\nNávrat k softvérovému vykresľovaniu." -msgid "<html><head/><body><p>When selecting media images (CD-ROM, floppy, etc.) the open dialog will start in the same directory as the 86Box configuration file. This setting will likely only make a difference on macOS.</p></body></html>" -msgstr "<html><head/><body><p>Pri výbere multimediálnych obrazov (CD-ROM, disketa atď.) sa dialógové okno otvorenia spustí v rovnakom adresári ako konfiguračný súbor 86Box. Toto nastavenie bude mať pravdepodobne význam len v systéme MacOS.</p></body></html>" +msgid "

When selecting media images (CD-ROM, floppy, etc.) the open dialog will start in the same directory as the 86Box configuration file. This setting will likely only make a difference on macOS.

" +msgstr "

Pri výbere multimediálnych obrazov (CD-ROM, disketa atď.) sa dialógové okno otvorenia spustí v rovnakom adresári ako konfiguračný súbor 86Box. Toto nastavenie bude mať pravdepodobne význam len v systéme MacOS.

" msgid "This machine might have been moved or copied." msgstr "Tento stroj mohol byť premiestnený alebo skopírovaný." @@ -2107,9 +2101,6 @@ msgstr "" msgid "Ask for confirmation before quitting" msgstr "" -msgid "Display hotkey message when entering full-screen mode" -msgstr "" - msgid "Options" msgstr "" diff --git a/src/qt/languages/sl-SI.po b/src/qt/languages/sl-SI.po index d07a1eac4..d4fd10e43 100644 --- a/src/qt/languages/sl-SI.po +++ b/src/qt/languages/sl-SI.po @@ -630,9 +630,6 @@ msgstr "Kritična napaka" msgid " - PAUSED" msgstr " - ZAUSTAVLJEN" -msgid "Press %1 to return to windowed mode." -msgstr "Pritisnite %1 za povratek iz celozaslonskega načina." - msgid "Speed" msgstr "Hitrost" @@ -864,9 +861,6 @@ msgstr "%1 je potreben za samodejno pretvorbo datotek PostScript v PDF.\n\nVsi d msgid "%1 is required for automatic conversion of PCL files to PDF.\n\nAny documents sent to the generic PCL printer will be saved as Printer Command Lnaugage (.pcl) files." msgstr "%1 je potreben za samodejno pretvorbo datotek PCL v PDF.\n\nVsi dokumenti, poslani generičnemu tiskalniku PCL bodo shranjeni kot datoteke Printer Command Language (.pcl)." -msgid "Entering fullscreen mode" -msgstr "Preklapljam v celozaslonski način" - msgid "Don't show this message again" msgstr "Ne pokaži več tega sporočila" @@ -1305,8 +1299,8 @@ msgstr "Napaka pri inicializaciji OpenGL" msgid "\nFalling back to software rendering." msgstr "\nVrnitev na programsko upodabljanje." -msgid "<html><head/><body><p>When selecting media images (CD-ROM, floppy, etc.) the open dialog will start in the same directory as the 86Box configuration file. This setting will likely only make a difference on macOS.</p></body></html>" -msgstr "<html><head/><body><p>Pri izbiri medijskih slik (CD-ROM, disketa itd.) se bo odprto pogovorno okno začelo v istem imeniku kot konfiguracijska datoteka 86Box. Ta nastavitev bo verjetno imela pomen le v operacijskem sistemu MacOS.</p></body></html>" +msgid "

When selecting media images (CD-ROM, floppy, etc.) the open dialog will start in the same directory as the 86Box configuration file. This setting will likely only make a difference on macOS.

" +msgstr "

Pri izbiri medijskih slik (CD-ROM, disketa itd.) se bo odprto pogovorno okno začelo v istem imeniku kot konfiguracijska datoteka 86Box. Ta nastavitev bo verjetno imela pomen le v operacijskem sistemu MacOS.

" msgid "This machine might have been moved or copied." msgstr "Ta naprava je bila morda premeščena ali kopirana." @@ -2106,9 +2100,6 @@ msgstr "Vprašaj za potrditev pred ponovnim zagonom" msgid "Ask for confirmation before quitting" msgstr "Vprašaj za potrditev pred izhodom" -msgid "Display hotkey message when entering full-screen mode" -msgstr "Prikaži obvestilo o bližnjični tipki pri prehodu v celozaslonski način" - msgid "Options" msgstr "Možnosti" diff --git a/src/qt/languages/sv-SE.po b/src/qt/languages/sv-SE.po index e33dbfe21..efbfab7eb 100644 --- a/src/qt/languages/sv-SE.po +++ b/src/qt/languages/sv-SE.po @@ -630,9 +630,6 @@ msgstr "Allvarligt fel" msgid " - PAUSED" msgstr " - PAUSAD" -msgid "Press %1 to return to windowed mode." -msgstr "Tryck på %1 för att återvända till fönsterläge." - msgid "Speed" msgstr "Hastighet" @@ -864,9 +861,6 @@ msgstr "%1 krävs för automatisk omvandling av PostScript-filer till PDF.\n\nAl msgid "%1 is required for automatic conversion of PCL files to PDF.\n\nAny documents sent to the generic PCL printer will be saved as Printer Command Language (.pcl) files." msgstr "%1 krävs för automatisk omvandling av PCL-filer till PDF.\n\nAlla dokument som skickas till den allmänna PCL-skrivaren kommer att sparas som Printer Command Language-filer (.pcl)." -msgid "Entering fullscreen mode" -msgstr "Startar helskärmsläge" - msgid "Don't show this message again" msgstr "Visa inte detta meddelande igen" @@ -1305,8 +1299,8 @@ msgstr "Fel vid initialisering av OpenGL" msgid "\nFalling back to software rendering." msgstr "\nFaller tillbaka på mjukvarurendering." -msgid "<html><head/><body><p>When selecting media images (CD-ROM, floppy, etc.) the open dialog will start in the same directory as the 86Box configuration file. This setting will likely only make a difference on macOS.</p></body></html>" -msgstr "<html><head/><body><p>Vid val av medieavbildningar (CD-ROM, diskett, osv.) så kommer fönstret att börja i samma mapp som 86Box konfigurationsfil. Denna inställning kommer troligtvis endast göra en skillnad på macOS.</p></body></html>" +msgid "

When selecting media images (CD-ROM, floppy, etc.) the open dialog will start in the same directory as the 86Box configuration file. This setting will likely only make a difference on macOS.

" +msgstr "

Vid val av medieavbildningar (CD-ROM, diskett, osv.) så kommer fönstret att börja i samma mapp som 86Box konfigurationsfil. Denna inställning kommer troligtvis endast göra en skillnad på macOS.

" msgid "This machine might have been moved or copied." msgstr "Denna maskin kan ha flyttats eller kopierats." @@ -2112,9 +2106,6 @@ msgstr "Bekräfta innan hård omstart" msgid "Ask for confirmation before quitting" msgstr "Bekräfta innan avslut" -msgid "Display hotkey message when entering full-screen mode" -msgstr "Visa meddelande om snabbtangenter när helskärmsläget startas" - msgid "Options" msgstr "Alternativ" diff --git a/src/qt/languages/tr-TR.po b/src/qt/languages/tr-TR.po index 24c1c0ba0..73d46a007 100644 --- a/src/qt/languages/tr-TR.po +++ b/src/qt/languages/tr-TR.po @@ -630,9 +630,6 @@ msgstr "Kritik hata" msgid " - PAUSED" msgstr " - DURAKLATILDI" -msgid "Press %1 to return to windowed mode." -msgstr "Pencere moduna geri dönmek için %1 tuşlarına basın." - msgid "Speed" msgstr "Hız" @@ -864,9 +861,6 @@ msgstr "%1 PostScript dosyalarının otomatik olarak PDF dosyalarına çevirilme msgid "%1 is required for automatic conversion of PCL files to PDF.\n\nAny documents sent to the generic PostScript printer will be saved as Printer Command Language (.pcl) files." msgstr "%1 PCL dosyalarının otomatik olarak PDF dosyalarına çevirilmesi için gereklidir.\n\nBu bulunmadığından dolayı genel PostScript yazıcısına gönderilen tüm dökümanlar Printer Command Language (.pcl) dosyası olarak kaydedilecektir." -msgid "Entering fullscreen mode" -msgstr "Tam ekran moduna geçiş yapılıyor" - msgid "Don't show this message again" msgstr "Bu mesajı bir daha gösterme" @@ -1305,8 +1299,8 @@ msgstr "OpenGL başlatılırken hata oluştu" msgid "\nFalling back to software rendering." msgstr "\nYazılım işleyicisine geri dönülüyor." -msgid "<html><head/><body><p>When selecting media images (CD-ROM, floppy, etc.) the open dialog will start in the same directory as the 86Box configuration file. This setting will likely only make a difference on macOS.</p></body></html>" -msgstr "<html><head/><body><p>Medya görüntüsü (CD-ROM, disket, vb.) seçme diyaloğu 86Box yapılandırma dosyasıyla aynı dizinde başlayacaktır. Bu ayar muhtemelen sadece macOS üzerinde bir fark meydana getirecektir.</p></body></html>" +msgid "

When selecting media images (CD-ROM, floppy, etc.) the open dialog will start in the same directory as the 86Box configuration file. This setting will likely only make a difference on macOS.

" +msgstr "

Medya görüntüsü (CD-ROM, disket, vb.) seçme diyaloğu 86Box yapılandırma dosyasıyla aynı dizinde başlayacaktır. Bu ayar muhtemelen sadece macOS üzerinde bir fark meydana getirecektir.

" msgid "This machine might have been moved or copied." msgstr "Bu makine taşınmış veya kopyalanmış olabilir." @@ -2106,9 +2100,6 @@ msgstr "" msgid "Ask for confirmation before quitting" msgstr "" -msgid "Display hotkey message when entering full-screen mode" -msgstr "" - msgid "Options" msgstr "" diff --git a/src/qt/languages/uk-UA.po b/src/qt/languages/uk-UA.po index 68b50771a..49a8acf00 100644 --- a/src/qt/languages/uk-UA.po +++ b/src/qt/languages/uk-UA.po @@ -630,9 +630,6 @@ msgstr "Непереробна помилка" msgid " - PAUSED" msgstr " - ПРИЗУПИНЕННЯ" -msgid "Press %1 to return to windowed mode." -msgstr "Натисніть %1 для повернення у віконний режим." - msgid "Speed" msgstr "Швидкість" @@ -864,9 +861,6 @@ msgstr "%1 потрібно для автоматичного перетворе msgid "%1 is required for automatic conversion of PCL files to PDF.\n\nAny documents sent to the generic PCL printer will be saved as Printer Command Language (.pcl) files." msgstr "%1 потрібно для автоматичного перетворення файлів PCL в PDF.\n\nВсі документи, відправлені на загальний принтер PCL, будуть збережені у вигляді файлів Printer Command Language (.ps)." -msgid "Entering fullscreen mode" -msgstr "Вхід у повноекранний режим" - msgid "Don't show this message again" msgstr "Більше не показувати це повідомлення" @@ -1305,8 +1299,8 @@ msgstr "Помилка ініціалізації OpenGL" msgid "\nFalling back to software rendering." msgstr "\nПовернення до програмного рендерингу." -msgid "<html><head/><body><p>When selecting media images (CD-ROM, floppy, etc.) the open dialog will start in the same directory as the 86Box configuration file. This setting will likely only make a difference on macOS.</p></body></html>" -msgstr "<html><head/><body><p>При виборі медіа-образів (CD-ROM, дискета і т.д.) діалогове вікно буде відкриватися в тому ж каталозі, що і файл конфігурації 86Box. Цей параметр, швидше за все, матиме значення лише на macOS.</p></body></html>" +msgid "

When selecting media images (CD-ROM, floppy, etc.) the open dialog will start in the same directory as the 86Box configuration file. This setting will likely only make a difference on macOS.

" +msgstr "

При виборі медіа-образів (CD-ROM, дискета і т.д.) діалогове вікно буде відкриватися в тому ж каталозі, що і файл конфігурації 86Box. Цей параметр, швидше за все, матиме значення лише на macOS.

" msgid "This machine might have been moved or copied." msgstr "Цю машину могли перемістити або скопіювати." @@ -2112,9 +2106,6 @@ msgstr "" msgid "Ask for confirmation before quitting" msgstr "" -msgid "Display hotkey message when entering full-screen mode" -msgstr "" - msgid "Options" msgstr "" diff --git a/src/qt/languages/vi-VN.po b/src/qt/languages/vi-VN.po index 8632234df..9fed36393 100644 --- a/src/qt/languages/vi-VN.po +++ b/src/qt/languages/vi-VN.po @@ -630,9 +630,6 @@ msgstr "Lỗi nghiêm trọng" msgid " - PAUSED" msgstr " - TẠM DỪNG" -msgid "Press %1 to return to windowed mode." -msgstr "Bấm %1 để quay lại chế độ cửa sổ." - msgid "Speed" msgstr "Vận tốc" @@ -864,9 +861,6 @@ msgstr "Cần có %1 để tự động chuyển đổi file PostScript qua PDF. msgid "%1 is required for automatic conversion of PCL files to PDF.\n\nAny documents sent to the generic PCL printer will be saved as Printer Command Language (.pcl) files." msgstr "Cần có %1 để tự động chuyển đổi file PCL qua PDF.\n\nMọi tài liệu được đưa qua máy in generic PCL sẽ lưu ở dạng Printer Command Language (.pcl)." -msgid "Entering fullscreen mode" -msgstr "Đang tiến vào chế độ toàn màn hình" - msgid "Don't show this message again" msgstr "Không hiện thông báo này nữa" @@ -1305,8 +1299,8 @@ msgstr "Lỗi khởi tạo OpenGL" msgid "\nFalling back to software rendering." msgstr "\nQuay trở lại kết xuất phần mềm." -msgid "<html><head/><body><p>When selecting media images (CD-ROM, floppy, etc.) the open dialog will start in the same directory as the 86Box configuration file. This setting will likely only make a difference on macOS.</p></body></html>" -msgstr "<html><head/><body><p>Khi chọn hình ảnh phương tiện (CD-ROM, ổ mềm, v.v.), hộp thoại mở sẽ bắt đầu trong cùng thư mục với tệp cấu hình 86box. Cài đặt này có thể sẽ chỉ tạo ra sự khác biệt trên macOS.</p></body></html>" +msgid "

When selecting media images (CD-ROM, floppy, etc.) the open dialog will start in the same directory as the 86Box configuration file. This setting will likely only make a difference on macOS.

" +msgstr "

Khi chọn hình ảnh phương tiện (CD-ROM, ổ mềm, v.v.), hộp thoại mở sẽ bắt đầu trong cùng thư mục với tệp cấu hình 86box. Cài đặt này có thể sẽ chỉ tạo ra sự khác biệt trên macOS.

" msgid "This machine might have been moved or copied." msgstr "Cấu hình máy này có thể đã được di chuyển hoặc sao chép." @@ -2106,9 +2100,6 @@ msgstr "" msgid "Ask for confirmation before quitting" msgstr "" -msgid "Display hotkey message when entering full-screen mode" -msgstr "" - msgid "Options" msgstr "" diff --git a/src/qt/languages/zh-CN.po b/src/qt/languages/zh-CN.po index 194db4f3d..d2ed7ce71 100644 --- a/src/qt/languages/zh-CN.po +++ b/src/qt/languages/zh-CN.po @@ -630,9 +630,6 @@ msgstr "致命错误" msgid " - PAUSED" msgstr " - 已暂停" -msgid "Press %1 to return to windowed mode." -msgstr "按下 %1 返回到窗口模式。" - msgid "Speed" msgstr "速度" @@ -864,9 +861,6 @@ msgstr "%1 是将 PostScript 文件转换为 PDF 所需要的库。\n\n使用通 msgid "%1 is required for automatic conversion of PCL files to PDF.\n\nAny documents sent to the generic PCL printer will be saved as Printer Command Language (.pcl) files." msgstr "%1 是将 PCL 文件转换为 PDF 所需要的库。\n\n使用通用 PCL 打印机打印的文档将被保存为 Printer Command Language (.pcl) 文件。" -msgid "Entering fullscreen mode" -msgstr "正在进入全屏模式" - msgid "Don't show this message again" msgstr "不要再显示此消息" @@ -1305,8 +1299,8 @@ msgstr "初始化 OpenGL 时出错" msgid "\nFalling back to software rendering." msgstr "\n回到软件渲染。" -msgid "<html><head/><body><p>When selecting media images (CD-ROM, floppy, etc.) the open dialog will start in the same directory as the 86Box configuration file. This setting will likely only make a difference on macOS.</p></body></html>" -msgstr "<html><head/><body><p>选择媒体图像(光盘、软盘等)时,打开对话框将从与 86Box 配置文件相同的目录开始。这一设置可能只会在 macOS 上产生影响。</p></body></html>;" +msgid "

When selecting media images (CD-ROM, floppy, etc.) the open dialog will start in the same directory as the 86Box configuration file. This setting will likely only make a difference on macOS.

" +msgstr "

选择媒体图像(光盘、软盘等)时,打开对话框将从与 86Box 配置文件相同的目录开始。这一设置可能只会在 macOS 上产生影响。

When selecting media images (CD-ROM, floppy, etc.) the open dialog will start in the same directory as the 86Box configuration file. This setting will likely only make a difference on macOS.

" +msgstr "

當選擇媒體映像 (CD-ROM、軟碟等) 時,開啟對話方塊會在與 86Box 設定檔相同的目錄中開始。此設定可能只會在 macOS 上有所影響。

" msgid "This machine might have been moved or copied." msgstr "這台機器可能已被移動或複製。" @@ -2106,9 +2100,6 @@ msgstr "" msgid "Ask for confirmation before quitting" msgstr "" -msgid "Display hotkey message when entering full-screen mode" -msgstr "" - msgid "Options" msgstr "" diff --git a/src/qt/qt_mainwindow.cpp b/src/qt/qt_mainwindow.cpp index 9148abea1..bb28b47ee 100644 --- a/src/qt/qt_mainwindow.cpp +++ b/src/qt/qt_mainwindow.cpp @@ -1345,26 +1345,6 @@ MainWindow::on_actionFullscreen_triggered() emit resizeContents(vid_resize == 2 ? fixed_size_x : monitors[0].mon_scrnsz_x, vid_resize == 2 ? fixed_size_y : monitors[0].mon_scrnsz_y); } } else { - if (video_fullscreen_first) { - bool wasCaptured = mouse_capture == 1; - - QMessageBox questionbox(QMessageBox::Icon::Information, tr("Entering fullscreen mode"), - tr("Press %1 to return to windowed mode.").arg(QKeySequence(acc_keys[FindAccelerator("fullscreen")].seq, QKeySequence::PortableText).toString(QKeySequence::NativeText)), - QMessageBox::Ok, this); - QCheckBox *chkbox = new QCheckBox(tr("Don't show this message again")); - questionbox.setCheckBox(chkbox); - chkbox->setChecked(!video_fullscreen_first); - - QObject::connect(chkbox, &QCheckBox::stateChanged, [](int state) { - video_fullscreen_first = (state == Qt::CheckState::Unchecked); - }); - questionbox.exec(); - config_save(); - - /* (re-capture mouse after dialog). */ - if (wasCaptured) - emit setMouseCapture(true); - } video_fullscreen = 1; setFixedSize(QWIDGETSIZE_MAX, QWIDGETSIZE_MAX); ui->menubar->hide(); diff --git a/src/qt/qt_progsettings.cpp b/src/qt/qt_progsettings.cpp index 4894b99c0..825689e78 100644 --- a/src/qt/qt_progsettings.cpp +++ b/src/qt/qt_progsettings.cpp @@ -96,7 +96,6 @@ ProgSettings::ProgSettings(QWidget *parent) ui->checkBoxConfirmExit->setChecked(confirm_exit); ui->checkBoxConfirmSave->setChecked(confirm_save); ui->checkBoxConfirmHardReset->setChecked(confirm_reset); - ui->checkBoxFullscreenFirst->setChecked(video_fullscreen_first); #ifndef Q_OS_WINDOWS ui->checkBoxMultimediaKeys->setHidden(true); @@ -111,7 +110,6 @@ ProgSettings::accept() confirm_exit = ui->checkBoxConfirmExit->isChecked() ? 1 : 0; confirm_save = ui->checkBoxConfirmSave->isChecked() ? 1 : 0; confirm_reset = ui->checkBoxConfirmHardReset->isChecked() ? 1 : 0; - video_fullscreen_first = ui->checkBoxFullscreenFirst->isChecked() ? 1 : 0; inhibit_multimedia_keys = ui->checkBoxMultimediaKeys->isChecked() ? 1 : 0; loadTranslators(QCoreApplication::instance()); diff --git a/src/qt/qt_progsettings.ui b/src/qt/qt_progsettings.ui index b01199dfd..6020efd77 100644 --- a/src/qt/qt_progsettings.ui +++ b/src/qt/qt_progsettings.ui @@ -165,13 +165,6 @@
- - - - Display hotkey message when entering full-screen mode - - -
From 04a92704d1b351cd7f1292f879e38e76b28ad6ec Mon Sep 17 00:00:00 2001 From: OBattler Date: Wed, 7 May 2025 19:42:18 +0200 Subject: [PATCH 152/180] And the PS/ValuePoint P60 as well. --- src/machine/m_at_socket4.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/machine/m_at_socket4.c b/src/machine/m_at_socket4.c index 03ff03a23..30da4e299 100644 --- a/src/machine/m_at_socket4.c +++ b/src/machine/m_at_socket4.c @@ -266,7 +266,8 @@ machine_at_valuepointp60_init(const machine_t *model) pci_register_slot(0x02, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 0); device_add(&keyboard_ps2_ps1_pci_device); device_add(&sio_device); - device_add(&fdc37c665_device); + device_add(&ide_rz1000_pci_single_channel_device); + device_add(&fdc37c665_ide_sec_device); device_add(&intel_flash_bxt_ami_device); device_add(&i430lx_device); From baba4b704f38ea9368e23fd1b4e9e3593288d9f1 Mon Sep 17 00:00:00 2001 From: OBattler Date: Wed, 7 May 2025 19:49:03 +0200 Subject: [PATCH 153/180] PS/ValuePoint P60: Only primary IDE, in accordance with the IBM hardware reference. --- src/machine/m_at_socket4.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/machine/m_at_socket4.c b/src/machine/m_at_socket4.c index 30da4e299..88474d431 100644 --- a/src/machine/m_at_socket4.c +++ b/src/machine/m_at_socket4.c @@ -254,7 +254,7 @@ machine_at_valuepointp60_init(const machine_t *model) return ret; machine_at_common_init(model); - device_add(&ide_pci_2ch_device); + device_add(&ide_pci_device); pci_init(PCI_CONFIG_TYPE_2 | PCI_NO_IRQ_STEERING); pci_register_slot(0x00, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); @@ -267,7 +267,7 @@ machine_at_valuepointp60_init(const machine_t *model) device_add(&keyboard_ps2_ps1_pci_device); device_add(&sio_device); device_add(&ide_rz1000_pci_single_channel_device); - device_add(&fdc37c665_ide_sec_device); + device_add(&fdc37c665_device); device_add(&intel_flash_bxt_ami_device); device_add(&i430lx_device); From 5fcef3713d97985de56afbb10412eb4b2d2291df Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Thu, 8 May 2025 00:28:25 +0600 Subject: [PATCH 154/180] Add missing tooltips for keyboard lock icons --- src/qt/qt_mainwindow.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/qt/qt_mainwindow.cpp b/src/qt/qt_mainwindow.cpp index bb28b47ee..3a0f1cb8a 100644 --- a/src/qt/qt_mainwindow.cpp +++ b/src/qt/qt_mainwindow.cpp @@ -198,18 +198,22 @@ MainWindow::MainWindow(QWidget *parent) num_label = new QLabel; num_label->setPixmap(num_icon_off.pixmap(QSize(16, 16))); + num_label->setToolTip(QShortcut::tr("Num Lock")); statusBar()->addPermanentWidget(num_label); caps_label = new QLabel; caps_label->setPixmap(caps_icon_off.pixmap(QSize(16, 16))); + caps_label->setToolTip(QShortcut::tr("Caps Lock")); statusBar()->addPermanentWidget(caps_label); scroll_label = new QLabel; scroll_label->setPixmap(scroll_icon_off.pixmap(QSize(16, 16))); + scroll_label->setToolTip(QShortcut::tr("Scroll Lock")); statusBar()->addPermanentWidget(scroll_label); kana_label = new QLabel; kana_label->setPixmap(kana_icon_off.pixmap(QSize(16, 16))); + kana_label->setToolTip(QShortcut::tr("Kana Lock")); statusBar()->addPermanentWidget(kana_label); QTimer* ledKeyboardTimer = new QTimer(this); @@ -1507,9 +1511,13 @@ MainWindow::refreshMediaMenu() ui->actionMCA_devices->setVisible(machine_has_bus(machine, MACHINE_BUS_MCA)); ui->actionACPI_Shutdown->setEnabled(!!acpi_enabled); + num_label->setToolTip(QShortcut::tr("Num Lock")); num_label->setVisible(machine_has_bus(machine, MACHINE_BUS_PS2_PORTS | MACHINE_BUS_AT_KBD)); + scroll_label->setToolTip(QShortcut::tr("Scroll Lock")); scroll_label->setVisible(machine_has_bus(machine, MACHINE_BUS_PS2_PORTS | MACHINE_BUS_AT_KBD)); + caps_label->setToolTip(QShortcut::tr("Caps Lock")); caps_label->setVisible(machine_has_bus(machine, MACHINE_BUS_PS2_PORTS | MACHINE_BUS_AT_KBD)); + kana_label->setToolTip(QShortcut::tr("Kana Lock")); kana_label->setVisible(machine_has_bus(machine, MACHINE_BUS_PS2_PORTS | MACHINE_BUS_AT_KBD) && machine_has_flags(machine, MACHINE_AX)); } From 2becc6fa600af8fa705d09884dc1c070a0e46739 Mon Sep 17 00:00:00 2001 From: TC1995 Date: Wed, 7 May 2025 21:27:20 +0200 Subject: [PATCH 155/180] P54NP4 fixes of the evening (May 7th, 2025) 1. The 430NX does support PCI IRQ steering, fix it accordingly. 2. Reorder the number of the slots. 3. Add the SIO ZB device to said machine as it must have one. 4. Remove the onboard 810 SCSI controller. --- src/machine/m_at_socket5.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/machine/m_at_socket5.c b/src/machine/m_at_socket5.c index 0d748b85e..4b3bbd49c 100644 --- a/src/machine/m_at_socket5.c +++ b/src/machine/m_at_socket5.c @@ -110,19 +110,19 @@ machine_at_p54np4_init(const machine_t *model) return ret; machine_at_common_init(model); + device_add(&ide_vlb_2ch_device); - pci_init(PCI_CONFIG_TYPE_2 | PCI_NO_IRQ_STEERING); + pci_init(PCI_CONFIG_TYPE_2 | PCI_CAN_SWITCH_TYPE); pci_register_slot(0x00, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); - pci_register_slot(0x03, PCI_CARD_NORMAL, 1, 2, 3, 4); /* 03 = Slot 1 */ - pci_register_slot(0x04, PCI_CARD_NORMAL, 2, 3, 4, 1); /* 04 = Slot 2 */ - pci_register_slot(0x05, PCI_CARD_NORMAL, 3, 4, 1, 2); /* 05 = Slot 3 */ - pci_register_slot(0x06, PCI_CARD_NORMAL, 4, 1, 2, 3); /* 06 = Slot 4 */ - pci_register_slot(0x07, PCI_CARD_SCSI, 1, 2, 3, 4); /* 07 = SCSI */ + pci_register_slot(0x06, PCI_CARD_NORMAL, 1, 2, 3, 4); /* 06 = Slot 1 */ + pci_register_slot(0x05, PCI_CARD_NORMAL, 2, 3, 4, 1); /* 05 = Slot 2 */ + pci_register_slot(0x04, PCI_CARD_NORMAL, 3, 4, 1, 2); /* 04 = Slot 3 */ + pci_register_slot(0x03, PCI_CARD_NORMAL, 4, 1, 2, 3); /* 03 = Slot 4 */ pci_register_slot(0x02, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 0); device_add(&i430nx_device); + device_add(&sio_zb_device); device_add(&keyboard_ps2_ami_pci_device); device_add(&fdc37c665_ide_pri_device); - device_add(&ncr53c810_onboard_pci_device); device_add(&intel_flash_bxt_device); return ret; From e6a41921cf6e2f86b7ccb55f70ecfe2d21678e9a Mon Sep 17 00:00:00 2001 From: TC1995 Date: Wed, 7 May 2025 21:40:22 +0200 Subject: [PATCH 156/180] Fix mono pattern position in the Mach64 cards using 24bpp mode (May 7th, 2025) See above. --- src/video/vid_ati_mach64.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/video/vid_ati_mach64.c b/src/video/vid_ati_mach64.c index 4ec9afff8..026634cf2 100644 --- a/src/video/vid_ati_mach64.c +++ b/src/video/vid_ati_mach64.c @@ -1670,7 +1670,7 @@ mach64_blit(uint32_t cpu_dat, int count, mach64_t *mach64) case MONO_SRC_PAT: if (mach64->dst_cntl & DST_24_ROT_EN) { if (!mach64->accel.xx_count) - mix = mach64->accel.pattern[dst_y & 7][dst_x & 7]; + mix = mach64->accel.pattern[dst_y & 7][(dst_x / 3) & 7]; } else mix = mach64->accel.pattern[dst_y & 7][dst_x & 7]; break; From e6f99168d170351fe87b27354acc4388828098e6 Mon Sep 17 00:00:00 2001 From: OBattler Date: Wed, 7 May 2025 22:51:27 +0200 Subject: [PATCH 157/180] ASUS KN97: Change minimum CPU core voltage to 2.8 V, the board does not support the 2.0 V Deschutes CPU's. --- 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 adf132a5d..09183e5c0 100644 --- a/src/machine/machine_table.c +++ b/src/machine/machine_table.c @@ -14770,7 +14770,7 @@ const machine_t machines[] = { .block = CPU_BLOCK_NONE, .min_bus = 60000000, .max_bus = 83333333, - .min_voltage = 1800, + .min_voltage = 2800, .max_voltage = 3500, .min_multi = 1.5, .max_multi = 8.0 From 58f342c27726c42c912cdb59764a49a331916396 Mon Sep 17 00:00:00 2001 From: OBattler Date: Wed, 7 May 2025 23:02:29 +0200 Subject: [PATCH 158/180] RZ-1000: Disable logging. --- src/disk/hdc_ide_rz1000.c | 1 - 1 file changed, 1 deletion(-) diff --git a/src/disk/hdc_ide_rz1000.c b/src/disk/hdc_ide_rz1000.c index d93e83859..2c1a09e8e 100644 --- a/src/disk/hdc_ide_rz1000.c +++ b/src/disk/hdc_ide_rz1000.c @@ -55,7 +55,6 @@ typedef struct rz1000_t { static int next_id = 0; -#define ENABLE_RZ1000_LOG 1 #ifdef ENABLE_RZ1000_LOG int rz1000_do_log = ENABLE_RZ1000_LOG; From d6338e42cc0875e54bdce4b86aa30fe636d667ce Mon Sep 17 00:00:00 2001 From: OBattler Date: Wed, 7 May 2025 23:08:26 +0200 Subject: [PATCH 159/180] Significantly speed up floppy turbo mode when the FDC is using DMA. --- src/floppy/fdc.c | 9 +++++++++ src/floppy/fdd_86f.c | 18 +++++++++++++++--- src/include/86box/fdc.h | 1 + 3 files changed, 25 insertions(+), 3 deletions(-) diff --git a/src/floppy/fdc.c b/src/floppy/fdc.c index de8508e69..e779ea2d7 100644 --- a/src/floppy/fdc.c +++ b/src/floppy/fdc.c @@ -279,6 +279,15 @@ fdc_is_mfm(fdc_t *fdc) return fdc->mfm ? 1 : 0; } +int +fdc_is_dma(fdc_t *fdc) +{ + if ((fdc->flags & FDC_FLAG_PCJR) || !fdc->dma) + return 0; + else + return 1; +} + void fdc_request_next_sector_id(fdc_t *fdc) { diff --git a/src/floppy/fdd_86f.c b/src/floppy/fdd_86f.c index 0a7120b16..24fde57b1 100644 --- a/src/floppy/fdd_86f.c +++ b/src/floppy/fdd_86f.c @@ -2414,16 +2414,28 @@ d86f_turbo_poll(int drive, int side) case STATE_0C_READ_DATA: case STATE_11_SCAN_DATA: case STATE_16_VERIFY_DATA: - d86f_turbo_read(drive, side); + if (fdc_is_dma(d86f_fdc)) + for (int i = 0; i < (128 << dev->last_sector.id.n); i++) + d86f_turbo_read(drive, side); + else + d86f_turbo_read(drive, side); break; case STATE_05_WRITE_DATA: case STATE_09_WRITE_DATA: - d86f_turbo_write(drive, side); + if (fdc_is_dma(d86f_fdc)) + for (int i = 0; i < (128 << dev->last_sector.id.n); i++) + d86f_turbo_write(drive, side); + else + d86f_turbo_write(drive, side); break; case STATE_0D_FORMAT_TRACK: - d86f_turbo_format(drive, side, (side && (d86f_get_sides(drive) != 2))); + if (fdc_is_dma(d86f_fdc)) + while (dev->state == STATE_0D_FORMAT_TRACK) + d86f_turbo_format(drive, side, (side && (d86f_get_sides(drive) != 2))); + else + d86f_turbo_format(drive, side, (side && (d86f_get_sides(drive) != 2))); return; case STATE_IDLE: diff --git a/src/include/86box/fdc.h b/src/include/86box/fdc.h index 36cfaeb7a..ed62cb45f 100644 --- a/src/include/86box/fdc.h +++ b/src/include/86box/fdc.h @@ -206,6 +206,7 @@ extern int fdc_get_drive(fdc_t *fdc); extern int fdc_get_perp(fdc_t *fdc); extern int fdc_get_format_n(fdc_t *fdc); extern int fdc_is_mfm(fdc_t *fdc); +extern int fdc_is_dma(fdc_t *fdc); extern double fdc_get_hut(fdc_t *fdc); extern double fdc_get_hlt(fdc_t *fdc); extern void fdc_request_next_sector_id(fdc_t *fdc); From 7301aaad004a8b3d9fab728230b1dba0188e7d3d Mon Sep 17 00:00:00 2001 From: OBattler Date: Thu, 8 May 2025 04:52:33 +0200 Subject: [PATCH 160/180] Added the ASUS 386/33-64K (Award 4.00 386DX). --- src/include/86box/machine.h | 1 + src/machine/m_at_386dx_486.c | 21 +++++++++++++++++++ src/machine/machine_table.c | 40 ++++++++++++++++++++++++++++++++++++ 3 files changed, 62 insertions(+) diff --git a/src/include/86box/machine.h b/src/include/86box/machine.h index 996f2bf5f..c28add516 100644 --- a/src/include/86box/machine.h +++ b/src/include/86box/machine.h @@ -514,6 +514,7 @@ extern int machine_at_ga486l_init(const machine_t *); extern int machine_at_cougar_init(const machine_t *); extern int machine_at_acc386_init(const machine_t *); +extern int machine_at_asus386_3364k_init(const machine_t *); extern int machine_at_asus386_init(const machine_t *); extern int machine_at_ecs386_init(const machine_t *); extern int machine_at_spc6000a_init(const machine_t *); diff --git a/src/machine/m_at_386dx_486.c b/src/machine/m_at_386dx_486.c index e3838ce32..e75c5414e 100644 --- a/src/machine/m_at_386dx_486.c +++ b/src/machine/m_at_386dx_486.c @@ -72,6 +72,27 @@ machine_at_acc386_init(const machine_t *model) return ret; } +int +machine_at_asus386_3364k_init(const machine_t *model) +{ + int ret; + + ret = bios_load_linear("roms/machines/asus386_3364k/am27c512dip28-64b53c26be3d8160533563.bin", + 0x000f0000, 65536, 0); + + if (bios_only || !ret) + return ret; + + machine_at_common_init(model); + device_add(&rabbit_device); + device_add(&keyboard_at_ami_device); + + if (fdc_current[0] == FDC_INTERNAL) + device_add(&fdc_at_device); + + return ret; +} + int machine_at_asus386_init(const machine_t *model) { diff --git a/src/machine/machine_table.c b/src/machine/machine_table.c index 09183e5c0..e0317f40f 100644 --- a/src/machine/machine_table.c +++ b/src/machine/machine_table.c @@ -5632,6 +5632,46 @@ const machine_t machines[] = { .snd_device = NULL, .net_device = NULL }, + /* Has Award KBC firmware. */ + { + .name = "[SiS 310] ASUS 386/33-64K", + .internal_name = "asus386_3364k", + .type = MACHINE_TYPE_386DX, + .chipset = MACHINE_CHIPSET_SIS_310, + .init = machine_at_asus386_3364k_init, + .p1_handler = NULL, + .gpio_handler = NULL, + .available_flag = MACHINE_AVAILABLE, + .gpio_acpi_handler = NULL, + .cpu = { + .package = CPU_PKG_386DX, + .block = CPU_BLOCK_NONE, + .min_bus = 0, + .max_bus = 0, + .min_voltage = 0, + .max_voltage = 0, + .min_multi = 0, + .max_multi = 0 + }, + .bus_flags = MACHINE_AT, + .flags = MACHINE_APM, + .ram = { + .min = 1024, + .max = 16384, + .step = 1024 + }, + .nvrmask = 127, + .kbc_device = NULL, + .kbc_p1 = 0xff, + .gpio = 0xffffffff, + .gpio_acpi = 0xffffffff, + .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, + .vid_device = NULL, + .snd_device = NULL, + .net_device = NULL + }, /* Has AMIKey F KBC firmware. */ { .name = "[SiS 310] ASUS ISA-386C", From e621014addfd514b1a89104ea968d677d9c41268 Mon Sep 17 00:00:00 2001 From: TC1995 Date: Thu, 8 May 2025 23:56:48 +0200 Subject: [PATCH 161/180] Actually fix the timing of the PAS16/Plus SCSI side (May 8th, 2025) See above, fixes the non-audio mamv1.sys SCSI controller driver using CD/HDD reads/writes. --- src/sound/snd_pas16.c | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/src/sound/snd_pas16.c b/src/sound/snd_pas16.c index cfefc8df5..9b82d580d 100644 --- a/src/sound/snd_pas16.c +++ b/src/sound/snd_pas16.c @@ -792,14 +792,10 @@ pas16_in(uint16_t port, void *priv) if ((scsi_bus->tx_mode == PIO_TX_BUS) && !(ret & 0x80)) ret |= 0x80; - if (ret & 0x80) { - if (scsi_bus->data_repeat < MIN(511, scsi_bus->total_len)) - scsi_bus->data_repeat++; - } else { - if (scsi_bus->data_repeat == MIN(511, scsi_bus->total_len)) - ret = 0x00; - } - pas16_log("%04X:%08X: Port %04x read ret=%02x, status=%02x, txmode=%x, repeat=%d.\n", CS, cpu_state.pc, port + pas16->base, ret, pas16->scsi->status & 0x06, scsi_bus->tx_mode, scsi_bus->data_repeat); + if ((pas16->scsi->status & 0x06) == 0x00) + ret = 0x00; + + pas16_log("%04X:%08X: Port %04x read ret=%02x, status=%02x, txmode=%x, repeat=%d, total=%d.\n", CS, cpu_state.pc, port + pas16->base, ret, pas16->scsi->status & 0x06, scsi_bus->tx_mode, scsi_bus->data_repeat, MIN(511, scsi_bus->total_len)); } break; case 0x5c03: From cc6076f93b5fe05fe60feb069ec57acb2b0ded50 Mon Sep 17 00:00:00 2001 From: TC1995 Date: Fri, 9 May 2025 02:23:56 +0200 Subject: [PATCH 162/180] Late night S3 changes (May 9th, 2025) 1. Pixtrans on port 0xb2e8 is not available on 864/964 and up (including the trio64) due to color compare taking its place, fixes some graphical glitches in WinXP. 2. The DOS s3id utility identifies the 80x chips correctly, either it's 801 ISA or 805 VLB, but not 805 ISA even if they share the same id, but since it's an ISA card, identify the Elsa Winner 1000 805 ISA as a 801 card. --- src/video/vid_s3.c | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/src/video/vid_s3.c b/src/video/vid_s3.c index e88bbe58f..683d2be34 100644 --- a/src/video/vid_s3.c +++ b/src/video/vid_s3.c @@ -1311,7 +1311,7 @@ s3_accel_out_fifo(s3_t *s3, uint16_t port, uint8_t val) case 0xb148: case 0xb2e8: s3_log("[%04X:%08X] OUT PORTB=%04x, val=%02x, CMD=%04x, C(%d,%d).\n", CS, cpu_state.pc, port, val, s3->accel.cmd, s3->accel.cur_x, s3->accel.cur_y); - if (s3->accel.multifunc[0xe] & 0x100) { + if ((s3->accel.multifunc[0xe] & 0x100) || (s3->chip >= S3_VISION964)) { s3->accel.b2e8_pix = 0; if (s3->bpp == 3) { if ((s3->chip >= S3_86C928) && (s3->chip < S3_VISION964)) { @@ -1353,7 +1353,7 @@ s3_accel_out_fifo(s3_t *s3, uint16_t port, uint8_t val) case 0xb149: case 0xb2e9: s3_log("[%04X:%08X] OUT PORTB=%04x, val=%02x, CMD=%04x, C(%d,%d).\n", CS, cpu_state.pc, port, val, s3->accel.cmd, s3->accel.cur_x, s3->accel.cur_y); - if (s3->accel.multifunc[0xe] & 0x100) { + if ((s3->accel.multifunc[0xe] & 0x100) || (s3->chip >= S3_VISION964)) { s3->accel.b2e8_pix = 0; if (s3->bpp == 3) { if ((s3->chip >= S3_86C928) && (s3->chip < S3_VISION964)) { @@ -8414,7 +8414,6 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi } } - if (s3->accel.b2e8_pix && s3_cpu_src(s3) && (count == 16)) { /*Pattern on pixtrans (911/924)*/ count = s3->accel.maj_axis_pcnt + 1; s3->accel.temp_cnt = 16; @@ -8806,8 +8805,7 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi s3_log("CMDFULL=%04x, FRGDSEL=%x, BKGDSEL=%x, FRGDMIX=%02x, BKGDMIX=%02x, MASKCHECK=%x, RDMASK=%04x, MINUS=%d, WRTMASK=%04X, MIX=%04x, CX=%d, CY=%d, DX=%d, DY=%d, SX=%d, SY=%d, PIXCNTL=%02x, 16BITCOLOR=%x, RDCHECK=%x, CLIPL=%d, CLIPR=%d, OVERFLOW=%d, pitch=%d.\n", s3->accel.cmd, frgd_mix, bkgd_mix, s3->accel.frgd_mix & 0x0f, s3->accel.bkgd_mix & 0x0f, s3->accel.rd_mask_16bit_check, rd_mask, s3->accel.minus, wrt_mask, mix_dat & 0xffff, s3->accel.cx, s3->accel.cy, s3->accel.dx, s3->accel.dy, s3->accel.sx, s3->accel.sy, s3->accel.multifunc[0x0a] & 0xc4, s3->accel.color_16bit_check, s3->accel.rd_mask_16bit_check, clip_l, clip_r, (s3->accel.destx_overflow & 0xc00) == 0xc00, s3->width); if (!cpu_input && (frgd_mix == 3) && !vram_mask && !(s3->accel.multifunc[0xe] & 0x100) && ((s3->accel.cmd & 0xa0) == 0xa0) && ((s3->accel.frgd_mix & 0xf) == 7) && ((s3->accel.bkgd_mix & 0xf) == 7)) { - s3_log("Special BitBLT.\n"); - + pclog("Special BitBLT.\n"); while (1) { if ((s3->accel.dx >= clip_l) && (s3->accel.dx <= clip_r) && (s3->accel.dy >= clip_t) && (s3->accel.dy <= clip_b)) { READ(s3->accel.src + s3->accel.cx - s3->accel.minus, src_dat); @@ -8851,7 +8849,7 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi } } } else { - s3_log("Normal blit.\n"); + s3_log("Normal blit, srcbase=%08x, dstbase=%08x, full=%04x, wrt_mask=%08x, extmultifunc0e=%03x, frgdmixval=%02x.\n", srcbase, dstbase, s3->accel.cmd, wrt_mask, s3->accel.multifunc[0x0e] & 0x180, s3->accel.frgd_mix); while (count-- && (s3->accel.sy >= 0)) { if ((s3->accel.dx >= clip_l) && (s3->accel.dx <= clip_r) && (s3->accel.dy >= clip_t) && (s3->accel.dy <= clip_b)) { if (vram_mask && (s3->accel.cmd & 0x10)) { @@ -9842,8 +9840,8 @@ s3_init(const device_t *info) break; case S3_WINNER1000_805: bios_fn = ROM_WINNER1000_805; - chip = S3_86C805; - video_inform(VIDEO_FLAG_TYPE_SPECIAL, &timing_s3_86c805); + chip = S3_86C801; + video_inform(VIDEO_FLAG_TYPE_SPECIAL, &timing_s3_86c801); break; case S3_86C805_ONBOARD: bios_fn = NULL; From 96d5a04b338ed1b71ec23290df2b7a7ba28faa62 Mon Sep 17 00:00:00 2001 From: OBattler Date: Fri, 9 May 2025 04:20:22 +0200 Subject: [PATCH 163/180] Laser XT 3: EMS memory accesses are now correctly 16-bit. --- src/machine/m_xt_laserxt.c | 34 ++++++++++++++++++++++++++++++---- 1 file changed, 30 insertions(+), 4 deletions(-) diff --git a/src/machine/m_xt_laserxt.c b/src/machine/m_xt_laserxt.c index d298e726b..ec4b41c35 100644 --- a/src/machine/m_xt_laserxt.c +++ b/src/machine/m_xt_laserxt.c @@ -154,6 +154,14 @@ lxt_ems_write(uint32_t addr, uint8_t val, void *priv) mem[addr & 0x3fff] = val; } +static void +lxt_ems_writew(uint32_t addr, uint16_t val, void *priv) +{ + uint8_t *mem = (uint8_t *) priv; + + *(uint16_t *) &(mem[addr & 0x3fff]) = val; +} + static uint8_t lxt_ems_read(uint32_t addr, void *priv) { @@ -165,6 +173,17 @@ lxt_ems_read(uint32_t addr, void *priv) return ret; } +static uint16_t +lxt_ems_readw(uint32_t addr, void *priv) +{ + uint8_t *mem = (uint8_t *) priv; + uint8_t ret = 0xff; + + ret = *(uint16_t *) &(mem[addr & 0x3fff]); + + return ret; +} + static lxt_ems_board_t * lxt_ems_init(lxt_t *parent, int en, uint16_t io, uint32_t mem) { @@ -186,10 +205,17 @@ lxt_ems_init(lxt_t *parent, int en, uint16_t io, uint32_t mem) for (uint8_t i = 0; i < 4; i++) { uint8_t *ptr = dev->ram + (i << 14); - mem_mapping_add(&dev->ems[i].mapping, 0xe0000 + (i << 14), 0x4000, - lxt_ems_read, NULL, NULL, - lxt_ems_write, NULL, NULL, - ptr, 0, ptr); + if (parent->is_lxt3) + mem_mapping_add(&dev->ems[i].mapping, 0xe0000 + (i << 14), 0x4000, + lxt_ems_read, lxt_ems_readw, NULL, + lxt_ems_write, lxt_ems_writew, NULL, + ptr, 0, ptr); + else + mem_mapping_add(&dev->ems[i].mapping, 0xe0000 + (i << 14), 0x4000, + lxt_ems_read, NULL, NULL, + lxt_ems_write, NULL, NULL, + ptr, 0, ptr); + mem_mapping_disable(&dev->ems[i].mapping); dev->ems[i].page = 0x7f; From 9a69e1800d1532c45297b64c7d766463927c789a Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Fri, 9 May 2025 14:56:55 +0600 Subject: [PATCH 164/180] Honour `--nohook` on X11 as well --- src/qt/qt_mainwindow.cpp | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/qt/qt_mainwindow.cpp b/src/qt/qt_mainwindow.cpp index 3a0f1cb8a..aaf625c2d 100644 --- a/src/qt/qt_mainwindow.cpp +++ b/src/qt/qt_mainwindow.cpp @@ -322,7 +322,8 @@ MainWindow::MainWindow(QWidget *parent) mouse_capture = state ? 1 : 0; qt_mouse_capture(mouse_capture); if (mouse_capture) { - this->grabKeyboard(); + if (hook_enabled) + this->grabKeyboard(); if (ui->stackedWidget->mouse_capture_func) ui->stackedWidget->mouse_capture_func(this->windowHandle()); } else { @@ -1481,13 +1482,15 @@ MainWindow::eventFilter(QObject *receiver, QEvent *event) plat_pause(curdopause); #ifdef __unix__ if (!QApplication::platformName().contains("wayland") && (this->windowState() & Qt::WindowActive)) { - this->grabKeyboard(); + if (hook_enabled) + this->grabKeyboard(); } #endif } else if (event->type() == QEvent::WindowActivate) { #ifdef __unix__ if (!QApplication::platformName().contains("wayland")) { - this->grabKeyboard(); + if (hook_enabled) + this->grabKeyboard(); } #endif } else if (event->type() == QEvent::WindowDeactivate) { From b0c9ca6b20aee537a4cbf7fdaece49a4a942b1b8 Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Fri, 9 May 2025 15:28:05 +0600 Subject: [PATCH 165/180] Fix stack use-after-return on Linux --- src/qt/qt_rendererstack.cpp | 2 +- src/qt/qt_rendererstack.hpp | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/qt/qt_rendererstack.cpp b/src/qt/qt_rendererstack.cpp index 431b3609b..79fa78097 100644 --- a/src/qt/qt_rendererstack.cpp +++ b/src/qt/qt_rendererstack.cpp @@ -77,7 +77,7 @@ RendererStack::RendererStack(QWidget *parent, int monitor_index) m_monitor_index = monitor_index; #if defined __unix__ && !defined __HAIKU__ - char auto_mouse_type[16]; + memset(auto_mouse_type, 0, sizeof (auto_mouse_type)); mousedata.mouse_type = getenv("EMU86BOX_MOUSE"); if (!mousedata.mouse_type || (mousedata.mouse_type[0] == '\0') || !stricmp(mousedata.mouse_type, "auto")) { if (QApplication::platformName().contains("wayland")) diff --git a/src/qt/qt_rendererstack.hpp b/src/qt/qt_rendererstack.hpp index 172dc2fe6..3a76f3ada 100644 --- a/src/qt/qt_rendererstack.hpp +++ b/src/qt/qt_rendererstack.hpp @@ -137,6 +137,8 @@ private: std::atomic_bool rendererTakesScreenshots; std::atomic_bool switchInProgress{false}; + + char auto_mouse_type[16]; }; #endif // QT_RENDERERCONTAINER_HPP From 070c6c4125addb5c0af0f46f62ae10aa4af61ed9 Mon Sep 17 00:00:00 2001 From: OBattler Date: Fri, 9 May 2025 20:21:28 +0200 Subject: [PATCH 166/180] Laser XT 3: Fix 16-bit EMS readout, fixes #5572. --- src/machine/m_xt_laserxt.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/machine/m_xt_laserxt.c b/src/machine/m_xt_laserxt.c index ec4b41c35..7a6cab5e3 100644 --- a/src/machine/m_xt_laserxt.c +++ b/src/machine/m_xt_laserxt.c @@ -176,8 +176,8 @@ lxt_ems_read(uint32_t addr, void *priv) static uint16_t lxt_ems_readw(uint32_t addr, void *priv) { - uint8_t *mem = (uint8_t *) priv; - uint8_t ret = 0xff; + uint8_t *mem = (uint8_t *) priv; + uint16_t ret = 0xff; ret = *(uint16_t *) &(mem[addr & 0x3fff]); From dd6d480facd9b357babbbf432a1ac41e34d1b70d Mon Sep 17 00:00:00 2001 From: TC1995 Date: Fri, 9 May 2025 23:41:05 +0200 Subject: [PATCH 167/180] Spock/Tribble changes of the evening (May 9th, 2025) Don't duplicate drives into phantom drives. --- src/scsi/scsi_spock.c | 137 +++++++++++++++++++++--------------------- 1 file changed, 70 insertions(+), 67 deletions(-) diff --git a/src/scsi/scsi_spock.c b/src/scsi/scsi_spock.c index 6f0b7aacb..0bb2d70ba 100644 --- a/src/scsi/scsi_spock.c +++ b/src/scsi/scsi_spock.c @@ -130,6 +130,7 @@ typedef struct { int adapter_id; int assign; int present[8]; + int id_connected; int cmd_status; int cir_status; @@ -448,7 +449,6 @@ static void spock_process_imm_cmd(spock_t *scsi) { int i; - int j = 0; int adapter_id; int phys_id; int lun_id; @@ -467,14 +467,23 @@ spock_process_imm_cmd(spock_t *scsi) if (scsi->command & (1 << 23)) { spock_log("Assign: adapter id=%d\n", adapter_id); scsi->dev_id[adapter_id].phys_id = -1; + scsi->id_connected = 0; spock_set_irq(scsi, scsi->attention & 0x0f, IRQ_TYPE_IMM_CMD_COMPLETE); } else { if (phys_id != scsi->adapter_id) { scsi->dev_id[adapter_id].phys_id = phys_id; scsi->dev_id[adapter_id].lun_id = lun_id; - spock_log("Assign: adapter dev=%x scsi ID=%i LUN=%i.\n", adapter_id, scsi->dev_id[adapter_id].phys_id, scsi->dev_id[adapter_id].lun_id); + if (scsi_device_present(&scsi_devices[scsi->bus][phys_id])) { + scsi->present[scsi->id_connected] = 1; + if (lun_id == 0) + scsi->id_connected++; + } else + scsi->present[scsi->id_connected] = 0; + + spock_log("Assign: adapter dev=%d, scsi ID=%i, LUN=%i, attention devsel=%d, present=%d, connected=%d.\n", adapter_id, scsi->dev_id[adapter_id].phys_id, scsi->dev_id[adapter_id].lun_id, scsi->attention & 0x0f, scsi->present[scsi->id_connected], scsi->id_connected); spock_set_irq(scsi, scsi->attention & 0x0f, IRQ_TYPE_IMM_CMD_COMPLETE); } else { /*Can not assign adapter*/ + scsi->id_connected = 0; spock_log("Assign: PUN=%d, cannot assign adapter.\n", phys_id); spock_set_irq(scsi, scsi->attention & 0x0f, IRQ_TYPE_COMMAND_FAIL); } @@ -495,35 +504,15 @@ spock_process_imm_cmd(spock_t *scsi) spock_set_irq(scsi, scsi->attention & 0x0f, IRQ_TYPE_IMM_CMD_COMPLETE); break; case CMD_RESET: + scsi->id_connected = 0; spock_log("Reset command, attention=%02x.\n", scsi->attention & 0x0f); if ((scsi->attention & 0x0f) == 0x0f) { /*Adapter reset*/ for (i = 0; i < 8; i++) scsi_device_reset(&scsi_devices[scsi->bus][i]); - for (i = 6; i > -1; i--) { - if (scsi_device_present(&scsi_devices[scsi->bus][i])) { - spock_log("Adapter Reset, SCSI reset present devices=%d, phys ID=%d, type=%04x.\n", j, scsi->dev_id[i].phys_id, scsi_devices[scsi->bus][i].type); - scsi->present[j] = i; - j++; - } else { - scsi->present[j] = 0xff; - spock_log("Adapter Reset, SCSI reset not present devices=%d, phys ID=%d, type=%04x.\n", j, scsi->dev_id[i].phys_id, scsi_devices[scsi->bus][i].type); - } - } - } else if ((scsi->attention & 0x0f) < 7) { /*Device reset*/ + } else if ((scsi->attention & 0x0f) < 7) /*Device reset*/ scsi_device_reset(&scsi_devices[scsi->bus][scsi->attention & 0x0f]); - for (i = 6; i > -1; i--) { - if (scsi_device_present(&scsi_devices[scsi->bus][i])) { - spock_log("Device Reset, SCSI reset present devices=%d, phys ID=%d, type=%04x.\n", j, scsi->dev_id[i].phys_id, scsi_devices[scsi->bus][i].type); - scsi->present[j] = i; - j++; - } else { - scsi->present[j] = 0xff; - spock_log("Device Reset, SCSI reset not present devices=%d, phys ID=%d, type=%04x.\n", j, scsi->dev_id[i].phys_id, scsi_devices[scsi->bus][i].type); - } - } - } scsi->scb_state = 0; spock_set_irq(scsi, scsi->attention & 0x0f, IRQ_TYPE_IMM_CMD_COMPLETE); break; @@ -538,7 +527,6 @@ static void spock_execute_cmd(spock_t *scsi, scb_t *scb) { int c; - int j = 0; int old_scb_state; if (scsi->in_reset) { @@ -556,17 +544,7 @@ spock_execute_cmd(spock_t *scsi, scb_t *scb) scsi->dev_id[c].phys_id = -1; scsi->in_reset = 0; - - for (c = 6; c >= 0; c--) { - if (scsi_device_present(&scsi_devices[scsi->bus][c])) { - spock_log("Reset, SCSI reset present devices=%d, phys ID=%d, type=%04x.\n", j, scsi->dev_id[c].phys_id, scsi_devices[scsi->bus][c].type); - scsi->present[j] = c; - j++; - } else { - scsi->present[j] = 0xff; - spock_log("Reset, SCSI reset not present devices=%d, phys ID=%d, type=%04x.\n", j, scsi->dev_id[c].phys_id, scsi_devices[scsi->bus][c].type); - } - } + spock_log("Reset.\n"); return; } @@ -698,12 +676,15 @@ spock_execute_cmd(spock_t *scsi, scb_t *scb) break; case CMD_DEVICE_INQUIRY: - if (scsi->present[scsi->scb_id] != 0xff) + if (scsi->scb_id != 15) { + if (scsi->present[scsi->scb_id]) + scsi->cdb_id = scsi->dev_id[scsi->scb_id].phys_id; + else + scsi->cdb_id = 0xff; + } else scsi->cdb_id = scsi->dev_id[scsi->scb_id].phys_id; - else - scsi->cdb_id = 0xff; - spock_log("Device Inquiry, ID=%d\n", scsi->cdb_id); + spock_log("Device Inquiry, ID=%d, connected=%d, present=%d.\n", scsi->cdb_id, scsi->id_connected, scsi->present[scsi->scb_id + 1]); scsi->cdb[0] = GPCMD_INQUIRY; scsi->cdb[1] = scsi->dev_id[scsi->scb_id].lun_id << 5; /*LUN*/ scsi->cdb[2] = 0; /*Page code*/ @@ -718,13 +699,16 @@ spock_execute_cmd(spock_t *scsi, scb_t *scb) return; case CMD_SEND_OTHER_SCSI: - if (scsi->present[scsi->scb_id] != 0xff) + if (scsi->scb_id != 15) { + if (scsi->present[scsi->scb_id]) + scsi->cdb_id = scsi->dev_id[scsi->scb_id].phys_id; + else + scsi->cdb_id = 0xff; + } else scsi->cdb_id = scsi->dev_id[scsi->scb_id].phys_id; - else - scsi->cdb_id = 0xff; dma_bm_read(scsi->scb_addr + 0x18, scsi->cdb, 12, 2); - spock_log("Send Other SCSI, SCB ID=%d, PHYS ID=%d, CDB[0]=%02x, CDB_ID=%d, ID Present=%d.\n", scsi->scb_id, scsi->dev_id[scsi->scb_id].phys_id, scsi->cdb[0], scsi->cdb_id, scsi->present[scsi->scb_id]); + spock_log("Send Other SCSI, SCB ID=%d, PHYS ID=%d, LUN=%d, CDB[0]=%02x, CDB_ID=%d, ID Present=%d.\n", scsi->scb_id, scsi->dev_id[scsi->scb_id].phys_id, scsi->dev_id[scsi->scb_id].lun_id, scsi->cdb[0], scsi->cdb_id, scsi->present[scsi->scb_id + 1]); scsi->cdb[1] = (scsi->cdb[1] & 0x1f) | (scsi->dev_id[scsi->scb_id].lun_id << 5); /*Patch correct LUN into command*/ scsi->cdb_len = (scb->lba_addr & 0xff) ? (scb->lba_addr & 0xff) : 6; scsi->scsi_state = SCSI_STATE_SELECT; @@ -732,10 +716,13 @@ spock_execute_cmd(spock_t *scsi, scb_t *scb) return; case CMD_READ_DEVICE_CAPACITY: - if (scsi->present[scsi->scb_id] != 0xff) + if (scsi->scb_id != 15) { + if (scsi->present[scsi->scb_id]) + scsi->cdb_id = scsi->dev_id[scsi->scb_id].phys_id; + else + scsi->cdb_id = 0xff; + } else scsi->cdb_id = scsi->dev_id[scsi->scb_id].phys_id; - else - scsi->cdb_id = 0xff; spock_log("Device Capacity, SCB ID=%d, PHYS ID=%d\n", scsi->scb_id, scsi->dev_id[scsi->scb_id].phys_id); scsi->cdb[0] = GPCMD_READ_CDROM_CAPACITY; @@ -754,10 +741,13 @@ spock_execute_cmd(spock_t *scsi, scb_t *scb) return; case CMD_READ_DATA: - if (scsi->present[scsi->scb_id] != 0xff) + if (scsi->scb_id != 15) { + if (scsi->present[scsi->scb_id]) + scsi->cdb_id = scsi->dev_id[scsi->scb_id].phys_id; + else + scsi->cdb_id = 0xff; + } else scsi->cdb_id = scsi->dev_id[scsi->scb_id].phys_id; - else - scsi->cdb_id = 0xff; spock_log("Device Read Data, SCB ID=%d, PHYS ID=%d\n", scsi->scb_id, scsi->dev_id[scsi->scb_id].phys_id); scsi->cdb[0] = GPCMD_READ_10; @@ -776,10 +766,13 @@ spock_execute_cmd(spock_t *scsi, scb_t *scb) return; case CMD_WRITE_DATA: - if (scsi->present[scsi->scb_id] != 0xff) + if (scsi->scb_id != 15) { + if (scsi->present[scsi->scb_id]) + scsi->cdb_id = scsi->dev_id[scsi->scb_id].phys_id; + else + scsi->cdb_id = 0xff; + } else scsi->cdb_id = scsi->dev_id[scsi->scb_id].phys_id; - else - scsi->cdb_id = 0xff; spock_log("Device Write Data\n"); scsi->cdb[0] = GPCMD_WRITE_10; @@ -798,10 +791,13 @@ spock_execute_cmd(spock_t *scsi, scb_t *scb) return; case CMD_VERIFY: - if (scsi->present[scsi->scb_id] != 0xff) + if (scsi->scb_id != 15) { + if (scsi->present[scsi->scb_id]) + scsi->cdb_id = scsi->dev_id[scsi->scb_id].phys_id; + else + scsi->cdb_id = 0xff; + } else scsi->cdb_id = scsi->dev_id[scsi->scb_id].phys_id; - else - scsi->cdb_id = 0xff; spock_log("Device Verify\n"); scsi->cdb[0] = GPCMD_VERIFY_10; @@ -821,10 +817,13 @@ spock_execute_cmd(spock_t *scsi, scb_t *scb) return; case CMD_WRITE_VERIFY: - if (scsi->present[scsi->scb_id] != 0xff) + if (scsi->scb_id != 15) { + if (scsi->present[scsi->scb_id]) + scsi->cdb_id = scsi->dev_id[scsi->scb_id].phys_id; + else + scsi->cdb_id = 0xff; + } else scsi->cdb_id = scsi->dev_id[scsi->scb_id].phys_id; - else - scsi->cdb_id = 0xff; spock_log("Device Write with Verify\n"); scsi->cdb[0] = GPCMD_WRITE_AND_VERIFY_10; @@ -843,10 +842,13 @@ spock_execute_cmd(spock_t *scsi, scb_t *scb) return; case CMD_REQUEST_SENSE: - if (scsi->present[scsi->scb_id] != 0xff) + if (scsi->scb_id != 15) { + if (scsi->present[scsi->scb_id]) + scsi->cdb_id = scsi->dev_id[scsi->scb_id].phys_id; + else + scsi->cdb_id = 0xff; + } else scsi->cdb_id = scsi->dev_id[scsi->scb_id].phys_id; - else - scsi->cdb_id = 0xff; spock_log("Device Request Sense, ID=%d\n", scsi->cdb_id); scsi->cdb[0] = GPCMD_REQUEST_SENSE; @@ -870,7 +872,7 @@ spock_execute_cmd(spock_t *scsi, scb_t *scb) if (scsi_device_present(&scsi_devices[scsi->bus][scsi->cdb_id]) && (scsi->cdb_id != 0xff)) { if (scsi->last_status == SCSI_STATUS_OK) { scsi->scb_state = 3; - spock_log("Status is Good on device ID %d, cdb id = %d.\n", scsi->scb_id, scsi->cdb_id); + spock_log("Status is Good on device ID %d, cdb id = %d, devsel = %d.\n", scsi->scb_id, scsi->cdb_id, scsi->attention & 0x0f); } else if (scsi->last_status == SCSI_STATUS_CHECK_CONDITION) { uint16_t term_stat_block_addr7 = (0xc << 8) | 2; uint16_t term_stat_block_addr8 = 0x20; @@ -905,7 +907,7 @@ spock_execute_cmd(spock_t *scsi, scb_t *scb) } else { spock_set_irq(scsi, scsi->scb_id, IRQ_TYPE_SCB_COMPLETE); scsi->scb_state = 0; - spock_log("Complete SCB ID = %d.\n", scsi->attention & 0x0f); + spock_log("Complete SCB ID = %d.\n", scsi->scb_id); } break; @@ -1084,10 +1086,10 @@ spock_callback(void *priv) case 4: case 0x0f: /*Start SCB*/ scsi->cmd_status = 1; - scsi->scb_addr = scsi->cir[0] | (scsi->cir[1] << 8) | (scsi->cir[2] << 16) | (scsi->cir[3] << 24); - scsi->scb_id = scsi->attention & 0x0f; + scsi->scb_addr = scsi->cir[0] | (scsi->cir[1] << 8) | (scsi->cir[2] << 16) | (scsi->cir[3] << 24); + scsi->scb_id = scsi->attention & 0x0f; scsi->cmd_timer = SPOCK_TIME * 2; - spock_log("Start SCB at ID = %d, attention = %02x\n", scsi->scb_id, scsi->attention >> 4); + spock_log("Start SCB at ID = %d, attention = %02x, cdb_id = %d\n", scsi->scb_id, scsi->attention >> 4, scsi->cdb_id); scsi->scb_state = 1; break; @@ -1182,6 +1184,7 @@ spock_reset(void *priv) scsi->in_invalid = 0; scsi->attention_wait = 0; scsi->basic_ctrl = 0; + scsi->id_connected = 0; spock_log("Actual Reset.\n"); } From e800f99f5a2b89b9aad04a0ce39b2726bdb0a88c Mon Sep 17 00:00:00 2001 From: OBattler Date: Sat, 10 May 2025 04:53:20 +0200 Subject: [PATCH 168/180] Make device.c assume CONFIG_BIOS is first in the config struct and make sure any device_t struct containing such follows that, in order to not have to traverse the entirety of every single device_t's config struct in the Settings dialog - should reduce the dialog's loading times further. --- src/device.c | 37 ++++++++++------------- src/disk/hdc_xta.c | 60 ++++++++++++++++++------------------- src/disk/hdc_xtide.c | 62 +++++++++++++++++++-------------------- src/scsi/scsi_ncr53c400.c | 62 +++++++++++++++++++-------------------- src/video/vid_et4000.c | 46 ++++++++++++++--------------- 5 files changed, 131 insertions(+), 136 deletions(-) diff --git a/src/device.c b/src/device.c index 25f0b55de..ecd523274 100644 --- a/src/device.c +++ b/src/device.c @@ -392,29 +392,24 @@ device_available(const device_t *dev) { if (dev != NULL) { const device_config_t *config = dev->config; - if (config != NULL) { - while (config->type != CONFIG_END) { - if (config->type == CONFIG_BIOS) { - int roms_present = 0; - const device_config_bios_t *bios = (const device_config_bios_t *) config->bios; + if ((config != NULL) && (config->type == CONFIG_BIOS)) { + int roms_present = 0; + const device_config_bios_t *bios = (const device_config_bios_t *) config->bios; - /* Go through the ROM's in the device configuration. */ - while ((bios != NULL) && - (bios->name != NULL) && - (bios->internal_name != NULL) && - (bios->files_no != 0)) { - int i = 0; - for (uint8_t bf = 0; bf < bios->files_no; bf++) - i += !!rom_present(bios->files[bf]); - if (i == bios->files_no) - roms_present++; - bios++; - } - - return (roms_present ? -1 : 0); - } - config++; + /* Go through the ROM's in the device configuration. */ + while ((bios != NULL) && + (bios->name != NULL) && + (bios->internal_name != NULL) && + (bios->files_no != 0)) { + int i = 0; + for (uint8_t bf = 0; bf < bios->files_no; bf++) + i += !!rom_present(bios->files[bf]); + if (i == bios->files_no) + roms_present++; + bios++; } + + return (roms_present ? -1 : 0); } /* No CONFIG_BIOS field present, use the classic available(). */ diff --git a/src/disk/hdc_xta.c b/src/disk/hdc_xta.c index 85581af2d..d54f6ab0c 100644 --- a/src/disk/hdc_xta.c +++ b/src/disk/hdc_xta.c @@ -1106,6 +1106,36 @@ xta_close(void *priv) static const device_config_t wdxt150_config[] = { // clang-format off + { + .name = "bios_rev", + .description = "BIOS Revision", + .type = CONFIG_BIOS, + .default_string = "rev_1", + .default_int = 0, + .file_filter = NULL, + .spinner = { 0 }, + .bios = { + { + .name = "Revision 1.0", + .internal_name = "rev_1", + .bios_type = BIOS_NORMAL, + .files_no = 1, + .local = 0, + .size = 8192, + .files = { WD_REV_1_BIOS_FILE, "" } + }, + { + .name = "Revision 2.0", + .internal_name = "rev_2", + .bios_type = BIOS_NORMAL, + .files_no = 1, + .local = 0, + .size = 8192, + .files = { WD_REV_2_BIOS_FILE, "" } + }, + { .files_no = 0 } + }, + }, { .name = "base", .description = "Address", @@ -1151,36 +1181,6 @@ static const device_config_t wdxt150_config[] = { }, .bios = { { 0 } } }, - { - .name = "bios_rev", - .description = "BIOS Revision", - .type = CONFIG_BIOS, - .default_string = "rev_1", - .default_int = 0, - .file_filter = NULL, - .spinner = { 0 }, - .bios = { - { - .name = "Revision 1.0", - .internal_name = "rev_1", - .bios_type = BIOS_NORMAL, - .files_no = 1, - .local = 0, - .size = 8192, - .files = { WD_REV_1_BIOS_FILE, "" } - }, - { - .name = "Revision 2.0", - .internal_name = "rev_2", - .bios_type = BIOS_NORMAL, - .files_no = 1, - .local = 0, - .size = 8192, - .files = { WD_REV_2_BIOS_FILE, "" } - }, - { .files_no = 0 } - }, - }, { .name = "", .description = "", .type = CONFIG_END } // clang-format off }; diff --git a/src/disk/hdc_xtide.c b/src/disk/hdc_xtide.c index 154a28cec..1c8e2c8da 100644 --- a/src/disk/hdc_xtide.c +++ b/src/disk/hdc_xtide.c @@ -252,6 +252,37 @@ xtide_at_close(void *priv) // clang-format off static const device_config_t xtide_config[] = { + { + .name = "bios", + .description = "BIOS Revision", + .type = CONFIG_BIOS, + .default_string = "xt", + .default_int = 0, + .file_filter = NULL, + .spinner = { 0 }, + .selection = { { 0 } }, + .bios = { + { + .name = "Regular XT", + .internal_name = "xt", + .bios_type = BIOS_NORMAL, + .files_no = 1, + .local = 0, + .size = 8192, + .files = { ROM_PATH_XT, "" } + }, + { + .name = "XT+ (V20/V30/8018x)", + .internal_name = "xt_plus", + .bios_type = BIOS_NORMAL, + .files_no = 1, + .local = 0, + .size = 8192, + .files = { ROM_PATH_XTP, "" } + }, + { .files_no = 0 } + }, + }, { .name = "base", .description = "Address", @@ -348,37 +379,6 @@ static const device_config_t xtide_config[] = { }, .bios = { { 0 } } }, - { - .name = "bios", - .description = "BIOS Revision", - .type = CONFIG_BIOS, - .default_string = "xt", - .default_int = 0, - .file_filter = NULL, - .spinner = { 0 }, - .selection = { { 0 } }, - .bios = { - { - .name = "Regular XT", - .internal_name = "xt", - .bios_type = BIOS_NORMAL, - .files_no = 1, - .local = 0, - .size = 8192, - .files = { ROM_PATH_XT, "" } - }, - { - .name = "XT+ (V20/V30/8018x)", - .internal_name = "xt_plus", - .bios_type = BIOS_NORMAL, - .files_no = 1, - .local = 0, - .size = 8192, - .files = { ROM_PATH_XTP, "" } - }, - { .files_no = 0 } - }, - }, { .name = "", .description = "", .type = CONFIG_END } }; diff --git a/src/scsi/scsi_ncr53c400.c b/src/scsi/scsi_ncr53c400.c index f91dc83a9..0e04e0b5e 100644 --- a/src/scsi/scsi_ncr53c400.c +++ b/src/scsi/scsi_ncr53c400.c @@ -859,6 +859,37 @@ static const device_config_t ncr53c400_mmio_config[] = { }; static const device_config_t rt1000b_config[] = { + { + .name = "bios_ver", + .description = "BIOS Revision", + .type = CONFIG_BIOS, + .default_string = "v8_10r", + .default_int = 0, + .file_filter = NULL, + .spinner = { 0 }, + .selection = { { 0 } }, + .bios = { + { + .name = "Version 8.10R", + .internal_name = "v8_10r", + .bios_type = BIOS_NORMAL, + .files_no = 1, + .local = 0, + .size = 8192, + .files = { RT1000B_810R_ROM, "" } + }, + { + .name = "Version 8.20R", + .internal_name = "v8_20r", + .bios_type = BIOS_NORMAL, + .files_no = 1, + .local = 0, + .size = 8192, + .files = { RT1000B_820R_ROM, "" } + }, + { .files_no = 0 } + }, + }, { .name = "bios_addr", .description = "BIOS Address", @@ -895,37 +926,6 @@ static const device_config_t rt1000b_config[] = { }, .bios = { { 0 } } }, - { - .name = "bios_ver", - .description = "BIOS Revision", - .type = CONFIG_BIOS, - .default_string = "v8_10r", - .default_int = 0, - .file_filter = NULL, - .spinner = { 0 }, - .selection = { { 0 } }, - .bios = { - { - .name = "Version 8.10R", - .internal_name = "v8_10r", - .bios_type = BIOS_NORMAL, - .files_no = 1, - .local = 0, - .size = 8192, - .files = { RT1000B_810R_ROM, "" } - }, - { - .name = "Version 8.20R", - .internal_name = "v8_20r", - .bios_type = BIOS_NORMAL, - .files_no = 1, - .local = 0, - .size = 8192, - .files = { RT1000B_820R_ROM, "" } - }, - { .files_no = 0 } - }, - }, { .name = "", .description = "", .type = CONFIG_END } }; diff --git a/src/video/vid_et4000.c b/src/video/vid_et4000.c index 064d79230..1929d1d16 100644 --- a/src/video/vid_et4000.c +++ b/src/video/vid_et4000.c @@ -942,22 +942,6 @@ et4000_kasan_available(void) static const device_config_t et4000_tc6058af_config[] = { // clang-format off - { - .name = "memory", - .description = "Memory size", - .type = CONFIG_SELECTION, - .default_string = NULL, - .default_int = 512, - .file_filter = NULL, - .spinner = { 0 }, - .selection = { - { .description = "256 KB", .value = 256 }, - { .description = "512 KB", .value = 512 }, - { .description = "1 MB", .value = 1024 }, - { .description = "" } - }, - .bios = { { 0 } } - }, { .name = "bios_ver", .description = "BIOS Revision", @@ -989,18 +973,12 @@ static const device_config_t et4000_tc6058af_config[] = { { .files_no = 0 } } }, - { .name = "", .description = "", .type = CONFIG_END } -// clang-format on -}; - -static const device_config_t et4000_bios_config[] = { - // clang-format off { .name = "memory", .description = "Memory size", .type = CONFIG_SELECTION, .default_string = NULL, - .default_int = 1024, + .default_int = 512, .file_filter = NULL, .spinner = { 0 }, .selection = { @@ -1011,6 +989,12 @@ static const device_config_t et4000_bios_config[] = { }, .bios = { { 0 } } }, + { .name = "", .description = "", .type = CONFIG_END } +// clang-format on +}; + +static const device_config_t et4000_bios_config[] = { + // clang-format off { .name = "bios_ver", .description = "BIOS Revision", @@ -1042,6 +1026,22 @@ static const device_config_t et4000_bios_config[] = { { .files_no = 0 } } }, + { + .name = "memory", + .description = "Memory size", + .type = CONFIG_SELECTION, + .default_string = NULL, + .default_int = 1024, + .file_filter = NULL, + .spinner = { 0 }, + .selection = { + { .description = "256 KB", .value = 256 }, + { .description = "512 KB", .value = 512 }, + { .description = "1 MB", .value = 1024 }, + { .description = "" } + }, + .bios = { { 0 } } + }, { .name = "", .description = "", .type = CONFIG_END } // clang-format on }; From 76d5fa79af07f10251eebb0c92265cdffbebfc0e Mon Sep 17 00:00:00 2001 From: OBattler Date: Sat, 10 May 2025 05:01:57 +0200 Subject: [PATCH 169/180] Improve machine availability checking so that it absolutely never uses the legacy method if the machine has a device and the device has a CONFIG_BIOS setting. --- src/device.c | 63 ++++++++++++++++++++++---------------- src/include/86box/device.h | 2 ++ src/machine/machine.c | 20 +++++++----- 3 files changed, 52 insertions(+), 33 deletions(-) diff --git a/src/device.c b/src/device.c index ecd523274..1922806b9 100644 --- a/src/device.c +++ b/src/device.c @@ -390,37 +390,18 @@ device_get_priv(const device_t *dev) int device_available(const device_t *dev) { - if (dev != NULL) { - const device_config_t *config = dev->config; - if ((config != NULL) && (config->type == CONFIG_BIOS)) { - int roms_present = 0; - const device_config_bios_t *bios = (const device_config_bios_t *) config->bios; - - /* Go through the ROM's in the device configuration. */ - while ((bios != NULL) && - (bios->name != NULL) && - (bios->internal_name != NULL) && - (bios->files_no != 0)) { - int i = 0; - for (uint8_t bf = 0; bf < bios->files_no; bf++) - i += !!rom_present(bios->files[bf]); - if (i == bios->files_no) - roms_present++; - bios++; - } - - return (roms_present ? -1 : 0); - } + int ret = machine_device_available(dev); + if (ret == 0) { /* No CONFIG_BIOS field present, use the classic available(). */ if (dev->available != NULL) - return (dev->available()); + ret = (dev->available()); else - return 1; - } + ret = (dev != NULL); + } else + ret = (ret == -1); - /* A NULL device is never available. */ - return 0; + return ret; } uint8_t @@ -964,6 +945,36 @@ machine_get_config_string(char *str) return ret; } +int +machine_device_available(const device_t *dev) +{ + if (dev != NULL) { + const device_config_t *config = dev->config; + if ((config != NULL) && (config->type == CONFIG_BIOS)) { + int roms_present = 0; + const device_config_bios_t *bios = (const device_config_bios_t *) config->bios; + + /* Go through the ROM's in the device configuration. */ + while ((bios != NULL) && + (bios->name != NULL) && + (bios->internal_name != NULL) && + (bios->files_no != 0)) { + int i = 0; + for (uint8_t bf = 0; bf < bios->files_no; bf++) + i += !!rom_present(bios->files[bf]); + if (i == bios->files_no) + roms_present++; + bios++; + } + + return (roms_present ? -1 : -2); + } + } + + /* NULL device or no CONFIG_BIOS field, return 0. */ + return 0; +} + const device_t * device_context_get_device(void) { diff --git a/src/include/86box/device.h b/src/include/86box/device.h index 91ff2daa6..76f12a0c5 100644 --- a/src/include/86box/device.h +++ b/src/include/86box/device.h @@ -239,6 +239,8 @@ extern const char *device_get_internal_name(const device_t *dev); extern int machine_get_config_int(char *str); extern const char *machine_get_config_string(char *str); +extern int machine_device_available(const device_t *dev); + extern const device_t device_none; extern const device_t device_internal; diff --git a/src/machine/machine.c b/src/machine/machine.c index b171dd505..505674000 100644 --- a/src/machine/machine.c +++ b/src/machine/machine.c @@ -139,18 +139,24 @@ machine_init(void) int machine_available(int m) { - int ret; + int ret = 0; const device_t *dev = machine_get_device(m); - bios_only = 1; + if (dev != NULL) + ret = machine_device_available(dev); + /* + Only via machine_init_ex() if the device is NULL or + it lacks a CONFIG_BIOS field (or the CONFIG_BIOS field + is not the first in list. + */ + if (ret == 0) { + bios_only = 1; - ret = device_available(dev); - /* Do not check via machine_init_ex() if the device is not NULL and - it has a CONFIG_BIOS field. */ - if ((dev == NULL) || (ret != -1)) ret = machine_init_ex(m); - bios_only = 0; + bios_only = 0; + } else if (ret == -2) + ret = 0; return !!ret; } From 462e9232b3633ac54e4abf2935cce95ae8426d53 Mon Sep 17 00:00:00 2001 From: OBattler Date: Sat, 10 May 2025 05:05:56 +0200 Subject: [PATCH 170/180] Chaintech 5SBM2: Rename to 5SBM/5SBM2 and add the 4.50PG BIOS from 1996 as an option. --- src/machine/m_at_socket7_3v.c | 49 ++++++++++++++++++++++++++++++++--- src/machine/machine_table.c | 7 ++--- 2 files changed, 50 insertions(+), 6 deletions(-) diff --git a/src/machine/m_at_socket7_3v.c b/src/machine/m_at_socket7_3v.c index 913c82518..04bc6b5ef 100644 --- a/src/machine/m_at_socket7_3v.c +++ b/src/machine/m_at_socket7_3v.c @@ -825,13 +825,56 @@ machine_at_vectra54_init(const machine_t *model) return ret; } +static const device_config_t c5sbm2_config[] = { + // clang-format off + { + .name = "bios", + .description = "BIOS Version", + .type = CONFIG_BIOS, + .default_string = "5sbm2", + .default_int = 0, + .file_filter = "", + .spinner = { 0 }, + .bios = { + { .name = "4.50GP (07/17/1995)", .internal_name = "5sbm2", .bios_type = BIOS_NORMAL, + .files_no = 1, .local = 0, .size = 131072, .files = { "roms/machines/5sbm2/5SBM0717.BIN", "" } }, + { .name = "4.50PG (03/21/1996)", .internal_name = "5sbm2_450pg", .bios_type = BIOS_NORMAL, + .files_no = 1, .local = 0, .size = 131072, .files = { "roms/machines/5sbm2/5SBM0326.BIN", "" } }, + { .files_no = 0 } + }, + }, + { .name = "", .description = "", .type = CONFIG_END } + // clang-format on +}; + +const device_t c5sbm2_device = { + .name = "Chaintech 5SBM/5SBM2 (M103)", + .internal_name = "5sbm2_device", + .flags = 0, + .local = 0, + .init = NULL, + .close = NULL, + .reset = NULL, + .available = NULL, + .speed_changed = NULL, + .force_redraw = NULL, + .config = c5sbm2_config +}; + int machine_at_5sbm2_init(const machine_t *model) { - int ret; + int ret = 0; + const char* fn; - ret = bios_load_linear("roms/machines/5sbm2/5SBM0717.BIN", - 0x000e0000, 131072, 0); + /* No ROMs available */ + if (!device_available(model->device)) + return ret; + + device_context(model->device); + fn = device_get_bios_file(machine_get_device(machine), device_get_config_bios("bios"), 0); + ret = bios_load_linear(fn, 0x000e0000, 131072, 0); + device_context_restore(); if (bios_only || !ret) return ret; diff --git a/src/machine/machine_table.c b/src/machine/machine_table.c index e0317f40f..34e69ed24 100644 --- a/src/machine/machine_table.c +++ b/src/machine/machine_table.c @@ -68,6 +68,7 @@ extern const device_t ibmxt286_device; extern const device_t pb450_device; extern const device_t jukopc_device; extern const device_t vendex_device; +extern const device_t c5sbm2_device; const machine_filter_t machine_types[] = { { "None", MACHINE_TYPE_NONE }, @@ -11545,7 +11546,7 @@ const machine_t machines[] = { /* SiS 5501 */ /* Has the Lance LT38C41 KBC. */ { - .name = "[SiS 5501] Chaintech 5SBM2 (M103)", + .name = "[SiS 5501] Chaintech 5SBM/5SBM2 (M103)", .internal_name = "5sbm2", .type = MACHINE_TYPE_SOCKET7_3V, .chipset = MACHINE_CHIPSET_SIS_5501, @@ -11568,7 +11569,7 @@ const machine_t machines[] = { .flags = MACHINE_IDE_DUAL | MACHINE_APM, .ram = { .min = 8192, - .max = 262144, + .max = 131072, .step = 8192 }, .nvrmask = 255, @@ -11576,7 +11577,7 @@ const machine_t machines[] = { .kbc_p1 = 0xff, .gpio = 0xffffffff, .gpio_acpi = 0xffffffff, - .device = NULL, + .device = &c5sbm2_device, .fdc_device = NULL, .sio_device = NULL, .vid_device = NULL, From 87557685159765b3f6f6f13f964be89c258dd447 Mon Sep 17 00:00:00 2001 From: OBattler Date: Sat, 10 May 2025 05:14:59 +0200 Subject: [PATCH 171/180] Chaintech 5SBM/5SBM2: Unicore Upgrade 4.51PG BIOS. --- src/machine/m_at_socket7_3v.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/machine/m_at_socket7_3v.c b/src/machine/m_at_socket7_3v.c index 04bc6b5ef..39dc2d735 100644 --- a/src/machine/m_at_socket7_3v.c +++ b/src/machine/m_at_socket7_3v.c @@ -840,6 +840,8 @@ static const device_config_t c5sbm2_config[] = { .files_no = 1, .local = 0, .size = 131072, .files = { "roms/machines/5sbm2/5SBM0717.BIN", "" } }, { .name = "4.50PG (03/21/1996)", .internal_name = "5sbm2_450pg", .bios_type = BIOS_NORMAL, .files_no = 1, .local = 0, .size = 131072, .files = { "roms/machines/5sbm2/5SBM0326.BIN", "" } }, + { .name = "4.51PG (03/15/2000 Unicore Upgrade)", .internal_name = "5sbm2_451pg", .bios_type = BIOS_NORMAL, + .files_no = 1, .local = 0, .size = 131072, .files = { "roms/machines/5sbm2/2A5ICC3A.BIN", "" } }, { .files_no = 0 } }, }, From 1dd460e9a445298d2e43ef936f14cf159d758603 Mon Sep 17 00:00:00 2001 From: OBattler Date: Sat, 10 May 2025 06:22:56 +0200 Subject: [PATCH 172/180] x86_64 new recompiler: properly handle cases where pccache is not within 2 GB of the beginning of the RAM array. --- src/codegen_new/codegen_backend_x86-64_ops.c | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/codegen_new/codegen_backend_x86-64_ops.c b/src/codegen_new/codegen_backend_x86-64_ops.c index fc6c1b492..b03ea88c3 100644 --- a/src/codegen_new/codegen_backend_x86-64_ops.c +++ b/src/codegen_new/codegen_backend_x86-64_ops.c @@ -780,8 +780,19 @@ host_x86_MOV32_REG_ABS(codeblock_t *block, int dst_reg, void *p) codegen_alloc_bytes(block, 8); codegen_addbyte4(block, 0x41, 0x8b, 0x84 | ((dst_reg & 7) << 3), 0x24); /*MOV dst_reg, ram_offset[R12]*/ codegen_addlong(block, ram_offset); + } else if ((ram_offset < -2147483648LL) || (ram_offset > 2147483647LL) || !(block->flags & CODEBLOCK_NO_IMMEDIATES)) { + // fatal("host_x86_MOV32_REG_ABS - out of range\n"); + // void *q = p; + //uint32_t *r = NULL; + // *r = 5; /* Crash deliberately. */ + codegen_alloc_bytes(block, 18); + codegen_addbyte2(block, 0x41, 0x54); /*PUSH r12*/ + codegen_addbyte2(block, 0x49, 0xbc); /*MOV r12,(uintptr_t) p*/ + codegen_addquad(block, (uintptr_t) p); + codegen_addbyte4(block, 0x41, 0x8b, 0x04 | ((dst_reg & 7) << 3), 0x24); /*MOV dst_reg, [R12]*/ + codegen_addbyte2(block, 0x41, 0x5c); /*POP r12*/ } else { - fatal("host_x86_MOV32_REG_ABS - out of range\n"); + fatal("host_x86_MOV32_REG_ABS - RAM offset = %016" PRIX64 " (p - ram = %016" PRIX64 ")\n", ram_offset, (uintptr_t) p - (uintptr_t) ram); codegen_alloc_bytes(block, 6); codegen_addbyte(block, 0x8b); /*MOV [p], src_reg*/ codegen_addbyte(block, 0x05 | ((dst_reg & 7) << 3)); From b179955a12aea4510d105521df0bc39db2f519ba Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Sat, 10 May 2025 12:57:27 +0600 Subject: [PATCH 173/180] x64 NDR: Avoid pushes/pops for `host_x86_MOV32_REG_ABS` --- src/codegen_new/codegen_backend_x86-64_ops.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/codegen_new/codegen_backend_x86-64_ops.c b/src/codegen_new/codegen_backend_x86-64_ops.c index b03ea88c3..ed218d7c4 100644 --- a/src/codegen_new/codegen_backend_x86-64_ops.c +++ b/src/codegen_new/codegen_backend_x86-64_ops.c @@ -785,12 +785,11 @@ host_x86_MOV32_REG_ABS(codeblock_t *block, int dst_reg, void *p) // void *q = p; //uint32_t *r = NULL; // *r = 5; /* Crash deliberately. */ - codegen_alloc_bytes(block, 18); - codegen_addbyte2(block, 0x41, 0x54); /*PUSH r12*/ - codegen_addbyte2(block, 0x49, 0xbc); /*MOV r12,(uintptr_t) p*/ + codegen_alloc_bytes(block, 8); + codegen_addbyte2(block, 0x49, 0xb9); /*MOV r9,(uintptr_t) p*/ codegen_addquad(block, (uintptr_t) p); - codegen_addbyte4(block, 0x41, 0x8b, 0x04 | ((dst_reg & 7) << 3), 0x24); /*MOV dst_reg, [R12]*/ - codegen_addbyte2(block, 0x41, 0x5c); /*POP r12*/ + codegen_alloc_bytes(block, 3); + codegen_addbyte3(block, 0x41, 0x8b, 0x01 | ((dst_reg & 7) << 3)); /*MOV dst_reg, [R9]*/ } else { fatal("host_x86_MOV32_REG_ABS - RAM offset = %016" PRIX64 " (p - ram = %016" PRIX64 ")\n", ram_offset, (uintptr_t) p - (uintptr_t) ram); codegen_alloc_bytes(block, 6); From 7529c19ec89721859eb4e2705f7cf28f0b5338b4 Mon Sep 17 00:00:00 2001 From: OBattler Date: Sat, 10 May 2025 14:25:29 +0200 Subject: [PATCH 174/180] Reset all keys on keyboard reset and also make sure to stop the CTRL+ALT+DEL sending on keyboard reset, fixes spurious "Keyboard not present" errors. --- src/86box.c | 28 ++++++++++++++++++++++++++ src/device/keyboard.c | 38 ++++++++++++++++++++++++------------ src/device/keyboard_at.c | 4 ++++ src/include/86box/keyboard.h | 2 ++ 4 files changed, 60 insertions(+), 12 deletions(-) diff --git a/src/86box.c b/src/86box.c index 25dc0e6e9..f54a69b79 100644 --- a/src/86box.c +++ b/src/86box.c @@ -1250,20 +1250,48 @@ pc_send_ca(uint16_t sc) if (keyboard_mode >= 0x81) { /* Use R-Alt because PS/55 DOS and OS/2 assign L-Alt Kanji */ keyboard_input(1, 0x1D); /* Ctrl key pressed */ + if (keyboard_get_in_reset()) + return; keyboard_input(1, 0x138); /* R-Alt key pressed */ + if (keyboard_get_in_reset()) + return; keyboard_input(1, sc); + if (keyboard_get_in_reset()) + return; usleep(50000); + if (keyboard_get_in_reset()) + return; keyboard_input(0, sc); + if (keyboard_get_in_reset()) + return; keyboard_input(0, 0x138); /* R-Alt key released */ + if (keyboard_get_in_reset()) + return; keyboard_input(0, 0x1D); /* Ctrl key released */ + if (keyboard_get_in_reset()) + return; } else { keyboard_input(1, 0x1D); /* Ctrl key pressed */ + if (keyboard_get_in_reset()) + return; keyboard_input(1, 0x38); /* Alt key pressed */ + if (keyboard_get_in_reset()) + return; keyboard_input(1, sc); + if (keyboard_get_in_reset()) + return; usleep(50000); + if (keyboard_get_in_reset()) + return; keyboard_input(0, sc); + if (keyboard_get_in_reset()) + return; keyboard_input(0, 0x38); /* Alt key released */ + if (keyboard_get_in_reset()) + return; keyboard_input(0, 0x1D); /* Ctrl key released */ + if (keyboard_get_in_reset()) + return; } } diff --git a/src/device/keyboard.c b/src/device/keyboard.c index 800e7fb8e..6a5693f71 100644 --- a/src/device/keyboard.c +++ b/src/device/keyboard.c @@ -64,11 +64,12 @@ static int keydelay[512]; #endif static scancode *scan_table; /* scancode table for keyboard */ -static volatile uint8_t caps_lock = 0; -static volatile uint8_t num_lock = 0; -static volatile uint8_t scroll_lock = 0; -static volatile uint8_t kana_lock = 0; -static uint8_t shift = 0; +static volatile uint8_t caps_lock = 0; +static volatile uint8_t num_lock = 0; +static volatile uint8_t scroll_lock = 0; +static volatile uint8_t kana_lock = 0; +static volatile uint8_t kbd_in_reset = 0; +static uint8_t shift = 0; static int key5576mode = 0; @@ -106,11 +107,12 @@ static scconvtbl scconv55_8a[18 + 1] = void keyboard_init(void) { - num_lock = 0; - caps_lock = 0; - scroll_lock = 0; - kana_lock = 0; - shift = 0; + num_lock = 0; + caps_lock = 0; + scroll_lock = 0; + kana_lock = 0; + shift = 0; + kbd_in_reset = 0; memset(recv_key, 0x00, sizeof(recv_key)); memset(recv_key_ui, 0x00, sizeof(recv_key)); @@ -343,9 +345,9 @@ void keyboard_all_up(void) { for (unsigned short i = 0; i < 0x200; i++) { - if (recv_key_ui[i]) { + if (recv_key_ui[i]) recv_key_ui[i] = 0; - } + if (recv_key[i]) { recv_key[i] = 0; key_process(i, 0); @@ -353,6 +355,18 @@ keyboard_all_up(void) } } +void +keyboard_set_in_reset(uint8_t in_reset) +{ + kbd_in_reset = in_reset; +} + +uint8_t +keyboard_get_in_reset(void) +{ + return kbd_in_reset; +} + static uint8_t keyboard_do_break(uint16_t scan) { diff --git a/src/device/keyboard_at.c b/src/device/keyboard_at.c index fbf167e3f..4b1097df4 100644 --- a/src/device/keyboard_at.c +++ b/src/device/keyboard_at.c @@ -3476,7 +3476,10 @@ keyboard_at_bat(void *priv) keyboard_scan = 1; + keyboard_all_up(); keyboard_update_states(0, 0, 0, 0); + + keyboard_set_in_reset(0); kbc_at_dev_queue_add(dev, 0xaa, 0); } else { bat_counter--; @@ -3714,6 +3717,7 @@ keyboard_at_write(void *priv) break; case 0xff: /* reset */ + keyboard_set_in_reset(1); kbc_at_dev_reset(dev, 1); bat_counter = 1000; break; diff --git a/src/include/86box/keyboard.h b/src/include/86box/keyboard.h index f62896106..dd8cae54b 100644 --- a/src/include/86box/keyboard.h +++ b/src/include/86box/keyboard.h @@ -273,6 +273,8 @@ extern void keyboard_input(int down, uint16_t scan); extern void keyboard_all_up(void); extern void keyboard_update_states(uint8_t cl, uint8_t nl, uint8_t sl, uint8_t kl); extern uint8_t keyboard_get_shift(void); +extern void keyboard_set_in_reset(uint8_t in_reset); +extern uint8_t keyboard_get_in_reset(void); extern void keyboard_get_states(uint8_t *cl, uint8_t *nl, uint8_t *sl, uint8_t *kl); extern void keyboard_set_states(uint8_t cl, uint8_t nl, uint8_t sl); extern int keyboard_recv(uint16_t key); From 8577e0b532764353a2f09664753d353c48330c72 Mon Sep 17 00:00:00 2001 From: OBattler Date: Sat, 10 May 2025 14:27:36 +0200 Subject: [PATCH 175/180] Also suppress any and all keyboard input while the keyboard is in reset. --- src/device/keyboard.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/device/keyboard.c b/src/device/keyboard.c index 6a5693f71..16904fe3b 100644 --- a/src/device/keyboard.c +++ b/src/device/keyboard.c @@ -240,6 +240,9 @@ key_process(uint16_t scan, int down) void keyboard_input(int down, uint16_t scan) { + if (kbd_in_reset) + return; + /* Special case for E1 1D, translate it to 0100 - special case. */ if ((scan >> 8) == 0xe1) { if ((scan & 0xff) == 0x1d) From 04b9735975e612bf0713d7b55037f5a3bc356e11 Mon Sep 17 00:00:00 2001 From: TC1995 Date: Sat, 10 May 2025 22:11:19 +0200 Subject: [PATCH 176/180] Quick timer fix on the T128/PAS SCSI (May 10th, 2025) 1. If the timer result is less than 10.0 microseconds, then adjust it to 10.0. Fixes some timing read issues with the T128 (and possibly PAS SCSI). 2. Remove unused variables. --- src/scsi/scsi_t128.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/scsi/scsi_t128.c b/src/scsi/scsi_t128.c index 94166054c..c5a1c4e67 100644 --- a/src/scsi/scsi_t128.c +++ b/src/scsi/scsi_t128.c @@ -241,9 +241,14 @@ t128_callback(void *priv) uint8_t c; uint8_t temp; uint8_t status; + double period = scsi_bus->period / 60.0; - if (scsi_bus->tx_mode != PIO_TX_BUS) - timer_on_auto(&t128->timer, scsi_bus->period / 60.0); + if (scsi_bus->tx_mode != PIO_TX_BUS) { + if (period >= 10.0) + timer_on_auto(&t128->timer, period); + else + timer_on_auto(&t128->timer, 10.0); + } if (scsi_bus->data_wait & 1) { scsi_bus->clear_req = 3; @@ -287,7 +292,6 @@ t128_callback(void *priv) t128->status &= ~0x02; t128->pos = 0; t128->host_pos = 0; - scsi_bus->data_repeat = 0; t128_log("T128 Remaining blocks to be written=%d\n", t128->block_count); if (scsi_bus->data_pos >= dev->buffer_length) { t128->block_loaded = 0; @@ -336,7 +340,6 @@ t128_callback(void *priv) t128->status &= ~0x02; t128->pos = 0; t128->host_pos = 0; - scsi_bus->data_repeat = 0; t128_log("T128 blocks read=%d, total len=%d\n", scsi_bus->data_pos, dev->buffer_length); if (scsi_bus->data_pos >= dev->buffer_length) { scsi_bus->bus_out |= BUS_REQ; From e5606f75302ff0181991e2f15552d65a0052f0f4 Mon Sep 17 00:00:00 2001 From: OBattler Date: Sat, 10 May 2025 23:14:10 +0200 Subject: [PATCH 177/180] Unix net socket: make the client socket non-blocking, fixes #5578. --- src/unix/unix_netsocket.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/unix/unix_netsocket.c b/src/unix/unix_netsocket.c index d626d025b..850fa3c6c 100644 --- a/src/unix/unix_netsocket.c +++ b/src/unix/unix_netsocket.c @@ -94,6 +94,8 @@ plat_netsocket_accept(SOCKET socket) if (clientsocket == -1) return -1; + fcntl(clientsocket, F_SETFL, fcntl(clientsocket, F_GETFL, 0) | O_NONBLOCK); + return clientsocket; } From 709771742d4255e066b215d1f9d5a056ff6ea0b1 Mon Sep 17 00:00:00 2001 From: Dave Cuthbert Date: Sat, 10 May 2025 17:19:39 -0400 Subject: [PATCH 178/180] Update README.md Small wording tweaks for clarity --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index ee0e1e7f1..506eba794 100644 --- a/README.md +++ b/README.md @@ -26,9 +26,9 @@ Minimum system requirements and recommendations * macOS version: macOS High Sierra 10.13 or newer * 4 GB of RAM or higher -Performance may vary depending on both host and guest configuration. Most emulation logic is executed in a single thread; therefore, systems with better IPC (instructions per clock) generally should be able to emulate higher clock speeds. +Performance may vary depending on host and guest configuration. Most emulation logic is executed in a single thread. Therefore, systems with greater IPC (instructions per clock) capacity should be able to emulate higher clock speeds. -It is also recommended to use a manager application with 86Box for easier handling of multiple virtual machines. +For easier handling of multiple virtual machines, use a manager application: * [Avalonia 86](https://github.com/notBald/Avalonia86) by [notBald](https://github.com/notBald) (Windows and Linux) * [86Box Manager](https://github.com/86Box/86BoxManager) by [Overdoze](https://github.com/daviunic) (Windows only) @@ -37,7 +37,7 @@ It is also recommended to use a manager application with 86Box for easier handli * [Linbox-qt5](https://github.com/Dungeonseeker/linbox-qt5) by [Dungeonseeker](https://github.com/Dungeonseeker/) (Linux focused, should work on Windows though untested) * [MacBox for 86Box](https://github.com/Moonif/MacBox) by [Moonif](https://github.com/Moonif) (MacOS only) -It is also possible to use 86Box on its own with the `--vmpath`/`-P` command line option. +To use 86Box on its own, use the `--vmpath`/`-P` command line option. Getting started --------------- @@ -47,7 +47,7 @@ See [our documentation](https://86box.readthedocs.io/en/latest/index.html) for a Community --------- -We operate an IRC channel and a Discord server for discussing 86Box, its development and anything related to retro computing. We look forward to hearing from you! +We operate an IRC channel and a Discord server for discussing 86Box, its development, and anything related to retro computing. We look forward to hearing from you! [![Visit our IRC channel](https://kiwiirc.com/buttons/irc.ringoflightning.net/86Box.png)](https://kiwiirc.com/client/irc.ringoflightning.net/?nick=86box|?#86Box) From 3b2ccf2229a15483f259a9afc5ddf20ec238a855 Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Sun, 11 May 2025 03:46:06 +0600 Subject: [PATCH 179/180] Make sockets from incoming connections nonblocking on Windows --- src/qt/win_netsocket.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/qt/win_netsocket.c b/src/qt/win_netsocket.c index 55a84d414..d7d467c07 100644 --- a/src/qt/win_netsocket.c +++ b/src/qt/win_netsocket.c @@ -82,10 +82,12 @@ SOCKET plat_netsocket_accept(SOCKET socket) { SOCKET clientsocket = accept(socket, NULL, NULL); + u_long yes = 1; if (clientsocket == INVALID_SOCKET) return -1; + ioctlsocket(clientsocket, FIONBIO, &yes); return clientsocket; } From 750fa33136e05479b3eb5213525687dfd49e176c Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Sun, 11 May 2025 22:01:24 +0600 Subject: [PATCH 180/180] Revert X11-related keyboard grabbing changes (except for `--nohook` ones) --- src/qt/qt_mainwindow.cpp | 22 +--------------------- 1 file changed, 1 insertion(+), 21 deletions(-) diff --git a/src/qt/qt_mainwindow.cpp b/src/qt/qt_mainwindow.cpp index aaf625c2d..4594ee5be 100644 --- a/src/qt/qt_mainwindow.cpp +++ b/src/qt/qt_mainwindow.cpp @@ -327,8 +327,7 @@ MainWindow::MainWindow(QWidget *parent) if (ui->stackedWidget->mouse_capture_func) ui->stackedWidget->mouse_capture_func(this->windowHandle()); } else { - if (!(windowState() & Qt::WindowActive)) - this->releaseKeyboard(); + this->releaseKeyboard(); if (ui->stackedWidget->mouse_uncapture_func) { ui->stackedWidget->mouse_uncapture_func(); } @@ -1480,25 +1479,6 @@ MainWindow::eventFilter(QObject *receiver, QEvent *event) releaseKeyboard(); } else if (event->type() == QEvent::WindowUnblocked) { plat_pause(curdopause); -#ifdef __unix__ - if (!QApplication::platformName().contains("wayland") && (this->windowState() & Qt::WindowActive)) { - if (hook_enabled) - this->grabKeyboard(); - } -#endif - } else if (event->type() == QEvent::WindowActivate) { -#ifdef __unix__ - if (!QApplication::platformName().contains("wayland")) { - if (hook_enabled) - this->grabKeyboard(); - } -#endif - } else if (event->type() == QEvent::WindowDeactivate) { -#ifdef __unix__ - if (!QApplication::platformName().contains("wayland")) { - this->releaseKeyboard(); - } -#endif } }