diff --git a/.ci/AppImageBuilder.yml b/.ci/AppImageBuilder.yml index 317be2317..fb2482491 100644 --- a/.ci/AppImageBuilder.yml +++ b/.ci/AppImageBuilder.yml @@ -64,6 +64,7 @@ AppDir: - usr/lib/cmake - usr/lib/pkgconfig - usr/sbin + - usr/share/aclocal - usr/share/alsa - usr/share/apport - usr/share/bug diff --git a/.ci/build.sh b/.ci/build.sh index 5cd5f3baa..a791521f5 100644 --- a/.ci/build.sh +++ b/.ci/build.sh @@ -232,7 +232,7 @@ else then pkgs="$pkgs build-essential" else - sudo dpkg --add-architecture $arch_deb + sudo dpkg --add-architecture "$arch_deb" pkgs="$pkgs crossbuild-essential-$arch_deb" fi diff --git a/CMakeLists.txt b/CMakeLists.txt index 56a4d446a..baebe22b8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -31,7 +31,7 @@ if(MUNT_EXTERNAL) endif() project(86Box - VERSION 3.2 + VERSION 3.2.1 DESCRIPTION "Emulator of x86-based systems" HOMEPAGE_URL "https://86box.net" LANGUAGES C CXX) diff --git a/README.md b/README.md index 0f48bc59e..3ec1994c4 100644 --- a/README.md +++ b/README.md @@ -15,14 +15,16 @@ Features System requirements and recommendations --------------------------------------- * Intel Core 2 or AMD Athlon 64 processor -* Windows 7 Service Pack 1, Windows 8.1 or Windows 10 +* Windows version: Windows 7 Service Pack 1, Windows 8.1 or Windows 10 +* Linux version: Ubuntu 16.04, Debian 9.0 or other distributions from 2016 onwards * 4 GB of RAM Performance may vary depending on both host and guest configuration. Most emulation logic is executed in a single thread, therefore generally systems with better IPC (instructions per clock) 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. +It is also recommended to use a manager application (**Windows only**) with 86Box for easier handling of multiple virtual machines. * [WinBox for 86Box](https://github.com/86Box/WinBox-for-86Box) by Laci bá' * The new manager with improved new user experience; installer, automatic updates of emulator files and more. + * While development is suspended and the repository is archived, the latest version is fully functional. * [86Box Manager](https://github.com/86Box/86BoxManager) by [daviunic](https://github.com/daviunic) (Overdoze) * The traditional 86Box manager with simple interface. diff --git a/src/chipset/via_pipc.c b/src/chipset/via_pipc.c index a9da704d8..1308d6cff 100644 --- a/src/chipset/via_pipc.c +++ b/src/chipset/via_pipc.c @@ -1577,7 +1577,7 @@ pipc_init(const device_t *info) dev->ac97 = device_add(&ac97_via_device); ac97_via_set_slot(dev->ac97, dev->slot, PCI_INTC); - dev->sb = device_add(&sb_pro_compat_device); + dev->sb = device_add_inst(&sb_pro_compat_device, 2); #ifndef VIA_PIPC_FM_EMULATION dev->sb->opl_enabled = 1; #endif diff --git a/src/device/isapnp.c b/src/device/isapnp.c index 2b75969ce..18b11ba3d 100644 --- a/src/device/isapnp.c +++ b/src/device/isapnp.c @@ -268,7 +268,7 @@ isapnp_read_data(uint16_t addr, void *priv) case 0x01: /* Serial Isolation */ card = dev->first_card; while (card) { - if (card->enable && (card->state == PNP_STATE_ISOLATION)) + if (card->enable && card->rom && (card->state == PNP_STATE_ISOLATION)) break; card = card->next; } diff --git a/src/include_make/86box/version.h b/src/include_make/86box/version.h index d2a0b2791..4e877ca24 100644 --- a/src/include_make/86box/version.h +++ b/src/include_make/86box/version.h @@ -20,12 +20,12 @@ #define EMU_NAME "86Box" #define EMU_NAME_W LSTR(EMU_NAME) -#define EMU_VERSION "3.2" +#define EMU_VERSION "3.2.1" #define EMU_VERSION_W LSTR(EMU_VERSION) -#define EMU_VERSION_EX "3.02" +#define EMU_VERSION_EX "3.21" #define EMU_VERSION_MAJ 3 -#define EMU_VERSION_MIN 0 -#define EMU_VERSION_PATCH 0 +#define EMU_VERSION_MIN 2 +#define EMU_VERSION_PATCH 1 #define EMU_BUILD_NUM 0 diff --git a/src/mem/sst_flash.c b/src/mem/sst_flash.c index 1de5e6e32..bcc3c3aa9 100644 --- a/src/mem/sst_flash.c +++ b/src/mem/sst_flash.c @@ -442,7 +442,7 @@ sst_init(const device_t *info) f = nvr_fopen(flash_path, "rb"); if (f) { if (fread(&(dev->array[0x00000]), 1, dev->size, f) != dev->size) - fatal("Less than %i bytes read from the SST Flash ROM file\n", dev->size); + pclog("Less than %i bytes read from the SST Flash ROM file\n", dev->size); fclose(f); } else dev->dirty = 1; /* It is by definition dirty on creation. */ diff --git a/src/qt/qt_machinestatus.cpp b/src/qt/qt_machinestatus.cpp index 71be8c232..ea83b630b 100644 --- a/src/qt/qt_machinestatus.cpp +++ b/src/qt/qt_machinestatus.cpp @@ -259,8 +259,8 @@ void MachineStatus::iterateCDROM(const std::function &cb) { for (size_t i = 0; i < CDROM_NUM; i++) { /* Could be Internal or External IDE.. */ if ((cdrom[i].bus_type == CDROM_BUS_ATAPI) && - !hasIDE() && hdc_name != QStringLiteral("ide") && - hdc_name != QStringLiteral("xtide")) + !hasIDE() && hdc_name.left(3) != QStringLiteral("ide") && + hdc_name.left(5) != QStringLiteral("xtide")) continue; if ((cdrom[i].bus_type == CDROM_BUS_SCSI) && !hasSCSI() && (scsi_card_current[0] == 0) && (scsi_card_current[1] == 0) && @@ -277,8 +277,8 @@ void MachineStatus::iterateZIP(const std::function &cb) { for (size_t i = 0; i < ZIP_NUM; i++) { /* Could be Internal or External IDE.. */ if ((zip_drives[i].bus_type == ZIP_BUS_ATAPI) && - !hasIDE() && hdc_name != QStringLiteral("ide") && - hdc_name != QStringLiteral("xtide")) + !hasIDE() && hdc_name.left(3) != QStringLiteral("ide") && + hdc_name.left(5) != QStringLiteral("xtide")) continue; if ((zip_drives[i].bus_type == ZIP_BUS_SCSI) && !hasSCSI() && (scsi_card_current[0] == 0) && (scsi_card_current[1] == 0) && @@ -295,8 +295,8 @@ void MachineStatus::iterateMO(const std::function &cb) { for (size_t i = 0; i < MO_NUM; i++) { /* Could be Internal or External IDE.. */ if ((mo_drives[i].bus_type == MO_BUS_ATAPI) && - !hasIDE() && hdc_name != QStringLiteral("ide") && - hdc_name != QStringLiteral("xtide")) + !hasIDE() && hdc_name.left(3) != QStringLiteral("ide") && + hdc_name.left(5) != QStringLiteral("xtide")) continue; if ((mo_drives[i].bus_type == MO_BUS_SCSI) && !hasSCSI() && (scsi_card_current[0] == 0) && (scsi_card_current[1] == 0) && diff --git a/src/qt/qt_mainwindow.cpp b/src/qt/qt_mainwindow.cpp index 6d7fb6592..986151b7c 100644 --- a/src/qt/qt_mainwindow.cpp +++ b/src/qt/qt_mainwindow.cpp @@ -445,6 +445,10 @@ void MainWindow::closeEvent(QCloseEvent *event) { } qt_nvr_save(); config_save(); +#ifdef __unix__ + extern void xinput2_exit(); + if (QApplication::platformName() == "xcb") xinput2_exit(); +#endif event->accept(); } diff --git a/src/qt/qt_platform.cpp b/src/qt/qt_platform.cpp index 7c329c074..e676a1b92 100644 --- a/src/qt/qt_platform.cpp +++ b/src/qt/qt_platform.cpp @@ -337,6 +337,7 @@ extern int nvr_save(void); void plat_power_off(void) { + plat_mouse_capture(0); confirm_exit = 0; nvr_save(); config_save(); diff --git a/src/qt/xinput2_mouse.cpp b/src/qt/xinput2_mouse.cpp index ff67b6a2c..0c31f6ca0 100644 --- a/src/qt/xinput2_mouse.cpp +++ b/src/qt/xinput2_mouse.cpp @@ -120,6 +120,14 @@ void xinput2_proc() prev_rel_coords[0] = relative_coords[0]; prev_rel_coords[1] = relative_coords[1]; prev_time = rawev->time; + if (!mouse_capture) break; + XWindowAttributes winattrib{}; + if (XGetWindowAttributes(disp, main_window->winId(), &winattrib)) { + auto globalPoint = main_window->mapToGlobal(QPoint(main_window->width() / 2, main_window->height() / 2)); + XWarpPointer(disp, XRootWindow(disp, XScreenNumberOfScreen(winattrib.screen)), XRootWindow(disp, XScreenNumberOfScreen(winattrib.screen)), 0, 0, 0, 0, globalPoint.x(), globalPoint.y()); + XFlush(disp); + } + } case XI_Motion: { if (XKeysymToKeycode(disp, XK_Home) == 69) { @@ -144,9 +152,12 @@ void xinput2_proc() void xinput2_exit() { - exitthread = true; - procThread->wait(5000); - procThread->terminate(); + if (!exitthread) + { + exitthread = true; + procThread->wait(5000); + procThread->terminate(); + } } void xinput2_init() @@ -175,13 +186,6 @@ void xinput2_poll() { mouse_x = xi2_mouse_x; mouse_y = xi2_mouse_y; - XWindowAttributes winattrib{}; - if (XGetWindowAttributes(disp, main_window->winId(), &winattrib)) - { - auto globalPoint = main_window->mapToGlobal(QPoint(main_window->width() / 2, main_window->height() / 2)); - XWarpPointer(disp, XRootWindow(disp, XScreenNumberOfScreen(winattrib.screen)), XRootWindow(disp, XScreenNumberOfScreen(winattrib.screen)), 0, 0, 0, 0, globalPoint.x(), globalPoint.y()); - XFlush(disp); - } } xi2_mouse_x = 0; xi2_mouse_y = 0; diff --git a/src/sound/snd_cs423x.c b/src/sound/snd_cs423x.c index d159182e4..a7bd6cc17 100644 --- a/src/sound/snd_cs423x.c +++ b/src/sound/snd_cs423x.c @@ -708,7 +708,7 @@ cs423x_reset(void *priv) /* Reset PnP resource data, state and logical devices. */ dev->pnp_enable = 1; cs423x_pnp_enable(dev, 1, 1); - if (dev->pnp_card) + if (dev->pnp_card && dev->sb) isapnp_reset_card(dev->pnp_card); /* Reset SLAM. */ @@ -780,7 +780,7 @@ cs423x_init(const device_t *info) dev->pnp_card = isapnp_add_card(NULL, 0, cs423x_pnp_config_changed, NULL, NULL, NULL, dev); /* Initialize SBPro codec. The WSS codec is initialized later by cs423x_reset */ - dev->sb = device_add(&sb_pro_compat_device); + dev->sb = device_add_inst(&sb_pro_compat_device, 1); sound_set_cd_audio_filter(sbpro_filter_cd_audio, dev->sb); /* CD audio filter for the default context */ /* Initialize RAM, registers and WSS codec. */ diff --git a/src/win/win_about.c b/src/win/win_about.c index d3d5157c2..c508c7b3c 100644 --- a/src/win/win_about.c +++ b/src/win/win_about.c @@ -39,7 +39,7 @@ AboutDialogCreate(HWND hwnd) int i; TASKDIALOGCONFIG tdconfig = {0}; TASKDIALOG_BUTTON tdbuttons[] = { - {IDOK, EMU_SITE}, + {IDOK, EMU_SITE_W}, {IDCANCEL, MAKEINTRESOURCE(IDS_2127)} };