From f1bfe4883218d02f8452af1d22671052a7b08b52 Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Fri, 19 Sep 2025 14:50:30 +0600 Subject: [PATCH 01/36] Software renderer no longer uses QRasterWindow --- src/qt/qt_softwarerenderer.cpp | 33 ++++++++++++++++++++++++++++++--- src/qt/qt_softwarerenderer.hpp | 12 ++++++++++-- 2 files changed, 40 insertions(+), 5 deletions(-) diff --git a/src/qt/qt_softwarerenderer.cpp b/src/qt/qt_softwarerenderer.cpp index bb6c7508b..45c929db9 100644 --- a/src/qt/qt_softwarerenderer.cpp +++ b/src/qt/qt_softwarerenderer.cpp @@ -21,6 +21,7 @@ #include "qt_softwarerenderer.hpp" #include #include +#include extern "C" { #include <86box/86box.h> @@ -31,7 +32,7 @@ SoftwareRenderer::SoftwareRenderer(QWidget *parent) #ifdef __HAIKU__ : QWidget(parent) #else - : QRasterWindow(parent->windowHandle()) + : QWindow(parent->windowHandle()), m_backingStore(new QBackingStore(this)) #endif { RendererCommon::parentWidget = parent; @@ -47,12 +48,30 @@ SoftwareRenderer::SoftwareRenderer(QWidget *parent) #endif } +#ifdef __HAIKU__ void SoftwareRenderer::paintEvent(QPaintEvent *event) { (void) event; onPaint(this); } +#endif + +void +SoftwareRenderer::render() +{ + if (!isExposed()) + return; + + QRect rect(0, 0, width(), height()); + m_backingStore->beginPaint(rect); + + QPaintDevice *device = m_backingStore->paintDevice(); + onPaint(device); + + m_backingStore->endPaint(); + m_backingStore->flush(rect); +} void SoftwareRenderer::onBlit(int buf_idx, int x, int y, int w, int h) @@ -70,7 +89,11 @@ SoftwareRenderer::onBlit(int buf_idx, int x, int y, int w, int h) if (source != origSource) onResize(this->width(), this->height()); +#ifdef __HAIKU__ update(); +#else + render(); +#endif } void @@ -80,7 +103,8 @@ SoftwareRenderer::resizeEvent(QResizeEvent *event) #ifdef __HAIKU__ QWidget::resizeEvent(event); #else - QRasterWindow::resizeEvent(event); + QWindow::resizeEvent(event); + m_backingStore->resize(event->size()); #endif } @@ -92,7 +116,7 @@ SoftwareRenderer::event(QEvent *event) #ifdef __HAIKU__ return QWidget::event(event); #else - return QRasterWindow::event(event); + return QWindow::event(event); #endif return res; } @@ -112,6 +136,9 @@ SoftwareRenderer::onPaint(QPaintDevice *device) #endif painter.setCompositionMode(QPainter::CompositionMode_Plus); painter.drawImage(destination, *images[cur_image], source); +#ifndef __HAIKU__ + painter.end(); +#endif } std::vector> diff --git a/src/qt/qt_softwarerenderer.hpp b/src/qt/qt_softwarerenderer.hpp index ec64f7000..f8bd91338 100644 --- a/src/qt/qt_softwarerenderer.hpp +++ b/src/qt/qt_softwarerenderer.hpp @@ -2,8 +2,10 @@ #define SOFTWARERENDERER_HPP #include -#include +#include #include +#include +#include #include #include #include "qt_renderercommon.hpp" @@ -12,14 +14,16 @@ class SoftwareRenderer : #ifdef __HAIKU__ public QWidget, #else - public QRasterWindow, + public QWindow, #endif public RendererCommon { Q_OBJECT public: explicit SoftwareRenderer(QWidget *parent = nullptr); +#ifdef __HAIKU__ void paintEvent(QPaintEvent *event) override; +#endif std::vector> getBuffers() override; @@ -33,6 +37,10 @@ protected: void onPaint(QPaintDevice *device); void resizeEvent(QResizeEvent *event) override; bool event(QEvent *event) override; + + void render(); + + QScopedPointer m_backingStore; }; #endif // SOFTWARERENDERER_HPP From a1c974c045c420f7badbc21fb23ce31a92deb379 Mon Sep 17 00:00:00 2001 From: MaxwellS04 Date: Fri, 19 Sep 2025 16:31:32 +0700 Subject: [PATCH 02/36] Machine Changes 1. Changed the names for two Chaintech machines (for example, 333AXB and 416SX) 2. Added the "AB" name to ABIT machines 3. Removed the space from PCChips and PCPartner names 4. BIOS name related corrections 5. Make few machines use their latest revisions as default BIOS option --- src/machine/m_at_386dx.c | 4 +- src/machine/m_at_386sx.c | 2 +- src/machine/m_at_slot1.c | 20 +++--- src/machine/m_at_socket3.c | 8 +-- src/machine/m_at_socket7.c | 8 +-- src/machine/m_at_socket8.c | 2 +- src/machine/machine_table.c | 126 ++++++++++++++++++------------------ 7 files changed, 85 insertions(+), 85 deletions(-) diff --git a/src/machine/m_at_386dx.c b/src/machine/m_at_386dx.c index 9cb7c5223..7fb045d58 100644 --- a/src/machine/m_at_386dx.c +++ b/src/machine/m_at_386dx.c @@ -68,9 +68,9 @@ static const device_config_t deskpro386_config[] = { .file_filter = "", .spinner = { 0 }, .bios = { - { .name = "September 1986", .internal_name = "deskpro386", .bios_type = BIOS_NORMAL, + { .name = "September 1986", .internal_name = "deskpro386_09_1986", .bios_type = BIOS_NORMAL, .files_no = 1, .local = 0, .size = 65536, .files = { "roms/machines/deskpro386/1986-09-04-HI.json.bin", "" } }, - { .name = "May 1988", .internal_name = "deskpro386_05_1988", .bios_type = BIOS_NORMAL, + { .name = "May 1988", .internal_name = "deskpro386", .bios_type = BIOS_NORMAL, .files_no = 1, .local = 0, .size = 65536, .files = { "roms/machines/deskpro386/1988-05-10.json.bin", "" } }, { .files_no = 0 } }, diff --git a/src/machine/m_at_386sx.c b/src/machine/m_at_386sx.c index 7e57c5902..0dc9142db 100644 --- a/src/machine/m_at_386sx.c +++ b/src/machine/m_at_386sx.c @@ -254,7 +254,7 @@ static const device_config_t c325ax_config[] = { }; const device_t c325ax_device = { - .name = "Chaintech 325AX", + .name = "Chaintech 3xxAX/AXB", .internal_name = "325ax_device", .flags = 0, .local = 0, diff --git a/src/machine/m_at_slot1.c b/src/machine/m_at_slot1.c index b80082d99..4c25799f6 100644 --- a/src/machine/m_at_slot1.c +++ b/src/machine/m_at_slot1.c @@ -359,9 +359,9 @@ static const device_config_t bx6_config[] = { .file_filter = "", .spinner = { 0 }, .bios = { - { .name = "1998/07/28 - BIOS EG", .internal_name = "bx6", .bios_type = BIOS_NORMAL, + { .name = "Award Modular BIOS v4.51PG - Revision EG", .internal_name = "bx6_eg", .bios_type = BIOS_NORMAL, .files_no = 1, .local = 0, .size = 131072, .files = { "roms/machines/bx6/BX6_EG.BIN", "" } }, - { .name = "2000/03/10 - BIOS QS", .internal_name = "bx6_qs", .bios_type = BIOS_NORMAL, + { .name = "Award Modular BIOS v4.51PG - Revision QS", .internal_name = "bx6", .bios_type = BIOS_NORMAL, .files_no = 1, .local = 0, .size = 131072, .files = { "roms/machines/bx6/BX6_QS.bin", "" } }, { .files_no = 0 } }, @@ -371,7 +371,7 @@ static const device_config_t bx6_config[] = { }; const device_t bx6_device = { - .name = "ABIT BX6", + .name = "ABIT AB-BX6", .internal_name = "bx6_device", .flags = 0, .local = 0, @@ -570,14 +570,14 @@ static const device_config_t ms6119_config[] = { .file_filter = "", .spinner = { 0 }, .bios = { - { .name = "Award Modular BIOS v4.51PG - Version 3.30b1 (LG IBM Multinet i x7G)", .internal_name = "lgibmx7g", .bios_type = BIOS_NORMAL, - .files_no = 1, .local = 0, .size = 262144, .files = { "roms/machines/ms6119/ms6119.331", "" } }, - { .name = "Award Modular BIOS v4.51PG - Version 2.12 (Viglen Vig69M)", .internal_name = "vig69m", .bios_type = BIOS_NORMAL, - .files_no = 1, .local = 0, .size = 262144, .files = { "roms/machines/ms6119/vig69m.212", "" } }, - { .name = "Award Modular BIOS v4.51PG - Version 2.10", .internal_name = "ms6119", .bios_type = BIOS_NORMAL, - .files_no = 1, .local = 0, .size = 262144, .files = { "roms/machines/ms6119/w6119ims.2a0", "" } }, - { .name = "AMIBIOS 071595 - Version 1.90 (Packard Bell Tacoma)", .internal_name = "tacoma", .bios_type = BIOS_NORMAL, + { .name = "AMIBIOS 6 (071595) - Revision 1.90 (Packard Bell Tacoma)", .internal_name = "tacoma", .bios_type = BIOS_NORMAL, .files_no = 1, .local = 0, .size = 262144, .files = { "roms/machines/ms6119/A19P2190.ROM", "" } }, + { .name = "Award Modular BIOS v4.51PG - Revision 2.10", .internal_name = "ms6119", .bios_type = BIOS_NORMAL, + .files_no = 1, .local = 0, .size = 262144, .files = { "roms/machines/ms6119/w6119ims.2a0", "" } }, + { .name = "Award Modular BIOS v4.51PG - Revision 2.12 (Viglen Vig69M)", .internal_name = "vig69m", .bios_type = BIOS_NORMAL, + .files_no = 1, .local = 0, .size = 262144, .files = { "roms/machines/ms6119/vig69m.212", "" } }, + { .name = "Award Modular BIOS v4.51PG - Revision 3.30b1 (LG IBM Multinet i x7G)", .internal_name = "lgibmx7g", .bios_type = BIOS_NORMAL, + .files_no = 1, .local = 0, .size = 262144, .files = { "roms/machines/ms6119/ms6119.331", "" } }, { .files_no = 0 } }, }, diff --git a/src/machine/m_at_socket3.c b/src/machine/m_at_socket3.c index 2d6ea9730..8d460186c 100644 --- a/src/machine/m_at_socket3.c +++ b/src/machine/m_at_socket3.c @@ -178,11 +178,11 @@ static const device_config_t j403tg_config[] = { .file_filter = "", .spinner = { 0 }, .bios = { - { .name = "Award Modular BIOS v4.50G", .internal_name = "403tg", .bios_type = BIOS_NORMAL, - .files_no = 1, .local = 0, .size = 65536, .files = { "roms/machines/403tg/403TG.BIN", "" } }, - { .name = "AMI WinBIOS (121593)", .internal_name = "403tg_d", .bios_type = BIOS_NORMAL, + { .name = "AMI WinBIOS (121593)", .internal_name = "403tg", .bios_type = BIOS_NORMAL, .files_no = 1, .local = 0, .size = 65536, .files = { "roms/machines/403tg/J403TGRevD.BIN", "" } }, - { .name = "MR BIOS V2.02", .internal_name = "403tg_d_mr", .bios_type = BIOS_NORMAL, + { .name = "Award Modular BIOS v4.50G", .internal_name = "403tg_award", .bios_type = BIOS_NORMAL, + .files_no = 1, .local = 0, .size = 65536, .files = { "roms/machines/403tg/403TG.BIN", "" } }, + { .name = "MR BIOS V2.02", .internal_name = "403tg_mr", .bios_type = BIOS_NORMAL, .files_no = 1, .local = 0, .size = 65536, .files = { "roms/machines/403tg/MRBiosOPT895.bin", "" } }, { .files_no = 0 } }, diff --git a/src/machine/m_at_socket7.c b/src/machine/m_at_socket7.c index ee276566a..2b02c5bf1 100644 --- a/src/machine/m_at_socket7.c +++ b/src/machine/m_at_socket7.c @@ -151,7 +151,7 @@ static const device_config_t cu430hx_config[] = { .file_filter = "", .spinner = { 0 }, .bios = { - { .name = "Intel AMIBIOS - Revision 1.00.03.DK08 (Toshiba Equium 5200D)", .internal_name = "equium5200", .bios_type = BIOS_NORMAL, + { .name = "Intel AMIBIOS - Revision 1.00.03.DK08 (Toshiba Equium 5xx0D)", .internal_name = "equium5200", .bios_type = BIOS_NORMAL, .files_no = 5, .local = 0, .size = 262144, .files = { "roms/machines/cu430hx/1003DK08.BIO", "roms/machines/cu430hx/1003DK08.BI1", "roms/machines/cu430hx/1003DK08.BI2", "roms/machines/cu430hx/1003DK08.BI3", "roms/machines/cu430hx/1003DK08.RCV", "" } }, @@ -270,7 +270,7 @@ static const device_config_t tc430hx_config[] = { .files_no = 5, .local = 0, .size = 262144, .files = { "roms/machines/tc430hx/1007DH0_.BIO", "roms/machines/tc430hx/1007DH0_.BI1", "roms/machines/tc430hx/1007DH0_.BI2", "roms/machines/tc430hx/1007DH0_.BI3", "roms/machines/tc430hx/1007DH0_.RCV", "" } }, - { .name = "Intel AMIBIOS - Revision 1.00.08.DH08 (Toshiba Infinia 7201)", .internal_name = "infinia7200", .bios_type = BIOS_NORMAL, + { .name = "Intel AMIBIOS - Revision 1.00.08.DH08 (Toshiba Infinia 7xx1)", .internal_name = "infinia7200", .bios_type = BIOS_NORMAL, .files_no = 5, .local = 0, .size = 262144, .files = { "roms/machines/tc430hx/1008DH08.BIO", "roms/machines/tc430hx/1008DH08.BI1", "roms/machines/tc430hx/1008DH08.BI2", "roms/machines/tc430hx/1008DH08.BI3", "roms/machines/tc430hx/1008DH08.RCV", "" } }, @@ -1806,9 +1806,9 @@ static const device_config_t m5ata_config[] = { .file_filter = "", .spinner = { 0 }, .bios = { - { .name = "Award Modular BIOS v4.51PG - Revision 12/23/97", .internal_name = "m5ata", .bios_type = BIOS_NORMAL, + { .name = "Award Modular BIOS v4.51PG - Revision 12/23/97", .internal_name = "m5ata_1223", .bios_type = BIOS_NORMAL, .files_no = 1, .local = 0, .size = 131072, .files = { "roms/machines/m5ata/ATA1223.BIN", "" } }, - { .name = "Award Modular BIOS v4.51PG - Revision 05/27/98", .internal_name = "m5ata_0527b", .bios_type = BIOS_NORMAL, + { .name = "Award Modular BIOS v4.51PG - Revision 05/27/98", .internal_name = "m5ata", .bios_type = BIOS_NORMAL, .files_no = 1, .local = 0, .size = 131072, .files = { "roms/machines/m5ata/ATA0527B.BIN", "" } }, { .files_no = 0 } }, diff --git a/src/machine/m_at_socket8.c b/src/machine/m_at_socket8.c index 3d5f4787e..11262ef4a 100644 --- a/src/machine/m_at_socket8.c +++ b/src/machine/m_at_socket8.c @@ -111,7 +111,7 @@ static const device_config_t ficpo6000_config[] = { .name = "bios", .description = "BIOS Version", .type = CONFIG_BIOS, - .default_string = "405F03C", + .default_string = "405F05C", .default_int = 0, .file_filter = "", .spinner = { 0 }, /*W1*/ diff --git a/src/machine/machine_table.c b/src/machine/machine_table.c index 3d241401d..47fe4823b 100644 --- a/src/machine/machine_table.c +++ b/src/machine/machine_table.c @@ -4075,7 +4075,7 @@ const machine_t machines[] = { .ram = { .min = 512, .max = 1024, - .step = 512 + .step = 128 }, .nvrmask = 63, .jumpered_ecp_dma = 0, @@ -5290,7 +5290,7 @@ const machine_t machines[] = { }, /* Has a JetKey KBC without version, which is a clone of AMI '8'. */ { - .name = "[ALi M1217] Chaintech 325AX", + .name = "[ALi M1217] Chaintech 3xxAX/AXB", .internal_name = "325ax", .type = MACHINE_TYPE_386SX, .chipset = MACHINE_CHIPSET_ALI_M1217, @@ -7385,7 +7385,7 @@ const machine_t machines[] = { /* Has AMIKey H KBC firmware, per the screenshot in "How computers & MS-DOS work". Also seen with an AMI 'F'. */ { - .name = "[SiS 401] Chaintech 433SC", + .name = "[SiS 401] Chaintech 4xxSX/SC", .internal_name = "sis401", .type = MACHINE_TYPE_486, .chipset = MACHINE_CHIPSET_SIS_401, @@ -7429,7 +7429,7 @@ const machine_t machines[] = { }, /* Seen with both AMIKey F and AMIKey-2 H KBC firmwares. */ { - .name = "[SiS 460] ABIT AV4", + .name = "[SiS 460] ABIT AB-AV4", .internal_name = "av4", .type = MACHINE_TYPE_486, .chipset = MACHINE_CHIPSET_SIS_460, @@ -10682,7 +10682,7 @@ const machine_t machines[] = { /* This has the UMC 88xx on-chip KBC. All the copies of the BIOS string I can find, end in in -H, so the UMC on-chip KBC likely emulates the AMI 'H' KBC firmware. */ { - .name = "[UMC 8881] PC Chips M919", + .name = "[UMC 8881] PCChips M919", .internal_name = "m919", .type = MACHINE_TYPE_486_S3_PCI, .chipset = MACHINE_CHIPSET_UMC_UM8881, @@ -13198,7 +13198,7 @@ const machine_t machines[] = { }, /* Has a VIA VT82C42N KBC. */ { - .name = "[i430FX] PC Partner MB500N", + .name = "[i430FX] PCPartner MB500N", .internal_name = "mb500n", .type = MACHINE_TYPE_SOCKET7_3V, .chipset = MACHINE_CHIPSET_INTEL_430FX, @@ -13828,7 +13828,7 @@ const machine_t machines[] = { }, /* Has the ALi M1543 southbridge with on-chip KBC. */ { - .name = "[ALi ALADDiN IV+] PC Chips M560", + .name = "[ALi ALADDiN IV+] PCChips M560", .internal_name = "m560", .type = MACHINE_TYPE_SOCKET7, .chipset = MACHINE_CHIPSET_ALI_ALADDIN_IV_PLUS, @@ -14913,7 +14913,7 @@ const machine_t machines[] = { /* This has the AMIKey 'H' firmware, possibly AMIKey-2. Photos show it with a BestKey, so it likely clones the behavior of AMIKey 'H'. */ { - .name = "[i430VX] PC Partner MB520N", + .name = "[i430VX] PCPartner MB520N", .internal_name = "mb520n", .type = MACHINE_TYPE_SOCKET7, .chipset = MACHINE_CHIPSET_INTEL_430VX, @@ -15377,7 +15377,7 @@ const machine_t machines[] = { /* The BIOS sends KBC command BB and expects it to output a byte, which is AMI KBC behavior. A picture shows a VIA VT82C42N KBC though, so it could be a case of that KBC with AMI firmware. */ { - .name = "[i430TX] PC Partner MB540N", + .name = "[i430TX] PCPartner MB540N", .internal_name = "mb540n", .type = MACHINE_TYPE_SOCKET7, .chipset = MACHINE_CHIPSET_INTEL_430TX, @@ -15918,7 +15918,7 @@ const machine_t machines[] = { /* Has the VIA VT82C586B southbridge with on-chip KBC identical to the VIA VT82C42N. */ { - .name = "[VIA VP3] PC Partner VIA809DS", + .name = "[VIA VP3] PCPartner VIA809DS", .internal_name = "via809ds", .type = MACHINE_TYPE_SOCKET7, .chipset = MACHINE_CHIPSET_VIA_APOLLO_VP3, @@ -16007,51 +16007,6 @@ const machine_t machines[] = { .snd_device = NULL, .net_device = NULL }, - /* Is the exact same as the Matsonic MS6260S. Has the ALi M1543C southbridge - with on-chip KBC. */ - { - .name = "[ALi ALADDiN V] PC Chips M579", - .internal_name = "m579", - .type = MACHINE_TYPE_SOCKETS7, - .chipset = MACHINE_CHIPSET_ALI_ALADDIN_V, - .init = machine_at_m579_init, - .p1_handler = machine_generic_p1_handler, - .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 = 100000000, - .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_USB, /* Machine has internal sound: C-Media CMI8330 */ - .ram = { - .min = 8192, - .max = 1572864, - .step = 8192 - }, - .nvrmask = 255, - .jumpered_ecp_dma = 0, - .default_jumpered_ecp_dma = -1, - .kbc_device = NULL, - .kbc_params = 0x00000000, - .kbc_p1 = 0x00000cf0, - .gpio = 0xffffffff, - .gpio_acpi = 0xffffffff, - .device = NULL, - .kbd_device = NULL, - .fdc_device = NULL, - .sio_device = NULL, - .vid_device = NULL, - .snd_device = NULL, - .net_device = NULL - }, /* M1534c kbc */ { .name = "[ALi ALADDiN V] Gateway Lucas", @@ -16184,6 +16139,51 @@ const machine_t machines[] = { .snd_device = NULL, .net_device = NULL }, + /* Is the exact same as the Matsonic MS6260S. Has the ALi M1543C southbridge + with on-chip KBC. */ + { + .name = "[ALi ALADDiN V] PCChips M579", + .internal_name = "m579", + .type = MACHINE_TYPE_SOCKETS7, + .chipset = MACHINE_CHIPSET_ALI_ALADDIN_V, + .init = machine_at_m579_init, + .p1_handler = machine_generic_p1_handler, + .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 = 100000000, + .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_USB, /* Machine has internal sound: C-Media CMI8330 */ + .ram = { + .min = 8192, + .max = 1572864, + .step = 8192 + }, + .nvrmask = 255, + .jumpered_ecp_dma = 0, + .default_jumpered_ecp_dma = -1, + .kbc_device = NULL, + .kbc_params = 0x00000000, + .kbc_p1 = 0x00000cf0, + .gpio = 0xffffffff, + .gpio_acpi = 0xffffffff, + .device = NULL, + .kbd_device = NULL, + .fdc_device = NULL, + .sio_device = NULL, + .vid_device = NULL, + .snd_device = NULL, + .net_device = NULL + }, /* SiS 5591 */ /* Has the SiS 5591 chipset with on-chip KBC. */ @@ -16954,7 +16954,7 @@ const machine_t machines[] = { }, /* Has a VIA VT82C42N KBC. */ { - .name = "[i440FX] PC Partner MB600N", + .name = "[i440FX] PCPartner MB600N", .internal_name = "mb600n", .type = MACHINE_TYPE_SOCKET8, .chipset = MACHINE_CHIPSET_INTEL_440FX, @@ -17001,7 +17001,7 @@ const machine_t machines[] = { /* ALi ALADDiN-PRO II */ /* Has the ALi M1543C southbridge with on-chip KBC. */ { - .name = "[ALi ALADDiN-PRO II] PC Chips M729", + .name = "[ALi ALADDiN-PRO II] PCChips M729", .internal_name = "m729", .type = MACHINE_TYPE_SLOT1, .chipset = MACHINE_CHIPSET_ALI_ALADDIN_PRO_II, @@ -17183,7 +17183,7 @@ const machine_t machines[] = { /* Has a Winbond W83977TF Super I/O chip with on-chip KBC with AMIKey-2 KBC firmware. */ { - .name = "[i440LX] ABIT LX6", + .name = "[i440LX] ABIT AB-LX6", .internal_name = "lx6", .type = MACHINE_TYPE_SLOT1, .chipset = MACHINE_CHIPSET_INTEL_440LX, @@ -17412,7 +17412,7 @@ const machine_t machines[] = { /* Has a Winbond W83977EF Super I/O chip with on-chip KBC with AMIKey-2 KBC firmware. */ { - .name = "[i440BX] ABIT BF6", + .name = "[i440BX] ABIT AB-BF6", .internal_name = "bf6", .type = MACHINE_TYPE_SLOT1, .chipset = MACHINE_CHIPSET_INTEL_440BX, @@ -17457,7 +17457,7 @@ const machine_t machines[] = { /* Has a Winbond W83977TF Super I/O chip with on-chip KBC with AMIKey-2 KBC firmware. */ { - .name = "[i440BX] ABIT BX6", + .name = "[i440BX] ABIT AB-BX6", .internal_name = "bx6", .type = MACHINE_TYPE_SLOT1, .chipset = MACHINE_CHIPSET_INTEL_440BX, @@ -17998,7 +17998,7 @@ const machine_t machines[] = { }, /* Has the SiS (5)600 chipset with on-chip KBC. */ { - .name = "[SiS 5600] PC Chips M747", + .name = "[SiS 5600] PCChips M747", .internal_name = "m747", .type = MACHINE_TYPE_SLOT1, .chipset = MACHINE_CHIPSET_SIS_5600, @@ -18879,7 +18879,7 @@ const machine_t machines[] = { /* Has an ITE IT8671F Super I/O chip with on-chip KBC with AMIKey-2 KBC firmware. */ { - .name = "[SMSC VictoryBX-66] PC Chips M773", + .name = "[SMSC VictoryBX-66] PCChips M773", .internal_name = "m773", .type = MACHINE_TYPE_SOCKET370, .chipset = MACHINE_CHIPSET_SMSC_VICTORYBX_66, @@ -18926,7 +18926,7 @@ const machine_t machines[] = { /* Has the VIA VT82C586B southbridge with on-chip KBC identical to the VIA VT82C42N. */ { - .name = "[VIA Apollo Pro] PC Partner APAS3", + .name = "[VIA Apollo Pro] PCPartner APAS3", .internal_name = "apas3", .type = MACHINE_TYPE_SOCKET370, .chipset = MACHINE_CHIPSET_VIA_APOLLO_PRO, From cdd72a18b6a635ac92024c97f88871ef2c8745d1 Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Fri, 19 Sep 2025 15:46:36 +0600 Subject: [PATCH 03/36] Fix resize glitches while paused --- src/qt/qt_openglrenderer.cpp | 3 +++ src/qt/qt_softwarerenderer.cpp | 1 + 2 files changed, 4 insertions(+) diff --git a/src/qt/qt_openglrenderer.cpp b/src/qt/qt_openglrenderer.cpp index ced74024b..962fa4d30 100644 --- a/src/qt/qt_openglrenderer.cpp +++ b/src/qt/qt_openglrenderer.cpp @@ -1223,6 +1223,9 @@ OpenGLRenderer::resizeEvent(QResizeEvent *event) destination.y(), destination.width(), destination.height()); + + if (video_framerate == -1) + render(); } void diff --git a/src/qt/qt_softwarerenderer.cpp b/src/qt/qt_softwarerenderer.cpp index 45c929db9..8dee1dbe3 100644 --- a/src/qt/qt_softwarerenderer.cpp +++ b/src/qt/qt_softwarerenderer.cpp @@ -105,6 +105,7 @@ SoftwareRenderer::resizeEvent(QResizeEvent *event) #else QWindow::resizeEvent(event); m_backingStore->resize(event->size()); + render(); #endif } From 83b7698d425d7b695763dc53b8e49295fc99173f Mon Sep 17 00:00:00 2001 From: MaxwellS04 Date: Fri, 19 Sep 2025 20:23:22 +0700 Subject: [PATCH 04/36] Oopsie, alphabetize 386 Chaintech --- src/machine/machine_table.c | 88 ++++++++++++++++++------------------- 1 file changed, 44 insertions(+), 44 deletions(-) diff --git a/src/machine/machine_table.c b/src/machine/machine_table.c index 47fe4823b..d36a6585f 100644 --- a/src/machine/machine_table.c +++ b/src/machine/machine_table.c @@ -5244,50 +5244,6 @@ const machine_t machines[] = { .snd_device = NULL, .net_device = NULL }, - /* Has a VIA VT82C42N KBC. */ - { - .name = "[ALi M1217] Flytech A36", - .internal_name = "flytech386", - .type = MACHINE_TYPE_386SX, - .chipset = MACHINE_CHIPSET_ALI_M1217, - .init = machine_at_flytech386_init, - .p1_handler = machine_generic_p1_handler, - .gpio_handler = NULL, - .available_flag = MACHINE_AVAILABLE, - .gpio_acpi_handler = NULL, - .cpu = { - .package = CPU_PKG_386SX, - .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_IDE | MACHINE_VIDEO, - .ram = { - .min = 1024, - .max = 16384, - .step = 1024 - }, - .nvrmask = 127, - .jumpered_ecp_dma = 0, - .default_jumpered_ecp_dma = -1, - .kbc_device = &kbc_at_device, - .kbc_params = KBC_VEN_VIA | 0x00424600, - .kbc_p1 = 0x000004f0, - .gpio = 0xffffffff, - .gpio_acpi = 0xffffffff, - .device = NULL, - .kbd_device = NULL, - .fdc_device = NULL, - .sio_device = NULL, - .vid_device = &tvga8900d_device, - .snd_device = NULL, - .net_device = NULL - }, /* Has a JetKey KBC without version, which is a clone of AMI '8'. */ { .name = "[ALi M1217] Chaintech 3xxAX/AXB", @@ -5332,6 +5288,50 @@ const machine_t machines[] = { .snd_device = NULL, .net_device = NULL }, + /* Has a VIA VT82C42N KBC. */ + { + .name = "[ALi M1217] Flytech A36", + .internal_name = "flytech386", + .type = MACHINE_TYPE_386SX, + .chipset = MACHINE_CHIPSET_ALI_M1217, + .init = machine_at_flytech386_init, + .p1_handler = machine_generic_p1_handler, + .gpio_handler = NULL, + .available_flag = MACHINE_AVAILABLE, + .gpio_acpi_handler = NULL, + .cpu = { + .package = CPU_PKG_386SX, + .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_IDE | MACHINE_VIDEO, + .ram = { + .min = 1024, + .max = 16384, + .step = 1024 + }, + .nvrmask = 127, + .jumpered_ecp_dma = 0, + .default_jumpered_ecp_dma = -1, + .kbc_device = &kbc_at_device, + .kbc_params = KBC_VEN_VIA | 0x00424600, + .kbc_p1 = 0x000004f0, + .gpio = 0xffffffff, + .gpio_acpi = 0xffffffff, + .device = NULL, + .kbd_device = NULL, + .fdc_device = NULL, + .sio_device = NULL, + .vid_device = &tvga8900d_device, + .snd_device = NULL, + .net_device = NULL + }, /* Uses a NEC/Acer 90M002A. This is a strange one - it has command AF but it returns 0x00. */ { From fdbf4a066b9d5fb929f613b5ba04ae22cbe9a0e3 Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Sat, 20 Sep 2025 00:30:29 +0600 Subject: [PATCH 05/36] Introduce `plat_file_check` and use it for ROM existence checking --- src/include/86box/plat.h | 1 + src/mem/rom.c | 39 ++++++++++++++++++++++++++++++--------- src/qt/qt_platform.cpp | 18 ++++++++++++++++++ src/unix/unix.c | 10 ++++++++++ 4 files changed, 59 insertions(+), 9 deletions(-) diff --git a/src/include/86box/plat.h b/src/include/86box/plat.h index 552b074f7..b76728047 100644 --- a/src/include/86box/plat.h +++ b/src/include/86box/plat.h @@ -150,6 +150,7 @@ extern void plat_get_temp_dir(char *outbuf, uint8_t len); extern void plat_get_vmm_dir(char *outbuf, size_t len); extern void plat_init_rom_paths(void); extern int plat_dir_check(char *path); +extern int plat_file_check(const char *path); extern int plat_dir_create(char *path); extern void *plat_mmap(size_t size, uint8_t executable); extern void plat_munmap(void *ptr, size_t size); diff --git a/src/mem/rom.c b/src/mem/rom.c index f7b2b2b0d..c7db01d72 100644 --- a/src/mem/rom.c +++ b/src/mem/rom.c @@ -28,6 +28,7 @@ #include #include #include +#include #define HAVE_STDARG_H #include <86box/86box.h> #include "cpu.h" @@ -129,6 +130,34 @@ rom_get_full_path(char *dest, const char *fn) } } +bool +rom_fcheck(const char *fn) +{ + char temp[1024]; + bool exists = false; + + if (fn == NULL) + return false; + + if (strstr(fn, "roms/") == fn) { + /* Relative path */ + for (rom_path_t *rom_path = &rom_paths; rom_path != NULL; rom_path = rom_path->next) { + path_append_filename(temp, rom_path->path, fn + 5); + + exists = plat_file_check(temp); + + if (exists) { + return exists; + } + } + + return exists; + } else { + /* Absolute path */ + return plat_file_check(fn); + } +} + FILE * rom_fopen(const char *fn, char *mode) { @@ -186,15 +215,7 @@ rom_getfile(char *fn, char *s, int size) int rom_present(const char *fn) { - FILE *fp; - - fp = rom_fopen(fn, "rb"); - if (fp != NULL) { - (void) fclose(fp); - return 1; - } - - return 0; + return rom_fcheck(fn); } uint8_t diff --git a/src/qt/qt_platform.cpp b/src/qt/qt_platform.cpp index a0c2aa502..f36856e5f 100644 --- a/src/qt/qt_platform.cpp +++ b/src/qt/qt_platform.cpp @@ -64,6 +64,8 @@ # include #endif +#include + #ifdef Q_OS_OPENBSD # include #endif @@ -250,6 +252,22 @@ plat_dir_check(char *path) return fi.isDir() ? 1 : 0; } +int +plat_file_check(const char *path) +{ +#ifdef _WIN32 + auto data = QString::fromUtf8(path).toStdWString(); + auto res = GetFileAttributesW(data.c_str()); + return (res != INVALID_FILE_ATTRIBUTES && !(res & FILE_ATTRIBUTE_DIRECTORY)); +#else + struct stat dummy; + if (stat(path, &dummy) < 0) { + return 0; + } + return !S_ISDIR(dummy.st_mode); +#endif +} + int plat_getcwd(char *bufp, int max) { diff --git a/src/unix/unix.c b/src/unix/unix.c index 70cf5b87c..20727928c 100644 --- a/src/unix/unix.c +++ b/src/unix/unix.c @@ -412,6 +412,16 @@ plat_dir_check(char *path) return S_ISDIR(dummy.st_mode); } +int +plat_file_check(const char *path) +{ + struct stat dummy; + if (stat(path, &dummy) < 0) { + return 0; + } + return !S_ISDIR(dummy.st_mode); +} + int plat_dir_create(char *path) { From 13d5de4e7b8a57ab2bc82f0984ae15dc61ddaf44 Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Fri, 19 Sep 2025 17:51:01 -0300 Subject: [PATCH 06/36] ROM file check optimizations and cleanups --- src/include/86box/rom.h | 2 +- src/mem/rom.c | 66 +++++++++++++++++------------------------ src/qt/qt_platform.cpp | 9 +++--- src/unix/unix.c | 14 ++++----- 4 files changed, 39 insertions(+), 52 deletions(-) diff --git a/src/include/86box/rom.h b/src/include/86box/rom.h index 331d78526..807649956 100644 --- a/src/include/86box/rom.h +++ b/src/include/86box/rom.h @@ -59,7 +59,7 @@ extern void rom_writel(uint32_t addr, uint32_t val, void *priv); extern void rom_get_full_path(char *dest, const char *fn); extern FILE *rom_fopen(const char *fn, char *mode); -extern int rom_getfile(char *fn, char *s, int size); +extern int rom_getfile(const char *fn, char *s, int size); extern int rom_present(const char *fn); extern int rom_load_linear_oddeven(const char *fn, uint32_t addr, int sz, diff --git a/src/mem/rom.c b/src/mem/rom.c index c7db01d72..ebebc6fc6 100644 --- a/src/mem/rom.c +++ b/src/mem/rom.c @@ -92,8 +92,9 @@ rom_check(const char *fn) { FILE *fp = NULL; int ret = 0; + char last = fn[strlen(fn) - 1]; - if ((fn[strlen(fn) - 1] == '/') || (fn[strlen(fn) - 1] == '\\')) + if ((last == '/') || (last == '\\')) ret = plat_dir_check((char *) fn); else { fp = fopen(fn, "rb"); @@ -112,7 +113,7 @@ rom_get_full_path(char *dest, const char *fn) dest[0] = 0x00; - if (strstr(fn, "roms/") == fn) { + if (!strncmp(fn, "roms/", 5)) { /* Relative path */ for (rom_path_t *rom_path = &rom_paths; rom_path != NULL; rom_path = rom_path->next) { path_append_filename(temp, rom_path->path, fn + 5); @@ -130,34 +131,6 @@ rom_get_full_path(char *dest, const char *fn) } } -bool -rom_fcheck(const char *fn) -{ - char temp[1024]; - bool exists = false; - - if (fn == NULL) - return false; - - if (strstr(fn, "roms/") == fn) { - /* Relative path */ - for (rom_path_t *rom_path = &rom_paths; rom_path != NULL; rom_path = rom_path->next) { - path_append_filename(temp, rom_path->path, fn + 5); - - exists = plat_file_check(temp); - - if (exists) { - return exists; - } - } - - return exists; - } else { - /* Absolute path */ - return plat_file_check(fn); - } -} - FILE * rom_fopen(const char *fn, char *mode) { @@ -167,14 +140,13 @@ rom_fopen(const char *fn, char *mode) if ((fn == NULL) || (mode == NULL)) return NULL; - if (strstr(fn, "roms/") == fn) { + if (!strncmp(fn, "roms/", 5)) { /* Relative path */ for (rom_path_t *rom_path = &rom_paths; rom_path != NULL; rom_path = rom_path->next) { path_append_filename(temp, rom_path->path, fn + 5); - if ((fp = plat_fopen(temp, mode)) != NULL) { + if ((fp = plat_fopen(temp, mode)) != NULL) return fp; - } } return fp; @@ -185,16 +157,16 @@ rom_fopen(const char *fn, char *mode) } int -rom_getfile(char *fn, char *s, int size) +rom_getfile(const char *fn, char *s, int size) { char temp[1024]; - if (strstr(fn, "roms/") == fn) { + if (!strncmp(fn, "roms/", 5)) { /* Relative path */ for (rom_path_t *rom_path = &rom_paths; rom_path != NULL; rom_path = rom_path->next) { path_append_filename(temp, rom_path->path, fn + 5); - if (rom_present(temp)) { + if (plat_file_check(temp)) { strncpy(s, temp, size); return 1; } @@ -203,7 +175,7 @@ rom_getfile(char *fn, char *s, int size) return 0; } else { /* Absolute path */ - if (rom_present(fn)) { + if (plat_file_check(fn)) { strncpy(s, fn, size); return 1; } @@ -215,7 +187,25 @@ rom_getfile(char *fn, char *s, int size) int rom_present(const char *fn) { - return rom_fcheck(fn); + char temp[1024]; + + if (fn == NULL) + return 0; + + if (!strncmp(fn, "roms/", 5)) { + /* Relative path */ + for (rom_path_t *rom_path = &rom_paths; rom_path != NULL; rom_path = rom_path->next) { + path_append_filename(temp, rom_path->path, fn + 5); + + if (plat_file_check(temp)) + return 1; + } + + return 0; + } else { + /* Absolute path */ + return plat_file_check(fn); + } } uint8_t diff --git a/src/qt/qt_platform.cpp b/src/qt/qt_platform.cpp index f36856e5f..ad49e5e7c 100644 --- a/src/qt/qt_platform.cpp +++ b/src/qt/qt_platform.cpp @@ -258,13 +258,12 @@ plat_file_check(const char *path) #ifdef _WIN32 auto data = QString::fromUtf8(path).toStdWString(); auto res = GetFileAttributesW(data.c_str()); - return (res != INVALID_FILE_ATTRIBUTES && !(res & FILE_ATTRIBUTE_DIRECTORY)); + return (res != INVALID_FILE_ATTRIBUTES) && !(res & FILE_ATTRIBUTE_DIRECTORY); #else - struct stat dummy; - if (stat(path, &dummy) < 0) { + struct stat stats; + if (stat(path, &stats) < 0) return 0; - } - return !S_ISDIR(dummy.st_mode); + return !S_ISDIR(stats.st_mode); #endif } diff --git a/src/unix/unix.c b/src/unix/unix.c index 20727928c..ee13284fd 100644 --- a/src/unix/unix.c +++ b/src/unix/unix.c @@ -405,21 +405,19 @@ path_append_filename(char *dest, const char *s1, const char *s2) int plat_dir_check(char *path) { - struct stat dummy; - if (stat(path, &dummy) < 0) { + struct stat stats; + if (stat(path, &stats) < 0) return 0; - } - return S_ISDIR(dummy.st_mode); + return S_ISDIR(stats.st_mode); } int plat_file_check(const char *path) { - struct stat dummy; - if (stat(path, &dummy) < 0) { + struct stat stats; + if (stat(path, &stats) < 0) return 0; - } - return !S_ISDIR(dummy.st_mode); + return !S_ISDIR(stats.st_mode); } int From 4b8b0efa482899d4f67ff0d576305a43060d301e Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Fri, 19 Sep 2025 18:45:35 -0300 Subject: [PATCH 07/36] Optimize a couple CPU block checks --- src/cpu/cpu.c | 6 +----- src/machine/machine_table.c | 2 +- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/src/cpu/cpu.c b/src/cpu/cpu.c index ff806297e..bdd93ec5b 100644 --- a/src/cpu/cpu.c +++ b/src/cpu/cpu.c @@ -386,11 +386,7 @@ cpu_is_eligible(const cpu_family_t *cpu_family, int cpu, int machine) return 1; /* Cyrix 6x86MX on the NuPRO 592. */ - if (((cpu_s->cyrix_id & 0xff00) == 0x0400) && (strstr(machine_s->internal_name, "nupro") != NULL)) - return 0; - - /* Cyrix 6x86MX or MII on the P5MMS98. */ - if ((cpu_s->cpu_type == CPU_Cx6x86MX) && (strstr(machine_s->internal_name, "p5mms98") != NULL)) + if (((cpu_s->cyrix_id & 0xff00) == 0x0400) && (machine_s->init == machine_at_nupro592_init)) return 0; /* Check CPU blocklist. */ diff --git a/src/machine/machine_table.c b/src/machine/machine_table.c index d36a6585f..f69544ecd 100644 --- a/src/machine/machine_table.c +++ b/src/machine/machine_table.c @@ -15476,7 +15476,7 @@ const machine_t machines[] = { .gpio_acpi_handler = NULL, .cpu = { .package = CPU_PKG_SOCKET5_7, - .block = CPU_BLOCK_NONE, + .block = CPU_BLOCK(CPU_Cx6x86MX), .min_bus = 50000000, .max_bus = 75000000, .min_voltage = 2100, From bc350fc8cee764191f428fe0d7033d7d03f61933 Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Fri, 19 Sep 2025 19:04:24 -0300 Subject: [PATCH 08/36] QIcon caching optimizations in settings pages --- src/qt/qt_settingsfloppycdrom.cpp | 27 +++++++++++++++----------- src/qt/qt_settingsfloppycdrom.hpp | 9 +++++++++ src/qt/qt_settingsharddisks.cpp | 29 +++++++++++++++++----------- src/qt/qt_settingsotherremovable.cpp | 24 +++++++++++++---------- src/qt/qt_settingsotherremovable.hpp | 8 ++++++++ 5 files changed, 65 insertions(+), 32 deletions(-) diff --git a/src/qt/qt_settingsfloppycdrom.cpp b/src/qt/qt_settingsfloppycdrom.cpp index f597aebe6..588b1aff9 100644 --- a/src/qt/qt_settingsfloppycdrom.cpp +++ b/src/qt/qt_settingsfloppycdrom.cpp @@ -34,43 +34,41 @@ extern "C" { #include <86box/cdrom.h> } -#include - #include "qt_models_common.hpp" #include "qt_harddrive_common.hpp" #include "qt_settings_bus_tracking.hpp" #include "qt_progsettings.hpp" -static void -setFloppyType(QAbstractItemModel *model, const QModelIndex &idx, int type) +void +SettingsFloppyCDROM::setFloppyType(QAbstractItemModel *model, const QModelIndex &idx, int type) { QIcon icon; if (type == 0) - icon = QIcon(":/settings/qt/icons/floppy_disabled.ico"); + icon = floppy_disabled_icon; else if (type >= 1 && type <= 6) - icon = QIcon(":/settings/qt/icons/floppy_525.ico"); + icon = floppy_525_icon; else - icon = QIcon(":/settings/qt/icons/floppy_35.ico"); + icon = floppy_35_icon; model->setData(idx, QObject::tr(fdd_getname(type))); model->setData(idx, type, Qt::UserRole); model->setData(idx, icon, Qt::DecorationRole); } -static void -setCDROMBus(QAbstractItemModel *model, const QModelIndex &idx, uint8_t bus, uint8_t channel) +void +SettingsFloppyCDROM::setCDROMBus(QAbstractItemModel *model, const QModelIndex &idx, uint8_t bus, uint8_t channel) { QIcon icon; switch (bus) { case CDROM_BUS_DISABLED: - icon = QIcon(":/settings/qt/icons/cdrom_disabled.ico"); + icon = cdrom_disabled_icon; break; case CDROM_BUS_ATAPI: case CDROM_BUS_SCSI: case CDROM_BUS_MITSUMI: case CDROM_BUS_MKE: - icon = QIcon(":/settings/qt/icons/cdrom.ico"); + icon = cdrom_icon; break; } @@ -116,6 +114,10 @@ SettingsFloppyCDROM::SettingsFloppyCDROM(QWidget *parent) { ui->setupUi(this); + floppy_disabled_icon = QIcon(":/settings/qt/icons/floppy_disabled.ico"); + floppy_525_icon = QIcon(":/settings/qt/icons/floppy_525.ico"); + floppy_35_icon = QIcon(":/settings/qt/icons/floppy_35.ico"); + auto *model = ui->comboBoxFloppyType->model(); int i = 0; while (true) { @@ -150,6 +152,9 @@ SettingsFloppyCDROM::SettingsFloppyCDROM(QWidget *parent) this, &SettingsFloppyCDROM::onFloppyRowChanged); ui->tableViewFloppy->setCurrentIndex(model->index(0, 0)); + cdrom_disabled_icon = QIcon(":/settings/qt/icons/cdrom_disabled.ico"); + cdrom_icon = QIcon(":/settings/qt/icons/cdrom.ico"); + Harddrives::populateCDROMBuses(ui->comboBoxBus->model()); model = ui->comboBoxSpeed->model(); for (int i = 0; i < 72; i++) diff --git a/src/qt/qt_settingsfloppycdrom.hpp b/src/qt/qt_settingsfloppycdrom.hpp index 063942201..ba7b396b7 100644 --- a/src/qt/qt_settingsfloppycdrom.hpp +++ b/src/qt/qt_settingsfloppycdrom.hpp @@ -2,6 +2,7 @@ #define QT_SETTINGSFLOPPYCDROM_HPP #include +#include namespace Ui { class SettingsFloppyCDROM; @@ -36,7 +37,15 @@ private slots: private: Ui::SettingsFloppyCDROM *ui; + void setFloppyType(QAbstractItemModel *model, const QModelIndex &idx, int type); + void setCDROMBus(QAbstractItemModel *model, const QModelIndex &idx, uint8_t bus, uint8_t channel); void enableCurrentlySelectedChannel(); + + QIcon floppy_disabled_icon; + QIcon floppy_525_icon; + QIcon floppy_35_icon; + QIcon cdrom_disabled_icon; + QIcon cdrom_icon; }; #endif // QT_SETTINGSFLOPPYCDROM_HPP diff --git a/src/qt/qt_settingsharddisks.cpp b/src/qt/qt_settingsharddisks.cpp index 6d82f2b77..40142f4d2 100644 --- a/src/qt/qt_settingsharddisks.cpp +++ b/src/qt/qt_settingsharddisks.cpp @@ -44,6 +44,8 @@ const int DataBusChannel = Qt::UserRole + 1; const int DataBusPrevious = Qt::UserRole + 2; const int DataBusChannelPrevious = Qt::UserRole + 3; +QIcon hard_disk_icon; + #if 0 static void normalize_hd_list() @@ -78,28 +80,31 @@ addRow(QAbstractItemModel *model, hard_disk_t *hd) model->insertRow(row); + auto busIndex = model->index(row, ColumnBus); QString busName = Harddrives::BusChannelName(hd->bus_type, hd->channel); - model->setData(model->index(row, ColumnBus), busName); - model->setData(model->index(row, ColumnBus), QIcon(":/settings/qt/icons/hard_disk.ico"), Qt::DecorationRole); - model->setData(model->index(row, ColumnBus), hd->bus_type, DataBus); - model->setData(model->index(row, ColumnBus), hd->bus_type, DataBusPrevious); - model->setData(model->index(row, ColumnBus), hd->channel, DataBusChannel); - model->setData(model->index(row, ColumnBus), hd->channel, DataBusChannelPrevious); + model->setData(busIndex, busName); + model->setData(busIndex, hard_disk_icon, Qt::DecorationRole); + model->setData(busIndex, hd->bus_type, DataBus); + model->setData(busIndex, hd->bus_type, DataBusPrevious); + model->setData(busIndex, hd->channel, DataBusChannel); + model->setData(busIndex, hd->channel, DataBusChannelPrevious); Harddrives::busTrackClass->device_track(1, DEV_HDD, hd->bus_type, hd->channel); + auto filenameIndex = model->index(row, ColumnFilename); QString fileName = hd->fn; if (fileName.startsWith(userPath, Qt::CaseInsensitive)) - model->setData(model->index(row, ColumnFilename), fileName.mid(userPath.size())); + model->setData(filenameIndex, fileName.mid(userPath.size())); else - model->setData(model->index(row, ColumnFilename), fileName); + model->setData(filenameIndex, fileName); - model->setData(model->index(row, ColumnFilename), fileName, Qt::UserRole); + model->setData(filenameIndex, fileName, Qt::UserRole); model->setData(model->index(row, ColumnCylinders), hd->tracks); model->setData(model->index(row, ColumnHeads), hd->hpc); model->setData(model->index(row, ColumnSectors), hd->spt); model->setData(model->index(row, ColumnSize), (hd->tracks * hd->hpc * hd->spt) >> 11); - model->setData(model->index(row, ColumnSpeed), QObject::tr(hdd_preset_getname(hd->speed_preset))); - model->setData(model->index(row, ColumnSpeed), hd->speed_preset, Qt::UserRole); + auto speedIndex = model->index(row, ColumnSpeed); + model->setData(speedIndex, QObject::tr(hdd_preset_getname(hd->speed_preset))); + model->setData(speedIndex, hd->speed_preset, Qt::UserRole); } SettingsHarddisks::SettingsHarddisks(QWidget *parent) @@ -108,6 +113,8 @@ SettingsHarddisks::SettingsHarddisks(QWidget *parent) { ui->setupUi(this); + hard_disk_icon = QIcon(":/settings/qt/icons/hard_disk.ico"); + QAbstractItemModel *model = new QStandardItemModel(0, 7, this); model->setHeaderData(ColumnBus, Qt::Horizontal, tr("Bus")); model->setHeaderData(ColumnFilename, Qt::Horizontal, tr("File")); diff --git a/src/qt/qt_settingsotherremovable.cpp b/src/qt/qt_settingsotherremovable.cpp index 4ba07161c..f2fa3c675 100644 --- a/src/qt/qt_settingsotherremovable.cpp +++ b/src/qt/qt_settingsotherremovable.cpp @@ -26,8 +26,6 @@ extern "C" { #include <86box/rdisk.h> } -#include - #include "qt_models_common.hpp" #include "qt_harddrive_common.hpp" #include "qt_settings_bus_tracking.hpp" @@ -47,17 +45,17 @@ rdiskDriveTypeName(int i) rdisk_drive_types[i].revision); } -static void -setMOBus(QAbstractItemModel *model, const QModelIndex &idx, uint8_t bus, uint8_t channel) +void +SettingsOtherRemovable::setMOBus(QAbstractItemModel *model, const QModelIndex &idx, uint8_t bus, uint8_t channel) { QIcon icon; switch (bus) { case MO_BUS_DISABLED: - icon = QIcon(":/settings/qt/icons/mo_disabled.ico"); + icon = mo_disabled_icon; break; case MO_BUS_ATAPI: case MO_BUS_SCSI: - icon = QIcon(":/settings/qt/icons/mo.ico"); + icon = mo_icon; break; default: @@ -71,17 +69,17 @@ setMOBus(QAbstractItemModel *model, const QModelIndex &idx, uint8_t bus, uint8_t model->setData(i, icon, Qt::DecorationRole); } -static void -setRDiskBus(QAbstractItemModel *model, const QModelIndex &idx, uint8_t bus, uint8_t channel) +void +SettingsOtherRemovable::setRDiskBus(QAbstractItemModel *model, const QModelIndex &idx, uint8_t bus, uint8_t channel) { QIcon icon; switch (bus) { case RDISK_BUS_DISABLED: - icon = QIcon(":/settings/qt/icons/rdisk_disabled.ico"); + icon = rdisk_disabled_icon; break; case RDISK_BUS_ATAPI: case RDISK_BUS_SCSI: - icon = QIcon(":/settings/qt/icons/rdisk.ico"); + icon = rdisk_icon; break; default: @@ -123,6 +121,9 @@ SettingsOtherRemovable::SettingsOtherRemovable(QWidget *parent) { ui->setupUi(this); + mo_disabled_icon = QIcon(":/settings/qt/icons/mo_disabled.ico"); + mo_icon = QIcon(":/settings/qt/icons/mo.ico"); + Harddrives::populateRemovableBuses(ui->comboBoxMOBus->model()); ui->comboBoxMOBus->model()->removeRows(3, ui->comboBoxMOBus->model()->rowCount() - 3); auto *model = ui->comboBoxMOType->model(); @@ -147,6 +148,9 @@ SettingsOtherRemovable::SettingsOtherRemovable(QWidget *parent) connect(ui->tableViewMO->selectionModel(), &QItemSelectionModel::currentRowChanged, this, &SettingsOtherRemovable::onMORowChanged); ui->tableViewMO->setCurrentIndex(model->index(0, 0)); + rdisk_disabled_icon = QIcon(":/settings/qt/icons/rdisk_disabled.ico"); + rdisk_icon = QIcon(":/settings/qt/icons/rdisk.ico"); + Harddrives::populateRemovableBuses(ui->comboBoxRDiskBus->model()); if ((ui->comboBoxRDiskBus->model()->rowCount() - 3) > 0) ui->comboBoxRDiskBus->model()->removeRows(3, ui->comboBoxRDiskBus->model()->rowCount() - 3); diff --git a/src/qt/qt_settingsotherremovable.hpp b/src/qt/qt_settingsotherremovable.hpp index 79fcfbf3f..2c7a4e80e 100644 --- a/src/qt/qt_settingsotherremovable.hpp +++ b/src/qt/qt_settingsotherremovable.hpp @@ -2,6 +2,7 @@ #define QT_SETTINGSOTHERREMOVABLE_HPP #include +#include namespace Ui { class SettingsOtherRemovable; @@ -37,8 +38,15 @@ private slots: private: Ui::SettingsOtherRemovable *ui; + void setMOBus(QAbstractItemModel *model, const QModelIndex &idx, uint8_t bus, uint8_t channel); + void setRDiskBus(QAbstractItemModel *model, const QModelIndex &idx, uint8_t bus, uint8_t channel); void enableCurrentlySelectedChannel_MO(); void enableCurrentlySelectedChannel_RDisk(); + + QIcon mo_disabled_icon; + QIcon mo_icon; + QIcon rdisk_disabled_icon; + QIcon rdisk_icon; }; #endif // QT_SETTINGSOTHERREMOVABLE_HPP From 9b5f4ba7b1133028a7e8d2e7fb69e9c3850b7b57 Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Fri, 19 Sep 2025 19:11:06 -0300 Subject: [PATCH 09/36] BIOS ROM presence checking optimizations --- src/mem/rom.c | 47 +++++++++++++++++------------------------------ 1 file changed, 17 insertions(+), 30 deletions(-) diff --git a/src/mem/rom.c b/src/mem/rom.c index ebebc6fc6..7c86d1368 100644 --- a/src/mem/rom.c +++ b/src/mem/rom.c @@ -609,13 +609,14 @@ bios_load(const char *fn1, const char *fn2, uint32_t addr, int sz, int off, int */ if (!bios_only) ptr = (flags & FLAG_AUX) ? rom : rom_reset(addr, sz); + else + return (!fn1 || rom_present(fn1)) && (!fn2 || rom_present(fn2)); if (!(flags & FLAG_AUX) && ((addr + sz) > 0x00100000)) sz = 0x00100000 - addr; #ifdef ENABLE_ROM_LOG - if (!bios_only) - rom_log("%sing %i bytes of %sBIOS starting with ptr[%08X] (ptr = %08X)\n", (bios_only) ? "Check" : "Load", sz, (flags & FLAG_AUX) ? "auxiliary " : "", addr - biosaddr, ptr); + rom_log("%sing %i bytes of %sBIOS starting with ptr[%08X] (ptr = %08X)\n", (bios_only) ? "Check" : "Load", sz, (flags & FLAG_AUX) ? "auxiliary " : "", addr - biosaddr, ptr); #endif if (flags & FLAG_INT) @@ -627,7 +628,7 @@ bios_load(const char *fn1, const char *fn2, uint32_t addr, int sz, int off, int ret = rom_load_linear(fn1, addr - biosaddr, sz, off, ptr); } - if (!bios_only && (flags & FLAG_REP) && (old_sz >= 65536) && (sz < old_sz)) { + if ((flags & FLAG_REP) && (old_sz >= 65536) && (sz < old_sz)) { old_sz /= sz; for (int i = 0; i < (old_sz - 1); i++) { rom_log("Copying ptr[%08X] to ptr[%08X]\n", addr - biosaddr, i * sz); @@ -635,7 +636,7 @@ bios_load(const char *fn1, const char *fn2, uint32_t addr, int sz, int off, int } } - if (!bios_only && ret && !(flags & FLAG_AUX)) + if (ret && !(flags & FLAG_AUX)) bios_add(); return ret; @@ -644,42 +645,28 @@ bios_load(const char *fn1, const char *fn2, uint32_t addr, int sz, int off, int int bios_load_linear_combined(const char *fn1, const char *fn2, int sz, UNUSED(int off)) { - uint8_t ret = 0; - - ret = bios_load_linear(fn1, 0x000f0000, 131072, 128); - ret &= bios_load_aux_linear(fn2, 0x000e0000, sz - 65536, 128); - - return ret; + return bios_load_linear(fn1, 0x000f0000, 131072, 128) && \ + bios_load_aux_linear(fn2, 0x000e0000, sz - 65536, 128); } int bios_load_linear_combined2(const char *fn1, const char *fn2, const char *fn3, const char *fn4, const char *fn5, int sz, int off) { - uint8_t ret = 0; - - ret = bios_load_linear(fn3, 0x000f0000, 262144, off); - ret &= bios_load_aux_linear(fn1, 0x000d0000, 65536, off); - ret &= bios_load_aux_linear(fn2, 0x000c0000, 65536, off); - ret &= bios_load_aux_linear(fn4, 0x000e0000, sz - 196608, off); - if (fn5 != NULL) - ret &= bios_load_aux_linear(fn5, 0x000ec000, 16384, 0); - - return ret; + return bios_load_linear(fn3, 0x000f0000, 262144, off) && \ + bios_load_aux_linear(fn1, 0x000d0000, 65536, off) && \ + bios_load_aux_linear(fn2, 0x000c0000, 65536, off) && \ + bios_load_aux_linear(fn4, 0x000e0000, sz - 196608, off) && \ + (!fn5 || bios_load_aux_linear(fn5, 0x000ec000, 16384, 0)); } int bios_load_linear_combined2_ex(const char *fn1, const char *fn2, const char *fn3, const char *fn4, const char *fn5, int sz, int off) { - uint8_t ret = 0; - - ret = bios_load_linear(fn3, 0x000e0000, 262144, off); - ret &= bios_load_aux_linear(fn1, 0x000c0000, 65536, off); - ret &= bios_load_aux_linear(fn2, 0x000d0000, 65536, off); - ret &= bios_load_aux_linear(fn4, 0x000f0000, sz - 196608, off); - if (fn5 != NULL) - ret &= bios_load_aux_linear(fn5, 0x000fc000, 16384, 0); - - return ret; + return bios_load_linear(fn3, 0x000e0000, 262144, off) && \ + bios_load_aux_linear(fn1, 0x000c0000, 65536, off) && \ + bios_load_aux_linear(fn2, 0x000d0000, 65536, off) && \ + bios_load_aux_linear(fn4, 0x000f0000, sz - 196608, off) && \ + (!fn5 || bios_load_aux_linear(fn5, 0x000fc000, 16384, 0)); } int From 25146643f9afd15b7a35e632be3d17f3759f844a Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Fri, 19 Sep 2025 19:41:01 -0300 Subject: [PATCH 10/36] Migrate remaining machine-specific checks from internal name to init function --- src/acpi.c | 14 +++++++------- src/chipset/cs8220.c | 2 +- src/chipset/intel_4x0.c | 2 +- src/chipset/intel_piix.c | 2 +- src/chipset/intel_sio.c | 2 +- src/chipset/sis_85c4xx.c | 4 ++-- src/chipset/vl82c480.c | 14 ++++++++------ src/config.c | 2 +- src/device/isartc.c | 2 +- src/device/kbc_at.c | 12 ++++++------ src/dma.c | 2 +- src/floppy/fdc.c | 8 ++++---- src/machine/machine_table.c | 2 +- src/mem/sst_flash.c | 2 +- src/nvr_at.c | 2 +- src/pic.c | 2 +- src/qt/qt_settingsinput.cpp | 2 +- src/sio/sio_f82c710.c | 2 +- src/sio/sio_fdc37c93x.c | 8 ++++---- src/sio/sio_vl82c113.c | 2 +- src/sio/sio_w83877.c | 2 +- src/video/vid_cl54xx.c | 2 +- 22 files changed, 47 insertions(+), 45 deletions(-) diff --git a/src/acpi.c b/src/acpi.c index 411662e39..0654754e8 100644 --- a/src/acpi.c +++ b/src/acpi.c @@ -1222,7 +1222,7 @@ acpi_reg_write_intel(int size, uint16_t addr, uint8_t val, void *priv) /* GPOREG - General Purpose Output Register (IO) */ if (size == 1) { dev->regs.gporeg[addr & 3] = val; - if ((addr == 0x34) && !strcmp(machine_get_internal_name(), "cubx")) + if ((addr == 0x34) && (machines[machine].init == machine_at_cubx_init)) hdc_onboard_enabled = (val & 0x01); } break; @@ -1749,7 +1749,7 @@ acpi_reg_write_sis_5595(int size, uint16_t addr, uint8_t val, void *priv) break; case 0x1c: dev->regs.gpe_pin = ((dev->regs.gpe_pin & ~(0xff << shift32)) | ((val & 0xff) << shift32)); - if (!strcmp(machine_get_internal_name(), "m747") && (val & 0x10) && + if ((machines[machine].init == machine_at_m747_init) && (val & 0x10) && !(dev->regs.gpe_io & 0x00000010)) resetx86(); break; @@ -2365,7 +2365,7 @@ acpi_reset(void *priv) /* PC Chips M773: - Bit 3: 80-conductor cable on unknown IDE channel (active low) - Bit 1: 80-conductor cable on unknown IDE channel (active low) */ - dev->regs.gpireg[0] = !strcmp(machine_get_internal_name(), "m773") ? 0xf5 : 0xff; + dev->regs.gpireg[0] = (machines[machine].init == machine_at_m773_init) ? 0xf5 : 0xff; dev->regs.gpireg[1] = 0xff; /* A-Trend ATC7020BXII: - Bit 3: 80-conductor cable on secondary IDE channel (active low) @@ -2399,9 +2399,9 @@ acpi_reset(void *priv) - Bit 19: password cleared (active low). */ dev->regs.gpi_val = 0xfff57fc1; - if (!strcmp(machine_get_internal_name(), "ficva503a") || !strcmp(machine_get_internal_name(), "6via90ap")) + if ((machines[machine].init == machine_at_ficva503a_init) || (machines[machine].init == machine_at_6via90ap_init)) dev->regs.gpi_val |= 0x00000004; - else if (!strcmp(machine_get_internal_name(), "ficka6130")) + else if ((machines[machine].init == machine_at_ficka6130_init)) dev->regs.gpi_val |= 0x00080000; /* TriGem Delhi-III second GPI word: @@ -2409,7 +2409,7 @@ acpi_reset(void *priv) - Bit 6 = Password jumper (must be set); - Bit 5 = Enable Setup (must be set). */ - else if (!strcmp(machine_get_internal_name(), "delhi3")) + else if (machines[machine].init == machine_at_delhi3_init) dev->regs.gpi_val |= 0x00008000; } @@ -2420,7 +2420,7 @@ acpi_reset(void *priv) } /* The Gateway Tomahawk requires the LID polarity bit to be set. */ - if (!strcmp(machine_get_internal_name(), "tomahawk")) + if (machines[machine].init == machine_at_tomahawk_init) dev->regs.glbctl |= 0x02000000; acpi_rtc_status = 0; diff --git a/src/chipset/cs8220.c b/src/chipset/cs8220.c index 4c08ecef5..3c3c23767 100644 --- a/src/chipset/cs8220.c +++ b/src/chipset/cs8220.c @@ -160,7 +160,7 @@ cs8220_init(UNUSED(const device_t *info)) /* Dell System 200: 640 kB soldered on-board, any other RAM is expansion. */ - if (!strcmp(machine_get_internal_name(), "dells200")) switch (mem_size) { + if ((machines[machine].init == machine_at_dells200_init)) switch (mem_size) { default: dev->ram_banks[2].virt = 0x00100000; dev->ram_banks[2].phys = 0x000a0000; diff --git a/src/chipset/intel_4x0.c b/src/chipset/intel_4x0.c index 8e6ce97c3..7d59653e8 100644 --- a/src/chipset/intel_4x0.c +++ b/src/chipset/intel_4x0.c @@ -1549,7 +1549,7 @@ i4x0_read(int func, int addr, void *priv) with the addition of bits 3 and 0. */ if ((func == 0) && (addr == 0x93) && ((dev->type == INTEL_440FX) || (dev->type == INTEL_440LX) || (dev->type == INTEL_440EX))) ret = (ret & 0xf9) | (pci_read(0x0cf9, NULL) & 0x06); - else if ((func == 0) && (addr == 0x52) && (dev->type == INTEL_430TX) && !strcmp(machine_get_internal_name(), "tomahawk")) + else if ((func == 0) && (addr == 0x52) && (dev->type == INTEL_430TX) && (machines[machine].init == machine_at_tomahawk_init)) ret = 0xb2; } diff --git a/src/chipset/intel_piix.c b/src/chipset/intel_piix.c index 5d0c18441..d3ef943ac 100644 --- a/src/chipset/intel_piix.c +++ b/src/chipset/intel_piix.c @@ -1595,7 +1595,7 @@ piix_init(const device_t *info) - Bit 4: CMOS clear jumper, must be clear; - Bit 0: Password switch, must be clear. */ - if (!strcmp(machine_get_internal_name(), "richmond")) + if (machines[machine].init == machine_at_richmond_init) acpi_set_gpireg2_default(dev->acpi, 0xee); else acpi_set_gpireg2_default(dev->acpi, (dev->type > 4) ? 0xf1 : 0xdd); diff --git a/src/chipset/intel_sio.c b/src/chipset/intel_sio.c index b11ec0765..87730b20f 100644 --- a/src/chipset/intel_sio.c +++ b/src/chipset/intel_sio.c @@ -368,7 +368,7 @@ sio_config_read(uint16_t port, UNUSED(void *priv)) - 1, 0 = M; - 1, 1 = M. */ - if (!strcmp(machine_get_internal_name(), "opti560l")) + if (machines[machine].init == machine_at_opti560l_init) ret = 0x20; else ret = 0xd3; diff --git a/src/chipset/sis_85c4xx.c b/src/chipset/sis_85c4xx.c index 49d0418ce..1b0eeceed 100644 --- a/src/chipset/sis_85c4xx.c +++ b/src/chipset/sis_85c4xx.c @@ -766,7 +766,7 @@ sis_85c4xx_reset(void *priv) if (dev->is_471) { dev->regs[0x09] = 0x40; - if (!strcmp(machine_get_internal_name(), "vli486sv2g")) { + if (machines[machine].init == machine_at_vli486sv2g_init) { if (mem_size_mb == 64) dev->regs[0x09] |= 0x1f; else @@ -784,7 +784,7 @@ sis_85c4xx_reset(void *priv) dev->regs[0x09] |= 0x34; else dev->regs[0x09] |= 0x35; - } else if (!strcmp(machine_get_internal_name(), "tg486g")) + } else if (machines[machine].init == machine_at_tg486g_init) dev->regs[0x09] |= ram_tg486g[mem_size_mb]; else dev->regs[0x09] |= ram_471[mem_size_mb]; diff --git a/src/chipset/vl82c480.c b/src/chipset/vl82c480.c index acb3568af..a31c35418 100644 --- a/src/chipset/vl82c480.c +++ b/src/chipset/vl82c480.c @@ -30,6 +30,8 @@ #include <86box/port_92.h> #include <86box/chipset.h> +#define machine_at_prolineamt_init NULL /* checks for a removed machine */ + typedef struct vl82c480_t { uint8_t idx; uint8_t regs[256]; @@ -132,8 +134,8 @@ vl82c480_write(uint16_t addr, uint8_t val, void *priv) break; case 0x02: case 0x03: dev->regs[dev->idx] = val; - if (!strcmp(machine_get_internal_name(), "martin") || - !strcmp(machine_get_internal_name(), "prolineamt")) + if ((machines[machine].init == machine_at_martin_init) || + (machines[machine].init == machine_at_prolineamt_init)) vl82c480_recalc_banks(dev); break; case 0x04: @@ -220,9 +222,9 @@ vl82c480_init(const device_t *info) vl82c480_t *dev = (vl82c480_t *) calloc(1, sizeof(vl82c480_t)); uint32_t sizes[8] = { 0, 0, 1024, 2048, 4096, 8192, 16384, 32768 }; uint32_t ms = mem_size; - uint8_t min_i = !strcmp(machine_get_internal_name(), "prolineamt") ? 1 : 0; - uint8_t min_j = !strcmp(machine_get_internal_name(), "prolineamt") ? 4 : 2; - uint8_t max_j = !strcmp(machine_get_internal_name(), "prolineamt") ? 8 : 7; + uint8_t min_i = (machines[machine].init == machine_at_prolineamt_init) ? 1 : 0; + uint8_t min_j = (machines[machine].init == machine_at_prolineamt_init) ? 4 : 2; + uint8_t max_j = (machines[machine].init == machine_at_prolineamt_init) ? 8 : 7; dev->regs[0x00] = info->local; dev->regs[0x01] = 0xff; @@ -233,7 +235,7 @@ vl82c480_init(const device_t *info) dev->regs[0x07] = 0x21; dev->regs[0x08] = 0x38; - if (!strcmp(machine_get_internal_name(), "prolineamt")) { + if (machines[machine].init == machine_at_prolineamt_init) { dev->banks[0] = 4096; /* Bank 0 is ignored if 64 MB is installed. */ diff --git a/src/config.c b/src/config.c index 53d00a6bf..42d4fe012 100644 --- a/src/config.c +++ b/src/config.c @@ -572,7 +572,7 @@ load_input_devices(void) p = ini_section_get_string(cat, "keyboard_type", NULL); if (p != NULL) keyboard_type = keyboard_get_from_internal_name(p); - else if (strstr(machine_get_internal_name(), "pc5086")) + else if (machines[machine].init == machine_xt_pc5086_init) keyboard_type = KEYBOARD_TYPE_PC_XT; else if (machine_has_bus(machine, MACHINE_BUS_PS2_PORTS)) { if (machine_has_flags(machine, MACHINE_KEYBOARD_JIS)) diff --git a/src/device/isartc.c b/src/device/isartc.c index 664793db3..88f03e7c5 100644 --- a/src/device/isartc.c +++ b/src/device/isartc.c @@ -523,7 +523,7 @@ isartc_init(const device_t *info) { rtcdev_t *dev; int is_at = IS_AT(machine); - is_at = is_at || !strcmp(machine_get_internal_name(), "xi8088"); + is_at = is_at || (machines[machine].init == machine_xt_xi8088_init); /* Create a device instance. */ dev = (rtcdev_t *) calloc(1, sizeof(rtcdev_t)); diff --git a/src/device/kbc_at.c b/src/device/kbc_at.c index 186804e22..0f3bd5600 100644 --- a/src/device/kbc_at.c +++ b/src/device/kbc_at.c @@ -806,15 +806,15 @@ write_p2(atkbc_t *dev, uint8_t val) cpu_set_edx(); flushmmucache(); if ((kbc_ven == KBC_VEN_ALI) || - !strcmp(machine_get_internal_name(), "spc7700plw") || - !strcmp(machine_get_internal_name(), "pl4600c")) + (machines[machine].init == machine_at_spc7700plw_init) || + (machines[machine].init == machine_at_pl4600c_init)) smbase = 0x00030000; /* Yes, this is a hack, but until someone gets ahold of the real PCD-2L and can find out what they actually did to make it boot from FFFFF0 correctly despite A20 being gated when the CPU is reset, this will have to do. */ - if ((kbc_ven == KBC_VEN_SIEMENS) || !strcmp(machine_get_internal_name(), "acera1g")) + if ((kbc_ven == KBC_VEN_SIEMENS) || (machines[machine].init == machine_at_acera1g_init)) is486 ? loadcs(0xf000) : loadcs_2386(0xf000); } } @@ -1187,7 +1187,7 @@ write_cmd_ami(void *priv, uint8_t val) kbc_at_log("ATkbc: set KBC lines P22-P23 (P2 bits 2-3) low\n"); if (!(dev->flags & DEVICE_PCI)) write_p2(dev, dev->p2 & ~(4 << (val & 0x01))); - if (strstr(machine_get_internal_name(), "sb486pv") != NULL) + if (machines[machine].init == machine_at_sb486pv_init) kbc_delay_to_ob(dev, 0x03, 0, 0x00); else kbc_delay_to_ob(dev, dev->ob, 0, 0x00); @@ -2627,7 +2627,7 @@ kbc_at_process_cmd(void *priv) if (dev->ib == 0xbb) break; - if (strstr(machine_get_internal_name(), "pb41") != NULL) + if (machines[machine].init == machine_at_pb410a_init) cpu_override_dynarec = 1; if (dev->misc_flags & FLAG_PS2) { @@ -2759,7 +2759,7 @@ kbc_at_port_1_read(uint16_t port, void *priv) */ if (!(dev->misc_flags & FLAG_PS2) && (dev->irq[0] != 0xffff)) picintclevel(1 << dev->irq[0], &dev->irq_state); - if ((strstr(machine_get_internal_name(), "pb41") != NULL) && (cpu_override_dynarec == 1)) + if ((machines[machine].init == machine_at_pb410a_init) && (cpu_override_dynarec == 1)) cpu_override_dynarec = 0; kbc_at_log("ATkbc: [%04X:%08X] read (%04X) = %02X\n", CS, cpu_state.pc, port, ret); diff --git a/src/dma.c b/src/dma.c index 2265947b9..60e36b3cd 100644 --- a/src/dma.c +++ b/src/dma.c @@ -1008,7 +1008,7 @@ dma_page_read(uint16_t addr, UNUSED(void *priv)) if (((addr & 0xfffc) == 0x80) && (CS == 0xf000) && ((cpu_state.pc & 0xfffffff8) == 0x00007278) && - !strcmp(machine_get_internal_name(), "megapc")) switch (addr) { + (machines[machine].init == machine_at_wd76c10_init)) switch (addr) { /* The Amstrad MegaPC Quadtel BIOS times a sequence of: mov ax,di div bx diff --git a/src/floppy/fdc.c b/src/floppy/fdc.c index 9d68365d2..af00af561 100644 --- a/src/floppy/fdc.c +++ b/src/floppy/fdc.c @@ -2402,10 +2402,10 @@ fdc_reset(void *priv) need to use a dual-RPM 5.25" drive - but hey, that finally gets those drives some usage as well. */ - fdc_update_drvrate(fdc, 0, !strcmp(machine_get_internal_name(), "if386sx")); - fdc_update_drvrate(fdc, 1, !strcmp(machine_get_internal_name(), "if386sx")); - fdc_update_drvrate(fdc, 2, !strcmp(machine_get_internal_name(), "if386sx")); - fdc_update_drvrate(fdc, 3, !strcmp(machine_get_internal_name(), "if386sx")); + fdc_update_drvrate(fdc, 0, (machines[machine].init == machine_at_if386sx_init)); + fdc_update_drvrate(fdc, 1, (machines[machine].init == machine_at_if386sx_init)); + fdc_update_drvrate(fdc, 2, (machines[machine].init == machine_at_if386sx_init)); + fdc_update_drvrate(fdc, 3, (machines[machine].init == machine_at_if386sx_init)); fdc_update_drv2en(fdc, 1); fdc_update_rates(fdc); diff --git a/src/machine/machine_table.c b/src/machine/machine_table.c index f69544ecd..aa4f44c2e 100644 --- a/src/machine/machine_table.c +++ b/src/machine/machine_table.c @@ -19531,7 +19531,7 @@ machine_has_bus(int m, int bus_flags) if ((bus_flags & MACHINE_BUS_XT_KBD) && !(machines[m].bus_flags & MACHINE_BUS_ISA16) && (!(machines[m].bus_flags & MACHINE_BUS_PS2_PORTS) || - !(strcmp(machine_get_internal_name(), "pc5086")))) + (machines[m].init == machine_xt_pc5086_init))) ret |= MACHINE_BUS_XT_KBD; #ifdef ONLY_AT_KBD_ON_AT_KBC diff --git a/src/mem/sst_flash.c b/src/mem/sst_flash.c index 34bfae83a..7a836792f 100644 --- a/src/mem/sst_flash.c +++ b/src/mem/sst_flash.c @@ -524,7 +524,7 @@ sst_init(const device_t *info) dev->is_39 = 1; dev->size = info->local & 0xffff0000; - if ((dev->size == 0x20000) && (strstr(machine_get_internal_name_ex(machine), "xi8088")) && !xi8088_bios_128kb()) + if ((dev->size == 0x20000) && ((machines[machine].init == machine_xt_xi8088_init) && !xi8088_bios_128kb())) dev->size = 0x10000; dev->mask = dev->size - 1; diff --git a/src/nvr_at.c b/src/nvr_at.c index 6853867ec..ae7bd8bb4 100644 --- a/src/nvr_at.c +++ b/src/nvr_at.c @@ -1213,7 +1213,7 @@ nvr_at_init(const device_t *info) } /* This is a hack but it is required for the machine to boot properly, no idea why. */ - if (nvr->is_new && !strcmp(machine_get_internal_name(), "spitfire")) + if (nvr->is_new && (machines[machine].init == machine_at_spitfire_init)) nvr->regs[0x33] = nvr->regs[0x34] = 0xff; return nvr; diff --git a/src/pic.c b/src/pic.c index 446ea1361..50802552f 100644 --- a/src/pic.c +++ b/src/pic.c @@ -254,7 +254,7 @@ void pic_reset(void) { int is_at = IS_AT(machine); - is_at = is_at || !strcmp(machine_get_internal_name(), "xi8088"); + is_at = is_at || (machines[machine].init == machine_xt_xi8088_init); memset(&pic, 0, sizeof(pic_t)); memset(&pic2, 0, sizeof(pic_t)); diff --git a/src/qt/qt_settingsinput.cpp b/src/qt/qt_settingsinput.cpp index 50e3662e9..c540aa2ed 100644 --- a/src/qt/qt_settingsinput.cpp +++ b/src/qt/qt_settingsinput.cpp @@ -123,7 +123,7 @@ SettingsInput::onCurrentMachineChanged(int machineId) int ikbd = (i == KEYBOARD_TYPE_INTERNAL); int pc5086_filter = (strstr(keyboard_get_internal_name(i), "ps") && - strstr(machine_get_internal_name_ex(machineId), "pc5086")); + machines[machineId].init == machine_xt_pc5086_init); if ((ikbd != has_int_kbd) || !device_is_valid(dev, machineId) || pc5086_filter) continue; diff --git a/src/sio/sio_f82c710.c b/src/sio/sio_f82c710.c index f7ff1409f..46cb61a40 100644 --- a/src/sio/sio_f82c710.c +++ b/src/sio/sio_f82c710.c @@ -349,7 +349,7 @@ f82c710_init(const device_t *info) { upc_t *dev = (upc_t *) calloc(1, sizeof(upc_t)); - if (strstr(machine_get_internal_name(), "5086") != NULL) + if (machines[machine].init == machine_xt_pc5086_init) dev->fdc = device_add(&fdc_at_actlow_device); else dev->fdc = device_add(&fdc_at_device); diff --git a/src/sio/sio_fdc37c93x.c b/src/sio/sio_fdc37c93x.c index 47e73ebae..399469424 100644 --- a/src/sio/sio_fdc37c93x.c +++ b/src/sio/sio_fdc37c93x.c @@ -143,7 +143,7 @@ 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)) + if ((reg == 2) && !strncmp(machine_get_internal_name(), "acer", 4)) 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); @@ -1812,7 +1812,7 @@ fdc37c93x_reset(void *priv) 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")) { + if (machines[machine].init == machine_at_vectra54_init) { dev->gpio_pulldn[1] = 0x40; /* @@ -1850,12 +1850,12 @@ fdc37c93x_reset(void *priv) dev->gpio_pulldn[1] |= 0x00; else if (cpu_dmulti > 2.5) dev->gpio_pulldn[1] |= 0x80; - } else if (!strcmp(machine_get_internal_name(), "acerv62x")) + } else if (machines[machine].init == machine_at_acerv62x_init) dev->gpio_pulldn[1] = 0xfe; else dev->gpio_pulldn[1] = (dev->chip_id == 0x30) ? 0xff : 0xfd; - if (strstr(machine_get_internal_name(), "acer") != NULL) + if (!strncmp(machine_get_internal_name(), "acer", 4)) /* Bit 2 on the Acer V35N is the text/graphics toggle, bits 1 and 3 = ????. */ dev->gpio_pulldn[2] = 0x10; diff --git a/src/sio/sio_vl82c113.c b/src/sio/sio_vl82c113.c index bf63e9023..b5ecde3c9 100644 --- a/src/sio/sio_vl82c113.c +++ b/src/sio/sio_vl82c113.c @@ -134,7 +134,7 @@ vl82c113_init(UNUSED(const device_t *info)) { vl82c113_t *dev = (vl82c113_t *) calloc(1, sizeof(vl82c113_t)); - if (!strcmp(machine_get_internal_name(), "martin")) + if (machines[machine].init == machine_at_martin_init) dev->nvr = device_add(&martin_nvr_device); else dev->nvr = device_add(&amstrad_megapc_nvr_device); diff --git a/src/sio/sio_w83877.c b/src/sio/sio_w83877.c index a7a2b4ea2..55ee9dd6a 100644 --- a/src/sio/sio_w83877.c +++ b/src/sio/sio_w83877.c @@ -527,7 +527,7 @@ w83877_init(const device_t *info) dev->has_ide = (info->local >> 16) & 0xff; - if (!strcmp(machine_get_internal_name(), "ficpa2012")) { + if (machines[machine].init == machine_at_ficpa2012_init) { dev->dma_map[0] = 4; dev->dma_map[1] = 3; dev->dma_map[2] = 1; diff --git a/src/video/vid_cl54xx.c b/src/video/vid_cl54xx.c index 0a43ab4ce..d9c3d1a98 100644 --- a/src/video/vid_cl54xx.c +++ b/src/video/vid_cl54xx.c @@ -4339,7 +4339,7 @@ gd54xx_init(const device_t *info) case CIRRUS_ID_CLGD5436: if ((info->local & 0x200) && - !strstr(machine_get_internal_name(), "sb486pv")) { + (machines[machine].init == machine_at_sb486pv_init)) { romfn = NULL; gd54xx->has_bios = 0; } else From 80ebd5a92e7feef8678a1e8a8d35925540f905d2 Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Fri, 19 Sep 2025 20:09:14 -0300 Subject: [PATCH 11/36] Add integer casting macros --- src/include/86box/86box.h | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/include/86box/86box.h b/src/include/86box/86box.h index 33749d440..1c4c4790c 100644 --- a/src/include/86box/86box.h +++ b/src/include/86box/86box.h @@ -79,6 +79,15 @@ #define BCD16(x) ((((x) / 1000) << 12) | (((x) / 100) << 8) | BCD8(x)) #define BCD32(x) ((((x) / 10000000) << 28) | (((x) / 1000000) << 24) | (((x) / 100000) << 20) | (((x) / 10000) << 16) | BCD16(x)) +#define AS_U8(x) (*((uint8_t *) &(x))) +#define AS_U16(x) (*((uint16_t *) &(x))) +#define AS_U32(x) (*((uint32_t *) &(x))) +#define AS_U64(x) (*((uint64_t *) &(x))) +#define AS_I8(x) (*((int8_t *) &(x))) +#define AS_I16(x) (*((int16_t *) &(x))) +#define AS_I32(x) (*((int32_t *) &(x))) +#define AS_I64(x) (*((int64_t *) &(x))) + #if defined(__GNUC__) || defined(__clang__) # define UNLIKELY(x) __builtin_expect((x), 0) # define LIKELY(x) __builtin_expect((x), 1) From 7c25ca22e338977e9313e6e323b7182cdde43637 Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Fri, 19 Sep 2025 20:09:29 -0300 Subject: [PATCH 12/36] Convert existing code to the integer casting macros --- src/cdrom/cdrom_image_viso.c | 14 ++++----- src/cpu/386_common.h | 2 +- src/device/isapnp.c | 46 ++++++++++++++-------------- src/gdbstub.c | 18 +++++------ src/network/net_rtl8139.c | 4 +-- src/sio/sio_it86x1f.c | 4 +-- src/sound/snd_ac97_via.c | 22 +++++++------- src/sound/snd_audiopci.c | 4 +-- src/sound/snd_cmi8x38.c | 58 ++++++++++++++++++------------------ src/upi42.c | 2 +- src/video/vid_mga.c | 4 +-- 11 files changed, 89 insertions(+), 89 deletions(-) diff --git a/src/cdrom/cdrom_image_viso.c b/src/cdrom/cdrom_image_viso.c index 3eec6d5a1..5c47b745d 100644 --- a/src/cdrom/cdrom_image_viso.c +++ b/src/cdrom/cdrom_image_viso.c @@ -880,7 +880,7 @@ viso_init(const uint8_t id, const char *dirname, int *error) if (dirp) { /* create empty directory if opendir failed */ while ((readdir_entry = readdir(dirp))) { /* Ignore . and .. pseudo-directories. */ - if ((readdir_entry->d_name[0] == '.') && ((readdir_entry->d_name[1] == '\0') || (*((uint16_t *) &readdir_entry->d_name[1]) == '.'))) + if ((readdir_entry->d_name[0] == '.') && ((readdir_entry->d_name[1] == '\0') || (AS_U16(readdir_entry->d_name[1]) == '.'))) continue; children_count++; } @@ -927,7 +927,7 @@ viso_init(const uint8_t id, const char *dirname, int *error) /* Ignore . and .. pseudo-directories. */ if ((readdir_entry->d_name[0] == '.') && ((readdir_entry->d_name[1] == '\0') || - (*((uint16_t *) &readdir_entry->d_name[1]) == '.'))) + (AS_U16(readdir_entry->d_name[1]) == '.'))) continue; /* Add and fill entry. */ @@ -1245,8 +1245,8 @@ next_dir: /* Calculate checksum. */ uint16_t eltorito_checksum = 0; for (int i = 0; i < (p - data); i += 2) - eltorito_checksum -= le16_to_cpu(*((uint16_t *) &data[i])); - *((uint16_t *) &data[28]) = cpu_to_le16(eltorito_checksum); + eltorito_checksum -= le16_to_cpu(AS_U16(data[i])); + AS_U16(data[28]) = cpu_to_le16(eltorito_checksum); /* Now fill the default boot entry. */ *p++ = 0x88; /* bootable flag */ @@ -1552,11 +1552,11 @@ next_entry: uint32_t boot_size = entry->stats.st_size; if (boot_size % 512) /* round up */ boot_size += 512 - (boot_size % 512); - *((uint16_t *) &data[0]) = cpu_to_le16(boot_size / 512); + AS_U16(data[0]) = cpu_to_le16(boot_size / 512); } else { /* emulation */ - *((uint16_t *) &data[0]) = cpu_to_le16(1); + AS_U16(data[0]) = cpu_to_le16(1); } - *((uint32_t *) &data[2]) = cpu_to_le32(viso->all_sectors * base_factor); + AS_U32(data[2]) = cpu_to_le32(viso->all_sectors * base_factor); viso_pwrite(data, eltorito_offset, 6, 1, viso->tf.fp); } else { p = data; diff --git a/src/cpu/386_common.h b/src/cpu/386_common.h index 8e1f7533f..1efda9d4f 100644 --- a/src/cpu/386_common.h +++ b/src/cpu/386_common.h @@ -542,7 +542,7 @@ fastreadl_fetch(uint32_t a) # if (defined __amd64__ || defined _M_X64 || defined __aarch64__ || defined _M_ARM64) return *((uint32_t *) (((uintptr_t) &pccache2[a] & 0x00000000ffffffffULL) | ((uintptr_t) &pccache2[0] & 0xffffffff00000000ULL))); # else - return *((uint32_t *) &pccache2[a]); + return AS_U32(pccache2[a]); # endif } val = fastreadw_fetch(a); diff --git a/src/device/isapnp.c b/src/device/isapnp.c index ce8f7817f..31c0b6d62 100644 --- a/src/device/isapnp.c +++ b/src/device/isapnp.c @@ -815,22 +815,22 @@ isapnp_update_card_rom(void *priv, uint8_t *rom, uint16_t rom_size) isapnp_log("ISAPnP: >>%s Memory range %d with %d bytes at %06X-%06X to %06X-%06X, align %d", /* %s */ in_df ? ">" : "", /* %d */ mem_range, - /* %d */ *((uint16_t *) &card->rom[i + 8]), - /* %06X */ *((uint16_t *) &card->rom[i + 4]) << 8, + /* %d */ AS_U16(card->rom[i + 8]), + /* %06X */ AS_U16(card->rom[i + 4]) << 8, /* %06X */ ((card->rom[i + 3] & 0x4) ? /* High address. */ - (*((uint16_t *) &card->rom[i + 10]) << 8) : + (AS_U16(card->rom[i + 10]) << 8) : /* Range. */ - (*((uint16_t *) &card->rom[i + 4]) << 8)) + - (*((uint16_t *) &card->rom[i + 10]) << 8), - /* %06X */ *((uint16_t *) &card->rom[i + 6]) << 8, + (AS_U16(card->rom[i + 4]) << 8)) + + (AS_U16(card->rom[i + 10]) << 8), + /* %06X */ AS_U16(card->rom[i + 6]) << 8, /* %06X */ ((card->rom[i + 3] & 0x4) ? /* High address. */ - (*((uint16_t *) &card->rom[i + 10]) << 8) : + (AS_U16(card->rom[i + 10]) << 8) : /* Range. */ - (*((uint16_t *) &card->rom[i + 6]) << 8)) + - (*((uint16_t *) &card->rom[i + 10]) << 8), - /* %d */ *((uint16_t *) &card->rom[i + 8])); + (AS_U16(card->rom[i + 6]) << 8)) + + (AS_U16(card->rom[i + 10]) << 8), + /* %d */ AS_U16(card->rom[i + 8])); res = 1 << mem_range; mem_range++; } else { @@ -847,22 +847,22 @@ isapnp_update_card_rom(void *priv, uint8_t *rom, uint16_t rom_size) isapnp_log("ISAPnP: >>%s 32-bit memory range %d with %d bytes at %08X-%08X, align %d", /* %s */ in_df ? ">" : "", /* %d */ mem_range_32, - /* %d */ *((uint32_t *) &card->rom[i + 12]), - /* %08X */ *((uint32_t *) &card->rom[i + 4]), + /* %d */ AS_U32(card->rom[i + 12]), + /* %08X */ AS_U32(card->rom[i + 4]), /* %08X */ ((card->rom[i + 3] & 0x4) ? /* High address. */ - *((uint32_t *) &card->rom[i + 16]) : + AS_U32(card->rom[i + 16]) : /* Range. */ - *((uint32_t *) &card->rom[i + 4])) + - *((uint32_t *) &card->rom[i + 16]), - /* %08X */ *((uint32_t *) &card->rom[i + 8]), + AS_U32(card->rom[i + 4])) + + AS_U32(card->rom[i + 16]), + /* %08X */ AS_U32(card->rom[i + 8]), /* %08X */ ((card->rom[i + 3] & 0x4) ? /* High address. */ - *((uint32_t *) &card->rom[i + 16]) : + AS_U32(card->rom[i + 16]) : /* Range. */ - *((uint32_t *) &card->rom[i + 8])) + - *((uint32_t *) &card->rom[i + 16]), - /* %d */ *((uint32_t *) &card->rom[i + 12])); + AS_U32(card->rom[i + 8])) + + AS_U32(card->rom[i + 16]), + /* %d */ AS_U32(card->rom[i + 12])); res = 1 << (4 + mem_range_32); mem_range_32++; } @@ -972,7 +972,7 @@ isapnp_update_card_rom(void *priv, uint8_t *rom, uint16_t rom_size) else /* specific */ res = card->rom[i + 3] & 0x0f; - isapnp_log("ISAPnP: >>%s IRQ index %d with mask %04X, types %01X\n", in_df ? ">" : "", irq, *((uint16_t *) &card->rom[i + 1]), res); + isapnp_log("ISAPnP: >>%s IRQ index %d with mask %04X, types %01X\n", in_df ? ">" : "", irq, AS_U16(card->rom[i + 1]), res); ld->irq_types &= ~(0x0f << (4 * irq)); ld->irq_types |= res << (4 * irq); @@ -1038,7 +1038,7 @@ isapnp_update_card_rom(void *priv, uint8_t *rom, uint16_t rom_size) break; } - isapnp_log("ISAPnP: >>%s I/O range %d with %d ports at %04X-%04X, align %d, %d-bit decode\n", in_df ? ">" : "", io, card->rom[i + 7], *((uint16_t *) &card->rom[i + 2]), *((uint16_t *) &card->rom[i + 4]), card->rom[i + 6], (card->rom[i + 1] & 0x01) ? 16 : 10); + isapnp_log("ISAPnP: >>%s I/O range %d with %d ports at %04X-%04X, align %d, %d-bit decode\n", in_df ? ">" : "", io, card->rom[i + 7], AS_U16(card->rom[i + 2]), AS_U16(card->rom[i + 4]), card->rom[i + 6], (card->rom[i + 1] & 0x01) ? 16 : 10); if (card->rom[i + 1] & 0x01) ld->io_16bit |= 1 << io; @@ -1063,7 +1063,7 @@ isapnp_update_card_rom(void *priv, uint8_t *rom, uint16_t rom_size) break; } - isapnp_log("ISAPnP: >>%s Fixed I/O range %d with %d ports at %04X\n", in_df ? ">" : "", io, card->rom[i + 3], *((uint16_t *) &card->rom[i + 1])); + isapnp_log("ISAPnP: >>%s Fixed I/O range %d with %d ports at %04X\n", in_df ? ">" : "", io, card->rom[i + 3], AS_U16(card->rom[i + 1])); /* Fixed I/O port ranges of this kind are always 10-bit. */ ld->io_16bit &= ~(1 << io); diff --git a/src/gdbstub.c b/src/gdbstub.c index 2ae40d24c..120e71142 100644 --- a/src/gdbstub.c +++ b/src/gdbstub.c @@ -535,8 +535,8 @@ gdbstub_client_write_reg(int index, uint8_t *buf) break; case GDB_REG_EFLAGS: - cpu_state.flags = *((uint16_t *) &buf[0]); - cpu_state.eflags = *((uint16_t *) &buf[2]); + cpu_state.flags = AS_U16(buf[0]); + cpu_state.eflags = AS_U16(buf[2]); break; case GDB_REG_CS ... GDB_REG_GS: @@ -564,8 +564,8 @@ gdbstub_client_write_reg(int index, uint8_t *buf) case GDB_REG_ST0 ... GDB_REG_ST7: width = 10; x87_conv_t conv = { - .eind = { .ll = *((uint64_t *) &buf[0]) }, - .begin = *((uint16_t *) &buf[8]) + .eind = { .ll = AS_U64(buf[0]) }, + .begin = AS_U16(buf[8]) }; cpu_state.ST[(cpu_state.TOP + (index - GDB_REG_ST0)) & 7] = x87_from80(&conv); break; @@ -671,8 +671,8 @@ gdbstub_client_read_reg(int index, uint8_t *buf) break; case GDB_REG_EFLAGS: - *((uint16_t *) &buf[0]) = cpu_state.flags; - *((uint16_t *) &buf[2]) = cpu_state.eflags; + AS_U16(buf[0]) = cpu_state.flags; + AS_U16(buf[2]) = cpu_state.eflags; break; case GDB_REG_CS ... GDB_REG_GS: @@ -697,8 +697,8 @@ gdbstub_client_read_reg(int index, uint8_t *buf) width = 10; x87_conv_t conv; x87_to80(cpu_state.ST[(cpu_state.TOP + (index - GDB_REG_ST0)) & 7], &conv); - *((uint64_t *) &buf[0]) = conv.eind.ll; - *((uint16_t *) &buf[8]) = conv.begin; + AS_U64(buf[0]) = conv.eind.ll; + AS_U16(buf[8]) = conv.begin; break; case GDB_REG_FCTRL ... GDB_REG_FSTAT: @@ -757,7 +757,7 @@ gdbstub_client_packet(gdbstub_client_t *client) #ifdef GDBSTUB_CHECK_CHECKSUM gdbstub_client_read_hex(client, &rcv_checksum, 1); #endif - *((uint16_t *) &client->packet[--client->packet_pos]) = 0; + AS_U16(client->packet[--client->packet_pos]) = 0; #ifdef GDBSTUB_CHECK_CHECKSUM for (i = 0; i < client->packet_pos; i++) checksum += client->packet[i]; diff --git a/src/network/net_rtl8139.c b/src/network/net_rtl8139.c index 41ce86f6b..5f2c85b03 100644 --- a/src/network/net_rtl8139.c +++ b/src/network/net_rtl8139.c @@ -835,7 +835,7 @@ rtl8139_do_receive(void *priv, uint8_t *buf, int size_) uint32_t rx_space = rxdw0 & CP_RX_BUFFER_SIZE_MASK; /* write VLAN info to descriptor variables. */ - if (s->CpCmd & CPlusRxVLAN && bswap16(*((uint16_t *) &buf[ETH_ALEN * 2])) == 0x8100) { + if (s->CpCmd & CPlusRxVLAN && bswap16(AS_U16(buf[ETH_ALEN * 2])) == 0x8100) { dot1q_buf = &buf[ETH_ALEN * 2]; size -= VLAN_HLEN; /* if too small buffer, use the tailroom added duing expansion */ @@ -849,7 +849,7 @@ rtl8139_do_receive(void *priv, uint8_t *buf, int size_) rtl8139_log("C+ Rx mode : extracted vlan tag with tci: " "%u\n", - bswap16(*((uint16_t *) &dot1q_buf[ETHER_TYPE_LEN]))); + bswap16(AS_U16(dot1q_buf[ETHER_TYPE_LEN]))); } else { /* reset VLAN tag flag */ rxdw1 &= ~CP_RX_TAVA; diff --git a/src/sio/sio_it86x1f.c b/src/sio/sio_it86x1f.c index 324914355..c9eaea2b7 100644 --- a/src/sio/sio_it86x1f.c +++ b/src/sio/sio_it86x1f.c @@ -43,7 +43,7 @@ enum { ITE_IT8671F = 0x8681 }; -#define CHIP_ID *((uint16_t *) &dev->global_regs[0]) +#define CHIP_ID AS_U16(dev->global_regs[0]) static void it8671f_pnp_config_changed(uint8_t ld, isapnp_device_config_t *config, void *priv); static void it8661f_pnp_config_changed(uint8_t ld, isapnp_device_config_t *config, void *priv); @@ -571,7 +571,7 @@ it86x1f_pnp_write_vendor_reg(uint8_t ld, uint8_t reg, uint8_t val, void *priv) case 0x7e3: if ((CHIP_ID == ITE_IT8671F) && (val & 0x80)) - *((uint16_t *) &dev->gpio_regs[0x22]) = 0x0000; + AS_U16(dev->gpio_regs[0x22]) = 0x0000; break; case 0x7fb: diff --git a/src/sound/snd_ac97_via.c b/src/sound/snd_ac97_via.c index 2d994b08f..4b9a86d23 100644 --- a/src/sound/snd_ac97_via.c +++ b/src/sound/snd_ac97_via.c @@ -348,7 +348,7 @@ ac97_via_sgd_write(uint16_t addr, uint8_t val, void *priv) dev->sgd_regs[modem][addr & 0xf0] = (dev->sgd_regs[modem][addr & 0xf0] & ~0x47) | 0x80; /* Start at the specified entry pointer. */ - dev->sgd[modem][addr >> 4].entry_ptr = *((uint32_t *) &dev->sgd_regs[modem][(addr & 0xf0) | 0x4]) & 0xfffffffe; + dev->sgd[modem][addr >> 4].entry_ptr = AS_U32(dev->sgd_regs[modem][(addr & 0xf0) | 0x4]) & 0xfffffffe; dev->sgd[modem][addr >> 4].restart = 2; /* Start the actual SGD process. */ @@ -403,14 +403,14 @@ ac97_via_sgd_write(uint16_t addr, uint8_t val, void *priv) if (val & 1) { /* return 0x0000 on unaligned reads (real 686B behavior) */ dev->sgd_regs[modem][0x80] = dev->sgd_regs[modem][0x81] = 0x00; } else { - *((uint16_t *) &dev->codec_shadow[modem].regs_codec[i][val & 0x7f]) = *((uint16_t *) &dev->sgd_regs[modem][0x80]) = ac97_codec_readw(codec, val); + AS_U16(dev->codec_shadow[modem].regs_codec[i][val & 0x7f]) = AS_U16(dev->sgd_regs[modem][0x80]) = ac97_codec_readw(codec, val); } /* Flag data/status/index for this codec as valid. */ dev->sgd_regs[modem][0x83] |= 0x02 << (i << 1); } else if (!(val & 1)) { /* do nothing on unaligned writes */ ac97_codec_writew(codec, val, - *((uint16_t *) &dev->codec_shadow[modem].regs_codec[i][val & 0x7f]) = *((uint16_t *) &dev->sgd_regs[modem][0x80])); + AS_U16(dev->codec_shadow[modem].regs_codec[i][val & 0x7f]) = AS_U16(dev->sgd_regs[modem][0x80])); /* Update primary audio codec state if that codec was written to. */ if (!modem && !i) { @@ -579,7 +579,7 @@ ac97_via_sgd_process(void *priv) if (sgd->restart) { /* (Re)load entry pointer if required. */ if (sgd->restart & 2) - sgd->entry_ptr = *((uint32_t *) &dev->sgd_regs[sgd->modem][sgd->id | 0x4]) & 0xfffffffe; /* TODO: probe real hardware - does "even addr" actually mean dword aligned? */ + sgd->entry_ptr = AS_U32(dev->sgd_regs[sgd->modem][sgd->id | 0x4]) & 0xfffffffe; /* TODO: probe real hardware - does "even addr" actually mean dword aligned? */ sgd->restart = 0; /* Read entry. */ @@ -605,11 +605,11 @@ ac97_via_sgd_process(void *priv) if (sgd->id & 0x10) { /* Write channel: read data from FIFO. */ - // mem_writel_phys(sgd->sample_ptr, *((uint32_t *) &sgd->fifo[sgd->fifo_end & (sizeof(sgd->fifo) - 1)])); + // mem_writel_phys(sgd->sample_ptr, AS_U32(sgd->fifo[sgd->fifo_end & (sizeof(sgd->fifo) - 1)])); dma_bm_write(sgd->sample_ptr, &sgd->fifo[sgd->fifo_end & (sizeof(sgd->fifo) - 1)], 4, 4); } else { /* Read channel: write data to FIFO. */ - // *((uint32_t *) &sgd->fifo[sgd->fifo_end & (sizeof(sgd->fifo) - 1)]) = mem_readl_phys(sgd->sample_ptr); + // AS_U32(sgd->fifo[sgd->fifo_end & (sizeof(sgd->fifo) - 1)]) = mem_readl_phys(sgd->sample_ptr); dma_bm_read(sgd->sample_ptr, &sgd->fifo[sgd->fifo_end & (sizeof(sgd->fifo) - 1)], 4, 4); } sgd->fifo_end += 4; @@ -709,7 +709,7 @@ ac97_via_poll_stereo(void *priv) case 0x20: /* Mono, 16-bit PCM */ if ((sgd->fifo_end - sgd->fifo_pos) >= 2) { - sgd->out_l = sgd->out_r = *((uint16_t *) &sgd->fifo[sgd->fifo_pos & (sizeof(sgd->fifo) - 1)]); + sgd->out_l = sgd->out_r = AS_U16(sgd->fifo[sgd->fifo_pos & (sizeof(sgd->fifo) - 1)]); sgd->fifo_pos += 2; return; } @@ -717,9 +717,9 @@ ac97_via_poll_stereo(void *priv) case 0x30: /* Stereo, 16-bit PCM */ if ((sgd->fifo_end - sgd->fifo_pos) >= 4) { - sgd->out_l = *((uint16_t *) &sgd->fifo[sgd->fifo_pos & (sizeof(sgd->fifo) - 1)]); + sgd->out_l = AS_U16(sgd->fifo[sgd->fifo_pos & (sizeof(sgd->fifo) - 1)]); sgd->fifo_pos += 2; - sgd->out_r = *((uint16_t *) &sgd->fifo[sgd->fifo_pos & (sizeof(sgd->fifo) - 1)]); + sgd->out_r = AS_U16(sgd->fifo[sgd->fifo_pos & (sizeof(sgd->fifo) - 1)]); sgd->fifo_pos += 2; return; } @@ -749,9 +749,9 @@ ac97_via_poll_fm(void *priv) /* Feed next sample from the FIFO. The data format is not documented, but it probes as 16-bit stereo at 24 KHz. */ if ((sgd->fifo_end - sgd->fifo_pos) >= 4) { - sgd->out_l = *((uint16_t *) &sgd->fifo[sgd->fifo_pos & (sizeof(sgd->fifo) - 1)]); + sgd->out_l = AS_U16(sgd->fifo[sgd->fifo_pos & (sizeof(sgd->fifo) - 1)]); sgd->fifo_pos += 2; - sgd->out_r = *((uint16_t *) &sgd->fifo[sgd->fifo_pos & (sizeof(sgd->fifo) - 1)]); + sgd->out_r = AS_U16(sgd->fifo[sgd->fifo_pos & (sizeof(sgd->fifo) - 1)]); sgd->fifo_pos += 2; return; } diff --git a/src/sound/snd_audiopci.c b/src/sound/snd_audiopci.c index 1ca547650..23c4863c7 100644 --- a/src/sound/snd_audiopci.c +++ b/src/sound/snd_audiopci.c @@ -438,8 +438,8 @@ es137x_reset(void *priv) /* Default subsystem ID. */ dev->subsys_lock = 0x00; - *((uint16_t *) &dev->subsys_id[0]) = (dev->type == AUDIOPCI_ES1370) ? 0x4942 : 0x1274; - *((uint16_t *) &dev->subsys_id[2]) = (dev->type == AUDIOPCI_ES1370) ? 0x4c4c : 0x1371; + AS_U16(dev->subsys_id[0]) = (dev->type == AUDIOPCI_ES1370) ? 0x4942 : 0x1274; + AS_U16(dev->subsys_id[2]) = (dev->type == AUDIOPCI_ES1370) ? 0x4c4c : 0x1371; /* Interrupt/Chip Select Control Register, Address 00H Addressable as byte, word, longword */ diff --git a/src/sound/snd_cmi8x38.c b/src/sound/snd_cmi8x38.c index a41f53865..5148ebd00 100644 --- a/src/sound/snd_cmi8x38.c +++ b/src/sound/snd_cmi8x38.c @@ -147,7 +147,7 @@ static void cmi8x38_update_irqs(cmi8x38_t *dev) { /* Calculate and use the INTR flag. */ - if (*((uint32_t *) &dev->io_regs[0x10]) & 0x0401c003) { + if (AS_U32(dev->io_regs[0x10]) & 0x0401c003) { dev->io_regs[0x13] |= 0x80; pci_set_irq(dev->pci_slot, PCI_INTA, &dev->irq_state); cmi8x38_log("CMI8x38: Raising IRQ\n"); @@ -912,19 +912,19 @@ cmi8x38_write(uint16_t addr, uint8_t val, void *priv) case 0x80 ... 0x83: case 0x88 ... 0x8b: dev->io_regs[addr] = val; - dev->dma[(addr & 0x78) >> 3].sample_ptr = *((uint32_t *) &dev->io_regs[addr & 0xfc]); + dev->dma[(addr & 0x78) >> 3].sample_ptr = AS_U32(dev->io_regs[addr & 0xfc]); return; case 0x84 ... 0x85: case 0x8c ... 0x8d: dev->io_regs[addr] = val; - dev->dma[(addr & 0x78) >> 3].frame_count_dma = dev->dma[(addr & 0x78) >> 3].sample_count_out = *((uint16_t *) &dev->io_regs[addr & 0xfe]) + 1; + dev->dma[(addr & 0x78) >> 3].frame_count_dma = dev->dma[(addr & 0x78) >> 3].sample_count_out = AS_U16(dev->io_regs[addr & 0xfe]) + 1; return; case 0x86 ... 0x87: case 0x8e ... 0x8f: dev->io_regs[addr] = val; - dev->dma[(addr & 0x78) >> 3].frame_count_fragment = *((uint16_t *) &dev->io_regs[addr & 0xfe]) + 1; + dev->dma[(addr & 0x78) >> 3].frame_count_fragment = AS_U16(dev->io_regs[addr & 0xfe]) + 1; return; case 0x92: @@ -1074,19 +1074,19 @@ cmi8x38_dma_process(void *priv) /* Set up base address and counters. Nothing reads sample_count_out; it's implemented as an assumption. */ dma->restart = 0; - dma->sample_ptr = *((uint32_t *) &dev->io_regs[dma->reg]); - dma->frame_count_dma = dma->sample_count_out = *((uint16_t *) &dev->io_regs[dma->reg | 0x4]) + 1; - dma->frame_count_fragment = *((uint16_t *) &dev->io_regs[dma->reg | 0x6]) + 1; + dma->sample_ptr = AS_U32(dev->io_regs[dma->reg]); + dma->frame_count_dma = dma->sample_count_out = AS_U16(dev->io_regs[dma->reg | 0x4]) + 1; + dma->frame_count_fragment = AS_U16(dev->io_regs[dma->reg | 0x6]) + 1; cmi8x38_log("CMI8x38: Starting DMA %d at %08X (count %04X fragment %04X)\n", dma->id, dma->sample_ptr, dma->frame_count_dma, dma->frame_count_fragment); } if (dma_status & 0x01) { /* Write channel: read data from FIFO. */ - mem_writel_phys(dma->sample_ptr, *((uint32_t *) &dma->fifo[dma->fifo_end & (sizeof(dma->fifo) - 1)])); + mem_writel_phys(dma->sample_ptr, AS_U32(dma->fifo[dma->fifo_end & (sizeof(dma->fifo) - 1)])); } else { /* Read channel: write data to FIFO. */ - *((uint32_t *) &dma->fifo[dma->fifo_end & (sizeof(dma->fifo) - 1)]) = mem_readl_phys(dma->sample_ptr); + AS_U32(dma->fifo[dma->fifo_end & (sizeof(dma->fifo) - 1)]) = mem_readl_phys(dma->sample_ptr); } dma->fifo_end += 4; dma->sample_ptr += 4; @@ -1094,7 +1094,7 @@ cmi8x38_dma_process(void *priv) /* Check if the fragment size was reached. */ if (--dma->frame_count_fragment <= 0) { /* Reset fragment counter. */ - dma->frame_count_fragment = *((uint16_t *) &dev->io_regs[dma->reg | 0x6]) + 1; + dma->frame_count_fragment = AS_U16(dev->io_regs[dma->reg | 0x6]) + 1; #ifdef ENABLE_CMI8X38_LOG if (dma->frame_count_fragment > 1) /* avoid log spam if fragment counting is unused, like on the newer WDM drivers (cmudax3) */ cmi8x38_log("CMI8x38: DMA %d fragment size reached at %04X frames left", dma->id, dma->frame_count_dma - 1); @@ -1181,7 +1181,7 @@ cmi8x38_poll(void *priv) case 0x02: /* Mono, 16-bit PCM */ if ((dma->fifo_end - dma->fifo_pos) >= 2) { - *out_l = *out_r = *((uint16_t *) &dma->fifo[dma->fifo_pos & (sizeof(dma->fifo) - 1)]); + *out_l = *out_r = AS_U16(dma->fifo[dma->fifo_pos & (sizeof(dma->fifo) - 1)]); dma->fifo_pos += 2; dma->sample_count_out -= 2; goto n4spk3d; @@ -1192,9 +1192,9 @@ cmi8x38_poll(void *priv) switch (dma->channels) { case 2: if ((dma->fifo_end - dma->fifo_pos) >= 4) { - *out_l = *((uint16_t *) &dma->fifo[dma->fifo_pos & (sizeof(dma->fifo) - 1)]); + *out_l = AS_U16(dma->fifo[dma->fifo_pos & (sizeof(dma->fifo) - 1)]); dma->fifo_pos += 2; - *out_r = *((uint16_t *) &dma->fifo[dma->fifo_pos & (sizeof(dma->fifo) - 1)]); + *out_r = AS_U16(dma->fifo[dma->fifo_pos & (sizeof(dma->fifo) - 1)]); dma->fifo_pos += 2; dma->sample_count_out -= 4; goto n4spk3d; @@ -1203,13 +1203,13 @@ cmi8x38_poll(void *priv) case 4: if ((dma->fifo_end - dma->fifo_pos) >= 8) { - dma->out_fl = *((uint16_t *) &dma->fifo[dma->fifo_pos & (sizeof(dma->fifo) - 1)]); + dma->out_fl = AS_U16(dma->fifo[dma->fifo_pos & (sizeof(dma->fifo) - 1)]); dma->fifo_pos += 2; - dma->out_fr = *((uint16_t *) &dma->fifo[dma->fifo_pos & (sizeof(dma->fifo) - 1)]); + dma->out_fr = AS_U16(dma->fifo[dma->fifo_pos & (sizeof(dma->fifo) - 1)]); dma->fifo_pos += 2; - dma->out_rl = *((uint16_t *) &dma->fifo[dma->fifo_pos & (sizeof(dma->fifo) - 1)]); + dma->out_rl = AS_U16(dma->fifo[dma->fifo_pos & (sizeof(dma->fifo) - 1)]); dma->fifo_pos += 2; - dma->out_rr = *((uint16_t *) &dma->fifo[dma->fifo_pos & (sizeof(dma->fifo) - 1)]); + dma->out_rr = AS_U16(dma->fifo[dma->fifo_pos & (sizeof(dma->fifo) - 1)]); dma->fifo_pos += 2; dma->sample_count_out -= 8; return; @@ -1218,15 +1218,15 @@ cmi8x38_poll(void *priv) case 5: /* not supported by WDM and Linux drivers; channel layout assumed */ if ((dma->fifo_end - dma->fifo_pos) >= 10) { - dma->out_fl = *((uint16_t *) &dma->fifo[dma->fifo_pos & (sizeof(dma->fifo) - 1)]); + dma->out_fl = AS_U16(dma->fifo[dma->fifo_pos & (sizeof(dma->fifo) - 1)]); dma->fifo_pos += 2; - dma->out_fr = *((uint16_t *) &dma->fifo[dma->fifo_pos & (sizeof(dma->fifo) - 1)]); + dma->out_fr = AS_U16(dma->fifo[dma->fifo_pos & (sizeof(dma->fifo) - 1)]); dma->fifo_pos += 2; - dma->out_rl = *((uint16_t *) &dma->fifo[dma->fifo_pos & (sizeof(dma->fifo) - 1)]); + dma->out_rl = AS_U16(dma->fifo[dma->fifo_pos & (sizeof(dma->fifo) - 1)]); dma->fifo_pos += 2; - dma->out_rr = *((uint16_t *) &dma->fifo[dma->fifo_pos & (sizeof(dma->fifo) - 1)]); + dma->out_rr = AS_U16(dma->fifo[dma->fifo_pos & (sizeof(dma->fifo) - 1)]); dma->fifo_pos += 2; - dma->out_c = *((uint16_t *) &dma->fifo[dma->fifo_pos & (sizeof(dma->fifo) - 1)]); + dma->out_c = AS_U16(dma->fifo[dma->fifo_pos & (sizeof(dma->fifo) - 1)]); dma->fifo_pos += 2; dma->sample_count_out -= 10; return; @@ -1235,17 +1235,17 @@ cmi8x38_poll(void *priv) case 6: if ((dma->fifo_end - dma->fifo_pos) >= 12) { - dma->out_fl = *((uint16_t *) &dma->fifo[dma->fifo_pos & (sizeof(dma->fifo) - 1)]); + dma->out_fl = AS_U16(dma->fifo[dma->fifo_pos & (sizeof(dma->fifo) - 1)]); dma->fifo_pos += 2; - dma->out_fr = *((uint16_t *) &dma->fifo[dma->fifo_pos & (sizeof(dma->fifo) - 1)]); + dma->out_fr = AS_U16(dma->fifo[dma->fifo_pos & (sizeof(dma->fifo) - 1)]); dma->fifo_pos += 2; - dma->out_rl = *((uint16_t *) &dma->fifo[dma->fifo_pos & (sizeof(dma->fifo) - 1)]); + dma->out_rl = AS_U16(dma->fifo[dma->fifo_pos & (sizeof(dma->fifo) - 1)]); dma->fifo_pos += 2; - dma->out_rr = *((uint16_t *) &dma->fifo[dma->fifo_pos & (sizeof(dma->fifo) - 1)]); + dma->out_rr = AS_U16(dma->fifo[dma->fifo_pos & (sizeof(dma->fifo) - 1)]); dma->fifo_pos += 2; - dma->out_c = *((uint16_t *) &dma->fifo[dma->fifo_pos & (sizeof(dma->fifo) - 1)]); + dma->out_c = AS_U16(dma->fifo[dma->fifo_pos & (sizeof(dma->fifo) - 1)]); dma->fifo_pos += 2; - dma->out_lfe = *((uint16_t *) &dma->fifo[dma->fifo_pos & (sizeof(dma->fifo) - 1)]); + dma->out_lfe = AS_U16(dma->fifo[dma->fifo_pos & (sizeof(dma->fifo) - 1)]); dma->fifo_pos += 2; dma->sample_count_out -= 12; return; @@ -1265,7 +1265,7 @@ cmi8x38_poll(void *priv) *out_l = *out_r = 0; /* Stop playback if DMA is disabled. */ - if ((*((uint32_t *) &dev->io_regs[0x00]) & (0x00010001 << dma->id)) != (0x00010000 << dma->id)) { + if ((AS_U32(dev->io_regs[0x00]) & (0x00010001 << dma->id)) != (0x00010000 << dma->id)) { cmi8x38_log("CMI8x38: Stopping playback of DMA channel %d\n", dma->id); dma->playback_enabled = 0; } diff --git a/src/upi42.c b/src/upi42.c index 50f5c44c9..62111d889 100644 --- a/src/upi42.c +++ b/src/upi42.c @@ -875,7 +875,7 @@ upi42_exec(void *priv) } /* Fetch instruction. */ - uint32_t fetchdat = *((uint32_t *) &upi42->rom[upi42->pc]); + uint32_t fetchdat = AS_U32(upi42->rom[upi42->pc]); /* Decode instruction. */ uint8_t insn = fetchdat & 0xff; diff --git a/src/video/vid_mga.c b/src/video/vid_mga.c index 564136428..7dd9218cf 100644 --- a/src/video/vid_mga.c +++ b/src/video/vid_mga.c @@ -3753,10 +3753,10 @@ blit_iload_iload(mystique_t *mystique, uint32_t data, int size) case MACCESS_PWIDTH_24: if (mystique->dwgreg.xdst >= mystique->dwgreg.cxleft && mystique->dwgreg.xdst <= mystique->dwgreg.cxright && mystique->dwgreg.ydst_lin >= mystique->dwgreg.ytop && mystique->dwgreg.ydst_lin <= mystique->dwgreg.ybot) { - uint32_t old_dst = *((uint32_t *) &svga->vram[((mystique->dwgreg.ydst_lin + mystique->dwgreg.xdst) * 3) & mystique->vram_mask]); + uint32_t old_dst = AS_U32(svga->vram[((mystique->dwgreg.ydst_lin + mystique->dwgreg.xdst) * 3) & mystique->vram_mask]); dst = bitop(data64, old_dst, mystique->dwgreg.dwgctrl_running); - *((uint32_t *) &svga->vram[((mystique->dwgreg.ydst_lin + mystique->dwgreg.xdst) * 3) & mystique->vram_mask]) = (dst & 0xffffff) | (old_dst & 0xff000000); + AS_U32(svga->vram[((mystique->dwgreg.ydst_lin + mystique->dwgreg.xdst) * 3) & mystique->vram_mask]) = (dst & 0xffffff) | (old_dst & 0xff000000); svga->changedvram[(((mystique->dwgreg.ydst_lin + mystique->dwgreg.xdst) * 3) & mystique->vram_mask) >> 12] = changeframecount; } From a314ff44d83e0944df82508e99536c6a4492b5bc Mon Sep 17 00:00:00 2001 From: win2kgamer <47463859+win2kgamer@users.noreply.github.com> Date: Sat, 20 Sep 2025 00:57:46 -0500 Subject: [PATCH 13/36] AD1848: I23 register on CS4231 is read-only, fixes codec misdetection on Linux --- src/sound/snd_ad1848.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/sound/snd_ad1848.c b/src/sound/snd_ad1848.c index ff9d36318..ef6f38041 100644 --- a/src/sound/snd_ad1848.c +++ b/src/sound/snd_ad1848.c @@ -488,6 +488,8 @@ readonly_x: ad1848_log("AD1848: write(X%d, %02X)\n", ad1848->xindex, val); return; } + if (ad1848->type == AD1848_TYPE_CS4231) /* I23 is reserved and read-only on CS4231 non-A */ + goto readonly_i; break; case 24: From 999812e9b986229fc5be853419dfdd178b84058b Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Sat, 20 Sep 2025 12:40:58 +0600 Subject: [PATCH 14/36] Bump GLSL version of default shaders to 1.50 --- src/qt/qt_openglrenderer.cpp | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/src/qt/qt_openglrenderer.cpp b/src/qt/qt_openglrenderer.cpp index 962fa4d30..b74b74202 100644 --- a/src/qt/qt_openglrenderer.cpp +++ b/src/qt/qt_openglrenderer.cpp @@ -75,11 +75,7 @@ extern int video_focus_dim; extern int video_refresh_rate; const char* vertex_shader_default_tex_src = -#ifdef __APPLE__ "#version 150\n" -#else - "#version 130\n" -#endif "\n" "in vec4 VertexCoord;\n" "in vec2 TexCoord;\n" @@ -93,11 +89,7 @@ const char* vertex_shader_default_tex_src = "}\n"; const char* fragment_shader_default_tex_src = -#ifdef __APPLE__ "#version 150\n" -#else - "#version 130\n" -#endif "\n" "in vec2 texCoord;\n" "uniform sampler2D Texture;\n" @@ -111,11 +103,7 @@ const char* fragment_shader_default_tex_src = "}\n"; const char* vertex_shader_default_color_src = -#ifdef __APPLE__ "#version 150\n" -#else - "#version 130\n" -#endif "\n" "in vec4 VertexCoord;\n" "in vec4 Color;\n" @@ -129,11 +117,7 @@ const char* vertex_shader_default_color_src = "}\n"; const char* fragment_shader_default_color_src = -#ifdef __APPLE__ "#version 150\n" -#else - "#version 130\n" -#endif "\n" "in vec4 color;\n" "\n" From cfa00e9e55d1c954a4b8ca62c94239f1e471e7af Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Sat, 20 Sep 2025 11:20:33 -0300 Subject: [PATCH 15/36] Add a couple more cast macros --- src/include/86box/86box.h | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/src/include/86box/86box.h b/src/include/86box/86box.h index 1c4c4790c..701e93e28 100644 --- a/src/include/86box/86box.h +++ b/src/include/86box/86box.h @@ -79,14 +79,16 @@ #define BCD16(x) ((((x) / 1000) << 12) | (((x) / 100) << 8) | BCD8(x)) #define BCD32(x) ((((x) / 10000000) << 28) | (((x) / 1000000) << 24) | (((x) / 100000) << 20) | (((x) / 10000) << 16) | BCD16(x)) -#define AS_U8(x) (*((uint8_t *) &(x))) -#define AS_U16(x) (*((uint16_t *) &(x))) -#define AS_U32(x) (*((uint32_t *) &(x))) -#define AS_U64(x) (*((uint64_t *) &(x))) -#define AS_I8(x) (*((int8_t *) &(x))) -#define AS_I16(x) (*((int16_t *) &(x))) -#define AS_I32(x) (*((int32_t *) &(x))) -#define AS_I64(x) (*((int64_t *) &(x))) +#define AS_U8(x) (*((uint8_t *) &(x))) +#define AS_U16(x) (*((uint16_t *) &(x))) +#define AS_U32(x) (*((uint32_t *) &(x))) +#define AS_U64(x) (*((uint64_t *) &(x))) +#define AS_I8(x) (*((int8_t *) &(x))) +#define AS_I16(x) (*((int16_t *) &(x))) +#define AS_I32(x) (*((int32_t *) &(x))) +#define AS_I64(x) (*((int64_t *) &(x))) +#define AS_FLOAT(x) (*((float *) &(x))) +#define AS_DOUBLE(x) (*((double *) &(x))) #if defined(__GNUC__) || defined(__clang__) # define UNLIKELY(x) __builtin_expect((x), 0) From 37bb70447424e5609934536d459a8af1877523ad Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Sun, 21 Sep 2025 05:16:26 +0600 Subject: [PATCH 16/36] Always use desktop OpenGL implementations --- src/qt/qt_main.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/qt/qt_main.cpp b/src/qt/qt_main.cpp index 2bc3eacbb..a48fde924 100644 --- a/src/qt/qt_main.cpp +++ b/src/qt/qt_main.cpp @@ -540,6 +540,7 @@ main(int argc, char *argv[]) #if QT_VERSION >= QT_VERSION_CHECK(5, 14, 0) QApplication::setHighDpiScaleFactorRoundingPolicy(Qt::HighDpiScaleFactorRoundingPolicy::PassThrough); #endif + QApplication::setAttribute(Qt::AA_UseDesktopOpenGL); QApplication app(argc, argv); QLocale::setDefault(QLocale::C); From b268f95b191b9b0484986cb05e038f32a10ed9ff Mon Sep 17 00:00:00 2001 From: win2kgamer <47463859+win2kgamer@users.noreply.github.com> Date: Sat, 20 Sep 2025 23:32:11 -0500 Subject: [PATCH 17/36] Add the Yamaha YMF-71x (OPL3-SA2/3) audio controllers (#6200) * Initial implementation of the Yamaha YMF-71x (OPL3-SA2/3) audio controllers * Give the Intel AN430TX its onboard YMF-715 * Forgotten change to snd_sb_dsp.c * Disable logging, code cleanup * Use 32K default SB DSP DMA buffer globally and remove the Yamaha subtype * Hook up master volume control to the OPL3 as well * Use custom CD audio filter to apply master volume * Initial implementation of the OPL3-SA3 bass/treble controls * Improve CD audio volume filter * Implement the power management registers * Move master volume recalc to its own function and update on register write * Correct YMF-719 PnP ROM filename * Cleanup --- src/device/isapnp.c | 2 + src/include/86box/isapnp.h | 3 +- src/include/86box/sound.h | 3 + src/machine/m_at_socket7.c | 3 + src/machine/machine_table.c | 4 +- src/sound/CMakeLists.txt | 1 + src/sound/snd_sb_dsp.c | 2 +- src/sound/snd_ymf71x.c | 882 ++++++++++++++++++++++++++++++++++++ src/sound/sound.c | 2 + 9 files changed, 898 insertions(+), 4 deletions(-) create mode 100644 src/sound/snd_ymf71x.c diff --git a/src/device/isapnp.c b/src/device/isapnp.c index ce8f7817f..003f05852 100644 --- a/src/device/isapnp.c +++ b/src/device/isapnp.c @@ -1117,6 +1117,8 @@ isapnp_enable_card(void *priv, uint8_t enable) /* Enable or disable the card. */ if (!!enable ^ !!card->enable) card->state = (enable == ISAPNP_CARD_FORCE_CONFIG) ? PNP_STATE_CONFIG : PNP_STATE_WAIT_FOR_KEY; + if (enable == ISAPNP_CARD_FORCE_SLEEP) + card->state = PNP_STATE_SLEEP; int old_enable = card->enable; card->enable = enable; diff --git a/src/include/86box/isapnp.h b/src/include/86box/isapnp.h index 5e48b7c18..6f7eb1185 100644 --- a/src/include/86box/isapnp.h +++ b/src/include/86box/isapnp.h @@ -28,7 +28,8 @@ enum { ISAPNP_CARD_DISABLE = 0, ISAPNP_CARD_ENABLE = 1, ISAPNP_CARD_FORCE_CONFIG = 2, /* cheat code for UMC UM8669F */ - ISAPNP_CARD_NO_KEY = 3 /* cheat code for Crystal CS423x */ + ISAPNP_CARD_NO_KEY = 3, /* cheat code for Crystal CS423x */ + ISAPNP_CARD_FORCE_SLEEP = 4 /* cheat code for Yamaha YMF-71x */ }; typedef struct isapnp_device_config_t { diff --git a/src/include/86box/sound.h b/src/include/86box/sound.h index 76a04356c..bbd2ff820 100644 --- a/src/include/86box/sound.h +++ b/src/include/86box/sound.h @@ -240,6 +240,9 @@ extern const device_t ncr_business_audio_device; /* Yamaha YMF-7xx */ extern const device_t ymf701_device; +extern const device_t ymf715_onboard_device; +extern const device_t ymf718_device; +extern const device_t ymf719_device; #ifdef USE_LIBSERIALPORT /* External Audio device OPL2Board (Host Connected hardware)*/ diff --git a/src/machine/m_at_socket7.c b/src/machine/m_at_socket7.c index 2b02c5bf1..b3d504148 100644 --- a/src/machine/m_at_socket7.c +++ b/src/machine/m_at_socket7.c @@ -1365,6 +1365,9 @@ machine_at_an430tx_init(const machine_t *model) device_add(&intel_flash_bxt_ami_device); spd_register(SPD_TYPE_SDRAM, 0x3, 128); + if (sound_card_current[0] == SOUND_INTERNAL) + machine_snd = device_add(machine_get_snd_device(machine)); + return ret; } diff --git a/src/machine/machine_table.c b/src/machine/machine_table.c index aa4f44c2e..cbc48db1d 100644 --- a/src/machine/machine_table.c +++ b/src/machine/machine_table.c @@ -15352,7 +15352,7 @@ const machine_t machines[] = { .max_multi = 3.5 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI, /* Machine has internal video: ATI Mach64GT-B 3D Rage II */ + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI | MACHINE_SOUND | MACHINE_GAMEPORT, /* Machine has internal video: ATI Mach64GT-B 3D Rage II */ .ram = { .min = 8192, .max = 262144, @@ -15371,7 +15371,7 @@ const machine_t machines[] = { .fdc_device = NULL, .sio_device = NULL, .vid_device = NULL, - .snd_device = NULL, + .snd_device = &ymf715_onboard_device, .net_device = NULL }, /* The BIOS sends KBC command BB and expects it to output a byte, which is AMI KBC behavior. diff --git a/src/sound/CMakeLists.txt b/src/sound/CMakeLists.txt index fdc60b971..ccb54ab19 100644 --- a/src/sound/CMakeLists.txt +++ b/src/sound/CMakeLists.txt @@ -52,6 +52,7 @@ add_library(snd OBJECT snd_optimc.c snd_opl_esfm.c snd_ymf701.c + snd_ymf71x.c ) # TODO: Should platform-specific audio driver be here? diff --git a/src/sound/snd_sb_dsp.c b/src/sound/snd_sb_dsp.c index 76956c417..80f6c9555 100644 --- a/src/sound/snd_sb_dsp.c +++ b/src/sound/snd_sb_dsp.c @@ -515,7 +515,7 @@ sb_dsp_reset(sb_dsp_t *dsp) dsp->sb_command = 0; dsp->sb_8_length = 0xffff; - dsp->sb_8_autolen = 0xffff; + dsp->sb_8_autolen = 0x7fff; dsp->sb_irq8 = 0; dsp->sb_irq16 = 0; diff --git a/src/sound/snd_ymf71x.c b/src/sound/snd_ymf71x.c new file mode 100644 index 000000000..2bede0555 --- /dev/null +++ b/src/sound/snd_ymf71x.c @@ -0,0 +1,882 @@ +/* + * 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. + * + * Yamaha YMF-71x (OPL3-SA2/3) audio controller emulation. + * + * + * + * Authors: Cacodemon345 + * Eluan Costa Miranda + * win2kgamer + * + * Copyright 2022 Cacodemon345. + * Copyright 2020 Eluan Costa Miranda. + * Copyright 2025 win2kgamer + */ + +#include +#include +#include +#include +#include +#include +#include +#define HAVE_STDARG_H + +#include <86box/86box.h> +#include <86box/device.h> +#include <86box/io.h> +#include <86box/midi.h> +#include <86box/timer.h> +#include <86box/pic.h> +#include <86box/sound.h> +#include <86box/gameport.h> +#include <86box/snd_ad1848.h> +#include <86box/snd_sb.h> +#include <86box/mem.h> +#include <86box/rom.h> +#include <86box/plat_unused.h> +#include <86box/log.h> +#include <86box/i2c.h> +#include <86box/isapnp.h> +#include <86box/nvr.h> +#include <86box/snd_opl.h> +#include <86box/filters.h> +#include "cpu.h" + +#define PNP_ROM_YMF718 "roms/sound/ymf71x/UFC-101.BIN" +#define PNP_ROM_YMF719 "roms/sound/ymf71x/PnP1.BIN" + +#define YMF71X_NO_EEPROM 0x100 + +#ifdef ENABLE_YMF71X_LOG +int ymf71x_do_log = ENABLE_YMF71X_LOG; + +static void +ymf71x_log(void *priv, const char *fmt, ...) +{ + if (ymf71x_do_log) { + va_list ap; + va_start(ap, fmt); + log_out(priv, fmt, ap); + va_end(ap); + } +} +#else +# define ymf71x_log(fmt, ...) +#endif + +static const uint8_t ymf71x_init_key[32] = { 0xB1, 0xD8, 0x6C, 0x36, 0x9B, 0x4D, 0xA6, 0xD3, /* "YAMAHA Key" from the datasheet */ + 0x69, 0xB4, 0x5A, 0xAD, 0xD6, 0xEB, 0x75, 0xBA, + 0xDD, 0xEE, 0xF7, 0x7B, 0x3D, 0x9E, 0xCF, 0x67, + 0x33, 0x19, 0x8C, 0x46, 0xA3, 0x51, 0xA8, 0x54 }; + +/* Reversed attenuation values borrowed from snd_sb.c */ +/* YMF-71x master volume attenuation is -30dB when all bits are 1, 0dB when all bits are 0 */ +static const double ymf71x_att_2dbstep_4bits[] = { + 32767.0, 26027.0, 20674.0, 16422.0, 13044.0, 10362.0, 8230.0, 6537.0, + 5192.0, 4125.0, 3276.0, 2602.0, 2067.0, 1641.0, 1304.0, 164.0 +}; + +/* Taken from the SoundBlaster code, not quite correct but provides the desired effect + without causing distortion when applied to CD audio (at lower settings, highest settings + still do this to CD audio) */ +static const double ymf71x_bass_treble_3bits[] = { + 0, 0.25892541, 0.584893192, 1, 1.511886431, 2.16227766, 3, 4.011872336 +}; + + +static int ymf71x_wss_dma[4] = { 0, 0, 1, 3 }; +static int ymf71x_wss_irq[8] = { 0, 7, 9, 10, 11, 0, 0, 0 }; + +typedef struct ymf71x_t { + uint8_t type; + + uint16_t cur_sb_addr; + uint16_t cur_wss_addr; + uint16_t cur_mpu401_addr; + uint16_t cur_opl_addr; + uint16_t cur_ctrl_addr; + + int cur_sb_irq; + int cur_sb_dma; + int cur_wss_enabled; + int cur_wss_irq; + int cur_wss_dma; + int cur_mpu401_irq; + void *gameport; + + ad1848_t ad1848; + mpu_t *mpu; + + sb_t *sb; + uint8_t index; + uint8_t regs[0x20]; + uint8_t max_reg; + double master_l; + double master_r; + + void *pnp_card; + uint8_t pnp_rom[512]; + uint8_t key_pos : 5; + uint8_t configidx; + uint8_t ramwrite_enable; + uint8_t ram_data[512]; + uint16_t ram_addr; + isapnp_device_config_t *ymf71x_pnp_config; + + void * log; /* New logging system */ +} ymf71x_t; + +static void +ymf71x_config_write(uint16_t addr, uint8_t val, void *priv) +{ + ymf71x_t *ymf71x = (ymf71x_t *) priv; + + ymf71x_log(ymf71x->log, "Config Write port = %04X, val = %02X\n", addr, val); + + if (addr == 0x279) { + if (ymf71x->key_pos == 0x00) + ymf71x->key_pos = 0x01; + /* Check for YAMAHA Key */ + if (val == ymf71x_init_key[ymf71x->key_pos]) { + ymf71x->key_pos++; + if (!ymf71x->key_pos) { + ymf71x_log(ymf71x->log, "YMF71x: Config unlocked\n"); + /* Force CSN to 0x81 */ + isapnp_set_csn(ymf71x->pnp_card, 0x81); + /* Set card to SLEEP state */ + isapnp_enable_card(ymf71x->pnp_card, ISAPNP_CARD_FORCE_SLEEP); + } + } + ymf71x->configidx = val; + } + if (addr == 0xA79) { + if ((ymf71x->configidx == 0x21) && (val & 0x01)) { + ymf71x_log(ymf71x->log, "Enable internal RAM write"); + ymf71x->ramwrite_enable = 1; + } + if ((ymf71x->configidx == 0x21) && (val == 0x00)) { + ymf71x_log(ymf71x->log, "Disable internal RAM write"); + isapnp_update_card_rom(ymf71x->pnp_card, &ymf71x->ram_data[0], 512); + } + if ((ymf71x->configidx == 0x20) && (ymf71x->ramwrite_enable == 0x01)) { + ymf71x_log(ymf71x->log, "Write to internal RAM addr %04X, val %02X", ymf71x->ram_addr, val); + ymf71x->ram_data[ymf71x->ram_addr++] = val; + } + } +} + +static uint8_t +ymf71x_wss_read(uint16_t addr, void *priv) +{ + ymf71x_t *ymf71x = (ymf71x_t *) priv; + uint8_t ret = 0x00; + uint8_t port = addr - ymf71x->cur_wss_addr; + + switch (port) { + case 0: + switch (ymf71x->cur_wss_irq) { + case 7: + ret |= 0x08; + break; + case 9: + ret |= 0x10; + break; + case 10: + ret |= 0x18; + break; + case 11: + ret |= 0x20; + break; + default: + break; + } + switch (ymf71x->cur_wss_dma) { + case 0: + ret |= 0x01; + break; + case 1: + ret |= 0x02; + break; + case 3: + ret |= 0x03; + break; + default: + break; + } + break; + case 3: + ret = 0x04; + break; + default: + ret = 0x04; + break; + } + ymf71x_log(ymf71x->log, "WSS Read: addr = %02X, ret = %02X\n", addr, ret); + return ret; + +} + +static void +ymf71x_wss_write(uint16_t addr, uint8_t val, void *priv) +{ + ymf71x_t *ymf71x = (ymf71x_t *) priv; + uint8_t port = addr - ymf71x->cur_wss_addr; + + ymf71x_log(ymf71x->log, "WSS Write: addr = %02X, val = %02X\n", addr, val); + switch (port) { + case 0: + break; + default: + break; + } +} + +static void +ymf71x_update_mastervol(void *priv) +{ + ymf71x_t *ymf71x = (ymf71x_t *) priv; + /* Master volume attenuation */ + if (ymf71x->regs[0x07] & 0x80) + ymf71x->master_l = 0; + else + ymf71x->master_l = ymf71x_att_2dbstep_4bits[ymf71x->regs[0x07] & 0x0F] / 32767.0; + + if (ymf71x->regs[0x08] & 0x80) + ymf71x->master_r = 0; + else + ymf71x->master_r = ymf71x_att_2dbstep_4bits[ymf71x->regs[0x08] & 0x0F] / 32767.0; +} + +static void +ymf71x_reg_write(uint16_t addr, uint8_t val, void *priv) +{ + ymf71x_t *ymf71x = (ymf71x_t *) priv; + uint8_t port = addr - ymf71x->cur_ctrl_addr; + + switch (port) { + case 0x00: /* Index */ + ymf71x->index = val; + break; + case 0x01: /* Data */ + if (ymf71x->index <= ymf71x->max_reg) { + switch (ymf71x->index) { + case 0x01: /* Power Management */ + ymf71x->regs[0x01] = val; + break; + case 0x02: /* System Control */ + ymf71x->regs[0x02] = val; + break; + case 0x03: /* Interrupt Channel Config */ + ymf71x->regs[0x03] = val; + break; + case 0x04: /* IRQ-A Status (RO) */ + break; + case 0x05: /* IRQ-B Status (RO) */ + break; + case 0x06: /* DMA Config */ + ymf71x->regs[0x06] = val; + break; + case 0x07: /* Master Volume Left Channel */ + ymf71x->regs[0x07] = val; + ymf71x_update_mastervol(ymf71x); + break; + case 0x08: /* Master Volume Right Channel */ + ymf71x->regs[0x08] = val; + ymf71x_update_mastervol(ymf71x); + break; + case 0x09: /* Mic Volume */ + ymf71x->regs[0x09] = val; + break; + case 0x0A: /* Miscellaneous */ + ymf71x->regs[0x0A] = ((val & 0xf0) | ymf71x->type); + break; + case 0x0B ... 0x0E: /* WSS DMA Base Counter */ + ymf71x->regs[ymf71x->index] = val; + break; + case 0x0F: /* WSS Interrupt Scan (SA3) */ + ymf71x->regs[0x0F] = val; + break; + case 0x10: /* SB Internal State Scan (SA3) */ + ymf71x->regs[0x10] = val; + break; + case 0x11: /* SB Internal State Scan (SA3) */ + ymf71x->regs[0x11] = val; + break; + case 0x12: /* Digital Block Partial Power Down (SA3) */ + ymf71x->regs[0x12] = val; + break; + case 0x13: /* Analog Block Partial Power Down (SA3) */ + ymf71x->regs[0x13] = val; + break; + case 0x14: /* 3D Enhanced Control Wide (SA3) */ + ymf71x->regs[0x14] = val; + break; + case 0x15: /* 3D Enhanced Control Bass (SA3) */ + ymf71x->regs[0x15] = val; + break; + case 0x16: /* 3D Enhanced Control Treble (SA3) */ + ymf71x->regs[0x16] = val; + break; + case 0x17: /* Hardware Volume Interrupt Channel Config (SA3) */ + ymf71x->regs[0x17] = val; + break; + default: + break; + } + } + break; + default: + break; + } + ymf71x_log(ymf71x->log, "Write: addr = %02X, val = %02X\n", addr, val); +} + +static uint8_t +ymf71x_reg_read(uint16_t addr, void *priv) +{ + ymf71x_t *ymf71x = (ymf71x_t *) priv; + uint8_t temp = 0xFF; + uint8_t port = addr - ymf71x->cur_ctrl_addr; + + switch (port) { + case 0x00: /* Index */ + temp = ymf71x->index; + break; + case 0x01: /* Data */ + if (ymf71x->index <= ymf71x->max_reg) { + if (ymf71x->index == 0x04) { /* Read IRQ-A status reg */ + temp = 0; + if (ymf71x->regs[0x03] & 0x01) + temp |= ((ymf71x->ad1848.regs[24] >> 4) & 0x07); + if (ymf71x->regs[0x03] & 0x02) + temp |= ((ymf71x->sb->dsp.sb_irq8) ? 8: 0); + } + else if (ymf71x->index == 0x05) { /* Read IRQ-B status reg */ + temp = 0; + if (ymf71x->regs[0x03] & 0x10) + temp |= ((ymf71x->ad1848.regs[24] >> 4) & 0x07); + if (ymf71x->regs[0x03] & 0x20) + temp |= ((ymf71x->sb->dsp.sb_irq8) ? 8: 0); + } + else + temp = ymf71x->regs[ymf71x->index]; + } + break; + default: + break; + } + + ymf71x_log(ymf71x->log, "Read: addr = %02X, ret = %02X\n", addr, temp); + return temp; +} + +static void +ymf71x_pnp_config_changed(uint8_t ld, isapnp_device_config_t *config, void *priv) +{ + ymf71x_t *ymf71x = (ymf71x_t *) priv; + + ymf71x_log(ymf71x->log, "PnP Config changed\n"); + + switch (ld) { + case 0: /* WSS/OPL3/SBPro/MPU401/CTRL */ + if (ymf71x->cur_wss_addr) { + io_removehandler(ymf71x->cur_wss_addr, 0x0004, ymf71x_wss_read, NULL, NULL, ymf71x_wss_write, NULL, NULL, ymf71x); + io_removehandler(ymf71x->cur_wss_addr + 0x0004, 0x0004, ad1848_read, NULL, NULL, ad1848_write, NULL, NULL, &ymf71x->ad1848); + ymf71x->cur_wss_addr = 0; + ymf71x->cur_wss_enabled = 0; + } + + if (ymf71x->cur_opl_addr) { + io_removehandler(ymf71x->cur_opl_addr, 4, ymf71x->sb->opl.read, NULL, NULL, ymf71x->sb->opl.write, NULL, NULL, ymf71x->sb->opl.priv); + ymf71x->cur_opl_addr = 0; + } + + if (ymf71x->cur_sb_addr) { + sb_dsp_setaddr(&ymf71x->sb->dsp, 0); + io_removehandler(ymf71x->cur_sb_addr, 4, ymf71x->sb->opl.read, NULL, NULL, ymf71x->sb->opl.write, NULL, NULL, ymf71x->sb->opl.priv); + io_removehandler(ymf71x->cur_sb_addr + 8, 2, ymf71x->sb->opl.read, NULL, NULL, ymf71x->sb->opl.write, NULL, NULL, ymf71x->sb->opl.priv); + io_removehandler(ymf71x->cur_sb_addr + 4, 2, sb_ct1345_mixer_read, NULL, NULL, sb_ct1345_mixer_write, NULL, NULL, ymf71x->sb); + ymf71x->cur_sb_addr = 0; + } + + if (ymf71x->cur_ctrl_addr) { + io_removehandler(ymf71x->cur_ctrl_addr, 2, ymf71x_reg_read, NULL, NULL, ymf71x_reg_write, NULL, NULL, ymf71x); + } + + ad1848_setirq(&ymf71x->ad1848, 0); + sb_dsp_setirq(&ymf71x->sb->dsp, 0); + + ad1848_setdma(&ymf71x->ad1848, 0); + sb_dsp_setdma8(&ymf71x->sb->dsp, 0); + + if (config->activate) { + if (config->io[0].base != ISAPNP_IO_DISABLED) { + ymf71x->cur_sb_addr = config->io[0].base; + ymf71x_log(ymf71x->log, "Updating SB DSP I/O port, SB Addr = %04X\n", ymf71x->cur_sb_addr); + sb_dsp_setaddr(&ymf71x->sb->dsp, ymf71x->cur_sb_addr); + io_sethandler(ymf71x->cur_sb_addr, 4, ymf71x->sb->opl.read, NULL, NULL, ymf71x->sb->opl.write, NULL, NULL, ymf71x->sb->opl.priv); + io_sethandler(ymf71x->cur_sb_addr + 8, 2, ymf71x->sb->opl.read, NULL, NULL, ymf71x->sb->opl.write, NULL, NULL, ymf71x->sb->opl.priv); + io_sethandler(ymf71x->cur_sb_addr + 4, 2, sb_ct1345_mixer_read, NULL, NULL, sb_ct1345_mixer_write, NULL, NULL, ymf71x->sb); + } + + if (config->io[1].base != ISAPNP_IO_DISABLED) { + ymf71x->cur_wss_addr = config->io[1].base; + ymf71x->cur_wss_enabled = 1; + ymf71x_log(ymf71x->log, "Updating WSS I/O port, WSS Addr = %04X\n", ymf71x->cur_wss_addr); + io_sethandler(ymf71x->cur_wss_addr, 0x0004, ymf71x_wss_read, NULL, NULL, ymf71x_wss_write, NULL, NULL, ymf71x); + io_sethandler(ymf71x->cur_wss_addr + 0x0004, 0x0004, ad1848_read, NULL, NULL, ad1848_write, NULL, NULL, &ymf71x->ad1848); + } + + if (config->io[2].base != ISAPNP_IO_DISABLED) { + ymf71x->cur_opl_addr = config->io[2].base; + ymf71x_log(ymf71x->log, "Updating OPL I/O port, OPL Addr = %04X\n", ymf71x->cur_opl_addr); + io_sethandler(ymf71x->cur_opl_addr, 4, ymf71x->sb->opl.read, NULL, NULL, ymf71x->sb->opl.write, NULL, NULL, ymf71x->sb->opl.priv); + } + + if (config->io[3].base != ISAPNP_IO_DISABLED) { + ymf71x->cur_mpu401_addr = config->io[3].base; + ymf71x_log(ymf71x->log, "Updating MPU401 I/O port, MPU Addr = %04X\n", ymf71x->cur_mpu401_addr); + mpu401_change_addr(ymf71x->mpu, ymf71x->cur_mpu401_addr); + } + + if (config->io[4].base != ISAPNP_IO_DISABLED) { + ymf71x->cur_ctrl_addr = config->io[4].base; + ymf71x_log(ymf71x->log, "Updating CTRL I/O port, CTRL Addr = %04X\n", ymf71x->cur_ctrl_addr); + io_sethandler(ymf71x->cur_ctrl_addr, 2, ymf71x_reg_read, NULL, NULL, ymf71x_reg_write, NULL, NULL, ymf71x); + } + + if (config->irq[0].irq != ISAPNP_IRQ_DISABLED) { + if (ymf71x->regs[0x03] & 0x01) { + ad1848_setirq(&ymf71x->ad1848, config->irq[0].irq); + ymf71x->cur_wss_irq = config->irq[0].irq; + ymf71x_log(ymf71x->log, "Setting WSS IRQ to IRQ-A (%04X)\n", ymf71x->cur_wss_irq); + } + if (ymf71x->regs[0x03] & 0x02) { + sb_dsp_setirq(&ymf71x->sb->dsp, config->irq[0].irq); + ymf71x->cur_sb_irq = config->irq[0].irq; + ymf71x_log(ymf71x->log, "Setting SB IRQ to IRQ-A (%04X)\n", ymf71x->cur_sb_irq); + } + if (ymf71x->regs[0x03] & 0x04) { + mpu401_setirq(ymf71x->mpu, config->irq[0].irq); + ymf71x->cur_mpu401_irq = config->irq[0].irq; + ymf71x_log(ymf71x->log, "Setting MPU401 IRQ to IRQ-A (%04X)\n", ymf71x->cur_mpu401_irq); + } + } + + if (config->irq[1].irq != ISAPNP_IRQ_DISABLED) { + if (ymf71x->regs[0x03] & 0x10) { + ad1848_setirq(&ymf71x->ad1848, config->irq[1].irq); + ymf71x->cur_wss_irq = config->irq[1].irq; + ymf71x_log(ymf71x->log, "Setting WSS IRQ to IRQ-B (%04X)\n", ymf71x->cur_wss_irq); + } + if (ymf71x->regs[0x03] & 0x20) { + sb_dsp_setirq(&ymf71x->sb->dsp, config->irq[1].irq); + ymf71x->cur_sb_irq = config->irq[1].irq; + ymf71x_log(ymf71x->log, "Setting SB IRQ to IRQ-B (%04X)\n", ymf71x->cur_sb_irq); + } + if (ymf71x->regs[0x03] & 0x40) { + mpu401_setirq(ymf71x->mpu, config->irq[1].irq); + ymf71x->cur_mpu401_irq = config->irq[1].irq; + ymf71x_log(ymf71x->log, "Setting MPU401 IRQ to IRQ-B (%04X)\n", ymf71x->cur_mpu401_irq); + } + } + + if (config->dma[0].dma != ISAPNP_DMA_DISABLED) { + if (ymf71x->regs[0x06] & 0x01) { + ad1848_setdma(&ymf71x->ad1848, config->dma[0].dma); + ymf71x->cur_wss_dma = config->dma[0].dma; + ymf71x_log(ymf71x->log, "Setting WSS DMA to DMA-A (%04X)\n", ymf71x->cur_wss_dma); + } + if (ymf71x->regs[0x06] & 0x04) { + sb_dsp_setdma8(&ymf71x->sb->dsp, config->dma[0].dma); + ymf71x->cur_sb_dma = config->dma[0].dma; + ymf71x_log(ymf71x->log, "Setting SB DMA to DMA-A (%04X)\n", ymf71x->cur_sb_dma); + } + } + + if (config->dma[1].dma != ISAPNP_DMA_DISABLED) { + if (ymf71x->regs[0x06] & 0x10) { + ad1848_setdma(&ymf71x->ad1848, config->dma[1].dma); + ymf71x->cur_wss_dma = config->dma[1].dma; + ymf71x_log(ymf71x->log, "Setting WSS DMA to DMA-B (%04X)\n", ymf71x->cur_wss_dma); + } + if (ymf71x->regs[0x06] & 0x40) { + sb_dsp_setdma8(&ymf71x->sb->dsp, config->dma[1].dma); + ymf71x->cur_sb_dma = config->dma[1].dma; + ymf71x_log(ymf71x->log, "Setting SB DMA to DMA-B (%04X)\n", ymf71x->cur_sb_dma); + } + } + } + break; + + case 1: /* Game Port */ + if (ymf71x->gameport) + gameport_remap(ymf71x->gameport, (config->activate && (config->io[0].base != ISAPNP_IO_DISABLED)) ? config->io[0].base : 0); + break; + default: + break; + } +} + +void +ymf71x_filter_cd_audio(int channel, double *buffer, void *priv) +{ + ymf71x_t *ymf71x = (ymf71x_t *) priv; + const double cd_vol = channel ? ymf71x->ad1848.cd_vol_r : ymf71x->ad1848.cd_vol_l; + double master = channel ? ymf71x->master_r : ymf71x->master_l; + double c = ((*buffer * cd_vol / 3.0) * master) / 65536.0; + double bass_treble; + + if ((ymf71x->regs[0x15] & 0x07) != 0x00) { + bass_treble = ymf71x_bass_treble_3bits[(ymf71x->regs[0x15] & 0x07)]; + + c += (low_iir(2, 0, c) * bass_treble); + } + + if (((ymf71x->regs[0x15] >> 4) & 0x07) != 0x00) { + bass_treble = ymf71x_bass_treble_3bits[((ymf71x->regs[0x15] >> 4) & 0x07)]; + + c += (low_iir(2, 1, c) * bass_treble); + } + + if ((ymf71x->regs[0x16] & 0x07) != 0x00) { + bass_treble = ymf71x_bass_treble_3bits[ymf71x->regs[0x16] & 0x07]; + + c += (high_iir(2, 0, c) * bass_treble); + } + + if (((ymf71x->regs[0x16] >> 4) & 0x07) != 0x00) { + bass_treble = ymf71x_bass_treble_3bits[(ymf71x->regs[0x16] >> 4) & 0x07]; + + c += (high_iir(2, 1, c) * bass_treble); + } + + *buffer = c; +} + +static void +ymf71x_filter_opl(void *priv, double *out_l, double *out_r) +{ + ymf71x_t *ymf71x = (ymf71x_t *) priv; + double bass_treble; + + /* Don't play audio if the FM DAC or OPL3 digital sections are powered down */ + if ( (!(ymf71x->regs[0x01] & 0x23)) && (!(ymf71x->regs[0x12] & 0x10)) && (!(ymf71x->regs[0x13] & 0x10)) ) { + if ((ymf71x->regs[0x15] & 0x07) != 0x00) { + bass_treble = ymf71x_bass_treble_3bits[(ymf71x->regs[0x15] & 0x07)]; + + *out_l += (low_iir(1, 0, *out_l) * bass_treble); + } + + if (((ymf71x->regs[0x15] >> 4) & 0x07) != 0x00) { + bass_treble = ymf71x_bass_treble_3bits[((ymf71x->regs[0x15] >> 4) & 0x07)]; + + *out_r += (low_iir(1, 1, *out_r) * bass_treble); + } + + if ((ymf71x->regs[0x16] & 0x07) != 0x00) { + bass_treble = ymf71x_bass_treble_3bits[ymf71x->regs[0x16] & 0x07]; + + *out_l += (high_iir(1, 0, *out_l) * bass_treble); + } + + if (((ymf71x->regs[0x16] >> 4) & 0x07) != 0x00) { + bass_treble = ymf71x_bass_treble_3bits[(ymf71x->regs[0x16] >> 4) & 0x07]; + + *out_r += (high_iir(1, 1, *out_r) * bass_treble); + } + + *out_l *= ymf71x->master_l; + *out_r *= ymf71x->master_r; + + if (ymf71x->cur_wss_enabled) { + ad1848_filter_channel((void *) &ymf71x->ad1848, AD1848_AUX2, out_l, out_r); + } + } +} + +static void +ymf71x_get_buffer(int32_t *buffer, int len, void *priv) +{ + ymf71x_t *ymf71x = (ymf71x_t *) priv; + + /* wss part */ + + /* Don't play audio if the WSS Playback analog or digital sections are powered down */ + if ( (!(ymf71x->regs[0x01] & 0x23)) && (!(ymf71x->regs[0x12] & 0x04)) && (!(ymf71x->regs[0x13] & 0x04)) ) { + ad1848_update(&ymf71x->ad1848); + for (int c = 0; c < len * 2; c += 2) { + double out_l = 0.0; + double out_r = 0.0; + double bass_treble; + + out_l += (ymf71x->ad1848.buffer[c] * ymf71x->master_l); + out_r += (ymf71x->ad1848.buffer[c +1] * ymf71x->master_r); + + if ((ymf71x->regs[0x15] & 0x07) != 0x00) { + bass_treble = ymf71x_bass_treble_3bits[(ymf71x->regs[0x15] & 0x07)]; + + out_l += (low_iir(0, 0, out_l) * bass_treble); + } + + if (((ymf71x->regs[0x15] >> 4) & 0x07) != 0x00) { + bass_treble = ymf71x_bass_treble_3bits[((ymf71x->regs[0x15] >> 4) & 0x07)]; + + out_r += (low_iir(0, 1, out_r) * bass_treble); + } + + if ((ymf71x->regs[0x16] & 0x07) != 0x00) { + bass_treble = ymf71x_bass_treble_3bits[ymf71x->regs[0x16] & 0x07]; + + out_l += (high_iir(0, 0, out_l) * bass_treble); + } + + if (((ymf71x->regs[0x16] >> 4) & 0x07) != 0x00) { + bass_treble = ymf71x_bass_treble_3bits[(ymf71x->regs[0x16] >> 4) & 0x07]; + + out_r += (high_iir(0, 1, out_r) * bass_treble); + } + + out_l *= ymf71x->master_l; + out_r *= ymf71x->master_r; + + buffer[c] += (int32_t) out_l; + buffer[c + 1] += (int32_t) out_r; + } + + ymf71x->ad1848.pos = 0; + } + + /* sbprov2 part */ + /* Don't play audio if the SB Compatibility analog or digital sections are powered down */ + if ( (!(ymf71x->regs[0x01] & 0x23)) && (!(ymf71x->regs[0x12] & 0x02)) && (!(ymf71x->regs[0x13] & 0x02)) ) { + sb_get_buffer_sbpro(buffer, len, ymf71x->sb); + } +} + +static void * +ymf71x_init(const device_t *info) +{ + ymf71x_t *ymf71x = calloc(1, sizeof(ymf71x_t)); + + ymf71x->type = (info->local & 0x0F); + + ymf71x->cur_wss_addr = 0; + ymf71x->cur_sb_addr = 0; + ymf71x->cur_sb_irq = 5; + ymf71x->cur_wss_enabled = 0; + ymf71x->cur_sb_dma = 1; + ymf71x->cur_mpu401_irq = 5; + ymf71x->cur_mpu401_addr = 0; + ymf71x->cur_wss_dma = 0; + ymf71x->cur_wss_irq = 11; + + ymf71x->regs[0x00] = 0xFF; + ymf71x->regs[0x01] = 0x00; + ymf71x->regs[0x02] = 0x00; + ymf71x->regs[0x03] = 0x69; /* IRQ-A = WSS + OPL3, IRQ-B = SB+MPU401 */ + ymf71x->regs[0x04] = 0x00; + ymf71x->regs[0x05] = 0x00; + ymf71x->regs[0x06] = 0x61; /* DMA-A = WSS Playback, DMA-B = WSS Capture + SBPro */ + ymf71x->regs[0x07] = 0x07; + ymf71x->regs[0x08] = 0x07; + ymf71x->regs[0x09] = 0x88; + ymf71x->regs[0x0A] = (0x80 | ymf71x->type); + ymf71x->regs[0x0B] = 0xFF; + ymf71x->regs[0x0C] = 0xFF; + ymf71x->regs[0x0D] = 0xFF; + ymf71x->regs[0x0E] = 0xFF; + ymf71x->regs[0x0F] = 0x00; + ymf71x->regs[0x10] = 0x00; + ymf71x->regs[0x11] = 0x00; + ymf71x->regs[0x12] = 0x00; + ymf71x->regs[0x13] = 0x00; + ymf71x->regs[0x14] = 0x00; + ymf71x->regs[0x15] = 0x00; + ymf71x->regs[0x16] = 0x00; + ymf71x->regs[0x17] = 0x00; + + if (ymf71x->type == 0x02) + ymf71x->max_reg = 0x17; + else + ymf71x->max_reg = 0x0E; + + ymf71x->log = log_open("YMF71x"); + + ymf71x->gameport = gameport_add(&gameport_pnp_device); + + ad1848_init(&ymf71x->ad1848, AD1848_TYPE_CS4231); + + ymf71x->sb = calloc(1, sizeof(sb_t)); + ymf71x->sb->opl_enabled = 1; + + sb_dsp_set_real_opl(&ymf71x->sb->dsp, 1); + sb_dsp_init(&ymf71x->sb->dsp, SBPRO2_DSP_302, SB_SUBTYPE_DEFAULT, ymf71x); + sb_ct1345_mixer_reset(ymf71x->sb); + + ymf71x->sb->opl_mixer = ymf71x; + ymf71x->sb->opl_mix = ymf71x_filter_opl; + + fm_driver_get(FM_YMF262, &ymf71x->sb->opl); + + sound_add_handler(ymf71x_get_buffer, ymf71x); + music_add_handler(sb_get_music_buffer_sbpro, ymf71x->sb); + ad1848_set_cd_audio_channel(&ymf71x->ad1848, AD1848_AUX1); + sound_set_cd_audio_filter(NULL, NULL); /* Seems to be necessary for the filter below to apply */ + sound_set_cd_audio_filter(ymf71x_filter_cd_audio, ymf71x); + + ymf71x->mpu = (mpu_t *) calloc(1, sizeof(mpu_t)); + mpu401_init(ymf71x->mpu, ymf71x->cur_mpu401_addr, ymf71x->cur_mpu401_irq, M_UART, device_get_config_int("receive_input401")); + + if (device_get_config_int("receive_input")) + midi_in_handler(1, sb_dsp_input_msg, sb_dsp_input_sysex, &ymf71x->sb->dsp); + + if (!(info->local & YMF71X_NO_EEPROM)) { + const char *pnp_rom_file = NULL; + uint16_t pnp_rom_len = 512; + switch (info->local) { + case 0x01: + pnp_rom_file = PNP_ROM_YMF718; + break; + + case 0x02: + pnp_rom_file = PNP_ROM_YMF719; + break; + + default: + break; + } + + uint8_t *pnp_rom = NULL; + if (pnp_rom_file) { + FILE *fp = rom_fopen(pnp_rom_file, "rb"); + if (fp) { + if (fread(ymf71x->pnp_rom, 1, pnp_rom_len, fp) == pnp_rom_len) + pnp_rom = ymf71x->pnp_rom; + fclose(fp); + } + } + ymf71x->pnp_card = isapnp_add_card(pnp_rom, sizeof(ymf71x->pnp_rom), ymf71x_pnp_config_changed, + NULL, NULL, NULL, ymf71x); + } + else + ymf71x->pnp_card = isapnp_add_card(NULL, 0, ymf71x_pnp_config_changed, NULL, NULL, NULL, ymf71x); + + io_sethandler(0x0279, 0x0001, NULL, NULL, NULL, ymf71x_config_write, NULL, NULL, ymf71x); + io_sethandler(0x0A79, 0x0001, NULL, NULL, NULL, ymf71x_config_write, NULL, NULL, ymf71x); + + return ymf71x; +} + +static void +ymf71x_close(void *priv) +{ + ymf71x_t *ymf71x = (ymf71x_t *) priv; + + if (ymf71x->log != NULL) { + log_close(ymf71x->log); + ymf71x->log = NULL; + } + + sb_close(ymf71x->sb); + free(ymf71x->mpu); + free(priv); +} + +static int +ymf718_available(void) +{ + return rom_present(PNP_ROM_YMF718); +} + +static int +ymf719_available(void) +{ + return rom_present(PNP_ROM_YMF719); +} + +static void +ymf71x_speed_changed(void *priv) +{ + ymf71x_t *ymf71x = (ymf71x_t *) priv; + + ad1848_speed_changed(&ymf71x->ad1848); + sb_speed_changed(ymf71x->sb); +} + +static const device_config_t ymf71x_config[] = { + // clang-format off + { + .name = "receive_input", + .description = "Receive MIDI input", + .type = CONFIG_BINARY, + .default_string = NULL, + .default_int = 1, + .file_filter = NULL, + .spinner = { 0 }, + .selection = { { 0 } }, + .bios = { { 0 } } + }, + { + .name = "receive_input401", + .description = "Receive MIDI input (MPU-401)", + .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 +}; + +const device_t ymf715_onboard_device = { + .name = "Yamaha YMF-715 Onboard (OPL3-SA3)", + .internal_name = "ymf715_onboard", + .flags = DEVICE_ISA16, + .local = 0x102, + .init = ymf71x_init, + .close = ymf71x_close, + .reset = NULL, + .available = NULL, + .speed_changed = ymf71x_speed_changed, + .force_redraw = NULL, + .config = ymf71x_config +}; + +const device_t ymf718_device = { + .name = "Yamaha YMF-718 (OPL3-SA2)", + .internal_name = "ymf718", + .flags = DEVICE_ISA16, + .local = 0x01, + .init = ymf71x_init, + .close = ymf71x_close, + .reset = NULL, + .available = ymf718_available, + .speed_changed = ymf71x_speed_changed, + .force_redraw = NULL, + .config = ymf71x_config +}; + +const device_t ymf719_device = { + .name = "Yamaha YMF-719 (OPL3-SA3)", + .internal_name = "ymf719", + .flags = DEVICE_ISA16, + .local = 0x02, + .init = ymf71x_init, + .close = ymf71x_close, + .reset = NULL, + .available = ymf719_available, + .speed_changed = ymf71x_speed_changed, + .force_redraw = NULL, + .config = ymf71x_config +}; diff --git a/src/sound/sound.c b/src/sound/sound.c index 8a755aea0..e120655e1 100644 --- a/src/sound/sound.c +++ b/src/sound/sound.c @@ -160,6 +160,8 @@ static const SOUND_CARD sound_cards[] = { { &sb_vibra16xv_device }, { &wss_device }, { &ymf701_device }, + { &ymf718_device }, + { &ymf719_device }, /* MCA */ { &adlib_mca_device }, { &ess_chipchat_16_mca_device }, From 3c5190a0db34e8efb2906c8a060b5208b18dc6e9 Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Mon, 15 Sep 2025 19:15:34 -0400 Subject: [PATCH 18/36] Header cleanups (1/2) --- src/acpi.c | 2 -- src/apm.c | 2 -- src/arch_detect.c | 2 -- src/cdrom/cdrom.c | 2 -- src/chipset/82c100.c | 2 -- src/chipset/acc2168.c | 2 -- src/chipset/ali1409.c | 2 -- src/chipset/ali1429.c | 2 -- src/chipset/ali1435.c | 2 -- src/chipset/ali1489.c | 2 -- src/chipset/ali1531.c | 2 -- src/chipset/ali1541.c | 2 -- src/chipset/ali1543.c | 2 -- src/chipset/ali1621.c | 2 -- src/chipset/ali6117.c | 2 -- src/chipset/contaq_82c59x.c | 2 -- src/chipset/cs4031.c | 2 -- src/chipset/cs8230.c | 2 -- src/chipset/et6000.c | 2 -- src/chipset/gc100.c | 2 -- src/chipset/grid1520.c | 1 + src/chipset/headland.c | 2 -- src/chipset/ims8848.c | 2 -- src/chipset/intel_420ex.c | 2 -- src/chipset/intel_4x0.c | 2 -- src/chipset/intel_82335.c | 2 -- src/chipset/intel_piix.c | 2 -- src/chipset/intel_sio.c | 2 -- src/chipset/neat.c | 2 -- src/chipset/olivetti_eva.c | 2 -- src/chipset/opti283.c | 2 -- src/chipset/opti291.c | 2 -- src/chipset/opti391.c | 2 -- src/chipset/opti499.c | 2 -- src/chipset/opti822.c | 2 -- src/chipset/opti895.c | 2 -- src/chipset/scamp.c | 2 -- src/chipset/scat.c | 2 -- src/chipset/sis_5571_old.c | 2 -- src/chipset/sis_85c496.c | 2 -- src/chipset/sis_85c4xx.c | 2 -- src/chipset/stpc.c | 2 -- src/chipset/umc_8886.c | 2 -- src/chipset/via_apollo.c | 2 -- src/chipset/via_pipc.c | 2 -- src/chipset/via_vt82c49x.c | 2 -- src/chipset/via_vt82c505.c | 2 -- src/chipset/vl82c480.c | 2 -- src/chipset/wd76c10.c | 1 - src/ddma.c | 2 -- src/device.c | 2 -- src/device/bugger.c | 3 +-- src/device/cartridge.c | 2 -- src/device/clock_ics9xxx.c | 2 -- src/device/hasp.c | 2 -- src/device/hwm.c | 3 --- src/device/hwm_gl518sm.c | 2 -- src/device/hwm_lm75.c | 2 -- src/device/hwm_lm78.c | 2 -- src/device/hwm_vt82c686.c | 2 -- src/device/i2c.c | 2 -- src/device/i2c_gpio.c | 2 -- src/device/ibm_5161.c | 2 -- src/device/isapnp.c | 2 -- src/device/isartc.c | 2 -- src/device/kbc_xt.c | 2 -- src/device/keyboard.c | 2 -- src/device/keyboard_xt.c | 2 -- src/device/mouse.c | 2 -- src/device/mouse_bus.c | 2 -- src/device/mouse_microtouch_touchscreen.c | 2 -- src/device/nec_mate_unk.c | 2 -- src/device/novell_cardkey.c | 2 -- src/device/pci_bridge.c | 3 --- src/device/phoenix_486_jumper.c | 2 -- src/device/postcard.c | 2 -- src/device/serial.c | 2 -- src/device/serial_passthrough.c | 2 -- src/device/smbus_piix4.c | 2 -- src/device/unittester.c | 2 -- src/device/zenith_scratchpad.c | 2 -- src/discord.c | 2 -- src/disk/hdc.c | 2 -- src/disk/hdc_esdi_at.c | 2 -- src/disk/hdc_esdi_mca.c | 3 --- src/disk/hdc_ide.c | 2 -- src/disk/hdc_ide_ali5213.c | 2 -- src/disk/hdc_ide_sff8038i.c | 2 -- src/disk/hdc_st506_at.c | 2 -- src/disk/hdc_st506_xt.c | 2 -- src/disk/hdc_xta_ps1.c | 2 -- src/disk/hdc_xtide.c | 2 -- src/disk/hdd.c | 2 -- src/disk/hdd_image.c | 2 -- src/disk/hdd_table.c | 2 -- src/dma.c | 2 -- src/floppy/fdc.c | 2 -- src/floppy/fdc_compaticard.c | 1 - src/floppy/fdc_magitronic.c | 1 - src/floppy/fdc_monster.c | 2 -- src/floppy/fdd.c | 2 -- src/floppy/fdd_86f.c | 2 -- src/floppy/fdd_common.c | 2 -- src/floppy/fdd_fdi.c | 2 -- src/floppy/fdd_imd.c | 2 -- src/floppy/fdd_img.c | 2 -- src/floppy/fdd_mfm.c | 2 -- src/floppy/fdd_pcjs.c | 2 -- src/floppy/fdd_td0.c | 2 -- src/floppy/fdi2raw.c | 2 -- src/gdbstub.c | 2 -- src/include/86box/access_bus.h | 2 -- src/include/86box/nv/vid_nv_rivatimer.h | 1 - src/include/fdi2raw.h | 2 -- src/io.c | 2 -- src/ioapic.c | 2 -- src/machine/m_amstrad.c | 2 -- src/machine/m_elt.c | 1 - src/machine/m_europc.c | 2 -- src/machine/m_pcjr.c | 2 -- src/machine/m_ps1.c | 2 -- src/machine/m_ps2_mca.c | 2 -- src/machine/m_tandy.c | 2 -- src/machine/m_xt_t1000.c | 2 -- src/machine/machine.c | 2 -- src/mem/catalyst_flash.c | 2 -- src/mem/i2c_eeprom.c | 2 -- src/mem/intel_flash.c | 2 -- src/mem/mmu_2386.c | 26 ++++++++++---------- src/mem/nmc93cxx.c | 2 -- src/mem/rom.c | 2 -- src/mem/row.c | 22 ++++++++--------- src/mem/spd.c | 2 -- src/mem/sst_flash.c | 2 -- src/network/net_3c501.c | 2 -- src/network/net_3c503.c | 2 -- src/network/net_dp8390.c | 2 -- src/network/net_modem.c | 3 --- src/network/net_ne2000.c | 2 -- src/network/net_netswitch.c | 28 +++++++++------------ src/network/net_null.c | 29 ++++++++++------------ src/network/net_pcap.c | 2 -- src/network/net_pcnet.c | 4 +-- src/network/net_plip.c | 2 -- src/network/net_slirp.c | 2 -- src/network/net_tap.c | 2 -- src/network/net_wd8003.c | 2 -- src/network/netswitch.c | 30 ++++++++++------------- src/network/netswitch.h | 29 ++++++++++------------ src/network/network.c | 2 -- src/nvr.c | 2 -- src/nvr_ps2.c | 2 -- src/pci.c | 2 -- src/pic.c | 2 -- src/pit.c | 2 -- src/pit_fast.c | 2 -- src/port_6x.c | 2 -- src/port_92.c | 2 -- src/printer/png.c | 2 -- src/printer/prt_cpmap.c | 2 -- src/printer/prt_escp.c | 2 -- src/printer/prt_ps.c | 3 --- src/printer/prt_text.c | 2 -- src/scsi/scsi.c | 2 -- src/scsi/scsi_aha154x.c | 2 -- src/scsi/scsi_buslogic.c | 2 -- src/scsi/scsi_device.c | 2 -- src/scsi/scsi_disk.c | 2 -- src/scsi/scsi_ncr5380.c | 2 -- src/scsi/scsi_ncr53c400.c | 2 -- src/scsi/scsi_ncr53c8xx.c | 2 -- src/scsi/scsi_pcscsi.c | 2 -- src/scsi/scsi_spock.c | 2 -- src/scsi/scsi_t128.c | 2 -- src/scsi/scsi_x54x.c | 2 -- src/sio/sio_82091aa.c | 2 -- src/sio/sio_acc3221.c | 2 -- src/sio/sio_ali5123.c | 2 -- src/sio/sio_cbm_io.c | 2 -- src/sio/sio_detect.c | 2 -- src/sio/sio_fdc37c669.c | 2 -- src/sio/sio_it86x1f.c | 2 -- src/sio/sio_pc87306.c | 2 -- src/sio/sio_um8669f.c | 1 - src/sio/sio_vt82c686.c | 2 -- src/sio/sio_w837x7.c | 1 + src/sio/sio_w83877.c | 1 + src/sound/audio4.c | 17 ++++++------- src/sound/midi.c | 26 +++++++++----------- src/sound/midi_rtmidi.cpp | 2 +- src/sound/openal.c | 22 ++++++++--------- src/sound/snd_ac97_codec.c | 18 ++++++-------- src/sound/snd_ac97_via.c | 18 ++++++-------- src/sound/snd_ad1848.c | 26 +++++++++----------- src/sound/snd_cmi8x38.c | 2 -- src/sound/snd_cs423x.c | 18 ++++++-------- src/sound/snd_mpu401.c | 24 +++++++++--------- src/sound/snd_opl2board.c | 2 -- src/sound/snd_opl_esfm.c | 2 -- src/sound/snd_opl_ymfm.cpp | 1 - src/sound/snd_optimc.c | 3 --- src/sound/snd_speaker.c | 22 ++++++++--------- src/sound/snd_wss.c | 22 ++++++++--------- src/sound/snd_ymf701.c | 3 --- src/sound/snd_ymf71x.c | 29 ++++++++++------------ src/sound/sndio.c | 17 ++++++------- src/sound/sound.c | 2 -- src/sound/xaudio2.c | 18 ++++++-------- src/unix/dummy_cdrom_ioctl.c | 2 -- src/unix/unix_cdrom.c | 3 --- src/unix/unix_serial_passthrough.c | 22 ++++++++--------- src/upi42.c | 2 -- src/usb.c | 2 -- src/utils/ini.c | 3 --- src/utils/random.c | 2 -- src/video/agpgart.c | 2 -- src/video/clockgen/vid_clockgen_av9194.c | 2 -- src/video/clockgen/vid_clockgen_icd2061.c | 2 -- src/video/clockgen/vid_clockgen_ics2494.c | 2 -- src/video/clockgen/vid_clockgen_ics2595.c | 2 -- src/video/nv/nv_rivatimer.c | 2 -- src/video/ramdac/vid_ramdac_ati68860.c | 2 -- src/video/ramdac/vid_ramdac_ati68875.c | 2 -- src/video/ramdac/vid_ramdac_att20c49x.c | 2 -- src/video/ramdac/vid_ramdac_att2xc498.c | 2 -- src/video/ramdac/vid_ramdac_bt481.c | 2 -- src/video/ramdac/vid_ramdac_bt48x.c | 2 -- src/video/ramdac/vid_ramdac_ibm_rgb528.c | 2 -- src/video/ramdac/vid_ramdac_sc1148x.c | 2 -- src/video/ramdac/vid_ramdac_sc1502x.c | 2 -- src/video/ramdac/vid_ramdac_sdac.c | 2 -- src/video/ramdac/vid_ramdac_stg1702.c | 2 -- src/video/ramdac/vid_ramdac_tkd8001.c | 2 -- src/video/ramdac/vid_ramdac_tvp3026.c | 1 - src/video/vid_8514a.c | 2 -- src/video/vid_ati18800.c | 2 -- src/video/vid_ati28800.c | 2 -- src/video/vid_ati_eeprom.c | 2 -- src/video/vid_ati_mach64.c | 2 -- src/video/vid_ati_mach8.c | 2 -- src/video/vid_bochs_vbe.c | 1 - src/video/vid_cga_colorplus.c | 2 -- src/video/vid_cga_comp.c | 2 -- src/video/vid_cga_compaq.c | 2 -- src/video/vid_cga_compaq_plasma.c | 2 -- src/video/vid_cga_ncr.c | 3 --- src/video/vid_cga_olivetti.c | 3 --- src/video/vid_cga_toshiba_t1000.c | 2 -- src/video/vid_cga_toshiba_t3100e.c | 2 -- src/video/vid_chips_69000.c | 2 -- src/video/vid_cl54xx.c | 2 -- src/video/vid_ddc.c | 2 -- src/video/vid_ddc_edid_custom.c | 3 --- src/video/vid_ega.c | 2 -- src/video/vid_ega_render.c | 2 -- src/video/vid_et3000.c | 2 -- src/video/vid_et4000.c | 2 -- src/video/vid_et4000w32.c | 2 -- src/video/vid_genius.c | 2 -- src/video/vid_hercules.c | 2 -- src/video/vid_hercules_incolor.c | 2 -- src/video/vid_hercules_plus.c | 2 -- src/video/vid_ht216.c | 2 -- src/video/vid_im1024.c | 2 -- src/video/vid_mda.c | 2 -- src/video/vid_mga.c | 2 -- src/video/vid_oak_oti.c | 2 -- src/video/vid_paradise.c | 2 -- src/video/vid_pcjr.c | 2 -- src/video/vid_pgc.c | 2 -- src/video/vid_ps55da2.c | 29 +++++++++++----------- src/video/vid_rtg310x.c | 2 -- src/video/vid_s3.c | 5 +--- src/video/vid_s3_virge.c | 2 -- src/video/vid_sigma.c | 2 -- src/video/vid_svga.c | 2 -- src/video/vid_svga_render.c | 2 -- src/video/vid_table.c | 2 -- src/video/vid_tandy.c | 2 -- src/video/vid_tgui9440.c | 2 -- src/video/vid_ti_cf62011.c | 2 -- src/video/vid_tvga.c | 2 -- src/video/vid_vga.c | 2 -- src/video/vid_voodoo.c | 2 -- src/video/vid_voodoo_banshee.c | 2 -- src/video/vid_voodoo_banshee_blitter.c | 14 +++++++++++ src/video/vid_voodoo_blitter.c | 2 -- src/video/vid_voodoo_display.c | 2 -- src/video/vid_voodoo_fb.c | 2 -- src/video/vid_voodoo_fifo.c | 2 -- src/video/vid_voodoo_reg.c | 2 -- src/video/vid_voodoo_render.c | 2 -- src/video/vid_voodoo_setup.c | 2 -- src/video/vid_voodoo_texture.c | 2 -- src/video/vid_wy700.c | 2 -- src/video/vid_xga.c | 8 +++--- src/video/video.c | 2 -- src/vnc.c | 2 -- src/vnc_keymap.c | 2 -- 299 files changed, 251 insertions(+), 821 deletions(-) diff --git a/src/acpi.c b/src/acpi.c index 0654754e8..84d910163 100644 --- a/src/acpi.c +++ b/src/acpi.c @@ -8,8 +8,6 @@ * * ACPI emulation. * - * - * * Authors: Miran Grca, * * Copyright 2020 Miran Grca. diff --git a/src/apm.c b/src/apm.c index 3973f2b23..b4806cb71 100644 --- a/src/apm.c +++ b/src/apm.c @@ -8,8 +8,6 @@ * * Advanced Power Management emulation. * - * - * * Authors: Miran Grca, * * Copyright 2019 Miran Grca. diff --git a/src/arch_detect.c b/src/arch_detect.c index 4ef267c94..08b92a546 100644 --- a/src/arch_detect.c +++ b/src/arch_detect.c @@ -8,8 +8,6 @@ * * Configure-time architecture detection for the CMake build. * - * - * * Authors: David Hrdlička, * * Copyright 2020-2021 David Hrdlička. diff --git a/src/cdrom/cdrom.c b/src/cdrom/cdrom.c index 6dd95b5dd..3b7eaeb3f 100644 --- a/src/cdrom/cdrom.c +++ b/src/cdrom/cdrom.c @@ -8,8 +8,6 @@ * * Generic CD-ROM drive core. * - * - * * Authors: Miran Grca, * * Copyright 2018-2021 Miran Grca. diff --git a/src/chipset/82c100.c b/src/chipset/82c100.c index a9d61b3b9..d3010674a 100644 --- a/src/chipset/82c100.c +++ b/src/chipset/82c100.c @@ -8,8 +8,6 @@ * * Implementation of Chips&Technology's 82C100 chipset. * - * - * * Authors: Miran Grca, * * Copyright 2021 Miran Grca. diff --git a/src/chipset/acc2168.c b/src/chipset/acc2168.c index dbbdc99f6..6378355e6 100644 --- a/src/chipset/acc2168.c +++ b/src/chipset/acc2168.c @@ -8,8 +8,6 @@ * * Implementation of the ACC 2046/2168 chipset * - * - * * Authors: Sarah Walker, * Tiseno100 * diff --git a/src/chipset/ali1409.c b/src/chipset/ali1409.c index 619843cda..b135473d8 100644 --- a/src/chipset/ali1409.c +++ b/src/chipset/ali1409.c @@ -11,8 +11,6 @@ * Note: This chipset has no datasheet, everything were done via * reverse engineering. * - * - * * Authors: Jose Phillips, * Sarah Walker, * diff --git a/src/chipset/ali1429.c b/src/chipset/ali1429.c index e2478078f..d6a4b28a0 100644 --- a/src/chipset/ali1429.c +++ b/src/chipset/ali1429.c @@ -11,8 +11,6 @@ * Note: This chipset has no datasheet, everything were done via * reverse engineering the BIOS of various machines using it. * - * - * * Authors: Tiseno100, * Miran Grca, * diff --git a/src/chipset/ali1435.c b/src/chipset/ali1435.c index ff096ac55..aebd10f32 100644 --- a/src/chipset/ali1435.c +++ b/src/chipset/ali1435.c @@ -7,8 +7,6 @@ * Emulation of ALi M1435 chipset that acts as both the * southbridge. * - * - * * Authors: Miran Grca, * * Copyright 2020 Miran Grca. diff --git a/src/chipset/ali1489.c b/src/chipset/ali1489.c index 80362e244..96ebd4a3d 100644 --- a/src/chipset/ali1489.c +++ b/src/chipset/ali1489.c @@ -8,8 +8,6 @@ * * Implementation of the ALi M1489 chipset. * - * - * * Authors: Tiseno100, * Miran Grca, * diff --git a/src/chipset/ali1531.c b/src/chipset/ali1531.c index 53324f8e6..1603dbca4 100644 --- a/src/chipset/ali1531.c +++ b/src/chipset/ali1531.c @@ -8,8 +8,6 @@ * * Implementation of the ALi M1531B CPU-to-PCI Bridge. * - * - * * Authors: Tiseno100, * * Copyright 2021 Tiseno100. diff --git a/src/chipset/ali1541.c b/src/chipset/ali1541.c index ebbcd7e63..1506d880a 100644 --- a/src/chipset/ali1541.c +++ b/src/chipset/ali1541.c @@ -8,8 +8,6 @@ * * Implementation of the ALi M1541/2 CPU-to-PCI Bridge. * - * - * * Authors: Miran Grca, * * Copyright 2021 Miran Grca. diff --git a/src/chipset/ali1543.c b/src/chipset/ali1543.c index 2f9273736..8ef8e6a20 100644 --- a/src/chipset/ali1543.c +++ b/src/chipset/ali1543.c @@ -8,8 +8,6 @@ * * Implementation of the ALi M1543 Desktop South Bridge. * - * - * * Authors: Tiseno100, * * Copyright 2021 Tiseno100. diff --git a/src/chipset/ali1621.c b/src/chipset/ali1621.c index d44c0f5a9..95602496c 100644 --- a/src/chipset/ali1621.c +++ b/src/chipset/ali1621.c @@ -8,8 +8,6 @@ * * Implementation of the ALi M1621/2 CPU-to-PCI Bridge. * - * - * * Authors: Miran Grca, * * Copyright 2021 Miran Grca. diff --git a/src/chipset/ali6117.c b/src/chipset/ali6117.c index 88bb4b572..a9eb96f88 100644 --- a/src/chipset/ali6117.c +++ b/src/chipset/ali6117.c @@ -8,8 +8,6 @@ * * Implementation of the ALi M6117 SoC. * - * - * * Authors: RichardG, * * Copyright 2020 RichardG. diff --git a/src/chipset/contaq_82c59x.c b/src/chipset/contaq_82c59x.c index 1981fd11c..a9831804f 100644 --- a/src/chipset/contaq_82c59x.c +++ b/src/chipset/contaq_82c59x.c @@ -8,8 +8,6 @@ * * Implementation of the Contaq/Cypress 82C596(A) and 597 chipsets. * - * - * * Authors: Miran Grca, * * Copyright 2021 Miran Grca. diff --git a/src/chipset/cs4031.c b/src/chipset/cs4031.c index cfec9ad30..ad01cd54d 100644 --- a/src/chipset/cs4031.c +++ b/src/chipset/cs4031.c @@ -8,8 +8,6 @@ * * Implementation of the Chips & Technologies CS4031 chipset. * - * - * * Authors: Tiseno100 * * Copyright 2021 Tiseno100 diff --git a/src/chipset/cs8230.c b/src/chipset/cs8230.c index 0374a44a6..7cdd808c6 100644 --- a/src/chipset/cs8230.c +++ b/src/chipset/cs8230.c @@ -8,8 +8,6 @@ * * Emulation of C&T CS8230 ("386/AT") chipset. * - * - * * Authors: Sarah Walker, * * Copyright 2020 Sarah Walker. diff --git a/src/chipset/et6000.c b/src/chipset/et6000.c index 14ebf852e..d561d90a3 100644 --- a/src/chipset/et6000.c +++ b/src/chipset/et6000.c @@ -8,8 +8,6 @@ * * Implementation of the ETEQ Cheetah ET6000 chipset. * - * - * * Authors: Tiseno100 * * Copyright 2021 Tiseno100 diff --git a/src/chipset/gc100.c b/src/chipset/gc100.c index e9eb05ecf..89dc6c9c0 100644 --- a/src/chipset/gc100.c +++ b/src/chipset/gc100.c @@ -12,8 +12,6 @@ * GC100 chipset, the GC100A chipset has been reverese-engineered. * Thus, its behavior may not be fully accurate. * - * - * * Authors: EngiNerd, * * Copyright 2020-2021 EngiNerd. diff --git a/src/chipset/grid1520.c b/src/chipset/grid1520.c index ce8b1e2a9..e008a0e29 100644 --- a/src/chipset/grid1520.c +++ b/src/chipset/grid1520.c @@ -9,6 +9,7 @@ * Implementation of the GRiD GRiDcase 1520 * * The GRiDcase 1520 is a 286-based portable. + * * These are HDDs supported by GRiD1520 (and probably other 15XX) BIOS * "CP3022",5 * "CP3024",5, 615,4,17 BIOS table type 2 diff --git a/src/chipset/headland.c b/src/chipset/headland.c index 1172d105d..480766103 100644 --- a/src/chipset/headland.c +++ b/src/chipset/headland.c @@ -8,8 +8,6 @@ * * Implementation of the HEADLAND AT286 chipset. * - * - * * Authors: Sarah Walker, * Fred N. van Kempen, * Original by GreatPsycho for PCem. diff --git a/src/chipset/ims8848.c b/src/chipset/ims8848.c index 094ee31f8..13fed304b 100644 --- a/src/chipset/ims8848.c +++ b/src/chipset/ims8848.c @@ -8,8 +8,6 @@ * * Implementation of the IMS 8848/8849 chipset. * - * - * * Authors: Miran Grca, * Tiseno100, * diff --git a/src/chipset/intel_420ex.c b/src/chipset/intel_420ex.c index 662fd0509..daa55c72c 100644 --- a/src/chipset/intel_420ex.c +++ b/src/chipset/intel_420ex.c @@ -9,8 +9,6 @@ * Emulation of Intel 82420EX chipset that acts as both the * northbridge and the southbridge. * - * - * * Authors: Miran Grca, * * Copyright 2020 Miran Grca. diff --git a/src/chipset/intel_4x0.c b/src/chipset/intel_4x0.c index 7d59653e8..18f4ee66a 100644 --- a/src/chipset/intel_4x0.c +++ b/src/chipset/intel_4x0.c @@ -8,8 +8,6 @@ * * Implementation of the Intel PCISet chips from 420TX to 440GX. * - * - * * Authors: Miran Grca, * * Copyright 2019-2020 Miran Grca. diff --git a/src/chipset/intel_82335.c b/src/chipset/intel_82335.c index bd53e0d05..1dc09a24b 100644 --- a/src/chipset/intel_82335.c +++ b/src/chipset/intel_82335.c @@ -8,8 +8,6 @@ * * Implementation of the Intel 82335(KU82335) chipset. * - * - * * Authors: Tiseno100 * * Copyright 2021 Tiseno100. diff --git a/src/chipset/intel_piix.c b/src/chipset/intel_piix.c index d3ef943ac..f48950cdc 100644 --- a/src/chipset/intel_piix.c +++ b/src/chipset/intel_piix.c @@ -11,8 +11,6 @@ * word 0 - base address * word 1 - bits 1-15 = byte count, bit 31 = end of transfer * - * - * * Authors: Miran Grca, * * Copyright 2016-2020 Miran Grca. diff --git a/src/chipset/intel_sio.c b/src/chipset/intel_sio.c index 87730b20f..739785acb 100644 --- a/src/chipset/intel_sio.c +++ b/src/chipset/intel_sio.c @@ -6,8 +6,6 @@ * * Emulation of Intel System I/O PCI chip. * - * - * * Authors: Miran Grca, * * Copyright 2016-2018 Miran Grca. diff --git a/src/chipset/neat.c b/src/chipset/neat.c index 0aa6fe5b6..2d901d035 100644 --- a/src/chipset/neat.c +++ b/src/chipset/neat.c @@ -13,8 +13,6 @@ * 8MB of DRAM chips', because it works fine with bus-based * memory expansion. * - * - * * Authors: Fred N. van Kempen, * * Copyright 2018 Fred N. van Kempen. diff --git a/src/chipset/olivetti_eva.c b/src/chipset/olivetti_eva.c index 0dcbdd21f..47614a132 100644 --- a/src/chipset/olivetti_eva.c +++ b/src/chipset/olivetti_eva.c @@ -11,8 +11,6 @@ * Note: This chipset has no datasheet, everything were done via * reverse engineering the BIOS of various machines using it. * - * - * * Authors: EngiNerd * * Copyright 2020-2021 EngiNerd diff --git a/src/chipset/opti283.c b/src/chipset/opti283.c index 81780cf10..12d58fbf3 100644 --- a/src/chipset/opti283.c +++ b/src/chipset/opti283.c @@ -8,8 +8,6 @@ * * Implementation of the OPTi 82C283 chipset. * - * - * * Authors: Tiseno100, * Miran Grca, * diff --git a/src/chipset/opti291.c b/src/chipset/opti291.c index 91b9010e2..62bc0de54 100644 --- a/src/chipset/opti291.c +++ b/src/chipset/opti291.c @@ -8,8 +8,6 @@ * * Implementation of the OPTi 82C291 chipset. * - * - * * Authors: plant/nerd73, Tiseno100 * * Copyright 2020 plant/nerd73. diff --git a/src/chipset/opti391.c b/src/chipset/opti391.c index 7d3c10c98..8f3d9deea 100644 --- a/src/chipset/opti391.c +++ b/src/chipset/opti391.c @@ -8,8 +8,6 @@ * * Implementation of the OPTi 82C391/392 chipset. * - * - * * Authors: Miran Grca, * * Copyright 2021 Miran Grca. diff --git a/src/chipset/opti499.c b/src/chipset/opti499.c index 383b8e3e2..ed7c269b0 100644 --- a/src/chipset/opti499.c +++ b/src/chipset/opti499.c @@ -8,8 +8,6 @@ * * Implementation of the OPTi 82C493/82C499 chipset. * - * - * * Authors: Tiseno100, * Miran Grca, * diff --git a/src/chipset/opti822.c b/src/chipset/opti822.c index 471fbe393..2f416a1c2 100644 --- a/src/chipset/opti822.c +++ b/src/chipset/opti822.c @@ -9,8 +9,6 @@ * Implementation of the OPTi 82C822 VESA Local Bus to PCI * Bridge Interface. * - * - * * Authors: Miran Grca, * * Copyright 2022 Miran Grca. diff --git a/src/chipset/opti895.c b/src/chipset/opti895.c index 16b324963..6edd7c855 100644 --- a/src/chipset/opti895.c +++ b/src/chipset/opti895.c @@ -8,8 +8,6 @@ * * Implementation of the OPTi 82C802G/82C895 chipset. * - * - * * Authors: Tiseno100, * Miran Grca, * diff --git a/src/chipset/scamp.c b/src/chipset/scamp.c index 7ad7b3db2..9019809b5 100644 --- a/src/chipset/scamp.c +++ b/src/chipset/scamp.c @@ -13,8 +13,6 @@ * 8MB of DRAM chips', because it works fine with bus-based * memory expansion. * - * - * * Authors: Sarah Walker, * * Copyright 2020 Sarah Walker. diff --git a/src/chipset/scat.c b/src/chipset/scat.c index 43f93649e..84f7d459d 100644 --- a/src/chipset/scat.c +++ b/src/chipset/scat.c @@ -10,8 +10,6 @@ * * Re-worked version based on the 82C235 datasheet and errata. * - * - * * Authors: Original by GreatPsycho for PCem. * Fred N. van Kempen, * diff --git a/src/chipset/sis_5571_old.c b/src/chipset/sis_5571_old.c index 495137aed..de620c9c1 100644 --- a/src/chipset/sis_5571_old.c +++ b/src/chipset/sis_5571_old.c @@ -8,8 +8,6 @@ * * Implementation of the SiS 5571 Chipset. * - * - * * Authors: Tiseno100, * * Copyright 2021 Tiseno100. diff --git a/src/chipset/sis_85c496.c b/src/chipset/sis_85c496.c index 10bccc1c8..f2c1941d4 100644 --- a/src/chipset/sis_85c496.c +++ b/src/chipset/sis_85c496.c @@ -8,8 +8,6 @@ * * Implementation of the SiS 85c496/85c497 chip. * - * - * * Authors: Miran Grca, * * Copyright 2019-2020 Miran Grca. diff --git a/src/chipset/sis_85c4xx.c b/src/chipset/sis_85c4xx.c index 1b0eeceed..aa50ed389 100644 --- a/src/chipset/sis_85c4xx.c +++ b/src/chipset/sis_85c4xx.c @@ -9,8 +9,6 @@ * Emulation of the SiS 85c401/85c402, 85c460, 85c461, and * 85c407/85c471 chipsets. * - * - * * Authors: Miran Grca, * * Copyright 2019-2020 Miran Grca. diff --git a/src/chipset/stpc.c b/src/chipset/stpc.c index f3075323a..56eca8268 100644 --- a/src/chipset/stpc.c +++ b/src/chipset/stpc.c @@ -8,8 +8,6 @@ * * Implementation of the STMicroelectronics STPC series of SoCs. * - * - * * Authors: RichardG, * * Copyright 2020 RichardG. diff --git a/src/chipset/umc_8886.c b/src/chipset/umc_8886.c index 29e2d46da..3725394c3 100644 --- a/src/chipset/umc_8886.c +++ b/src/chipset/umc_8886.c @@ -11,8 +11,6 @@ * Note: This chipset has no datasheet, everything were done via * reverse engineering the BIOS of various machines using it. * - * - * * Authors: Tiseno100, * Miran Grca, * diff --git a/src/chipset/via_apollo.c b/src/chipset/via_apollo.c index 110b1f8e1..974f4e274 100644 --- a/src/chipset/via_apollo.c +++ b/src/chipset/via_apollo.c @@ -8,8 +8,6 @@ * * Implementation of the VIA Apollo series of chips. * - * - * * Authors: Miran Grca, * RichardG, * Tiseno100, diff --git a/src/chipset/via_pipc.c b/src/chipset/via_pipc.c index 7915b199e..a4d83220b 100644 --- a/src/chipset/via_pipc.c +++ b/src/chipset/via_pipc.c @@ -8,8 +8,6 @@ * * Emulation of the VIA PIPC southbridges. * - * - * * Authors: Miran Grca, * RichardG, * diff --git a/src/chipset/via_vt82c49x.c b/src/chipset/via_vt82c49x.c index 3a7bbfdda..35d9c18cc 100644 --- a/src/chipset/via_vt82c49x.c +++ b/src/chipset/via_vt82c49x.c @@ -8,8 +8,6 @@ * * Implementation of the VIA VT82C49X chipset. * - * - * * Authors: Tiseno100, * Miran Grca, * diff --git a/src/chipset/via_vt82c505.c b/src/chipset/via_vt82c505.c index dbbb447c7..3daeec85b 100644 --- a/src/chipset/via_vt82c505.c +++ b/src/chipset/via_vt82c505.c @@ -8,8 +8,6 @@ * * Implementation of the VIA VT82C505 VL/PCI Bridge Controller. * - * - * * Authors: Tiseno100, * Miran Grca, * diff --git a/src/chipset/vl82c480.c b/src/chipset/vl82c480.c index a31c35418..8015137e0 100644 --- a/src/chipset/vl82c480.c +++ b/src/chipset/vl82c480.c @@ -8,8 +8,6 @@ * * Implementation of the VLSI VL82c480 chipset. * - * - * * Authors: Miran Grca, * * Copyright 2020 Miran Grca. diff --git a/src/chipset/wd76c10.c b/src/chipset/wd76c10.c index ddde7626e..b70785b37 100644 --- a/src/chipset/wd76c10.c +++ b/src/chipset/wd76c10.c @@ -11,7 +11,6 @@ * Authors: Miran Grca, * * Copyright 2024 Miran Grca. - * */ #include #include diff --git a/src/ddma.c b/src/ddma.c index 0ca1bb879..51f2b589e 100644 --- a/src/ddma.c +++ b/src/ddma.c @@ -8,8 +8,6 @@ * * Distributed DMA emulation. * - * - * * Authors: Miran Grca, * * Copyright 2020 Miran Grca. diff --git a/src/device.c b/src/device.c index 07e193ead..cd5adfee0 100644 --- a/src/device.c +++ b/src/device.c @@ -9,8 +9,6 @@ * Implementation of the generic device interface to handle * all devices attached to the emulator. * - * - * * Authors: Fred N. van Kempen, * Miran Grca, * Sarah Walker, diff --git a/src/device/bugger.c b/src/device/bugger.c index 6a30df7be..8495cdbe5 100644 --- a/src/device/bugger.c +++ b/src/device/bugger.c @@ -44,9 +44,8 @@ * configuration register (CTRL_SPCFG bit set) but have to * remember that stuff first... * - * - * * Authors: Fred N. van Kempen, + * * Copyright 1989-2018 Fred N. van Kempen. */ #include diff --git a/src/device/cartridge.c b/src/device/cartridge.c index cb3c5e412..639095f72 100644 --- a/src/device/cartridge.c +++ b/src/device/cartridge.c @@ -8,8 +8,6 @@ * * Implementation of the PCjr cartridge emulation. * - * - * * Authors: Miran Grca, * * Copyright 2021 Miran Grca. diff --git a/src/device/clock_ics9xxx.c b/src/device/clock_ics9xxx.c index 02f033e9b..4c08d6b77 100644 --- a/src/device/clock_ics9xxx.c +++ b/src/device/clock_ics9xxx.c @@ -8,8 +8,6 @@ * * Emulation of the ICS9xxx series of clock generators. * - * - * * Authors: RichardG, * * Copyright 2020 RichardG. diff --git a/src/device/hasp.c b/src/device/hasp.c index 07e9ac636..ea8b9b413 100644 --- a/src/device/hasp.c +++ b/src/device/hasp.c @@ -12,8 +12,6 @@ * emulation is enough to satisfy that game, but not Aladdin's * DiagnostiX utility. * - * - * * Authors: RichardG, * Peter Ferrie * diff --git a/src/device/hwm.c b/src/device/hwm.c index 85c689740..13abcb413 100644 --- a/src/device/hwm.c +++ b/src/device/hwm.c @@ -8,13 +8,10 @@ * * Common functions for hardware monitoring chips. * - * - * * Authors: RichardG, * * Copyright 2020 RichardG. */ - #include #include #include diff --git a/src/device/hwm_gl518sm.c b/src/device/hwm_gl518sm.c index cfc16664a..a39511c9a 100644 --- a/src/device/hwm_gl518sm.c +++ b/src/device/hwm_gl518sm.c @@ -8,8 +8,6 @@ * * Emulation of the Genesys Logic GL518SM hardware monitoring chip. * - * - * * Authors: RichardG, * * Copyright 2020 RichardG. diff --git a/src/device/hwm_lm75.c b/src/device/hwm_lm75.c index 29fe2024f..79f9ee6f0 100644 --- a/src/device/hwm_lm75.c +++ b/src/device/hwm_lm75.c @@ -8,8 +8,6 @@ * * Emulation of the National Semiconductor LM75 temperature sensor chip. * - * - * * Authors: RichardG, * * Copyright 2020 RichardG. diff --git a/src/device/hwm_lm78.c b/src/device/hwm_lm78.c index 909713833..27741fd6d 100644 --- a/src/device/hwm_lm78.c +++ b/src/device/hwm_lm78.c @@ -8,8 +8,6 @@ * * Emulation of the National Semiconductor LM78 hardware monitoring chip. * - * - * * Authors: RichardG, * * Copyright 2020 RichardG. diff --git a/src/device/hwm_vt82c686.c b/src/device/hwm_vt82c686.c index 8623a9f6b..f20f8264c 100644 --- a/src/device/hwm_vt82c686.c +++ b/src/device/hwm_vt82c686.c @@ -8,8 +8,6 @@ * * Emulation of the VIA VT82C686A/B integrated hardware monitor. * - * - * * Authors: RichardG, * * Copyright 2020 RichardG. diff --git a/src/device/i2c.c b/src/device/i2c.c index eb80f413b..ca5e549b7 100644 --- a/src/device/i2c.c +++ b/src/device/i2c.c @@ -8,8 +8,6 @@ * * Implementation of the I2C bus and its operations. * - * - * * Authors: RichardG, * * Copyright 2020 RichardG. diff --git a/src/device/i2c_gpio.c b/src/device/i2c_gpio.c index 61a3dbe05..c941a2cc1 100644 --- a/src/device/i2c_gpio.c +++ b/src/device/i2c_gpio.c @@ -8,8 +8,6 @@ * * Emulation of a GPIO-based I2C host controller. * - * - * * Authors: RichardG, * * Copyright 2020 RichardG. diff --git a/src/device/ibm_5161.c b/src/device/ibm_5161.c index 456227676..38f911120 100644 --- a/src/device/ibm_5161.c +++ b/src/device/ibm_5161.c @@ -6,8 +6,6 @@ * * Emulation of the IBM Expansion Unit (5161). * - * - * * Authors: Miran Grca, * * Copyright 2016-2018 Miran Grca. diff --git a/src/device/isapnp.c b/src/device/isapnp.c index 003f05852..04584f0cb 100644 --- a/src/device/isapnp.c +++ b/src/device/isapnp.c @@ -8,8 +8,6 @@ * * Implementation of ISA Plug and Play. * - * - * * Authors: Miran Grca, * RichardG, * diff --git a/src/device/isartc.c b/src/device/isartc.c index 88f03e7c5..06b7767c8 100644 --- a/src/device/isartc.c +++ b/src/device/isartc.c @@ -26,8 +26,6 @@ * NOTE: The IRQ functionalities have been implemented, but not yet * tested, as I need to write test software for them first :) * - * - * * Authors: Fred N. van Kempen, * * Copyright 2018 Fred N. van Kempen. diff --git a/src/device/kbc_xt.c b/src/device/kbc_xt.c index 176f1df43..a9fa8bf6c 100644 --- a/src/device/kbc_xt.c +++ b/src/device/kbc_xt.c @@ -8,8 +8,6 @@ * * Implementation of the XT-style keyboard. * - * - * * Authors: Sarah Walker, * Miran Grca, * Fred N. van Kempen, diff --git a/src/device/keyboard.c b/src/device/keyboard.c index 524593eb7..7806418dd 100644 --- a/src/device/keyboard.c +++ b/src/device/keyboard.c @@ -8,8 +8,6 @@ * * General keyboard driver interface. * - * - * * Authors: Sarah Walker, * Miran Grca, * Fred N. van Kempen, diff --git a/src/device/keyboard_xt.c b/src/device/keyboard_xt.c index 2936868b0..d31d5f027 100644 --- a/src/device/keyboard_xt.c +++ b/src/device/keyboard_xt.c @@ -8,8 +8,6 @@ * * Implementation of the XT-style keyboard. * - * - * * Authors: Sarah Walker, * Miran Grca, * Fred N. van Kempen, diff --git a/src/device/mouse.c b/src/device/mouse.c index fb7fd020f..eb7557faf 100644 --- a/src/device/mouse.c +++ b/src/device/mouse.c @@ -11,8 +11,6 @@ * TODO: Add the Genius bus- and serial mouse. * Remove the '3-button' flag from mouse types. * - * - * * Authors: Miran Grca, * Fred N. van Kempen, * diff --git a/src/device/mouse_bus.c b/src/device/mouse_bus.c index dd71ef11e..cd54f981a 100644 --- a/src/device/mouse_bus.c +++ b/src/device/mouse_bus.c @@ -57,8 +57,6 @@ * Microsoft Windows NT 3.1 * Microsoft Windows 98 SE * - * - * * Authors: Miran Grca, * Fred N. van Kempen, * diff --git a/src/device/mouse_microtouch_touchscreen.c b/src/device/mouse_microtouch_touchscreen.c index 512fcc0df..4c4f46708 100644 --- a/src/device/mouse_microtouch_touchscreen.c +++ b/src/device/mouse_microtouch_touchscreen.c @@ -8,8 +8,6 @@ * * 3M MicroTouch Serial emulation. * - * - * * Authors: Cacodemon345, mourix * * Copyright 2024 Cacodemon345 diff --git a/src/device/nec_mate_unk.c b/src/device/nec_mate_unk.c index c0393eaa2..c4a697bd8 100644 --- a/src/device/nec_mate_unk.c +++ b/src/device/nec_mate_unk.c @@ -8,8 +8,6 @@ * * Implementation of the NEC Mate NX MA30D/23D Unknown Readout. * - * - * * Authors: Miran Grca, * * Copyright 2020-2023 Miran Grca. diff --git a/src/device/novell_cardkey.c b/src/device/novell_cardkey.c index edc32b879..0b1045777 100644 --- a/src/device/novell_cardkey.c +++ b/src/device/novell_cardkey.c @@ -9,12 +9,10 @@ * Implementation of the Novell NetWare 2.x Key Card, which * was used for anti-piracy protection. * - * * Authors: Cacodemon345 * * Copyright 2024 Cacodemon345. */ - #include #include #include diff --git a/src/device/pci_bridge.c b/src/device/pci_bridge.c index bf49baf14..d9aeeffb6 100644 --- a/src/device/pci_bridge.c +++ b/src/device/pci_bridge.c @@ -8,13 +8,10 @@ * * Implementation of PCI-PCI and host-AGP bridges. * - * - * * Authors: RichardG, * * Copyright 2020 RichardG. */ - #include #include #include diff --git a/src/device/phoenix_486_jumper.c b/src/device/phoenix_486_jumper.c index a3e2f0e7e..1b6270984 100644 --- a/src/device/phoenix_486_jumper.c +++ b/src/device/phoenix_486_jumper.c @@ -8,8 +8,6 @@ * * Implementation of the Phoenix 486 Jumper Readout. * - * - * * Authors: Miran Grca, * Tiseno100, * diff --git a/src/device/postcard.c b/src/device/postcard.c index ec031c2b8..908adfe72 100644 --- a/src/device/postcard.c +++ b/src/device/postcard.c @@ -8,8 +8,6 @@ * * Implementation of a port 80h POST diagnostic card. * - * - * * Authors: RichardG, * * Copyright 2020 RichardG. diff --git a/src/device/serial.c b/src/device/serial.c index ad9abfe5d..63f20cbee 100644 --- a/src/device/serial.c +++ b/src/device/serial.c @@ -10,8 +10,6 @@ * * Now passes all the AMIDIAG tests. * - * - * * Authors: Miran Grca, * Fred N. van Kempen, * diff --git a/src/device/serial_passthrough.c b/src/device/serial_passthrough.c index 249380b4f..6cf273fd1 100644 --- a/src/device/serial_passthrough.c +++ b/src/device/serial_passthrough.c @@ -8,14 +8,12 @@ * * Implementation of Serial passthrough device. * - * * Authors: Andreas J. Reichel , * Jasmine Iwanek * * Copyright 2021 Andreas J. Reichel. * Copyright 2021-2025 Jasmine Iwanek. */ - #include #include #include diff --git a/src/device/smbus_piix4.c b/src/device/smbus_piix4.c index ae37c72c4..ae263b484 100644 --- a/src/device/smbus_piix4.c +++ b/src/device/smbus_piix4.c @@ -8,8 +8,6 @@ * * Implementation of a generic PIIX4-compatible SMBus host controller. * - * - * * Authors: RichardG, * * Copyright 2020 RichardG. diff --git a/src/device/unittester.c b/src/device/unittester.c index 0e864aa0b..48486efce 100644 --- a/src/device/unittester.c +++ b/src/device/unittester.c @@ -11,8 +11,6 @@ * If modifying the protocol, you MUST modify the specification * and increment the version number. * - * - * * Authors: GreaseMonkey, * * Copyright 2024 GreaseMonkey. diff --git a/src/device/zenith_scratchpad.c b/src/device/zenith_scratchpad.c index 0db40c3f0..f71a9aada 100644 --- a/src/device/zenith_scratchpad.c +++ b/src/device/zenith_scratchpad.c @@ -9,8 +9,6 @@ * Emulation of various Zenith PC compatible machines. * Currently only the Zenith Data Systems Supersport is emulated. * - * - * * Authors: Tux, * Miran Grca, * TheCollector1995, diff --git a/src/discord.c b/src/discord.c index 18faee696..091d4c95f 100644 --- a/src/discord.c +++ b/src/discord.c @@ -8,8 +8,6 @@ * * Discord integration module. * - * - * * Authors: David Hrdlička, * * Copyright 2019 David Hrdlička. diff --git a/src/disk/hdc.c b/src/disk/hdc.c index 1e0d3f2bb..eb6c3a1b3 100644 --- a/src/disk/hdc.c +++ b/src/disk/hdc.c @@ -8,8 +8,6 @@ * * Common code to handle all sorts of disk controllers. * - * - * * Authors: Miran Grca, * Fred N. van Kempen, * diff --git a/src/disk/hdc_esdi_at.c b/src/disk/hdc_esdi_at.c index 64d292250..4838c23d3 100644 --- a/src/disk/hdc_esdi_at.c +++ b/src/disk/hdc_esdi_at.c @@ -8,8 +8,6 @@ * * Driver for the ESDI controller (WD1007-vse1) for PC/AT. * - * - * * Authors: Sarah Walker, * Miran Grca, * Fred N. van Kempen, diff --git a/src/disk/hdc_esdi_mca.c b/src/disk/hdc_esdi_mca.c index e59ae981d..78a2f3183 100644 --- a/src/disk/hdc_esdi_mca.c +++ b/src/disk/hdc_esdi_mca.c @@ -52,15 +52,12 @@ * however, are auto-configured by the system software as * shown above. * - * - * * Authors: Sarah Walker, * Fred N. van Kempen, * * Copyright 2008-2018 Sarah Walker. * Copyright 2017-2018 Fred N. van Kempen. */ - #include #include #include diff --git a/src/disk/hdc_ide.c b/src/disk/hdc_ide.c index e8c9fb05e..e9ee7083f 100644 --- a/src/disk/hdc_ide.c +++ b/src/disk/hdc_ide.c @@ -9,8 +9,6 @@ * Implementation of the IDE emulation for hard disks and ATAPI * CD-ROM devices. * - * - * * Authors: Sarah Walker, * Miran Grca, * diff --git a/src/disk/hdc_ide_ali5213.c b/src/disk/hdc_ide_ali5213.c index 67f959e1a..ff837cbc6 100644 --- a/src/disk/hdc_ide_ali5213.c +++ b/src/disk/hdc_ide_ali5213.c @@ -8,8 +8,6 @@ * * Implementation of the ALi M1489 chipset. * - * - * * Authors: Tiseno100, * Miran Grca, * diff --git a/src/disk/hdc_ide_sff8038i.c b/src/disk/hdc_ide_sff8038i.c index 50deac38a..15dd4c515 100644 --- a/src/disk/hdc_ide_sff8038i.c +++ b/src/disk/hdc_ide_sff8038i.c @@ -10,8 +10,6 @@ * word 0 - base address * word 1 - bits 1-15 = byte count, bit 31 = end of transfer * - * - * * Authors: Sarah Walker, * Miran Grca, * diff --git a/src/disk/hdc_st506_at.c b/src/disk/hdc_st506_at.c index ed7b29d1f..5e50c44f0 100644 --- a/src/disk/hdc_st506_at.c +++ b/src/disk/hdc_st506_at.c @@ -12,8 +12,6 @@ * based design. Most cards were WD1003-WA2 or -WAH, where the * -WA2 cards had a floppy controller as well (to save space.) * - * - * * Authors: Sarah Walker, * Fred N. van Kempen, * diff --git a/src/disk/hdc_st506_xt.c b/src/disk/hdc_st506_xt.c index a7313ca63..de2536d83 100644 --- a/src/disk/hdc_st506_xt.c +++ b/src/disk/hdc_st506_xt.c @@ -41,8 +41,6 @@ * Since all controllers (including the ones made by DTC) use * (mostly) the same API, we keep them all in this module. * - * - * * Authors: Fred N. van Kempen, * Sarah Walker, * diff --git a/src/disk/hdc_xta_ps1.c b/src/disk/hdc_xta_ps1.c index ea71c918b..4a4273333 100644 --- a/src/disk/hdc_xta_ps1.c +++ b/src/disk/hdc_xta_ps1.c @@ -41,8 +41,6 @@ * Type table with the main code, so the user can only select * items from that list... * - * - * * Authors: Fred N. van Kempen, * * Based on my earlier HD20 driver for the EuroPC. diff --git a/src/disk/hdc_xtide.c b/src/disk/hdc_xtide.c index 63067f579..de79bca1b 100644 --- a/src/disk/hdc_xtide.c +++ b/src/disk/hdc_xtide.c @@ -21,8 +21,6 @@ * already on their way out, the newer IDE standard based on the * PC/AT controller and 16b design became the IDE we now know. * - * - * * Authors: Sarah Walker, * Miran Grca, * Fred N. van Kempen, diff --git a/src/disk/hdd.c b/src/disk/hdd.c index e48af6b20..af4411ab0 100644 --- a/src/disk/hdd.c +++ b/src/disk/hdd.c @@ -8,8 +8,6 @@ * * Common code to handle all sorts of hard disk images. * - * - * * Authors: Miran Grca, * Fred N. van Kempen, * diff --git a/src/disk/hdd_image.c b/src/disk/hdd_image.c index 75c27f4d1..79de77965 100644 --- a/src/disk/hdd_image.c +++ b/src/disk/hdd_image.c @@ -8,8 +8,6 @@ * * Handling of hard disk image files. * - * - * * Authors: Miran Grca, * Fred N. van Kempen, * diff --git a/src/disk/hdd_table.c b/src/disk/hdd_table.c index 12a0040ef..e0ff57b3f 100644 --- a/src/disk/hdd_table.c +++ b/src/disk/hdd_table.c @@ -9,8 +9,6 @@ * Implementation of the IDE emulation for hard disks and ATAPI * CD-ROM devices. * - * - * * Authors: Miran Grca, * Fred N. van Kempen, * diff --git a/src/dma.c b/src/dma.c index 60e36b3cd..bfc294f2a 100644 --- a/src/dma.c +++ b/src/dma.c @@ -8,8 +8,6 @@ * * Implementation of the Intel DMA controllers. * - * - * * Authors: Sarah Walker, * Miran Grca, * Fred N. van Kempen, diff --git a/src/floppy/fdc.c b/src/floppy/fdc.c index af00af561..75938e21a 100644 --- a/src/floppy/fdc.c +++ b/src/floppy/fdc.c @@ -9,8 +9,6 @@ * Implementation of the NEC uPD-765 and compatible floppy disk * controller. * - * - * * Authors: Sarah Walker, * Miran Grca, * diff --git a/src/floppy/fdc_compaticard.c b/src/floppy/fdc_compaticard.c index cc438ddf6..1c668b470 100644 --- a/src/floppy/fdc_compaticard.c +++ b/src/floppy/fdc_compaticard.c @@ -12,7 +12,6 @@ * * Copyright 2022-2025 Jasmine Iwanek. */ - #include #include #include diff --git a/src/floppy/fdc_magitronic.c b/src/floppy/fdc_magitronic.c index a1ee922da..29db35006 100644 --- a/src/floppy/fdc_magitronic.c +++ b/src/floppy/fdc_magitronic.c @@ -12,7 +12,6 @@ * * Copyright 2021 Tiseno100 */ - #include #include #include diff --git a/src/floppy/fdc_monster.c b/src/floppy/fdc_monster.c index 38ad9e2ed..0bac3d590 100644 --- a/src/floppy/fdc_monster.c +++ b/src/floppy/fdc_monster.c @@ -8,8 +8,6 @@ * * Emulation of Sergey Kiselev's Monster Floppy Disk Controller. * - * - * * Authors: Jasmine Iwanek, * Miran Grca, * diff --git a/src/floppy/fdd.c b/src/floppy/fdd.c index bc81c8662..8e834c2fc 100644 --- a/src/floppy/fdd.c +++ b/src/floppy/fdd.c @@ -8,8 +8,6 @@ * * Implementation of the floppy drive emulation. * - * - * * Authors: Sarah Walker, * Miran Grca, * Fred N. van Kempen, diff --git a/src/floppy/fdd_86f.c b/src/floppy/fdd_86f.c index f210bf4fd..0c64c41e7 100644 --- a/src/floppy/fdd_86f.c +++ b/src/floppy/fdd_86f.c @@ -10,8 +10,6 @@ * data in the form of FM/MFM-encoded transitions) which also * forms the core of the emulator's floppy disk emulation. * - * - * * Authors: Miran Grca, * Fred N. van Kempen, * diff --git a/src/floppy/fdd_common.c b/src/floppy/fdd_common.c index d0659d990..ee694fac0 100644 --- a/src/floppy/fdd_common.c +++ b/src/floppy/fdd_common.c @@ -8,8 +8,6 @@ * * Shared code for all the floppy modules. * - * - * * Authors: Fred N. van Kempen, * * Copyright 2017-2018 Fred N. van Kempen. diff --git a/src/floppy/fdd_fdi.c b/src/floppy/fdd_fdi.c index 97b6441a0..835a06a53 100644 --- a/src/floppy/fdd_fdi.c +++ b/src/floppy/fdd_fdi.c @@ -9,8 +9,6 @@ * Implementation of the FDI floppy stream image format * interface to the FDI2RAW module. * - * - * * Authors: Sarah Walker, * Miran Grca, * Fred N. van Kempen, diff --git a/src/floppy/fdd_imd.c b/src/floppy/fdd_imd.c index 7994530ed..314b42927 100644 --- a/src/floppy/fdd_imd.c +++ b/src/floppy/fdd_imd.c @@ -8,8 +8,6 @@ * * Implementation of the IMD floppy image format. * - * - * * Authors: Fred N. van Kempen, * Miran Grca, * diff --git a/src/floppy/fdd_img.c b/src/floppy/fdd_img.c index 30e0212cd..5cd736377 100644 --- a/src/floppy/fdd_img.c +++ b/src/floppy/fdd_img.c @@ -13,8 +13,6 @@ * re-merged with the other files. Much of it is generic to * all formats. * - * - * * Authors: Sarah Walker, * Miran Grca, * Fred N. van Kempen, diff --git a/src/floppy/fdd_mfm.c b/src/floppy/fdd_mfm.c index 87da4e08b..68448bfab 100644 --- a/src/floppy/fdd_mfm.c +++ b/src/floppy/fdd_mfm.c @@ -8,8 +8,6 @@ * * Implementation of the HxC MFM image format. * - * - * * Authors: Miran Grca, * * Copyright 2018-2019 Miran Grca. diff --git a/src/floppy/fdd_pcjs.c b/src/floppy/fdd_pcjs.c index 6f69042b0..2193048c6 100644 --- a/src/floppy/fdd_pcjs.c +++ b/src/floppy/fdd_pcjs.c @@ -12,8 +12,6 @@ * * Copyright 2024 cold-brewed */ - - #include #include #include diff --git a/src/floppy/fdd_td0.c b/src/floppy/fdd_td0.c index f5882158b..f62e22c70 100644 --- a/src/floppy/fdd_td0.c +++ b/src/floppy/fdd_td0.c @@ -8,8 +8,6 @@ * * Implementation of the Teledisk floppy image format. * - * - * * Authors: Milodrag Milanovic, * Haruhiko OKUMURA, * Haruyasu YOSHIZAKI, diff --git a/src/floppy/fdi2raw.c b/src/floppy/fdi2raw.c index c6a41a52d..7c068e056 100644 --- a/src/floppy/fdi2raw.c +++ b/src/floppy/fdi2raw.c @@ -12,8 +12,6 @@ * addition of get_last_head and C++ callability by Thomas * Harte. * - * - * * Authors: Toni Wilen, * and Vincent Joguin, * Thomas Harte, diff --git a/src/gdbstub.c b/src/gdbstub.c index 2ae40d24c..9a8228505 100644 --- a/src/gdbstub.c +++ b/src/gdbstub.c @@ -8,8 +8,6 @@ * * GDB stub server for remote debugging. * - * - * * Authors: RichardG, * * Copyright 2022 RichardG. diff --git a/src/include/86box/access_bus.h b/src/include/86box/access_bus.h index 333a1d4a5..84099a3db 100644 --- a/src/include/86box/access_bus.h +++ b/src/include/86box/access_bus.h @@ -8,8 +8,6 @@ * * Definitions for the ACPI emulation. * - * - * * Authors: Miran Grca, * * Copyright 2020-2025 Miran Grca. diff --git a/src/include/86box/nv/vid_nv_rivatimer.h b/src/include/86box/nv/vid_nv_rivatimer.h index 59f6cfebf..659f683bd 100644 --- a/src/include/86box/nv/vid_nv_rivatimer.h +++ b/src/include/86box/nv/vid_nv_rivatimer.h @@ -8,7 +8,6 @@ * * Fast, high-frequency, guest CPU-independent timer for Riva emulation. * - * * Authors: Connor Hyde, I need a better email address ;^) * * Copyright 2024-2025 starfrost diff --git a/src/include/fdi2raw.h b/src/include/fdi2raw.h index b848b26f2..68e90ba9b 100644 --- a/src/include/fdi2raw.h +++ b/src/include/fdi2raw.h @@ -8,8 +8,6 @@ * * Definitions for the FDI floppy file format. * - * - * * Authors: Toni Wilen, * and Vincent Joguin, * Thomas Harte, diff --git a/src/io.c b/src/io.c index 45dd4cb3d..233dd6704 100644 --- a/src/io.c +++ b/src/io.c @@ -8,8 +8,6 @@ * * Implement I/O ports and their operations. * - * - * * Authors: Sarah Walker, * Miran Grca, * Fred N. van Kempen, diff --git a/src/ioapic.c b/src/ioapic.c index ea0811f91..4c28c2c64 100644 --- a/src/ioapic.c +++ b/src/ioapic.c @@ -9,8 +9,6 @@ * Skeleton I/O APIC implementation, currently housing the MPS * table patcher for machines that require it. * - * - * * Authors: RichardG, * * Copyright 2020 RichardG. diff --git a/src/machine/m_amstrad.c b/src/machine/m_amstrad.c index 809a4a701..cded8e4f9 100644 --- a/src/machine/m_amstrad.c +++ b/src/machine/m_amstrad.c @@ -29,8 +29,6 @@ * All models: The internal mouse controller does not work correctly with * version 7.04 of the mouse driver. * - * - * * Authors: Sarah Walker, * Miran Grca, * Fred N. van Kempen, diff --git a/src/machine/m_elt.c b/src/machine/m_elt.c index 2c807782c..17775d430 100644 --- a/src/machine/m_elt.c +++ b/src/machine/m_elt.c @@ -30,7 +30,6 @@ * Boston, MA 02111-1307 * USA. */ - #include #include #include diff --git a/src/machine/m_europc.c b/src/machine/m_europc.c index d85563241..c388e64e3 100644 --- a/src/machine/m_europc.c +++ b/src/machine/m_europc.c @@ -68,8 +68,6 @@ * * WARNING THIS IS A WORK-IN-PROGRESS MODULE. USE AT OWN RISK. * - * - * * Authors: Fred N. van Kempen, * * Inspired by the "jim.c" file originally present, but a diff --git a/src/machine/m_pcjr.c b/src/machine/m_pcjr.c index 9dba8795f..9d4df7528 100644 --- a/src/machine/m_pcjr.c +++ b/src/machine/m_pcjr.c @@ -8,8 +8,6 @@ * * Emulation of the IBM PCjr. * - * - * * Authors: Sarah Walker, * Miran Grca, * Fred N. van Kempen, diff --git a/src/machine/m_ps1.c b/src/machine/m_ps1.c index c8973cbb1..534424609 100644 --- a/src/machine/m_ps1.c +++ b/src/machine/m_ps1.c @@ -22,8 +22,6 @@ * The reserved 384K is remapped to the top of extended memory. * If this is not done then you get an error on startup. * - * - * * Authors: Sarah Walker, * Miran Grca, * Fred N. van Kempen, diff --git a/src/machine/m_ps2_mca.c b/src/machine/m_ps2_mca.c index 4a3d94ab3..d35a31451 100644 --- a/src/machine/m_ps2_mca.c +++ b/src/machine/m_ps2_mca.c @@ -8,8 +8,6 @@ * * Implementation of MCA-based PS/2 machines. * - * - * * Authors: Fred N. van Kempen, * Miran Grca, * Sarah Walker, diff --git a/src/machine/m_tandy.c b/src/machine/m_tandy.c index 899e819f7..9ac254e44 100644 --- a/src/machine/m_tandy.c +++ b/src/machine/m_tandy.c @@ -8,8 +8,6 @@ * * Emulation of Tandy models 1000, 1000HX and 1000SL2. * - * - * * Authors: Sarah Walker, * Miran Grca, * diff --git a/src/machine/m_xt_t1000.c b/src/machine/m_xt_t1000.c index 080a03d19..13407c535 100644 --- a/src/machine/m_xt_t1000.c +++ b/src/machine/m_xt_t1000.c @@ -51,8 +51,6 @@ * NOTE: Still need to figure out a way to load/save ConfigSys and * HardRAM stuff. Needs to be linked in to the NVR code. * - * - * * Authors: Fred N. van Kempen, * Miran Grca, * John Elliott, diff --git a/src/machine/machine.c b/src/machine/machine.c index 50b0bb150..55bc141c0 100644 --- a/src/machine/machine.c +++ b/src/machine/machine.c @@ -8,8 +8,6 @@ * * Handling of the emulated machines. * - * - * * Authors: Miran Grca, * Fred N. van Kempen, * diff --git a/src/mem/catalyst_flash.c b/src/mem/catalyst_flash.c index 5c8812464..da9bfc249 100644 --- a/src/mem/catalyst_flash.c +++ b/src/mem/catalyst_flash.c @@ -9,8 +9,6 @@ * Implementation of the Intel 1 Mbit and 2 Mbit, 8-bit and * 16-bit flash devices. * - * - * * Authors: Sarah Walker, * Miran Grca, * diff --git a/src/mem/i2c_eeprom.c b/src/mem/i2c_eeprom.c index a8ae7ed04..75b13a801 100644 --- a/src/mem/i2c_eeprom.c +++ b/src/mem/i2c_eeprom.c @@ -8,8 +8,6 @@ * * Emulation of the 24Cxx series of I2C EEPROMs. * - * - * * Authors: RichardG, * * Copyright 2020 RichardG. diff --git a/src/mem/intel_flash.c b/src/mem/intel_flash.c index e193f3545..50e8016ce 100644 --- a/src/mem/intel_flash.c +++ b/src/mem/intel_flash.c @@ -9,8 +9,6 @@ * Implementation of the Intel 1 Mbit and 2 Mbit, 8-bit and * 16-bit flash devices. * - * - * * Authors: Sarah Walker, * Miran Grca, * diff --git a/src/mem/mmu_2386.c b/src/mem/mmu_2386.c index ebf062d95..21a5c43a3 100644 --- a/src/mem/mmu_2386.c +++ b/src/mem/mmu_2386.c @@ -1,20 +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. + * 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. + * This file is part of the 86Box distribution. * - * Memory handling and MMU. + * Memory handling and MMU. * - * Authors: Sarah Walker, - * Miran Grca, - * Fred N. van Kempen, + * Authors: Sarah Walker, + * Miran Grca, + * Fred N. van Kempen, * - * Copyright 2008-2020 Sarah Walker. - * Copyright 2016-2020 Miran Grca. - * Copyright 2017-2020 Fred N. van Kempen. + * Copyright 2008-2020 Sarah Walker. + * Copyright 2016-2020 Miran Grca. + * Copyright 2017-2020 Fred N. van Kempen. */ #include #include @@ -1048,7 +1048,7 @@ do_mmutranslate_2386(uint32_t addr, uint32_t *a64, int num, int write) mem_debug_check_addr(addr, write ? 2 : read_type); for (i = 0; i < num; i++) - a64[i] = (uint64_t) addr; + a64[i] = (uint64_t) addr; if (!(temp_cr0 >> 31)) return; diff --git a/src/mem/nmc93cxx.c b/src/mem/nmc93cxx.c index 50905bae2..17d97591e 100644 --- a/src/mem/nmc93cxx.c +++ b/src/mem/nmc93cxx.c @@ -8,14 +8,12 @@ * * Emulation of National Semiconductors NMC93Cxx EEPROMs. * - * * Authors: Cacodemon345 * * Copyright 2023 Cacodemon345 */ /* Ported over from QEMU */ - #include #include #include diff --git a/src/mem/rom.c b/src/mem/rom.c index 7c86d1368..631328913 100644 --- a/src/mem/rom.c +++ b/src/mem/rom.c @@ -12,8 +12,6 @@ * - pc2386 video BIOS is underdumped (16k instead of 24k) * - c386sx16 BIOS fails checksum * - * - * * Authors: Sarah Walker, * Miran Grca, * Fred N. van Kempen, diff --git a/src/mem/row.c b/src/mem/row.c index 572df7f47..02839b848 100644 --- a/src/mem/row.c +++ b/src/mem/row.c @@ -1,16 +1,16 @@ /* - * 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. + * 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. + * This file is part of the 86Box distribution. * - * DRAM row handling. + * DRAM row handling. * - * Authors: Miran Grca, + * Authors: Miran Grca, * - * Copyright 2016-2020 Miran Grca. + * Copyright 2016-2020 Miran Grca. */ #include #include @@ -266,9 +266,9 @@ row_init(const device_t *info) pages[c].write_w = NULL; pages[c].write_l = NULL; #ifdef USE_NEW_DYNAREC - pages[c].evict_prev = EVICT_NOT_IN_LIST; - pages[c].byte_dirty_mask = &byte_dirty_mask[c * 64]; - pages[c].byte_code_present_mask = &byte_code_present_mask[c * 64]; + pages[c].evict_prev = EVICT_NOT_IN_LIST; + pages[c].byte_dirty_mask = &byte_dirty_mask[c * 64]; + pages[c].byte_code_present_mask = &byte_code_present_mask[c * 64]; #endif } diff --git a/src/mem/spd.c b/src/mem/spd.c index 01cd7b464..f3a61297b 100644 --- a/src/mem/spd.c +++ b/src/mem/spd.c @@ -8,8 +8,6 @@ * * Emulation of SPD (Serial Presence Detect) devices. * - * - * * Authors: RichardG, * * Copyright 2020 RichardG. diff --git a/src/mem/sst_flash.c b/src/mem/sst_flash.c index 7a836792f..5db1e33de 100644 --- a/src/mem/sst_flash.c +++ b/src/mem/sst_flash.c @@ -8,8 +8,6 @@ * * Implementation of an SST flash chip. * - * - * * Authors: Miran Grca, * Jasmine Iwanek, * diff --git a/src/network/net_3c501.c b/src/network/net_3c501.c index f5809afb1..78c71ca88 100644 --- a/src/network/net_3c501.c +++ b/src/network/net_3c501.c @@ -9,8 +9,6 @@ * Implementation of the following network controller: * - 3Com Etherlink 3c500/3c501 (ISA 8-bit). * - * - * * Based on @(#)Dev3C501.cpp Oracle (VirtualBox) * * Authors: TheCollector1995, diff --git a/src/network/net_3c503.c b/src/network/net_3c503.c index ea64633bc..3c1f1b041 100644 --- a/src/network/net_3c503.c +++ b/src/network/net_3c503.c @@ -9,8 +9,6 @@ * Implementation of the following network controllers: * - 3Com Etherlink II 3c503 (ISA 8-bit). * - * - * * Based on @(#)3c503.cpp Carl (MAME) * * Authors: TheCollector1995, diff --git a/src/network/net_dp8390.c b/src/network/net_dp8390.c index a0e0e7129..7f3490877 100644 --- a/src/network/net_dp8390.c +++ b/src/network/net_dp8390.c @@ -7,8 +7,6 @@ * Emulation of the DP8390 Network Interface Controller used by * the WD family, NE1000/NE2000 family, and 3Com 3C503 NIC's. * - * - * * Authors: Miran Grca, * Bochs project, * diff --git a/src/network/net_modem.c b/src/network/net_modem.c index 24869349f..20d3a03d1 100644 --- a/src/network/net_modem.c +++ b/src/network/net_modem.c @@ -8,8 +8,6 @@ * * Hayes AT-compliant modem emulation. * - * - * * Authors: Cacodemon345 * The DOSBox Team * @@ -17,7 +15,6 @@ * Copyright (C) 2022 The DOSBox Staging Team * Copyright (C) 2002-2021 The DOSBox Team */ - #include #include #include diff --git a/src/network/net_ne2000.c b/src/network/net_ne2000.c index 0174ef098..0ce0190ac 100644 --- a/src/network/net_ne2000.c +++ b/src/network/net_ne2000.c @@ -13,8 +13,6 @@ * - Realtek RTL8019AS (ISA 16-bit, PnP); * - Realtek RTL8029AS (PCI). * - * - * * Based on @(#)ne2k.cc v1.56.2.1 2004/02/02 22:37:22 cbothamy * * Authors: Fred N. van Kempen, diff --git a/src/network/net_netswitch.c b/src/network/net_netswitch.c index 336895dc6..e95c9aeaf 100644 --- a/src/network/net_netswitch.c +++ b/src/network/net_netswitch.c @@ -1,21 +1,17 @@ /* -* 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. -* -* Network Switch network driver -* -* -* -* Authors: cold-brewed -* -* Copyright 2024 cold-brewed + * 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. + * + * Network Switch network driver + * + * Authors: cold-brewed + * + * Copyright 2024 cold-brewed */ - - #include #include #include diff --git a/src/network/net_null.c b/src/network/net_null.c index 6d5f68e46..4b1f03e3f 100644 --- a/src/network/net_null.c +++ b/src/network/net_null.c @@ -1,20 +1,17 @@ /* -* 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. -* -* Null network driver -* -* -* -* Authors: cold-brewed -* -* Copyright 2023 The 86Box development team -*/ - + * 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. + * + * Null network driver + * + * Authors: cold-brewed + * + * Copyright 2023 The 86Box development team + */ #include #include #include diff --git a/src/network/net_pcap.c b/src/network/net_pcap.c index 2af34d786..e0c6804f4 100644 --- a/src/network/net_pcap.c +++ b/src/network/net_pcap.c @@ -6,8 +6,6 @@ * * Handle WinPcap library processing. * - * - * * Authors: Fred N. van Kempen, * * Copyright 2017-2019 Fred N. van Kempen. diff --git a/src/network/net_pcnet.c b/src/network/net_pcnet.c index 16fd7c65c..0c97d1078 100644 --- a/src/network/net_pcnet.c +++ b/src/network/net_pcnet.c @@ -4,11 +4,11 @@ * PC systems and compatibles from 1981 through fairly recent * system designs based on the PCI bus. * + * This file is part of the 86Box distribution. + * * Emulation of the AMD PCnet LANCE NIC controller for both the ISA, VLB, * and PCI buses. * - * - * * Authors: Miran Grca, * TheCollector1995, * Antony T Curtis diff --git a/src/network/net_plip.c b/src/network/net_plip.c index 5eacc5536..36df49153 100644 --- a/src/network/net_plip.c +++ b/src/network/net_plip.c @@ -12,8 +12,6 @@ * packet driver. PLIP is not particularly fast, as it's a 4-bit * half-duplex protocol operating over SPP. * - * - * * Authors: RichardG, * Copyright 2020 RichardG. */ diff --git a/src/network/net_slirp.c b/src/network/net_slirp.c index 9bf1f63d4..4f61a55a8 100644 --- a/src/network/net_slirp.c +++ b/src/network/net_slirp.c @@ -11,8 +11,6 @@ * Some of the code was borrowed from libvdeslirp * * - * - * * Authors: Fred N. van Kempen, * RichardG, * diff --git a/src/network/net_tap.c b/src/network/net_tap.c index 762f68b60..48721a9d2 100644 --- a/src/network/net_tap.c +++ b/src/network/net_tap.c @@ -13,7 +13,6 @@ * * Authors: Doug Johnson * - * * Copyright 2023 Doug Johnson * * Redistribution and use in source and binary forms, with @@ -46,7 +45,6 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ - #ifdef _WIN32 # error TAP networking is only supported on Linux #endif diff --git a/src/network/net_wd8003.c b/src/network/net_wd8003.c index 890b221e2..100391eb0 100644 --- a/src/network/net_wd8003.c +++ b/src/network/net_wd8003.c @@ -11,8 +11,6 @@ * - SMC/WD 8013EBT (ISA 16-bit); * - SMC/WD 8013EP/A (MCA). * - * - * * Authors: Fred N. van Kempen, * TheCollector1995, * Miran Grca, diff --git a/src/network/netswitch.c b/src/network/netswitch.c index 54815a682..e7b913d0d 100644 --- a/src/network/netswitch.c +++ b/src/network/netswitch.c @@ -1,21 +1,17 @@ /* -* 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. -* -* Network Switch backend -* -* -* -* Authors: cold-brewed -* -* Copyright 2024 cold-brewed -*/ - - + * 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. + * + * Network Switch backend + * + * Authors: cold-brewed + * + * Copyright 2024 cold-brewed + */ #include #include #include diff --git a/src/network/netswitch.h b/src/network/netswitch.h index 02534ff30..69062b66c 100644 --- a/src/network/netswitch.h +++ b/src/network/netswitch.h @@ -1,20 +1,17 @@ /* -* 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. -* -* Network Switch backend -* -* -* -* Authors: cold-brewed -* -* Copyright 2024 cold-brewed -*/ - + * 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. + * + * Network Switch backend + * + * Authors: cold-brewed + * + * Copyright 2024 cold-brewed + */ #ifndef NET_SWITCH_H #define NET_SWITCH_H diff --git a/src/network/network.c b/src/network/network.c index 661da7250..3f854f356 100644 --- a/src/network/network.c +++ b/src/network/network.c @@ -10,8 +10,6 @@ * it should be malloc'ed and then linked to the NETCARD def. * Will be done later. * - * - * * Authors: Fred N. van Kempen, * * Copyright 2017-2019 Fred N. van Kempen. diff --git a/src/nvr.c b/src/nvr.c index b6bf2a5a5..ba4a12aa4 100644 --- a/src/nvr.c +++ b/src/nvr.c @@ -6,8 +6,6 @@ * * Implement a generic NVRAM/CMOS/RTC device. * - * - * * Authors: Fred N. van Kempen, , * David Hrdlička, * diff --git a/src/nvr_ps2.c b/src/nvr_ps2.c index febf6c165..9698f5fae 100644 --- a/src/nvr_ps2.c +++ b/src/nvr_ps2.c @@ -8,8 +8,6 @@ * * Handling of the PS/2 series CMOS devices. * - * - * * Authors: Fred N. van Kempen, * Sarah Walker, * diff --git a/src/pci.c b/src/pci.c index 94ab9d5f2..16e8cdb4f 100644 --- a/src/pci.c +++ b/src/pci.c @@ -8,8 +8,6 @@ * * Implementation the PCI bus. * - * - * * Authors: Miran Grca, * * Copyright 2023 Miran Grca. diff --git a/src/pic.c b/src/pic.c index 50802552f..a39933939 100644 --- a/src/pic.c +++ b/src/pic.c @@ -9,8 +9,6 @@ * Implementation of the Intel PIC chip emulation, partially * ported from reenigne's XTCE. * - * - * * Authors: Andrew Jenner, * Miran Grca, * diff --git a/src/pit.c b/src/pit.c index b99fed799..7c58a4b67 100644 --- a/src/pit.c +++ b/src/pit.c @@ -9,8 +9,6 @@ * Implementation of the Intel 8253/8254 Programmable Interval * Timer. * - * - * * Authors: Miran Grca, * * Copyright 2019 Miran Grca. diff --git a/src/pit_fast.c b/src/pit_fast.c index b92b59f3c..f8df2a7c4 100644 --- a/src/pit_fast.c +++ b/src/pit_fast.c @@ -9,8 +9,6 @@ * Implementation of the Intel 8253/8254 Programmable Interval * Timer. * - * - * * Authors: Miran Grca, * * Copyright 2019 Miran Grca. diff --git a/src/port_6x.c b/src/port_6x.c index b8183d651..0dc9bdbdd 100644 --- a/src/port_6x.c +++ b/src/port_6x.c @@ -9,8 +9,6 @@ * Implementation of Ports 61, 62, and 63 used by various * machines. * - * - * * Authors: Miran Grca, * * Copyright 2021 Miran Grca. diff --git a/src/port_92.c b/src/port_92.c index d1a53a321..23595eeb9 100644 --- a/src/port_92.c +++ b/src/port_92.c @@ -9,8 +9,6 @@ * Implementation of Port 92 used by PS/2 machines and 386+ * clones. * - * - * * Authors: Miran Grca, * * Copyright 2019 Miran Grca. diff --git a/src/printer/png.c b/src/printer/png.c index c7443252b..52d939673 100644 --- a/src/printer/png.c +++ b/src/printer/png.c @@ -6,8 +6,6 @@ * * Provide centralized access to the PNG image handler. * - * - * * Authors: Fred N. van Kempen, * * Copyright 2018 Fred N. van Kempen. diff --git a/src/printer/prt_cpmap.c b/src/printer/prt_cpmap.c index 153008f35..370e258ce 100644 --- a/src/printer/prt_cpmap.c +++ b/src/printer/prt_cpmap.c @@ -6,8 +6,6 @@ * * Various ASCII to Unicode maps, for the various codepages. * - * - * * Authors: Michael Drüing, * Fred N. van Kempen, * diff --git a/src/printer/prt_escp.c b/src/printer/prt_escp.c index 8fb6a1059..a24072971 100644 --- a/src/printer/prt_escp.c +++ b/src/printer/prt_escp.c @@ -6,8 +6,6 @@ * * Implementation of the Generic ESC/P 2 Dot-Matrix printer. * - * - * * Authors: Michael Drüing, * Fred N. van Kempen, * diff --git a/src/printer/prt_ps.c b/src/printer/prt_ps.c index 38c8053c2..3a3230394 100644 --- a/src/printer/prt_ps.c +++ b/src/printer/prt_ps.c @@ -9,15 +9,12 @@ * Implementation of a generic PostScript printer and a * generic PCL 5e printer. * - * - * * Authors: David Hrdlička, * Cacodemon345 * * Copyright 2019 David Hrdlička. * Copyright 2024 Cacodemon345. */ - #include #include #include diff --git a/src/printer/prt_text.c b/src/printer/prt_text.c index 41d3737d1..af601af75 100644 --- a/src/printer/prt_text.c +++ b/src/printer/prt_text.c @@ -13,8 +13,6 @@ * printer mechanics. This would lead to a page being 66 lines * of 80 characters each. * - * - * * Authors: Fred N. van Kempen, * * Copyright 2018-2019 Fred N. van Kempen. diff --git a/src/scsi/scsi.c b/src/scsi/scsi.c index a02f4e7a5..36e1d0638 100644 --- a/src/scsi/scsi.c +++ b/src/scsi/scsi.c @@ -8,8 +8,6 @@ * * Handling of the SCSI controllers. * - * - * * Authors: Miran Grca, * Fred N. van Kempen, * TheCollector1995, diff --git a/src/scsi/scsi_aha154x.c b/src/scsi/scsi_aha154x.c index 7161a53bb..61228b3c0 100644 --- a/src/scsi/scsi_aha154x.c +++ b/src/scsi/scsi_aha154x.c @@ -10,8 +10,6 @@ * made by Adaptec, Inc. These controllers were designed for * the ISA bus. * - * - * * Authors: Fred N. van Kempen, * Original Buslogic version by SA1988 and Miran Grca. * diff --git a/src/scsi/scsi_buslogic.c b/src/scsi/scsi_buslogic.c index c2ecc7b62..daeb0a3e4 100644 --- a/src/scsi/scsi_buslogic.c +++ b/src/scsi/scsi_buslogic.c @@ -11,8 +11,6 @@ * 1 - BT-545S ISA; * 2 - BT-958D PCI * - * - * * Authors: TheCollector1995, * Miran Grca, * Fred N. van Kempen, diff --git a/src/scsi/scsi_device.c b/src/scsi/scsi_device.c index 33d3fa89a..1f6967105 100644 --- a/src/scsi/scsi_device.c +++ b/src/scsi/scsi_device.c @@ -8,8 +8,6 @@ * * The generic SCSI device command handler. * - * - * * Authors: Miran Grca, * Fred N. van Kempen, * diff --git a/src/scsi/scsi_disk.c b/src/scsi/scsi_disk.c index 9c8d36f7f..6c59ee7ad 100644 --- a/src/scsi/scsi_disk.c +++ b/src/scsi/scsi_disk.c @@ -6,8 +6,6 @@ * * Emulation of SCSI fixed disks. * - * - * * Authors: Miran Grca, * * Copyright 2017-2018 Miran Grca. diff --git a/src/scsi/scsi_ncr5380.c b/src/scsi/scsi_ncr5380.c index 132fade37..102e637c4 100644 --- a/src/scsi/scsi_ncr5380.c +++ b/src/scsi/scsi_ncr5380.c @@ -9,8 +9,6 @@ * Implementation of the NCR 5380 chip made by NCR * and used in various controllers. * - * - * * Authors: Sarah Walker, * TheCollector1995, * Fred N. van Kempen, diff --git a/src/scsi/scsi_ncr53c400.c b/src/scsi/scsi_ncr53c400.c index 5f2302b4f..31a2de8b3 100644 --- a/src/scsi/scsi_ncr53c400.c +++ b/src/scsi/scsi_ncr53c400.c @@ -9,8 +9,6 @@ * Implementation of the NCR 53c400 series of SCSI Host Adapters * made by NCR. These controllers were designed for the ISA and MCA bus. * - * - * * Authors: Sarah Walker, * TheCollector1995, * Fred N. van Kempen, diff --git a/src/scsi/scsi_ncr53c8xx.c b/src/scsi/scsi_ncr53c8xx.c index f87f22452..bc3ecec0b 100644 --- a/src/scsi/scsi_ncr53c8xx.c +++ b/src/scsi/scsi_ncr53c8xx.c @@ -10,8 +10,6 @@ * Adapters made by NCR and later Symbios and LSI. These * controllers were designed for the PCI bus. * - * - * * Authors: Paul Brook (QEMU) * Artyom Tarasenko (QEMU) * TheCollector1995, diff --git a/src/scsi/scsi_pcscsi.c b/src/scsi/scsi_pcscsi.c index 2c73066a1..11793f5a9 100644 --- a/src/scsi/scsi_pcscsi.c +++ b/src/scsi/scsi_pcscsi.c @@ -9,8 +9,6 @@ * Implementation of the Tekram DC-390 SCSI and related MCA * controllers using the NCR 53c9x series of chips. * - * - * * Authors: Fabrice Bellard (QEMU) * Herve Poussineau (QEMU) * TheCollector1995, diff --git a/src/scsi/scsi_spock.c b/src/scsi/scsi_spock.c index 0bb2d70ba..cf0236236 100644 --- a/src/scsi/scsi_spock.c +++ b/src/scsi/scsi_spock.c @@ -9,8 +9,6 @@ * Implementation of the IBM PS/2 SCSI controller with * cache for MCA only. * - * - * * Authors: Sarah Walker, * TheCollector1995, * diff --git a/src/scsi/scsi_t128.c b/src/scsi/scsi_t128.c index e2f963900..5b893dd70 100644 --- a/src/scsi/scsi_t128.c +++ b/src/scsi/scsi_t128.c @@ -9,8 +9,6 @@ * Implementation of the Trantor 128/228 series of SCSI Host Adapters * made by Trantor. These controllers were designed for the ISA and MCA bus. * - * - * * Authors: Sarah Walker, * TheCollector1995, * Fred N. van Kempen, diff --git a/src/scsi/scsi_x54x.c b/src/scsi/scsi_x54x.c index c248fbe92..b4256f94d 100644 --- a/src/scsi/scsi_x54x.c +++ b/src/scsi/scsi_x54x.c @@ -11,8 +11,6 @@ * series of SCSI Host Adapters made by Mylex. * These controllers were designed for various buses. * - * - * * Authors: TheCollector1995, * Miran Grca, * Fred N. van Kempen, diff --git a/src/sio/sio_82091aa.c b/src/sio/sio_82091aa.c index cfe33df12..6a38ec92c 100644 --- a/src/sio/sio_82091aa.c +++ b/src/sio/sio_82091aa.c @@ -8,8 +8,6 @@ * * Emulation of the Intel 82091AA Super I/O chip. * - * - * * Authors: Miran Grca, * * Copyright 2020 Miran Grca. diff --git a/src/sio/sio_acc3221.c b/src/sio/sio_acc3221.c index c9cb8b6cf..babcff121 100644 --- a/src/sio/sio_acc3221.c +++ b/src/sio/sio_acc3221.c @@ -8,8 +8,6 @@ * * Implementation of the ACC 3221-SP Super I/O Chip. * - * - * * Authors: Sarah Walker, * * Copyright 2019 Sarah Walker. diff --git a/src/sio/sio_ali5123.c b/src/sio/sio_ali5123.c index 5dad42252..39d6f1b90 100644 --- a/src/sio/sio_ali5123.c +++ b/src/sio/sio_ali5123.c @@ -8,8 +8,6 @@ * * Implementation of the ALi M5123/1543C Super I/O Chip. * - * - * * Authors: Miran Grca, * * Copyright 2016-2018 Miran Grca. diff --git a/src/sio/sio_cbm_io.c b/src/sio/sio_cbm_io.c index 477c30a44..2bcdadd65 100644 --- a/src/sio/sio_cbm_io.c +++ b/src/sio/sio_cbm_io.c @@ -8,8 +8,6 @@ * * Implementation of the ACC 3221-SP Super I/O Chip. * - * - * * Authors: Sarah Walker, * * Copyright 2019 Sarah Walker. diff --git a/src/sio/sio_detect.c b/src/sio/sio_detect.c index d36522fe0..d34718db9 100644 --- a/src/sio/sio_detect.c +++ b/src/sio/sio_detect.c @@ -8,8 +8,6 @@ * * Super I/O chip detection code. * - * - * * Authors: Miran Grca, * * Copyright 2016-2018 Miran Grca. diff --git a/src/sio/sio_fdc37c669.c b/src/sio/sio_fdc37c669.c index 57ca37619..122afc521 100644 --- a/src/sio/sio_fdc37c669.c +++ b/src/sio/sio_fdc37c669.c @@ -8,8 +8,6 @@ * * Implementation of the SMC FDC37C669 Super I/O Chip. * - * - * * Authors: Miran Grca, * * Copyright 2016-2024 Miran Grca. diff --git a/src/sio/sio_it86x1f.c b/src/sio/sio_it86x1f.c index 324914355..2b7d5c580 100644 --- a/src/sio/sio_it86x1f.c +++ b/src/sio/sio_it86x1f.c @@ -8,8 +8,6 @@ * * Emulation of the ITE IT86x1F Super I/O chips. * - * - * * Authors: RichardG, * * Copyright 2023 RichardG. diff --git a/src/sio/sio_pc87306.c b/src/sio/sio_pc87306.c index f3c635dc8..f9e066b1f 100644 --- a/src/sio/sio_pc87306.c +++ b/src/sio/sio_pc87306.c @@ -8,8 +8,6 @@ * * Emulation of the NatSemi PC87306 Super I/O chip. * - * - * * Authors: Miran Grca, * * Copyright 2016-2018 Miran Grca. diff --git a/src/sio/sio_um8669f.c b/src/sio/sio_um8669f.c index 96c37573d..3431ae63e 100644 --- a/src/sio/sio_um8669f.c +++ b/src/sio/sio_um8669f.c @@ -44,7 +44,6 @@ 10 ASKIR 11 Disabled */ - #include #include #include diff --git a/src/sio/sio_vt82c686.c b/src/sio/sio_vt82c686.c index 4caffbc00..4b6228905 100644 --- a/src/sio/sio_vt82c686.c +++ b/src/sio/sio_vt82c686.c @@ -8,8 +8,6 @@ * * Emulation of the VIA VT82C686A/B integrated Super I/O. * - * - * * Authors: RichardG, * * Copyright 2020 RichardG. diff --git a/src/sio/sio_w837x7.c b/src/sio/sio_w837x7.c index 0b6aae240..ecf51d061 100644 --- a/src/sio/sio_w837x7.c +++ b/src/sio/sio_w837x7.c @@ -9,6 +9,7 @@ * Emulation of the Winbond W837x7F/IF Super I/O Chip. * * Authors: Miran Grca, + * * Copyright 2020-2025 Miran Grca. */ #include diff --git a/src/sio/sio_w83877.c b/src/sio/sio_w83877.c index 55ee9dd6a..b57ad76ff 100644 --- a/src/sio/sio_w83877.c +++ b/src/sio/sio_w83877.c @@ -9,6 +9,7 @@ * Emulation of the Winbond W83877 family of Super I/O Chips. * * Authors: Miran Grca, + * * Copyright 2016-2025 Miran Grca. */ #include diff --git a/src/sound/audio4.c b/src/sound/audio4.c index c76d3253f..db43fa5d9 100644 --- a/src/sound/audio4.c +++ b/src/sound/audio4.c @@ -1,17 +1,16 @@ /* - * 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. + * 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. + * This file is part of the 86Box distribution. * - * Interface to audio(4) for NetBSD/OpenBSD. + * Interface to audio(4) for NetBSD/OpenBSD. * + * Authors: Nishi * - * Authors: Nishi - * - * Copyright 2025 Nishi. + * Copyright 2025 Nishi. */ #include #include diff --git a/src/sound/midi.c b/src/sound/midi.c index 9f83e88dc..84aed3d51 100644 --- a/src/sound/midi.c +++ b/src/sound/midi.c @@ -1,22 +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. + * 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. + * This file is part of the 86Box distribution. * - * MIDI device core module. + * MIDI device core module. * + * Authors: Miran Grca, + * Bit, + * DOSBox Team, * - * - * Authors: Miran Grca, - * Bit, - * DOSBox Team, - * - * Copyright 2016-2020 Miran Grca. - * Copyright 2016-2020 Bit. - * Copyright 2008-2020 DOSBox Team. + * Copyright 2016-2020 Miran Grca. + * Copyright 2016-2020 Bit. + * Copyright 2008-2020 DOSBox Team. */ #include #include diff --git a/src/sound/midi_rtmidi.cpp b/src/sound/midi_rtmidi.cpp index 11203c3f2..e5e03bc0d 100644 --- a/src/sound/midi_rtmidi.cpp +++ b/src/sound/midi_rtmidi.cpp @@ -10,10 +10,10 @@ * * Author: Cacodemon345, * Miran Grca, + * * Copyright 2021 Cacodemon345. * Copyright 2021 Miran Grca. */ - #if defined __has_include # if __has_include() # include diff --git a/src/sound/openal.c b/src/sound/openal.c index c2addb270..9734470b0 100644 --- a/src/sound/openal.c +++ b/src/sound/openal.c @@ -1,20 +1,18 @@ /* - * 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. + * 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. + * This file is part of the 86Box distribution. * - * Interface to the OpenAL sound processing library. + * Interface to the OpenAL sound processing library. * + * Authors: Sarah Walker, + * Miran Grca, * - * - * Authors: Sarah Walker, - * Miran Grca, - * - * Copyright 2008-2019 Sarah Walker. - * Copyright 2016-2019 Miran Grca. + * Copyright 2008-2019 Sarah Walker. + * Copyright 2016-2019 Miran Grca. */ #include #include diff --git a/src/sound/snd_ac97_codec.c b/src/sound/snd_ac97_codec.c index 1b28a8aab..77e5825d9 100644 --- a/src/sound/snd_ac97_codec.c +++ b/src/sound/snd_ac97_codec.c @@ -1,18 +1,16 @@ /* - * 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. + * 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. + * This file is part of the 86Box distribution. * - * AC'97 audio codec emulation. + * AC'97 audio codec emulation. * + * Authors: RichardG, * - * - * Authors: RichardG, - * - * Copyright 2021 RichardG. + * Copyright 2021 RichardG. */ #include #include diff --git a/src/sound/snd_ac97_via.c b/src/sound/snd_ac97_via.c index 2d994b08f..22a115607 100644 --- a/src/sound/snd_ac97_via.c +++ b/src/sound/snd_ac97_via.c @@ -1,18 +1,16 @@ /* - * 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. + * 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. + * This file is part of the 86Box distribution. * - * VIA AC'97 audio controller emulation. + * VIA AC'97 audio controller emulation. * + * Authors: RichardG, * - * - * Authors: RichardG, - * - * Copyright 2021 RichardG. + * Copyright 2021 RichardG. */ #include #include diff --git a/src/sound/snd_ad1848.c b/src/sound/snd_ad1848.c index ef6f38041..94520070e 100644 --- a/src/sound/snd_ad1848.c +++ b/src/sound/snd_ad1848.c @@ -1,22 +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. + * 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. + * This file is part of the 86Box distribution. * - * AD1848 / CS4248 / CS4231 (Windows Sound System) codec emulation. + * AD1848 / CS4248 / CS4231 (Windows Sound System) codec emulation. * + * Authors: Sarah Walker, + * TheCollector1995, + * RichardG, * - * - * Authors: Sarah Walker, - * TheCollector1995, - * RichardG, - * - * Copyright 2008-2020 Sarah Walker. - * Copyright 2018-2020 TheCollector1995. - * Copyright 2021-2025 RichardG. + * Copyright 2008-2020 Sarah Walker. + * Copyright 2018-2020 TheCollector1995. + * Copyright 2021-2025 RichardG. */ #include #include diff --git a/src/sound/snd_cmi8x38.c b/src/sound/snd_cmi8x38.c index a41f53865..58b328f01 100644 --- a/src/sound/snd_cmi8x38.c +++ b/src/sound/snd_cmi8x38.c @@ -8,8 +8,6 @@ * * C-Media CMI8x38 PCI audio controller emulation. * - * - * * Authors: RichardG, * * Copyright 2022 RichardG. diff --git a/src/sound/snd_cs423x.c b/src/sound/snd_cs423x.c index 5905fb64e..15ad71782 100644 --- a/src/sound/snd_cs423x.c +++ b/src/sound/snd_cs423x.c @@ -1,18 +1,16 @@ /* - * 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. + * 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. + * This file is part of the 86Box distribution. * - * Crystal CS423x (SBPro/WSS compatible sound chips) emulation. + * Crystal CS423x (SBPro/WSS compatible sound chips) emulation. * + * Authors: RichardG, * - * - * Authors: RichardG, - * - * Copyright 2021-2025 RichardG. + * Copyright 2021-2025 RichardG. */ #include #include diff --git a/src/sound/snd_mpu401.c b/src/sound/snd_mpu401.c index bec2ed39c..87c191cec 100644 --- a/src/sound/snd_mpu401.c +++ b/src/sound/snd_mpu401.c @@ -1,20 +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. + * 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. + * This file is part of the 86Box distribution. * - * Roland MPU-401 emulation. + * Roland MPU-401 emulation. * - * Authors: DOSBox Team, - * Miran Grca, - * TheCollector1995, + * Authors: DOSBox Team, + * Miran Grca, + * TheCollector1995, * - * Copyright 2008-2024 DOSBox Team. - * Copyright 2016-2024 Miran Grca. - * Copyright 2016-2024 TheCollector1995. + * Copyright 2008-2024 DOSBox Team. + * Copyright 2016-2024 Miran Grca. + * Copyright 2016-2024 TheCollector1995. */ #include #include diff --git a/src/sound/snd_opl2board.c b/src/sound/snd_opl2board.c index 632ad85f1..e8d877222 100644 --- a/src/sound/snd_opl2board.c +++ b/src/sound/snd_opl2board.c @@ -7,7 +7,6 @@ * This file is part of the 86Box distribution. * * Interface to the OPL2Board External audio device (USB) - * * * Authors: Jose Phillips * Fred N. van Kempen, @@ -17,7 +16,6 @@ * Copyright 2017-2020 Fred N. van Kempen. * Copyright 2016-2020 Miran Grca. */ - #include #include #include diff --git a/src/sound/snd_opl_esfm.c b/src/sound/snd_opl_esfm.c index b80d264d5..a05f1f52c 100644 --- a/src/sound/snd_opl_esfm.c +++ b/src/sound/snd_opl_esfm.c @@ -8,7 +8,6 @@ * * ESFMu ESFM emulator. * - * * Authors: Fred N. van Kempen, * Miran Grca, * Alexey Khokholov (Nuke.YKT) @@ -19,7 +18,6 @@ * Copyright 2013-2018 Alexey Khokholov (Nuke.YKT) * Copyright 2024 Cacodemon345 */ - #include #include #include diff --git a/src/sound/snd_opl_ymfm.cpp b/src/sound/snd_opl_ymfm.cpp index fb00401d5..815b6cb4b 100644 --- a/src/sound/snd_opl_ymfm.cpp +++ b/src/sound/snd_opl_ymfm.cpp @@ -8,7 +8,6 @@ * * Interface to the YMFM emulator. * - * * Authors: Adrien Moulin, * * Copyright 2022 Adrien Moulin. diff --git a/src/sound/snd_optimc.c b/src/sound/snd_optimc.c index 274bbd568..c6f25aadf 100644 --- a/src/sound/snd_optimc.c +++ b/src/sound/snd_optimc.c @@ -8,15 +8,12 @@ * * OPTi MediaCHIPS 82C929A (also known as OPTi MAD16 Pro) audio controller emulation. * - * - * * Authors: Cacodemon345 * Eluan Costa Miranda * * Copyright 2022 Cacodemon345. * Copyright 2020 Eluan Costa Miranda. */ - #include #include #include diff --git a/src/sound/snd_speaker.c b/src/sound/snd_speaker.c index 063554875..a780861f8 100644 --- a/src/sound/snd_speaker.c +++ b/src/sound/snd_speaker.c @@ -1,20 +1,18 @@ /* - * 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. + * 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. + * This file is part of the 86Box distribution. * - * Emulation of the PC speaker. + * Emulation of the PC speaker. * + * Authors: Sarah Walker, + * Miran Grca, * - * - * Authors: Sarah Walker, - * Miran Grca, - * - * Copyright 2008-2019 Sarah Walker. - * Copyright 2016-2019 Miran Grca. + * Copyright 2008-2019 Sarah Walker. + * Copyright 2016-2019 Miran Grca. */ #include #include diff --git a/src/sound/snd_wss.c b/src/sound/snd_wss.c index 874638a80..aa5166fa6 100644 --- a/src/sound/snd_wss.c +++ b/src/sound/snd_wss.c @@ -1,20 +1,18 @@ /* - * 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. + * 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. + * This file is part of the 86Box distribution. * - * Windows Sound System emulation. + * Windows Sound System emulation. * + * Authors: Sarah Walker, + * TheCollector1995, * - * - * Authors: Sarah Walker, - * TheCollector1995, - * - * Copyright 2012-2018 Sarah Walker. - * Copyright 2018 TheCollector1995. + * Copyright 2012-2018 Sarah Walker. + * Copyright 2018 TheCollector1995. */ #include #include diff --git a/src/sound/snd_ymf701.c b/src/sound/snd_ymf701.c index ff2f9f78a..3b3529320 100644 --- a/src/sound/snd_ymf701.c +++ b/src/sound/snd_ymf701.c @@ -8,8 +8,6 @@ * * Yamaha YMF-701 (OPL3-SA) audio controller emulation. * - * - * * Authors: Cacodemon345 * Eluan Costa Miranda * win2kgamer @@ -18,7 +16,6 @@ * Copyright 2020 Eluan Costa Miranda. * Copyright 2025 win2kgamer */ - #include #include #include diff --git a/src/sound/snd_ymf71x.c b/src/sound/snd_ymf71x.c index 2bede0555..480d3c2d0 100644 --- a/src/sound/snd_ymf71x.c +++ b/src/sound/snd_ymf71x.c @@ -8,8 +8,6 @@ * * Yamaha YMF-71x (OPL3-SA2/3) audio controller emulation. * - * - * * Authors: Cacodemon345 * Eluan Costa Miranda * win2kgamer @@ -18,7 +16,6 @@ * Copyright 2020 Eluan Costa Miranda. * Copyright 2025 win2kgamer */ - #include #include #include @@ -118,11 +115,11 @@ typedef struct ymf71x_t { uint8_t index; uint8_t regs[0x20]; uint8_t max_reg; - double master_l; - double master_r; + double master_l; + double master_r; - void *pnp_card; - uint8_t pnp_rom[512]; + void *pnp_card; + uint8_t pnp_rom[512]; uint8_t key_pos : 5; uint8_t configidx; uint8_t ramwrite_enable; @@ -176,8 +173,8 @@ static uint8_t ymf71x_wss_read(uint16_t addr, void *priv) { ymf71x_t *ymf71x = (ymf71x_t *) priv; - uint8_t ret = 0x00; - uint8_t port = addr - ymf71x->cur_wss_addr; + uint8_t ret = 0x00; + uint8_t port = addr - ymf71x->cur_wss_addr; switch (port) { case 0: @@ -227,7 +224,7 @@ static void ymf71x_wss_write(uint16_t addr, uint8_t val, void *priv) { ymf71x_t *ymf71x = (ymf71x_t *) priv; - uint8_t port = addr - ymf71x->cur_wss_addr; + uint8_t port = addr - ymf71x->cur_wss_addr; ymf71x_log(ymf71x->log, "WSS Write: addr = %02X, val = %02X\n", addr, val); switch (port) { @@ -257,7 +254,7 @@ ymf71x_update_mastervol(void *priv) static void ymf71x_reg_write(uint16_t addr, uint8_t val, void *priv) { - ymf71x_t *ymf71x = (ymf71x_t *) priv; + ymf71x_t *ymf71x = (ymf71x_t *) priv; uint8_t port = addr - ymf71x->cur_ctrl_addr; switch (port) { @@ -528,11 +525,11 @@ ymf71x_pnp_config_changed(uint8_t ld, isapnp_device_config_t *config, void *priv void ymf71x_filter_cd_audio(int channel, double *buffer, void *priv) { - ymf71x_t *ymf71x = (ymf71x_t *) priv; + ymf71x_t *ymf71x = (ymf71x_t *) priv; const double cd_vol = channel ? ymf71x->ad1848.cd_vol_r : ymf71x->ad1848.cd_vol_l; - double master = channel ? ymf71x->master_r : ymf71x->master_l; - double c = ((*buffer * cd_vol / 3.0) * master) / 65536.0; - double bass_treble; + double master = channel ? ymf71x->master_r : ymf71x->master_l; + double c = ((*buffer * cd_vol / 3.0) * master) / 65536.0; + double bass_treble; if ((ymf71x->regs[0x15] & 0x07) != 0x00) { bass_treble = ymf71x_bass_treble_3bits[(ymf71x->regs[0x15] & 0x07)]; @@ -565,7 +562,7 @@ static void ymf71x_filter_opl(void *priv, double *out_l, double *out_r) { ymf71x_t *ymf71x = (ymf71x_t *) priv; - double bass_treble; + double bass_treble; /* Don't play audio if the FM DAC or OPL3 digital sections are powered down */ if ( (!(ymf71x->regs[0x01] & 0x23)) && (!(ymf71x->regs[0x12] & 0x10)) && (!(ymf71x->regs[0x13] & 0x10)) ) { diff --git a/src/sound/sndio.c b/src/sound/sndio.c index 7459dc130..b5a54e420 100644 --- a/src/sound/sndio.c +++ b/src/sound/sndio.c @@ -1,17 +1,16 @@ /* - * 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. + * 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. + * This file is part of the 86Box distribution. * - * Interface to sndio + * Interface to sndio * + * Authors: Nishi * - * Authors: Nishi - * - * Copyright 2025 Nishi. + * Copyright 2025 Nishi. */ #include #include diff --git a/src/sound/sound.c b/src/sound/sound.c index e120655e1..1e406cc8e 100644 --- a/src/sound/sound.c +++ b/src/sound/sound.c @@ -8,8 +8,6 @@ * * Sound emulation core. * - * - * * Authors: Sarah Walker, * Miran Grca, * Jasmine Iwanek, diff --git a/src/sound/xaudio2.c b/src/sound/xaudio2.c index b526fa72f..148175f33 100644 --- a/src/sound/xaudio2.c +++ b/src/sound/xaudio2.c @@ -1,18 +1,16 @@ /* - * 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. + * 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. + * This file is part of the 86Box distribution. * - * Interface to the XAudio2 audio processing library. + * Interface to the XAudio2 audio processing library. * + * Authors: Cacodemon345 * - * - * Authors: Cacodemon345 - * - * Copyright 2022 Cacodemon345. + * Copyright 2022 Cacodemon345. */ #include #include diff --git a/src/unix/dummy_cdrom_ioctl.c b/src/unix/dummy_cdrom_ioctl.c index 8dffc6758..af8679ecc 100644 --- a/src/unix/dummy_cdrom_ioctl.c +++ b/src/unix/dummy_cdrom_ioctl.c @@ -8,8 +8,6 @@ * * Win32 CD-ROM support via IOCTL. * - * - * * Authors: TheCollector1995, , * Miran Grca, * diff --git a/src/unix/unix_cdrom.c b/src/unix/unix_cdrom.c index 09aaa5092..daf13cb9a 100644 --- a/src/unix/unix_cdrom.c +++ b/src/unix/unix_cdrom.c @@ -8,15 +8,12 @@ * * Handle the platform-side of CDROM/RDisk/MO drives. * - * - * * Authors: Miran Grca, * Fred N. van Kempen, * * Copyright 2016-2018 Miran Grca. * Copyright 2017-2018 Fred N. van Kempen. */ - #include #include #include diff --git a/src/unix/unix_serial_passthrough.c b/src/unix/unix_serial_passthrough.c index fb74f67b3..0fcfbe5b1 100644 --- a/src/unix/unix_serial_passthrough.c +++ b/src/unix/unix_serial_passthrough.c @@ -1,21 +1,19 @@ /* - * 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. + * 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. + * This file is part of the 86Box distribution. * - * Definitions for platform specific serial to host passthrough + * Definitions for platform specific serial to host passthrough * + * Authors: Andreas J. Reichel , + * Jasmine Iwanek * - * Authors: Andreas J. Reichel , - * Jasmine Iwanek - * - * Copyright 2021 Andreas J. Reichel. - * Copyright 2021-2025 Jasmine Iwanek. + * Copyright 2021 Andreas J. Reichel. + * Copyright 2021-2025 Jasmine Iwanek. */ - #ifndef __APPLE__ # define _XOPEN_SOURCE 500 # define _DEFAULT_SOURCE 1 diff --git a/src/upi42.c b/src/upi42.c index 50f5c44c9..7685d2948 100644 --- a/src/upi42.c +++ b/src/upi42.c @@ -8,8 +8,6 @@ * * Intel UPI-42/MCS-48 microcontroller emulation. * - * - * * Authors: RichardG, * * Copyright 2022 RichardG. diff --git a/src/usb.c b/src/usb.c index 222062f4f..c305f4806 100644 --- a/src/usb.c +++ b/src/usb.c @@ -9,8 +9,6 @@ * Universal Serial Bus emulation (currently dummy UHCI and * OHCI). * - * - * * Authors: Miran Grca, * * Copyright 2020 Miran Grca. diff --git a/src/utils/ini.c b/src/utils/ini.c index 47e792594..3ca4c7943 100644 --- a/src/utils/ini.c +++ b/src/utils/ini.c @@ -8,8 +8,6 @@ * * Configuration file handler. * - * - * * Authors: Sarah Walker, * Miran Grca, * Fred N. van Kempen, @@ -25,7 +23,6 @@ * it on Windows XP, and possibly also Vista. Use the * -DANSI_CFG for use on these systems. */ - #include #include #include diff --git a/src/utils/random.c b/src/utils/random.c index 58abb15eb..6ed6c1d0c 100644 --- a/src/utils/random.c +++ b/src/utils/random.c @@ -9,8 +9,6 @@ * A better random number generation, used for floppy weak bits * and network MAC address generation. * - * - * * Authors: Miran Grca, * * Copyright 2016-2018 Miran Grca. diff --git a/src/video/agpgart.c b/src/video/agpgart.c index bf1976b73..6ce5508a0 100644 --- a/src/video/agpgart.c +++ b/src/video/agpgart.c @@ -8,8 +8,6 @@ * * AGP Graphics Address Remapping Table remapping emulation. * - * - * * Authors: RichardG, * * Copyright 2021 RichardG. diff --git a/src/video/clockgen/vid_clockgen_av9194.c b/src/video/clockgen/vid_clockgen_av9194.c index 951f3519c..2f52db151 100644 --- a/src/video/clockgen/vid_clockgen_av9194.c +++ b/src/video/clockgen/vid_clockgen_av9194.c @@ -10,8 +10,6 @@ * * Used by the S3 86c801 (V7-Mirage) card. * - * - * * Authors: Miran Grca, * * Copyright 2016-2018 Miran Grca. diff --git a/src/video/clockgen/vid_clockgen_icd2061.c b/src/video/clockgen/vid_clockgen_icd2061.c index a7f0286f2..bbb4f306f 100644 --- a/src/video/clockgen/vid_clockgen_icd2061.c +++ b/src/video/clockgen/vid_clockgen_icd2061.c @@ -14,8 +14,6 @@ * Used by ET4000w32/p (Diamond Stealth 32) and the S3 * Vision964 family. * - * - * * Authors: Miran Grca, * * Copyright 2016-2018 Miran Grca. diff --git a/src/video/clockgen/vid_clockgen_ics2494.c b/src/video/clockgen/vid_clockgen_ics2494.c index 33a74fe62..f9f4fbcb1 100644 --- a/src/video/clockgen/vid_clockgen_ics2494.c +++ b/src/video/clockgen/vid_clockgen_ics2494.c @@ -10,8 +10,6 @@ * * Used by the AMI S3 924. * - * - * * Authors: Miran Grca, * * Copyright 2020 Miran Grca. diff --git a/src/video/clockgen/vid_clockgen_ics2595.c b/src/video/clockgen/vid_clockgen_ics2595.c index b5da3d7e2..1ee61eb02 100644 --- a/src/video/clockgen/vid_clockgen_ics2595.c +++ b/src/video/clockgen/vid_clockgen_ics2595.c @@ -8,8 +8,6 @@ * * ICS2595 clock chip emulation. Used by ATI Mach64. * - * - * * Authors: Sarah Walker, * Miran Grca, * diff --git a/src/video/nv/nv_rivatimer.c b/src/video/nv/nv_rivatimer.c index 12d40c026..b28042eab 100644 --- a/src/video/nv/nv_rivatimer.c +++ b/src/video/nv/nv_rivatimer.c @@ -8,8 +8,6 @@ * * Fast, high-frequency, CPU-independent timer. * - * - * * Authors: Connor Hyde, I need a better email address ;^) * * Copyright 2024-2025 starfrost diff --git a/src/video/ramdac/vid_ramdac_ati68860.c b/src/video/ramdac/vid_ramdac_ati68860.c index 4411f2ee2..0f40a4515 100644 --- a/src/video/ramdac/vid_ramdac_ati68860.c +++ b/src/video/ramdac/vid_ramdac_ati68860.c @@ -28,8 +28,6 @@ * 7 If set can remove "snow" in some cases * (A860_Delay_L ?) ?? * - * - * * Authors: Sarah Walker, * Miran Grca, * diff --git a/src/video/ramdac/vid_ramdac_ati68875.c b/src/video/ramdac/vid_ramdac_ati68875.c index 4de0ed3d9..12d39ad05 100644 --- a/src/video/ramdac/vid_ramdac_ati68875.c +++ b/src/video/ramdac/vid_ramdac_ati68875.c @@ -8,8 +8,6 @@ * * Emulation of the Mach32-compatible ATI 68875 RAMDAC and clones. * - * - * * Authors: TheCollector1995. * * Copyright 2022-2023 TheCollector1995. diff --git a/src/video/ramdac/vid_ramdac_att20c49x.c b/src/video/ramdac/vid_ramdac_att20c49x.c index 7815f79be..2d8d6a304 100644 --- a/src/video/ramdac/vid_ramdac_att20c49x.c +++ b/src/video/ramdac/vid_ramdac_att20c49x.c @@ -8,8 +8,6 @@ * * Emulation of a AT&T 20c490/491 and 492/493 RAMDAC. * - * - * * Authors: Miran Grca, * * Copyright 2016-2018 Miran Grca. diff --git a/src/video/ramdac/vid_ramdac_att2xc498.c b/src/video/ramdac/vid_ramdac_att2xc498.c index f52b1432f..141ffa4b4 100644 --- a/src/video/ramdac/vid_ramdac_att2xc498.c +++ b/src/video/ramdac/vid_ramdac_att2xc498.c @@ -8,8 +8,6 @@ * * Emulation of a AT&T 2xc498 RAMDAC. * - * - * * Authors: Miran Grca, * * Copyright 2016-2018 Miran Grca. diff --git a/src/video/ramdac/vid_ramdac_bt481.c b/src/video/ramdac/vid_ramdac_bt481.c index 1b81e2dc7..829d1f5a3 100644 --- a/src/video/ramdac/vid_ramdac_bt481.c +++ b/src/video/ramdac/vid_ramdac_bt481.c @@ -9,8 +9,6 @@ * Emulation of the Brooktree BT481 true colour RAMDAC * family. * - * - * * Authors: TheCollector1995. * * Copyright 2024 TheCollector1995. diff --git a/src/video/ramdac/vid_ramdac_bt48x.c b/src/video/ramdac/vid_ramdac_bt48x.c index 7ae96dfbd..be6499990 100644 --- a/src/video/ramdac/vid_ramdac_bt48x.c +++ b/src/video/ramdac/vid_ramdac_bt48x.c @@ -9,8 +9,6 @@ * Emulation of the Brooktree BT484-485A true colour RAMDAC * family. * - * - * * Authors: Miran Grca, * TheCollector1995, * diff --git a/src/video/ramdac/vid_ramdac_ibm_rgb528.c b/src/video/ramdac/vid_ramdac_ibm_rgb528.c index 2f1d57240..bded466d1 100644 --- a/src/video/ramdac/vid_ramdac_ibm_rgb528.c +++ b/src/video/ramdac/vid_ramdac_ibm_rgb528.c @@ -8,8 +8,6 @@ * * Emulation of the IBM RGB 528 true colour RAMDAC. * - * - * * Authors: Miran Grca, * * Copyright 2020 Miran Grca. diff --git a/src/video/ramdac/vid_ramdac_sc1148x.c b/src/video/ramdac/vid_ramdac_sc1148x.c index 0ebcb49b6..d508787b3 100644 --- a/src/video/ramdac/vid_ramdac_sc1148x.c +++ b/src/video/ramdac/vid_ramdac_sc1148x.c @@ -10,8 +10,6 @@ * * Used by the S3 911 and 924 chips. * - * - * * Authors: TheCollector1995, * * Copyright 2020 TheCollector1995. diff --git a/src/video/ramdac/vid_ramdac_sc1502x.c b/src/video/ramdac/vid_ramdac_sc1502x.c index 972e0d895..e427cdfb6 100644 --- a/src/video/ramdac/vid_ramdac_sc1502x.c +++ b/src/video/ramdac/vid_ramdac_sc1502x.c @@ -10,8 +10,6 @@ * * Used by the TLIVESA1 driver for ET4000. * - * - * * Authors: Sarah Walker, * Miran Grca, * diff --git a/src/video/ramdac/vid_ramdac_sdac.c b/src/video/ramdac/vid_ramdac_sdac.c index 4e6deacdc..2b2890307 100644 --- a/src/video/ramdac/vid_ramdac_sdac.c +++ b/src/video/ramdac/vid_ramdac_sdac.c @@ -8,8 +8,6 @@ * * 87C716 'SDAC' true colour RAMDAC emulation. * - * - * * Authors: Sarah Walker, * Miran Grca, * diff --git a/src/video/ramdac/vid_ramdac_stg1702.c b/src/video/ramdac/vid_ramdac_stg1702.c index 85d492ce7..8a2d008dd 100644 --- a/src/video/ramdac/vid_ramdac_stg1702.c +++ b/src/video/ramdac/vid_ramdac_stg1702.c @@ -8,8 +8,6 @@ * * STG1702 true colour RAMDAC emulation. * - * - * * Authors: Sarah Walker, * Miran Grca, * diff --git a/src/video/ramdac/vid_ramdac_tkd8001.c b/src/video/ramdac/vid_ramdac_tkd8001.c index c8ad1c421..7b1ab4d36 100644 --- a/src/video/ramdac/vid_ramdac_tkd8001.c +++ b/src/video/ramdac/vid_ramdac_tkd8001.c @@ -8,8 +8,6 @@ * * Trident TKD8001 RAMDAC emulation. * - * - * * Authors: Sarah Walker, * Miran Grca, * diff --git a/src/video/ramdac/vid_ramdac_tvp3026.c b/src/video/ramdac/vid_ramdac_tvp3026.c index bd5a83fd0..1958fa588 100644 --- a/src/video/ramdac/vid_ramdac_tvp3026.c +++ b/src/video/ramdac/vid_ramdac_tvp3026.c @@ -9,7 +9,6 @@ * Emulation of the Texas Instruments TVP3026 true colour RAMDAC * family. * - * * TODO: Clock and other parts. * * Authors: TheCollector1995, diff --git a/src/video/vid_8514a.c b/src/video/vid_8514a.c index 7b747ddc0..d521c07d5 100644 --- a/src/video/vid_8514a.c +++ b/src/video/vid_8514a.c @@ -9,8 +9,6 @@ * Emulation of the 8514/A card from IBM for the MCA bus and * ISA bus clones. * - * - * * Authors: TheCollector1995. * * Copyright 2022-2024 TheCollector1995. diff --git a/src/video/vid_ati18800.c b/src/video/vid_ati18800.c index 11124a35b..a7d479235 100644 --- a/src/video/vid_ati18800.c +++ b/src/video/vid_ati18800.c @@ -8,8 +8,6 @@ * * ATI 18800 emulation (VGA Edge-16) * - * - * * Authors: Sarah Walker, * Miran Grca, * diff --git a/src/video/vid_ati28800.c b/src/video/vid_ati28800.c index 205d934ee..2fe46bea3 100644 --- a/src/video/vid_ati28800.c +++ b/src/video/vid_ati28800.c @@ -8,8 +8,6 @@ * * ATI 28800 emulation (VGA Charger and Korean VGA) * - * - * * Authors: Sarah Walker, * Miran Grca, * greatpsycho, diff --git a/src/video/vid_ati_eeprom.c b/src/video/vid_ati_eeprom.c index a057f1f39..84cbffedb 100644 --- a/src/video/vid_ati_eeprom.c +++ b/src/video/vid_ati_eeprom.c @@ -8,8 +8,6 @@ * * Emulation of the EEPROM on select ATI cards. * - * - * * Authors: Sarah Walker, * Miran Grca, * diff --git a/src/video/vid_ati_mach64.c b/src/video/vid_ati_mach64.c index 324023db1..6a9b9ea34 100644 --- a/src/video/vid_ati_mach64.c +++ b/src/video/vid_ati_mach64.c @@ -8,8 +8,6 @@ * * ATi Mach64 graphics card emulation. * - * - * * Authors: Sarah Walker, * Miran Grca, * diff --git a/src/video/vid_ati_mach8.c b/src/video/vid_ati_mach8.c index 24293ab1d..b0642c0de 100644 --- a/src/video/vid_ati_mach8.c +++ b/src/video/vid_ati_mach8.c @@ -9,8 +9,6 @@ * Emulation of the 8514/A-compatible Mach8 and Mach32 graphics * chips from ATI for the ISA/VLB/MCA/PCI buses. * - * - * * Authors: TheCollector1995. * * Copyright 2022-2024 TheCollector1995. diff --git a/src/video/vid_bochs_vbe.c b/src/video/vid_bochs_vbe.c index 0ea268ef7..ea0b8872b 100644 --- a/src/video/vid_bochs_vbe.c +++ b/src/video/vid_bochs_vbe.c @@ -23,7 +23,6 @@ * * See https://gitlab.freedesktop.org/xorg/lib/libxcvt/-/blob/master/COPYING for libxcvt license details */ - #include #include #include diff --git a/src/video/vid_cga_colorplus.c b/src/video/vid_cga_colorplus.c index 15d53d543..8b5f1daf7 100644 --- a/src/video/vid_cga_colorplus.c +++ b/src/video/vid_cga_colorplus.c @@ -8,8 +8,6 @@ * * Plantronics ColorPlus emulation. * - * - * * Authors: Sarah Walker, * Miran Grca, * diff --git a/src/video/vid_cga_comp.c b/src/video/vid_cga_comp.c index a316f79fb..2e3fb8d68 100644 --- a/src/video/vid_cga_comp.c +++ b/src/video/vid_cga_comp.c @@ -9,8 +9,6 @@ * IBM CGA composite filter, borrowed from reenigne's DOSBox * patch and ported to C. * - * - * * Authors: reenigne, * Miran Grca, * diff --git a/src/video/vid_cga_compaq.c b/src/video/vid_cga_compaq.c index 81b063248..6168b7752 100644 --- a/src/video/vid_cga_compaq.c +++ b/src/video/vid_cga_compaq.c @@ -8,8 +8,6 @@ * * Emulation of the Compaq CGA graphics cards. * - * - * * Authors: John Elliott, * Sarah Walker, * Miran Grca, diff --git a/src/video/vid_cga_compaq_plasma.c b/src/video/vid_cga_compaq_plasma.c index b281cf93f..b894daa9f 100644 --- a/src/video/vid_cga_compaq_plasma.c +++ b/src/video/vid_cga_compaq_plasma.c @@ -8,8 +8,6 @@ * * Emulation of the plasma displays on early Compaq Portables and laptops. * - * - * * Authors: Sarah Walker, * Miran Grca, * diff --git a/src/video/vid_cga_ncr.c b/src/video/vid_cga_ncr.c index eb4474a40..6b0f15f65 100644 --- a/src/video/vid_cga_ncr.c +++ b/src/video/vid_cga_ncr.c @@ -8,8 +8,6 @@ * * Emulation of the NCR NGA (K511, K201) video cards. * - * - * * Authors: Sarah Walker, * Miran Grca, * Fred N. van Kempen, @@ -20,7 +18,6 @@ * Copyright 2017-2019 Fred N. van Kempen. * Copyright 2020 EngiNerd. */ - #include #include #include diff --git a/src/video/vid_cga_olivetti.c b/src/video/vid_cga_olivetti.c index 147529f6e..4cb845684 100644 --- a/src/video/vid_cga_olivetti.c +++ b/src/video/vid_cga_olivetti.c @@ -9,8 +9,6 @@ * Emulation of the Olivetti OGC 8-bit ISA (GO708) and * M21/M24/M28 16-bit bus (GO317/318/380/709) video cards. * - * - * * Authors: Sarah Walker, * Miran Grca, * Fred N. van Kempen, @@ -21,7 +19,6 @@ * Copyright 2017-2019 Fred N. van Kempen. * Copyright 2020 EngiNerd. */ - #include #include #include diff --git a/src/video/vid_cga_toshiba_t1000.c b/src/video/vid_cga_toshiba_t1000.c index 2fd382272..894d28a56 100644 --- a/src/video/vid_cga_toshiba_t1000.c +++ b/src/video/vid_cga_toshiba_t1000.c @@ -9,8 +9,6 @@ * Implementation of the Toshiba T1000 plasma display, which * has a fixed resolution of 640x200 pixels. * - * - * * Authors: Fred N. van Kempen, * Miran Grca, * John Elliott, diff --git a/src/video/vid_cga_toshiba_t3100e.c b/src/video/vid_cga_toshiba_t3100e.c index e3eb673c8..25f079204 100644 --- a/src/video/vid_cga_toshiba_t3100e.c +++ b/src/video/vid_cga_toshiba_t3100e.c @@ -22,8 +22,6 @@ * 61 50 52 0F 19 06 19 19 02 0D 0B 0C MONO * 2D 28 22 0A 67 00 64 67 02 03 06 07 640x400 * - * - * * Authors: Fred N. van Kempen, * Miran Grca, * John Elliott, diff --git a/src/video/vid_chips_69000.c b/src/video/vid_chips_69000.c index c63bfc70a..ef48207e1 100644 --- a/src/video/vid_chips_69000.c +++ b/src/video/vid_chips_69000.c @@ -8,8 +8,6 @@ * * C&T 69000 emulation. * - * - * * Authors: Cacodemon345 * * Copyright 2023-2024 Cacodemon345 diff --git a/src/video/vid_cl54xx.c b/src/video/vid_cl54xx.c index d9c3d1a98..740c971c1 100644 --- a/src/video/vid_cl54xx.c +++ b/src/video/vid_cl54xx.c @@ -9,8 +9,6 @@ * Emulation of select Cirrus Logic cards (CL-GD 5428, * CL-GD 5429, CL-GD 5430, CL-GD 5434 and CL-GD 5436 are supported). * - * - * * Authors: Miran Grca, * tonioni, * TheCollector1995, diff --git a/src/video/vid_ddc.c b/src/video/vid_ddc.c index ba6ac2a6d..dd1bdc0a1 100644 --- a/src/video/vid_ddc.c +++ b/src/video/vid_ddc.c @@ -8,8 +8,6 @@ * * DDC monitor emulation. * - * - * * Authors: RichardG, * * Copyright 2020 RichardG. diff --git a/src/video/vid_ddc_edid_custom.c b/src/video/vid_ddc_edid_custom.c index 2febde67e..4442fac10 100644 --- a/src/video/vid_ddc_edid_custom.c +++ b/src/video/vid_ddc_edid_custom.c @@ -8,15 +8,12 @@ * * Custom monitor EDID file loader. * - * - * * Authors: Cacodemon345, * David Hrdlička, * * Copyright 2025 Cacodemon. * Copyright 2025 David Hrdlička. */ - #include #include #include diff --git a/src/video/vid_ega.c b/src/video/vid_ega.c index d25861681..61df063ba 100644 --- a/src/video/vid_ega.c +++ b/src/video/vid_ega.c @@ -9,8 +9,6 @@ * Emulation of the EGA and Chips & Technologies SuperEGA * graphics cards. * - * - * * Authors: Sarah Walker, * Miran Grca, * diff --git a/src/video/vid_ega_render.c b/src/video/vid_ega_render.c index c1c44dfdb..1c1c0161e 100644 --- a/src/video/vid_ega_render.c +++ b/src/video/vid_ega_render.c @@ -8,8 +8,6 @@ * * EGA renderers. * - * - * * Authors: Sarah Walker, * Miran Grca, * diff --git a/src/video/vid_et3000.c b/src/video/vid_et3000.c index a75a63829..d86d25363 100644 --- a/src/video/vid_et3000.c +++ b/src/video/vid_et3000.c @@ -8,8 +8,6 @@ * * Emulation of the Tseng Labs ET3000. * - * - * * Authors: Miran Grca, * * Copyright 2016-2018 Miran Grca. diff --git a/src/video/vid_et4000.c b/src/video/vid_et4000.c index b19aad20a..1a8a767e2 100644 --- a/src/video/vid_et4000.c +++ b/src/video/vid_et4000.c @@ -8,8 +8,6 @@ * * Emulation of the Tseng Labs ET4000. * - * - * * Authors: Fred N. van Kempen, * Miran Grca, * GreatPsycho, diff --git a/src/video/vid_et4000w32.c b/src/video/vid_et4000w32.c index 181c3a833..05de0dbea 100644 --- a/src/video/vid_et4000w32.c +++ b/src/video/vid_et4000w32.c @@ -10,8 +10,6 @@ * * Known bugs: Accelerator doesn't work in planar modes * - * - * * Authors: Sarah Walker, * Miran Grca, * diff --git a/src/video/vid_genius.c b/src/video/vid_genius.c index 366fa25e1..472217d30 100644 --- a/src/video/vid_genius.c +++ b/src/video/vid_genius.c @@ -8,8 +8,6 @@ * * MDSI Genius VHR emulation. * - * - * * Authors: John Elliott, * Miran Grca, * diff --git a/src/video/vid_hercules.c b/src/video/vid_hercules.c index 15b9e69cd..758b041af 100644 --- a/src/video/vid_hercules.c +++ b/src/video/vid_hercules.c @@ -8,8 +8,6 @@ * * Hercules emulation. * - * - * * Authors: Sarah Walker, * Miran Grca, * diff --git a/src/video/vid_hercules_incolor.c b/src/video/vid_hercules_incolor.c index 6e3b6a6d2..b9be0765e 100644 --- a/src/video/vid_hercules_incolor.c +++ b/src/video/vid_hercules_incolor.c @@ -8,8 +8,6 @@ * * Hercules InColor emulation. * - * - * * Authors: Sarah Walker, * Miran Grca, * diff --git a/src/video/vid_hercules_plus.c b/src/video/vid_hercules_plus.c index c6b442ce0..25b44ad70 100644 --- a/src/video/vid_hercules_plus.c +++ b/src/video/vid_hercules_plus.c @@ -8,8 +8,6 @@ * * Hercules Plus emulation. * - * - * * Authors: Sarah Walker, * Miran Grca, * diff --git a/src/video/vid_ht216.c b/src/video/vid_ht216.c index 3ba814870..005cc6dfa 100644 --- a/src/video/vid_ht216.c +++ b/src/video/vid_ht216.c @@ -8,8 +8,6 @@ * * Video 7 VGA 1024i emulation. * - * - * * Authors: Sarah Walker, * Miran Grca, * diff --git a/src/video/vid_im1024.c b/src/video/vid_im1024.c index a77ad09c3..1ade8badb 100644 --- a/src/video/vid_im1024.c +++ b/src/video/vid_im1024.c @@ -38,8 +38,6 @@ * This is implemented by holding a FIFO of unlimited depth in * the IM1024 to receive the data. * - * - * * Authors: Fred N. van Kempen, * John Elliott, * diff --git a/src/video/vid_mda.c b/src/video/vid_mda.c index 184ad7fdd..f530419f2 100644 --- a/src/video/vid_mda.c +++ b/src/video/vid_mda.c @@ -8,8 +8,6 @@ * * IBM Monochrome Display and Printer Adapter emulation. * - * - * * Authors: Sarah Walker, * Miran Grca, * Connor Hyde, diff --git a/src/video/vid_mga.c b/src/video/vid_mga.c index 564136428..bb5f51011 100644 --- a/src/video/vid_mga.c +++ b/src/video/vid_mga.c @@ -8,8 +8,6 @@ * * Matrox MGA graphics card emulation. * - * - * * Authors: Sarah Walker, * * Copyright 2008-2020 Sarah Walker. diff --git a/src/video/vid_oak_oti.c b/src/video/vid_oak_oti.c index 4ea0b21e4..d8e3a89e4 100644 --- a/src/video/vid_oak_oti.c +++ b/src/video/vid_oak_oti.c @@ -8,8 +8,6 @@ * * Oak OTI037C/67/077 emulation. * - * - * * Authors: Sarah Walker, * Miran Grca, * diff --git a/src/video/vid_paradise.c b/src/video/vid_paradise.c index ff1013232..48796fcc7 100644 --- a/src/video/vid_paradise.c +++ b/src/video/vid_paradise.c @@ -10,8 +10,6 @@ * PC2086, PC3086 use PVGA1A * MegaPC uses W90C11A * - * - * * Authors: Sarah Walker, * Miran Grca, * diff --git a/src/video/vid_pcjr.c b/src/video/vid_pcjr.c index 62ce9b61d..fe982980c 100644 --- a/src/video/vid_pcjr.c +++ b/src/video/vid_pcjr.c @@ -8,7 +8,6 @@ * * IBM PCjr video subsystem emulation * - * * Authors: Sarah Walker, * Miran Grca, * Connor Hyde / starfrost @@ -18,7 +17,6 @@ * Copyright 2017-2019 Fred N. van Kempen. * Copyright 2025 starfrost */ - #include #include #include diff --git a/src/video/vid_pgc.c b/src/video/vid_pgc.c index 63126955c..73fde302d 100644 --- a/src/video/vid_pgc.c +++ b/src/video/vid_pgc.c @@ -44,8 +44,6 @@ * * This is expected to be done shortly. * - * - * * Authors: Fred N. van Kempen, * John Elliott, * diff --git a/src/video/vid_ps55da2.c b/src/video/vid_ps55da2.c index 938e4bf6b..a97d2aa84 100644 --- a/src/video/vid_ps55da2.c +++ b/src/video/vid_ps55da2.c @@ -22,7 +22,6 @@ * * Copyright 2024-2025 Akamaki. */ - #include #include #include @@ -96,20 +95,20 @@ #define DA2_POSID_L 0xfe /* [Identification] - POS ID SYS ID - EFFFh * Display Adapter (PS/55 Model 5571-S0A) [Toledo] - E013h * Layout Display Terminal (PS/55-5571 RPQ model) [LDT] - EFFEh * Display Adapter II (I/O 3E0:0A = xx0x xxxx) [Atlas] - |- FFF2h Display Adapter B2 (I/O 3E0:0A = xx1x xxxx) (PS/55 Model 5530Z-SX) - |- FDFEh Display Adapter B2 (I/O 3E0:0A = xx1x xxxx) (PS/55 Model 5550-V2) - |- * Display Adapter III,V (I/O 3E0:0A = xx1x xxxx) - ECECh FF4Fh Display Adapter B1 (PS/55 Model 5531Z-SX) [Atlas-KENT] - |- * Display Adapter IV - ECCEh * Display Adapter IV - 901Fh * Display Adapter A2 - 901Dh * Display Adapter A1 [Atlas II] - 901Eh * Plasma Display Adapter - EFD8h * Display Adapter/J [Atlas-SP2] + POS ID SYS ID + EFFFh * Display Adapter (PS/55 Model 5571-S0A) [Toledo] + E013h * Layout Display Terminal (PS/55-5571 RPQ model) [LDT] + EFFEh * Display Adapter II (I/O 3E0:0A = xx0x xxxx) [Atlas] + |- FFF2h Display Adapter B2 (I/O 3E0:0A = xx1x xxxx) (PS/55 Model 5530Z-SX) + |- FDFEh Display Adapter B2 (I/O 3E0:0A = xx1x xxxx) (PS/55 Model 5550-V2) + |- * Display Adapter III,V (I/O 3E0:0A = xx1x xxxx) + ECECh FF4Fh Display Adapter B1 (PS/55 Model 5531Z-SX) [Atlas-KENT] + |- * Display Adapter IV + ECCEh * Display Adapter IV + 901Fh * Display Adapter A2 + 901Dh * Display Adapter A1 [Atlas II] + 901Eh * Plasma Display Adapter + EFD8h * Display Adapter/J [Atlas-SP2] [Japanese DOS and Display Adapter compatibility] | | | 5605JBK | 5605PAA | 5605PCA | 5605PDE | 5605PAW | 5605PXB | diff --git a/src/video/vid_rtg310x.c b/src/video/vid_rtg310x.c index 813d30bf3..76b8d8f3f 100644 --- a/src/video/vid_rtg310x.c +++ b/src/video/vid_rtg310x.c @@ -8,8 +8,6 @@ * * Emulation of the Realtek RTG series of VGA ISA chips. * - * - * * Authors: TheCollector1995, * * Copyright 2021 TheCollector1995. diff --git a/src/video/vid_s3.c b/src/video/vid_s3.c index e3176381a..2333d68b7 100644 --- a/src/video/vid_s3.c +++ b/src/video/vid_s3.c @@ -8,8 +8,6 @@ * * S3 emulation. * - * - * * Authors: Sarah Walker, * Miran Grca, * @@ -530,9 +528,8 @@ s3_queue(s3_t *s3, uint32_t addr, uint32_t val, uint32_t type) if (FIFO_FULL) { thread_reset_event(s3->fifo_not_full_event); - if (FIFO_FULL) { + if (FIFO_FULL) thread_wait_event(s3->fifo_not_full_event, -1); /*Wait for room in ringbuffer*/ - } } fifo->val = val; diff --git a/src/video/vid_s3_virge.c b/src/video/vid_s3_virge.c index d8356df4a..d9e1d91ef 100644 --- a/src/video/vid_s3_virge.c +++ b/src/video/vid_s3_virge.c @@ -8,8 +8,6 @@ * * S3 ViRGE emulation. * - * - * * Authors: Sarah Walker, * Miran Grca, * diff --git a/src/video/vid_sigma.c b/src/video/vid_sigma.c index 9f71773ad..4759bb7af 100644 --- a/src/video/vid_sigma.c +++ b/src/video/vid_sigma.c @@ -8,8 +8,6 @@ * * Sigma Color 400 emulation. * - * - * * Authors: John Elliott, * * Copyright 2018 John Elliott. diff --git a/src/video/vid_svga.c b/src/video/vid_svga.c index cbbf98ab4..03f829e74 100644 --- a/src/video/vid_svga.c +++ b/src/video/vid_svga.c @@ -11,8 +11,6 @@ * This is intended to be used by another SVGA driver, * and not as a card in its own right. * - * - * * Authors: Sarah Walker, * Miran Grca, * diff --git a/src/video/vid_svga_render.c b/src/video/vid_svga_render.c index 92228243f..140bfd9fd 100644 --- a/src/video/vid_svga_render.c +++ b/src/video/vid_svga_render.c @@ -8,8 +8,6 @@ * * SVGA renderers. * - * - * * Authors: Sarah Walker, * Miran Grca, * diff --git a/src/video/vid_table.c b/src/video/vid_table.c index 20a8f311d..4e76e150d 100644 --- a/src/video/vid_table.c +++ b/src/video/vid_table.c @@ -8,8 +8,6 @@ * * Define all known video cards. * - * - * * Authors: Miran Grca, * Fred N. van Kempen, * diff --git a/src/video/vid_tandy.c b/src/video/vid_tandy.c index f11b687ef..bca6d6efa 100644 --- a/src/video/vid_tandy.c +++ b/src/video/vid_tandy.c @@ -8,8 +8,6 @@ * * Tandy 1000 video emulation * - * - * * Authors: Sarah Walker, * Miran Grca, * Connor Hyde / starfrost, diff --git a/src/video/vid_tgui9440.c b/src/video/vid_tgui9440.c index 6a0e1ca5e..2fd4ba482 100644 --- a/src/video/vid_tgui9440.c +++ b/src/video/vid_tgui9440.c @@ -47,8 +47,6 @@ * access size or host data has any affect, but the Windows 3.1 * driver always reads bytes and write words of 0xffff. * - * - * * Authors: Sarah Walker, * Miran Grca, * diff --git a/src/video/vid_ti_cf62011.c b/src/video/vid_ti_cf62011.c index fcc046cb4..afea65374 100644 --- a/src/video/vid_ti_cf62011.c +++ b/src/video/vid_ti_cf62011.c @@ -42,8 +42,6 @@ * which are the same as the XGA. It supports up to 1MB of VRAM, * but we lock it down to 512K. The PS/1 2122 had 256K. * - * - * * Authors: Sarah Walker, * Miran Grca, * Fred N. van Kempen, diff --git a/src/video/vid_tvga.c b/src/video/vid_tvga.c index 51ab132ca..0a436178b 100644 --- a/src/video/vid_tvga.c +++ b/src/video/vid_tvga.c @@ -8,8 +8,6 @@ * * Trident TVGA (8900D) emulation. * - * - * * Authors: Sarah Walker, * Miran Grca, * diff --git a/src/video/vid_vga.c b/src/video/vid_vga.c index 4cde5ba01..1d3db4645 100644 --- a/src/video/vid_vga.c +++ b/src/video/vid_vga.c @@ -8,8 +8,6 @@ * * IBM VGA emulation. * - * - * * Authors: Sarah Walker, * Miran Grca, * diff --git a/src/video/vid_voodoo.c b/src/video/vid_voodoo.c index 57ddbf64d..fe02b7811 100644 --- a/src/video/vid_voodoo.c +++ b/src/video/vid_voodoo.c @@ -8,8 +8,6 @@ * * Voodoo Graphics, 2, Banshee, 3 emulation. * - * - * * Authors: Sarah Walker, * leilei * diff --git a/src/video/vid_voodoo_banshee.c b/src/video/vid_voodoo_banshee.c index 7bd94a34a..abccff860 100644 --- a/src/video/vid_voodoo_banshee.c +++ b/src/video/vid_voodoo_banshee.c @@ -8,8 +8,6 @@ * * Voodoo Banshee and 3 specific emulation. * - * - * * Authors: Sarah Walker, * * Copyright 2008-2020 Sarah Walker. diff --git a/src/video/vid_voodoo_banshee_blitter.c b/src/video/vid_voodoo_banshee_blitter.c index ad92d580f..ac8cb172d 100644 --- a/src/video/vid_voodoo_banshee_blitter.c +++ b/src/video/vid_voodoo_banshee_blitter.c @@ -1,3 +1,17 @@ +/* + * 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. + * + * 3DFX Voodoo emulation. + * + * Authors: Sarah Walker, + * + * Copyright 2008-2020 Sarah Walker. + */ /*Current issues : - missing YUV blits (YUV -> 32-bit, 24-bit, or 16-bit RGB now done) - missing wait for vsync diff --git a/src/video/vid_voodoo_blitter.c b/src/video/vid_voodoo_blitter.c index 6ea2edcc3..0d2c9e103 100644 --- a/src/video/vid_voodoo_blitter.c +++ b/src/video/vid_voodoo_blitter.c @@ -8,8 +8,6 @@ * * 3DFX Voodoo emulation. * - * - * * Authors: Sarah Walker, * * Copyright 2008-2020 Sarah Walker. diff --git a/src/video/vid_voodoo_display.c b/src/video/vid_voodoo_display.c index d04376941..3595d8b89 100644 --- a/src/video/vid_voodoo_display.c +++ b/src/video/vid_voodoo_display.c @@ -8,8 +8,6 @@ * * 3DFX Voodoo emulation. * - * - * * Authors: Sarah Walker, * * Copyright 2008-2020 Sarah Walker. diff --git a/src/video/vid_voodoo_fb.c b/src/video/vid_voodoo_fb.c index ddf68360f..cb5a614d4 100644 --- a/src/video/vid_voodoo_fb.c +++ b/src/video/vid_voodoo_fb.c @@ -8,8 +8,6 @@ * * 3DFX Voodoo emulation. * - * - * * Authors: Sarah Walker, * * Copyright 2008-2020 Sarah Walker. diff --git a/src/video/vid_voodoo_fifo.c b/src/video/vid_voodoo_fifo.c index 83be0f7bb..612ca4c18 100644 --- a/src/video/vid_voodoo_fifo.c +++ b/src/video/vid_voodoo_fifo.c @@ -8,8 +8,6 @@ * * 3DFX Voodoo emulation. * - * - * * Authors: Sarah Walker, * * Copyright 2008-2020 Sarah Walker. diff --git a/src/video/vid_voodoo_reg.c b/src/video/vid_voodoo_reg.c index 82dfde354..38ac42845 100644 --- a/src/video/vid_voodoo_reg.c +++ b/src/video/vid_voodoo_reg.c @@ -8,8 +8,6 @@ * * 3DFX Voodoo emulation. * - * - * * Authors: Sarah Walker, * * Copyright 2008-2020 Sarah Walker. diff --git a/src/video/vid_voodoo_render.c b/src/video/vid_voodoo_render.c index 6bd80ec08..9c1204bd3 100644 --- a/src/video/vid_voodoo_render.c +++ b/src/video/vid_voodoo_render.c @@ -8,8 +8,6 @@ * * 3DFX Voodoo emulation. * - * - * * Authors: Sarah Walker, * * Copyright 2008-2020 Sarah Walker. diff --git a/src/video/vid_voodoo_setup.c b/src/video/vid_voodoo_setup.c index 11f4ff861..d148876eb 100644 --- a/src/video/vid_voodoo_setup.c +++ b/src/video/vid_voodoo_setup.c @@ -8,8 +8,6 @@ * * 3DFX Voodoo emulation. * - * - * * Authors: Sarah Walker, * * Copyright 2008-2020 Sarah Walker. diff --git a/src/video/vid_voodoo_texture.c b/src/video/vid_voodoo_texture.c index f6894ec0f..7651866fd 100644 --- a/src/video/vid_voodoo_texture.c +++ b/src/video/vid_voodoo_texture.c @@ -8,8 +8,6 @@ * * 3DFX Voodoo emulation. * - * - * * Authors: Sarah Walker, * * Copyright 2008-2020 Sarah Walker. diff --git a/src/video/vid_wy700.c b/src/video/vid_wy700.c index c00541113..bd9ba9386 100644 --- a/src/video/vid_wy700.c +++ b/src/video/vid_wy700.c @@ -8,8 +8,6 @@ * * Wyse-700 emulation. * - * - * * Authors: Sarah Walker, * Miran Grca, * diff --git a/src/video/vid_xga.c b/src/video/vid_xga.c index 8de29a2e6..0a9822006 100644 --- a/src/video/vid_xga.c +++ b/src/video/vid_xga.c @@ -8,8 +8,6 @@ * * IBM XGA emulation. * - * - * * Authors: TheCollector1995. * * Copyright 2022 TheCollector1995. @@ -2718,15 +2716,15 @@ xga_hwcursor_draw(svga_t *svga, int displine) if (x >= idx) { switch (comb) { case 0x00: - /* Cursor Color 1 */ + /* Cursor Color 1 */ p[x_pos] = xga->hwc_color0; break; case 0x01: - /* Cursor Color 2 */ + /* Cursor Color 2 */ p[x_pos] = xga->hwc_color1; break; case 0x03: - /* Complement */ + /* Complement */ p[x_pos] ^= 0xffffff; break; diff --git a/src/video/video.c b/src/video/video.c index e2f2801d3..859794142 100644 --- a/src/video/video.c +++ b/src/video/video.c @@ -40,8 +40,6 @@ * W = 3 bus clocks * L = 4 bus clocks * - * - * * Authors: Sarah Walker, * Miran Grca, * diff --git a/src/vnc.c b/src/vnc.c index cd9911b02..d440aa21b 100644 --- a/src/vnc.c +++ b/src/vnc.c @@ -8,8 +8,6 @@ * * Implement the VNC remote renderer with LibVNCServer. * - * - * * Authors: Fred N. van Kempen, * Based on raw code by RichardG, * diff --git a/src/vnc_keymap.c b/src/vnc_keymap.c index 599ba1d9b..b801546c2 100644 --- a/src/vnc_keymap.c +++ b/src/vnc_keymap.c @@ -22,8 +22,6 @@ * NOTE: The values are as defined in the Microsoft document named * "Keyboard Scan Code Specification", version 1.3a of 2000/03/16. * - * - * * Authors: Fred N. van Kempen, * Based on raw code by RichardG, * From 82399b4dd6c032f2c5c458c0606218ffac7e6c0e Mon Sep 17 00:00:00 2001 From: OBattler Date: Sun, 21 Sep 2025 12:14:13 +0200 Subject: [PATCH 19/36] YMF-71x: Fix two warnings. --- src/sound/snd_ymf71x.c | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/sound/snd_ymf71x.c b/src/sound/snd_ymf71x.c index 480d3c2d0..9641f71d7 100644 --- a/src/sound/snd_ymf71x.c +++ b/src/sound/snd_ymf71x.c @@ -88,9 +88,6 @@ static const double ymf71x_bass_treble_3bits[] = { }; -static int ymf71x_wss_dma[4] = { 0, 0, 1, 3 }; -static int ymf71x_wss_irq[8] = { 0, 7, 9, 10, 11, 0, 0, 0 }; - typedef struct ymf71x_t { uint8_t type; From e736dbc694a91fc30ad7f784c269db11bc365dde Mon Sep 17 00:00:00 2001 From: OBattler Date: Sun, 21 Sep 2025 12:24:17 +0200 Subject: [PATCH 20/36] CL-GD 5436: Correct the ICS SB486PV check. --- src/video/vid_cl54xx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/video/vid_cl54xx.c b/src/video/vid_cl54xx.c index 740c971c1..abdde1622 100644 --- a/src/video/vid_cl54xx.c +++ b/src/video/vid_cl54xx.c @@ -4337,7 +4337,7 @@ gd54xx_init(const device_t *info) case CIRRUS_ID_CLGD5436: if ((info->local & 0x200) && - (machines[machine].init == machine_at_sb486pv_init)) { + (machines[machine].init != machine_at_sb486pv_init)) { romfn = NULL; gd54xx->has_bios = 0; } else From 0b0bf2e438b74cc880e898e977f0adaab2ff504a Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Sun, 21 Sep 2025 17:39:40 +0600 Subject: [PATCH 21/36] Fix overflow crashes in certain cases --- src/video/vid_svga_render.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/video/vid_svga_render.c b/src/video/vid_svga_render.c index 140bfd9fd..25b3cd946 100644 --- a/src/video/vid_svga_render.c +++ b/src/video/vid_svga_render.c @@ -155,7 +155,7 @@ svga_render_text_40(svga_t *svga) svga->lastline_draw = svga->displine; if (svga->fullchange) { - p = &svga->monitor->target_buffer->line[svga->displine + svga->y_add][svga->x_add]; + p = &svga->monitor->target_buffer->line[(svga->displine + svga->y_add) & 2047][(svga->x_add) & 2047]; xinc = (svga->seqregs[1] & 1) ? 16 : 18; for (int x = 0; x < (svga->hdisp + svga->scrollcache); x += xinc) { @@ -238,7 +238,7 @@ svga_render_text_80(svga_t *svga) svga->lastline_draw = svga->displine; if (svga->fullchange) { - p = &svga->monitor->target_buffer->line[svga->displine + svga->y_add][svga->x_add]; + p = &svga->monitor->target_buffer->line[(svga->displine + svga->y_add) & 2047][(svga->x_add) & 2047]; xinc = (svga->seqregs[1] & 1) ? 8 : 9; static uint32_t col = 0x00000000; From 388f39e1959feb38d841d4f7de804648bb6ec057 Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Sun, 21 Sep 2025 17:55:39 +0600 Subject: [PATCH 22/36] Clear screen to black on software renderer after it starts --- src/qt/qt_softwarerenderer.cpp | 6 ++++++ src/qt/qt_softwarerenderer.hpp | 2 ++ 2 files changed, 8 insertions(+) diff --git a/src/qt/qt_softwarerenderer.cpp b/src/qt/qt_softwarerenderer.cpp index 8dee1dbe3..dcc0799dd 100644 --- a/src/qt/qt_softwarerenderer.cpp +++ b/src/qt/qt_softwarerenderer.cpp @@ -73,6 +73,12 @@ SoftwareRenderer::render() m_backingStore->flush(rect); } +void +SoftwareRenderer::exposeEvent(QExposeEvent* event) +{ + render(); +} + void SoftwareRenderer::onBlit(int buf_idx, int x, int y, int w, int h) { diff --git a/src/qt/qt_softwarerenderer.hpp b/src/qt/qt_softwarerenderer.hpp index f8bd91338..c9c2706cd 100644 --- a/src/qt/qt_softwarerenderer.hpp +++ b/src/qt/qt_softwarerenderer.hpp @@ -25,6 +25,8 @@ public: void paintEvent(QPaintEvent *event) override; #endif + void exposeEvent(QExposeEvent* event) override; + std::vector> getBuffers() override; public slots: From 8c3e45e691cd7470771f25d0f826b0d1709fa6bd Mon Sep 17 00:00:00 2001 From: win2kgamer <47463859+win2kgamer@users.noreply.github.com> Date: Sun, 21 Sep 2025 10:46:27 -0500 Subject: [PATCH 23/36] YMF71x: Call master volume recalc during init --- src/sound/snd_ymf71x.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/sound/snd_ymf71x.c b/src/sound/snd_ymf71x.c index 9641f71d7..116a0966d 100644 --- a/src/sound/snd_ymf71x.c +++ b/src/sound/snd_ymf71x.c @@ -152,15 +152,15 @@ ymf71x_config_write(uint16_t addr, uint8_t val, void *priv) } if (addr == 0xA79) { if ((ymf71x->configidx == 0x21) && (val & 0x01)) { - ymf71x_log(ymf71x->log, "Enable internal RAM write"); + ymf71x_log(ymf71x->log, "Enable internal RAM write\n"); ymf71x->ramwrite_enable = 1; } if ((ymf71x->configidx == 0x21) && (val == 0x00)) { - ymf71x_log(ymf71x->log, "Disable internal RAM write"); + ymf71x_log(ymf71x->log, "Disable internal RAM write\n"); isapnp_update_card_rom(ymf71x->pnp_card, &ymf71x->ram_data[0], 512); } if ((ymf71x->configidx == 0x20) && (ymf71x->ramwrite_enable == 0x01)) { - ymf71x_log(ymf71x->log, "Write to internal RAM addr %04X, val %02X", ymf71x->ram_addr, val); + ymf71x_log(ymf71x->log, "Write to internal RAM addr %04X, val %02X\n", ymf71x->ram_addr, val); ymf71x->ram_data[ymf71x->ram_addr++] = val; } } @@ -766,6 +766,8 @@ ymf71x_init(const device_t *info) io_sethandler(0x0279, 0x0001, NULL, NULL, NULL, ymf71x_config_write, NULL, NULL, ymf71x); io_sethandler(0x0A79, 0x0001, NULL, NULL, NULL, ymf71x_config_write, NULL, NULL, ymf71x); + ymf71x_update_mastervol(ymf71x); + return ymf71x; } From d087ea2ab556179bb7ad671a7961b76dc587041a Mon Sep 17 00:00:00 2001 From: nstarke Date: Sun, 21 Sep 2025 11:39:40 -0500 Subject: [PATCH 24/36] BUGFIX: MIDI In causes VM hang when sysex message received. This commit fixes the issue. --- src/sound/midi.c | 44 ++++++++++++++++++++++++++++++++++++++------ 1 file changed, 38 insertions(+), 6 deletions(-) diff --git a/src/sound/midi.c b/src/sound/midi.c index 84aed3d51..f64ba64ff 100644 --- a/src/sound/midi.c +++ b/src/sound/midi.c @@ -27,6 +27,9 @@ #include <86box/midi.h> #include <86box/plat.h> +#define MIDI_SYSEX_MAX_ITERATIONS 1000 +#define MIDI_SYSEX_TIMEOUT_MS 5000 + int midi_output_device_current = 0; static int midi_output_device_last = 0; int midi_input_device_current = 0; @@ -568,15 +571,44 @@ midi_do_sysex(void) void midi_in_sysex(uint8_t *buffer, uint32_t len) { + int max_iterations = MIDI_SYSEX_MAX_ITERATIONS; + int iteration_count = 0; + uint32_t start_time = plat_get_ticks(); + uint32_t max_timeout_ms = MIDI_SYSEX_TIMEOUT_MS; + + /* Input validation */ + if (!buffer || len == 0) { + return; + } + midi_start_sysex(buffer, len); - while (1) { - /* This will return 0 if all theh handlers have either - timed out or otherwise indicated it is time to stop. */ - if (midi_do_sysex()) - plat_delay_ms(5); /* msec */ - else + while (iteration_count < max_iterations) { + /* Check for timeout */ + uint32_t elapsed_time = plat_get_ticks() - start_time; + if (elapsed_time > max_timeout_ms) { + /* Force abort all handlers on timeout */ + midi_in_handler_t *temp = mih_first; + while (temp != NULL) { + if (temp->sysex) { + temp->sysex(temp->priv, NULL, 0, 1); /* Call with abort=1 */ + } + temp->cnt = 0; + temp->len = 0; + temp = temp->next; + } + /* pclog("MIDI: SYSEX processing timed out after %d ms\n", elapsed_time); */ break; + } + + /* This will return 0 if all the handlers have either + timed out or otherwise indicated it is time to stop. */ + if (midi_do_sysex()) { + plat_delay_ms(5); /* msec */ + iteration_count++; + } else { + break; + } } } From da7bec3beb715209aaab46dc08642e9ab13d61e0 Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Sun, 21 Sep 2025 15:18:17 -0300 Subject: [PATCH 25/36] Temporary audio system override --- .ci/Jenkinsfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.ci/Jenkinsfile b/.ci/Jenkinsfile index 94070569e..f9395674c 100644 --- a/.ci/Jenkinsfile +++ b/.ci/Jenkinsfile @@ -83,7 +83,7 @@ def presetSlugs = [ ] def presetFlags = [ - 'Regular': '-t --preset=regular -D CMAKE_BUILD_TYPE=Release', + 'Regular': '-t --preset=regular -D CMAKE_BUILD_TYPE=Release -D OPENAL=OFF', 'Debug': '--preset=debug -D CMAKE_BUILD_TYPE=Debug -D STATIC_BUILD=OFF', 'Dev': '--preset=experimental -D CMAKE_BUILD_TYPE=Debug -D VNC=OFF -D STATIC_BUILD=OFF' ] From f3f2068d1a0e330bb0bffbd5172ce9c12b328e39 Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Sat, 6 Sep 2025 22:39:16 -0400 Subject: [PATCH 26/36] VFIO - Virtual Function I/O Co-Authored-By: richardg867 <540874+richardg867@users.noreply.github.com> --- CMakeLists.txt | 1 + src/86box.c | 6 + src/CMakeLists.txt | 10 + src/device/CMakeLists.txt | 11 + src/device/vfio.c | 3377 +++++++++++++++++++++++++++++++++++++ src/include/86box/vfio.h | 20 + 6 files changed, 3425 insertions(+) create mode 100644 src/device/vfio.c create mode 100644 src/include/86box/vfio.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 57e3b178f..29fedd6ad 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -185,6 +185,7 @@ cmake_dependent_option(SIO_DETECT "Super I/O Detection Helper" cmake_dependent_option(WACOM "Wacom Input Devices" ON "DEV_BRANCH" OFF) cmake_dependent_option(XL24 "ATI VGA Wonder XL24 (ATI-28800-6)" ON "DEV_BRANCH" OFF) cmake_dependent_option(NETSWITCH "Network Switch Support" ON "DEV_BRANCH" OFF) +cmake_dependent_option(VFIO "Virtual Function I/O" ON "DEV_BRANCH" OFF) # Ditto but for Qt if(QT) diff --git a/src/86box.c b/src/86box.c index b90591267..95f714747 100644 --- a/src/86box.c +++ b/src/86box.c @@ -107,6 +107,7 @@ #include <86box/apm.h> #include <86box/acpi.h> #include <86box/nv/vid_nv_rivatimer.h> +#include <86box/vfio.h> // Disable c99-designator to avoid the warnings about int ng #ifdef __clang__ @@ -1646,6 +1647,11 @@ pc_reset_hard_init(void) the chances of the SCSI controller ending up on the bridge. */ video_voodoo_init(); +#if defined(USE_VFIO) && defined(__linux__) + /* Initialize VFIO */ + vfio_init(); +#endif + /* installs first game port if no device provides one, must be late */ if (joystick_type[0]) gameport_update_joystick_type(0); diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 166320061..7c389c368 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -103,6 +103,16 @@ if(VNC) endif() endif() +if(CMAKE_SYSTEM_NAME MATCHES "Linux") + if(VFIO) + include(CheckIncludeFile) + check_include_file("linux/vfio.h" VFIO_AVAILABLE) + if(VFIO_AVAILABLE) + add_compile_definitions(USE_VFIO) + endif() + endif() +endif() + if(INSTRUMENT) add_compile_definitions(USE_INSTRUMENT) endif() diff --git a/src/device/CMakeLists.txt b/src/device/CMakeLists.txt index 12835e909..dcad64149 100644 --- a/src/device/CMakeLists.txt +++ b/src/device/CMakeLists.txt @@ -81,6 +81,17 @@ if(ISAMEM_BRAT) target_compile_definitions(dev PRIVATE USE_ISAMEM_BRAT) endif() +if(CMAKE_SYSTEM_NAME MATCHES "Linux") + if(VFIO) + include(CheckIncludeFile) + check_include_file("linux/vfio.h" VFIO_AVAILABLE) + if(VFIO_AVAILABLE) + add_compile_definitions(USE_VFIO) + target_sources(dev PRIVATE vfio.c) + endif() + endif() +endif() + if(LASERXT) target_compile_definitions(dev PRIVATE USE_LASERXT) endif() diff --git a/src/device/vfio.c b/src/device/vfio.c new file mode 100644 index 000000000..b5fc077b8 --- /dev/null +++ b/src/device/vfio.c @@ -0,0 +1,3377 @@ +/* + * 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. + * + * Virtual Function I/O PCI passthrough handler. + * + * Authors: RichardG, + * + * Copyright 2021-2025 RichardG. + */ +#define _FILE_OFFSET_BITS 64 +#define _LARGEFILE64_SOURCE 1 +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#define HAVE_STDARG_H +#include "cpu.h" +#include <86box/86box.h> +#include <86box/ini.h> +#include <86box/config.h> +#include <86box/device.h> +#include <86box/i2c.h> /* log2i */ +#include <86box/io.h> +#include <86box/mem.h> +#include <86box/path.h> +#include <86box/pci.h> +#include <86box/plat.h> +#include <86box/thread.h> +#include <86box/timer.h> +#include <86box/video.h> + +/* Just so we don't have to include Linux's pci.h, which + has some defines that conflict with our own pci.h */ +#define PCI_SLOT(devfn) (((devfn) >> 3) & 0x1f) +#define PCI_FUNC(devfn) ((devfn) & 0x07) + +enum { + NVIDIA_3D0_NONE = 0, + NVIDIA_3D0_SELECT, + NVIDIA_3D0_WINDOW, + NVIDIA_3D0_READ, + NVIDIA_3D0_WRITE +}; + +typedef struct { + int fd; + uint64_t precalc_offset; + uint64_t offset; + uint64_t size; + uint32_t emulated_offset; + uint8_t *mmap_base; + uint8_t *mmap_precalc; + uint8_t type; + uint8_t bar_id; + uint8_t read : 1; + uint8_t write : 1; + mem_mapping_t mem_mapping; + char name[20]; + struct _vfio_device_ *dev; + + struct { + mem_mapping_t mem_mappings[2]; + + struct { + uint32_t offset; + } iomirror; + + struct { + uint32_t offset; + } configmirror; + + struct { + struct { + uint32_t start; + uint32_t end; + } offset[2]; + uint32_t index; + } configwindow; + } quirks; +} vfio_region_t; + +typedef struct { + struct _vfio_device_ *dev; + int fd; + int type; + int vector; + uint16_t msix_offset; +} vfio_irq_t; + +typedef struct _vfio_device_ { + int fd; + uint8_t mem_enabled : 1; + uint8_t io_enabled : 1; + uint8_t rom_enabled : 1; + uint8_t can_reset : 1; + uint8_t can_flr_reset : 1; + uint8_t can_pm_reset : 1; + uint8_t can_hot_reset : 1; + uint8_t slot; + uint8_t bar_count; + uint8_t pm_cap; + uint8_t msi_cap; + uint8_t msix_cap; + uint8_t pcie_cap; + uint8_t af_cap; + char *name; + char *rom_fn; + + vfio_region_t bars[6]; + vfio_region_t rom; + vfio_region_t config; + vfio_region_t vga_io_lo; + vfio_region_t vga_io_hi; + vfio_region_t vga_mem; + + struct { + uint8_t type; + int vector_count; + vfio_irq_t *vectors; + + struct { + int raised; + uint8_t pin; + uint8_t state; + } intx; + struct { + uint32_t address; + uint32_t address_upper; + uint32_t pending; + uint32_t mask; + uint16_t ctl; + uint16_t data; + uint16_t vector_enable_mask; + uint8_t vector_count; + uint8_t vector_enable_count; + } msi; + struct { + mem_mapping_t table_mapping; + mem_mapping_t pba_mapping; + uint32_t table_offset; + uint32_t pba_offset; + uint32_t table_offset_precalc; + uint32_t pba_offset_precalc; + uint16_t ctl; + uint16_t vector_count; + uint16_t table_size; + uint16_t pba_size; + uint8_t table_bar; + uint8_t pba_bar; + uint8_t *table; + uint8_t *pba; + } msix; + } irq; + + struct { + union { + struct { + vfio_region_t *bar; + } ati3c3; + + struct { + uint64_t master_enable; + uint8_t bar_enable; + } nvidiabar5; + + struct { + uint32_t index; + uint8_t state; + } nvidia3d0; + }; + } quirks; + + struct _vfio_device_ *next; +} vfio_device_t; + +typedef struct _vfio_group_ { + int id; + int fd; + + vfio_device_t *first_device; + vfio_device_t *current_device; + + struct _vfio_group_ *next; +} vfio_group_t; + +static video_timings_t timing_default = { VIDEO_PCI, 8, 16, 32, 8, 16, 32 }; +static int container_fd = -1; +static int epoll_fd = -1; +static int irq_thread_wake_fd = -1; +static int closing = 0; +static int intx_high = 0; +static int timing_readb = 0; +static int timing_readw = 0; +static int timing_readl = 0; +static int timing_writeb = 0; +static int timing_writew = 0; +static int timing_writel = 0; +static vfio_group_t *first_group = NULL; +static vfio_group_t *current_group; +static thread_t *irq_thread; +static event_t *irq_event; +static event_t *irq_thread_resume; +static pc_timer_t irq_timer; +static vfio_irq_t *current_irq = NULL; +static const device_t vfio_device; + +#define ENABLE_VFIO_LOG 2 +#ifdef ENABLE_VFIO_LOG +int vfio_do_log = ENABLE_VFIO_LOG; + +static void +vfio_log(const char *fmt, ...) +{ + va_list ap; + + if (vfio_do_log) { + va_start(ap, fmt); + pclog_ex(fmt, ap); + va_end(ap); + } +} + +# if ENABLE_VFIO_LOG == 2 +# define vfio_log_op vfio_log +# else +# define vfio_log_op(fmt, ...) +# endif +#else +# define vfio_log(fmt, ...) +# define vfio_log_op(fmt, ...) +#endif + +static uint8_t vfio_bar_gettype(vfio_device_t *dev, vfio_region_t *bar); +static uint8_t vfio_config_readb(int func, int addr, void *priv); +static uint16_t vfio_config_readw(int func, int addr, void *priv); +static uint32_t vfio_config_readl(int func, int addr, void *priv); +static void vfio_config_writeb(int func, int addr, uint8_t val, void *priv); +static void vfio_config_writew(int func, int addr, uint16_t val, void *priv); +static void vfio_config_writel(int func, int addr, uint32_t val, void *priv); +static void vfio_irq_intx_setpin(vfio_device_t *dev); +static void vfio_irq_msi_disable(vfio_device_t *dev); +static void vfio_irq_msix_disable(vfio_device_t *dev); +static void vfio_irq_msix_updatemask(vfio_device_t *dev, uint16_t offset); +static void vfio_irq_enable(vfio_device_t *dev, int type); + +#define VFIO_RW(space, length_char, addr_type, addr_slength, val_type, val_slength) \ + static val_type \ + vfio_##space##_read##length_char##_fd(addr_type addr, void *priv) \ + { \ + register vfio_region_t *region = (vfio_region_t *) priv; \ + val_type ret; \ + if (pread(region->fd, &ret, sizeof(ret), region->precalc_offset + addr) != sizeof(ret)) \ + ret = -1; \ + vfio_log_op("[%04X:%08X] VFIO: " #space "_read" #length_char "_fd(%0" #addr_slength "X) = %0" #val_slength "X\n", CS, cpu_state.pc, addr, ret); \ + cycles -= timing_read##length_char; \ + intx_high = 0; \ + return ret; \ + } \ + \ + static void \ + vfio_##space##_write##length_char##_fd(addr_type addr, val_type val, void *priv) \ + { \ + register vfio_region_t *region = (vfio_region_t *) priv; \ + vfio_log_op("[%04X:%08X] VFIO: " #space "_write" #length_char "_fd(%0" #addr_slength "X, %0" #val_slength "X)\n", CS, cpu_state.pc, addr, val); \ + (void) !pwrite(region->fd, &val, sizeof(val), region->precalc_offset + addr); \ + cycles -= timing_write##length_char; \ + intx_high = 0; \ + } \ + \ + static val_type \ + vfio_##space##_read##length_char##_mm(addr_type addr, void *priv) \ + { \ + register val_type ret = *((val_type *) &((uint8_t *) priv)[addr]); \ + vfio_log_op("[%04X:%08X] VFIO: " #space "_read" #length_char "_mm(%0" #addr_slength "X) = %0" #val_slength "X\n", CS, cpu_state.pc, addr, ret); \ + cycles -= timing_read##length_char; \ + intx_high = 0; \ + return ret; \ + } \ + \ + static void \ + vfio_##space##_write##length_char##_mm(addr_type addr, val_type val, void *priv) \ + { \ + vfio_log_op("[%04X:%08X] VFIO: " #space "_write" #length_char "_mm(%0" #addr_slength "X, %0" #val_slength "X)\n", CS, cpu_state.pc, addr, val); \ + *((val_type *) &((uint8_t *) priv)[addr]) = val; \ + cycles -= timing_write##length_char; \ + intx_high = 0; \ + } + +VFIO_RW(mem, b, uint32_t, 8, uint8_t, 2) +VFIO_RW(mem, w, uint32_t, 8, uint16_t, 4) +VFIO_RW(mem, l, uint32_t, 8, uint32_t, 8) +VFIO_RW(io, b, uint16_t, 4, uint8_t, 2) +VFIO_RW(io, w, uint16_t, 4, uint16_t, 4) +VFIO_RW(io, l, uint16_t, 4, uint32_t, 8) + +static void +vfio_quirk_capture_io(vfio_device_t *dev, vfio_region_t *bar, + uint16_t base, uint16_t size, uint8_t enable, + uint8_t (*inb)(uint16_t addr, void *priv), + uint16_t (*inw)(uint16_t addr, void *priv), + uint32_t (*inl)(uint16_t addr, void *priv), + void (*outb)(uint16_t addr, uint8_t val, void *priv), + void (*outw)(uint16_t addr, uint16_t val, void *priv), + void (*outl)(uint16_t addr, uint32_t val, void *priv)) +{ + /* Remove quirk handler from port range. */ + io_removehandler(base, size, + bar->read ? inb : NULL, + bar->read ? inw : NULL, + bar->read ? inl : NULL, + bar->write ? outb : NULL, + bar->write ? outw : NULL, + bar->write ? outl : NULL, + dev ? ((void *) dev) : ((void *) bar)); + + if (enable) { + /* Remove existing handler from port range. */ + if (bar->mmap_base) /* mmap available */ + io_removehandler(base, size, + bar->read ? vfio_io_readb_mm : NULL, + bar->read ? vfio_io_readw_mm : NULL, + bar->read ? vfio_io_readl_mm : NULL, + bar->write ? vfio_io_writeb_mm : NULL, + bar->write ? vfio_io_writew_mm : NULL, + bar->write ? vfio_io_writel_mm : NULL, + bar->mmap_precalc); + else /* mmap not available */ + io_removehandler(base, size, + bar->read ? vfio_io_readb_fd : NULL, + bar->read ? vfio_io_readw_fd : NULL, + bar->read ? vfio_io_readl_fd : NULL, + bar->write ? vfio_io_writeb_fd : NULL, + bar->write ? vfio_io_writew_fd : NULL, + bar->write ? vfio_io_writel_fd : NULL, + bar); + + /* Add quirk handler to port range. */ + io_sethandler(base, size, + bar->read ? inb : NULL, + bar->read ? inw : NULL, + bar->read ? inl : NULL, + bar->write ? outb : NULL, + bar->write ? outw : NULL, + bar->write ? outl : NULL, + dev ? ((void *) dev) : ((void *) bar)); + } +} + +static uint8_t +vfio_quirk_configmirror_readb(uint32_t addr, void *priv) +{ + vfio_region_t *bar = (vfio_region_t *) priv; + vfio_device_t *dev = bar->dev; + + /* Cascade to the main handler. */ + vfio_mem_readb_fd(addr, bar); + + /* Read configuration register. */ + uint8_t ret = vfio_config_readb(0, addr - bar->quirks.configmirror.offset, dev); + vfio_log_op("VFIO %s: Config mirror: Read %02X from index %02X\n", + dev->name, ret, addr - bar->quirks.configmirror.offset); + + return ret; +} + +static uint16_t +vfio_quirk_configmirror_readw(uint32_t addr, void *priv) +{ + vfio_region_t *bar = (vfio_region_t *) priv; + vfio_device_t *dev = bar->dev; + + /* Cascade to the main handler. */ + vfio_mem_readw_fd(addr, bar); + + /* Read configuration register. */ + uint16_t ret = vfio_config_readw(0, addr - bar->quirks.configmirror.offset, dev); + vfio_log_op("VFIO %s: Config mirror: Read %04X from index %02X\n", + dev->name, ret, addr - bar->quirks.configmirror.offset); + + return ret; +} + +static uint32_t +vfio_quirk_configmirror_readl(uint32_t addr, void *priv) +{ + vfio_region_t *bar = (vfio_region_t *) priv; + vfio_device_t *dev = bar->dev; + + /* Cascade to the main handler. */ + vfio_mem_readl_fd(addr, bar); + + /* Read configuration register. */ + uint32_t ret = vfio_config_readl(0, addr - bar->quirks.configmirror.offset, dev); + vfio_log_op("VFIO %s: Config mirror: Read %08X from index %02X\n", + dev->name, ret, addr - bar->quirks.configmirror.offset); + + return ret; +} + +static void +vfio_quirk_configmirror_writeb(uint32_t addr, uint8_t val, void *priv) +{ + vfio_region_t *bar = (vfio_region_t *) priv; + vfio_device_t *dev = bar->dev; + + /* Write configuration register. */ + vfio_log_op("VFIO %s: Config mirror: Write %02X to index %02X\n", + dev->name, val, addr - bar->quirks.configmirror.offset); + vfio_config_writeb(0, addr - bar->quirks.configmirror.offset, val, dev); +} + +static void +vfio_quirk_configmirror_writew(uint32_t addr, uint16_t val, void *priv) +{ + vfio_region_t *bar = (vfio_region_t *) priv; + vfio_device_t *dev = bar->dev; + + /* Write configuration register. */ + vfio_log_op("VFIO %s: Config mirror: Write %04X to index %02X\n", + dev->name, val, addr - bar->quirks.configmirror.offset); + vfio_config_writew(0, addr - bar->quirks.configmirror.offset, val, dev); +} + +static void +vfio_quirk_configmirror_writel(uint32_t addr, uint32_t val, void *priv) +{ + vfio_region_t *bar = (vfio_region_t *) priv; + vfio_device_t *dev = bar->dev; + + /* Write configuration register. */ + vfio_log_op("VFIO %s: Config mirror: Write %08X to index %02X\n", + dev->name, val, addr - bar->quirks.configmirror.offset); + vfio_config_writel(0, addr - bar->quirks.configmirror.offset, val, dev); +} + +static void +vfio_quirk_configmirror(vfio_device_t *dev, vfio_region_t *bar, + uint32_t offset, uint8_t mapping_slot, uint8_t enable) +{ + /* Get the additional memory mapping structure. */ + mem_mapping_t *mapping = &bar->quirks.mem_mappings[mapping_slot]; + + vfio_log("VFIO %s: %sapping configuration space mirror for %s @ %08X\n", + dev->name, enable ? "M" : "Unm", bar->name, bar->emulated_offset + offset); + + /* Add mapping if it wasn't already added. + Being added after region setup, it should override the main BAR mapping. */ + if (!mapping->base) + mem_mapping_add(mapping, 0, 0, + vfio_quirk_configmirror_readb, + vfio_quirk_configmirror_readw, + vfio_quirk_configmirror_readl, + vfio_quirk_configmirror_writeb, + vfio_quirk_configmirror_writew, + vfio_quirk_configmirror_writel, + NULL, MEM_MAPPING_EXTERNAL, bar); + + /* Store start offset. */ + bar->quirks.configmirror.offset = bar->emulated_offset + offset; + + /* Enable or disable mapping. */ + if (enable) + mem_mapping_set_addr(mapping, bar->emulated_offset + offset, 256); + else + mem_mapping_disable(mapping); +} + +static void +vfio_quirk_configwindow_index_writeb(uint16_t addr, uint8_t val, void *priv) +{ + vfio_region_t *bar = (vfio_region_t *) priv; + vfio_device_t *dev = bar->dev; + + /* Write configuration register index. */ + vfio_log_op("VFIO %s: Config window: Write index[%d] %02X\n", + dev->name, addr & 3, val); + uint8_t offset = (addr & 3) << 3; + bar->quirks.configwindow.index &= ~(0x000000ff << offset); + bar->quirks.configwindow.index |= val << offset; + + /* Cascade to the main handler. */ + vfio_io_writeb_fd(addr, val, bar); +} + +static void +vfio_quirk_configwindow_index_writew(uint16_t addr, uint16_t val, void *priv) +{ + vfio_region_t *bar = (vfio_region_t *) priv; + vfio_device_t *dev = bar->dev; + + /* Write configuration register index. */ + vfio_log_op("VFIO %s: Config window: Write index[%d] %04X\n", + dev->name, addr & 2, val); + uint8_t offset = (addr & 2) << 3; + bar->quirks.configwindow.index &= ~(0x0000ffff << offset); + bar->quirks.configwindow.index |= val << offset; + + /* Cascade to the main handler. */ + vfio_io_writew_fd(addr, val, bar); +} + +static void +vfio_quirk_configwindow_index_writel(uint16_t addr, uint32_t val, void *priv) +{ + vfio_region_t *bar = (vfio_region_t *) priv; + vfio_device_t *dev = bar->dev; + + /* Write configuration register index. */ + vfio_log_op("VFIO %s: Config window: Write index %08X\n", + dev->name, val); + bar->quirks.configwindow.index = val; + + /* Cascade to the main handler. */ + vfio_io_writel_fd(addr, val, bar); +} + +static uint8_t +vfio_quirk_configwindow_data_readb(uint16_t addr, void *priv) +{ + vfio_region_t *bar = (vfio_region_t *) priv; + vfio_device_t *dev = bar->dev; + + /* Cascade to the main handler. */ + uint8_t ret = vfio_io_readb_fd(addr, bar); + + /* Read configuration register if part of the main PCI configuration space. */ + uint32_t index = bar->quirks.configwindow.index; + if ((index >= bar->quirks.configwindow.offset[0].start) && (index <= bar->quirks.configwindow.offset[0].end)) { + ret = vfio_config_readb(0, index - bar->quirks.configwindow.offset[0].start, dev); + vfio_log_op("VFIO %s: Config window: Read %02X from primary index %08X\n", + dev->name, ret, index); + } else if ((index >= bar->quirks.configwindow.offset[1].start) && (index <= bar->quirks.configwindow.offset[1].end)) { + ret = vfio_config_readb(0, index - bar->quirks.configwindow.offset[1].start, dev); + vfio_log_op("VFIO %s: Config window: Read %02X from secondary index %08X\n", + dev->name, ret, index); + } + + return ret; +} + +static uint16_t +vfio_quirk_configwindow_data_readw(uint16_t addr, void *priv) +{ + vfio_region_t *bar = (vfio_region_t *) priv; + vfio_device_t *dev = bar->dev; + + /* Cascade to the main handler. */ + uint16_t ret = vfio_io_readw_fd(addr, bar); + + /* Read configuration register if part of the main PCI configuration space. */ + uint32_t index = bar->quirks.configwindow.index; + if ((index >= bar->quirks.configwindow.offset[0].start) && (index <= bar->quirks.configwindow.offset[0].end)) { + ret = vfio_config_readw(0, index - bar->quirks.configwindow.offset[0].start, dev); + vfio_log_op("VFIO %s: Config window: Read %04X from primary index %08X\n", + dev->name, ret, index); + } else if ((index >= bar->quirks.configwindow.offset[1].start) && (index <= bar->quirks.configwindow.offset[1].end)) { + ret = vfio_config_readw(0, index - bar->quirks.configwindow.offset[1].start, dev); + vfio_log_op("VFIO %s: Config window: Read %04X from secondary index %08X\n", + dev->name, ret, index); + } + + return ret; +} + +static uint32_t +vfio_quirk_configwindow_data_readl(uint16_t addr, void *priv) +{ + vfio_region_t *bar = (vfio_region_t *) priv; + vfio_device_t *dev = bar->dev; + + /* Cascade to the main handler. */ + uint32_t ret = vfio_io_readl_fd(addr, bar); + + /* Read configuration register if part of the main PCI configuration space. */ + uint32_t index = bar->quirks.configwindow.index; + if ((index >= bar->quirks.configwindow.offset[0].start) && (index <= bar->quirks.configwindow.offset[0].end)) { + ret = vfio_config_readl(0, index - bar->quirks.configwindow.offset[0].start, dev); + vfio_log_op("VFIO %s: Config window: Read %08X from primary index %08X\n", + dev->name, ret, index); + } else if ((index >= bar->quirks.configwindow.offset[1].start) && (index <= bar->quirks.configwindow.offset[1].end)) { + ret = vfio_config_readl(0, index - bar->quirks.configwindow.offset[1].start, dev); + vfio_log_op("VFIO %s: Config window: Read %08X from secondary index %08X\n", + dev->name, ret, index); + } + + return ret; +} + +static void +vfio_quirk_configwindow_data_writeb(uint16_t addr, uint8_t val, void *priv) +{ + vfio_region_t *bar = (vfio_region_t *) priv; + vfio_device_t *dev = bar->dev; + + /* Write configuration register if part of the main PCI configuration space. */ + uint32_t index = bar->quirks.configwindow.index; + if ((index >= bar->quirks.configwindow.offset[0].start) && (index <= bar->quirks.configwindow.offset[0].end)) { + vfio_log_op("VFIO %s: Config window: Write %02X to primary index %08X\n", + dev->name, val, index); + vfio_config_writeb(0, index - bar->quirks.configwindow.offset[0].start, val, dev); + return; + } else if ((index >= bar->quirks.configwindow.offset[1].start) && (index <= bar->quirks.configwindow.offset[1].end)) { + vfio_log_op("VFIO %s: Config window: Write %02X to secondary index %08X\n", + dev->name, val, index); + vfio_config_writeb(0, index - bar->quirks.configwindow.offset[1].start, val, dev); + return; + } + + /* Cascade to the main handler. */ + vfio_io_writeb_fd(addr, val, bar); +} + +static void +vfio_quirk_configwindow_data_writew(uint16_t addr, uint16_t val, void *priv) +{ + vfio_region_t *bar = (vfio_region_t *) priv; + vfio_device_t *dev = bar->dev; + + /* Write configuration register if part of the main PCI configuration space. */ + uint32_t index = bar->quirks.configwindow.index; + if ((index >= bar->quirks.configwindow.offset[0].start) && (index <= bar->quirks.configwindow.offset[0].end)) { + vfio_log_op("VFIO %s: Config window: Write %04X to primary index %08X\n", + dev->name, val, index); + vfio_config_writew(0, index - bar->quirks.configwindow.offset[0].start, val, dev); + return; + } else if ((index >= bar->quirks.configwindow.offset[1].start) && (index <= bar->quirks.configwindow.offset[1].end)) { + vfio_log_op("VFIO %s: Config window: Write %04X to secondary index %08X\n", + dev->name, val, index); + vfio_config_writew(0, index - bar->quirks.configwindow.offset[1].start, val, dev); + return; + } + + /* Cascade to the main handler. */ + vfio_io_writew_fd(addr, val, bar); +} + +static void +vfio_quirk_configwindow_data_writel(uint16_t addr, uint32_t val, void *priv) +{ + vfio_region_t *bar = (vfio_region_t *) priv; + vfio_device_t *dev = bar->dev; + + /* Write configuration register if part of the main PCI configuration space. */ + uint32_t index = bar->quirks.configwindow.index; + if ((index >= bar->quirks.configwindow.offset[0].start) && (index <= bar->quirks.configwindow.offset[0].end)) { + vfio_log_op("VFIO %s: Config window: Write %08X to primary index %08X\n", + dev->name, val, index); + vfio_config_writel(0, index - bar->quirks.configwindow.offset[0].start, val, dev); + return; + } else if ((index >= bar->quirks.configwindow.offset[1].start) && (index <= bar->quirks.configwindow.offset[1].end)) { + vfio_log_op("VFIO %s: Config window: Write %08X to secondary index %08X\n", + dev->name, val, index); + vfio_config_writel(0, index - bar->quirks.configwindow.offset[1].start, val, dev); + return; + } + + /* Cascade to the main handler. */ + vfio_io_writel_fd(addr, val, bar); +} + +static void +vfio_quirk_configwindow(vfio_device_t *dev, vfio_region_t *bar, + uint16_t index_offset, uint16_t index_size, + uint16_t data_offset, uint16_t data_size, + uint32_t window_offset0, uint32_t window_offset1, uint8_t enable) +{ + vfio_log("VFIO %s: %sapping configuration space window for %s @ %04X and %04X\n", + dev->name, enable ? "M" : "Unm", bar->name, + bar->emulated_offset + index_offset, bar->emulated_offset + data_offset); + + /* Store start offsets, as well as end offsets to speed up operations. */ + bar->quirks.configwindow.offset[0].start = window_offset0; + bar->quirks.configwindow.offset[0].end = window_offset0 + 255; + bar->quirks.configwindow.offset[1].start = window_offset1; + bar->quirks.configwindow.offset[1].end = window_offset1 + 255; + + /* Enable or disable mapping. */ + vfio_quirk_capture_io(NULL, bar, bar->emulated_offset + index_offset, index_size, enable, + vfio_io_readb_fd, + vfio_io_readw_fd, + vfio_io_readl_fd, + vfio_quirk_configwindow_index_writeb, + vfio_quirk_configwindow_index_writew, + vfio_quirk_configwindow_index_writel); + vfio_quirk_capture_io(NULL, bar, bar->emulated_offset + data_offset, data_size, enable, + vfio_quirk_configwindow_data_readb, + vfio_quirk_configwindow_data_readw, + vfio_quirk_configwindow_data_readl, + vfio_quirk_configwindow_data_writeb, + vfio_quirk_configwindow_data_writew, + vfio_quirk_configwindow_data_writel); +} + +static uint8_t +vfio_quirk_iomirror_readb(uint16_t addr, void *priv) +{ + vfio_region_t *bar = (vfio_region_t *) priv; + + /* Read I/O port mirror from memory-mapped space. */ + uint8_t ret = vfio_mem_readb_fd(bar->emulated_offset + bar->quirks.iomirror.offset + addr, bar); +#ifdef ENABLE_VFIO_LOG + vfio_device_t *dev = bar->dev; + vfio_log_op("VFIO %s: I/O mirror: Read %02X from %04X (%08X)\n", dev->name, + ret, addr, bar->quirks.iomirror.offset + addr); +#endif + return ret; +} + +static uint16_t +vfio_quirk_iomirror_readw(uint16_t addr, void *priv) +{ + vfio_region_t *bar = (vfio_region_t *) priv; + + /* Read I/O port mirror from memory-mapped space. */ + uint16_t ret = vfio_mem_readw_fd(bar->emulated_offset + bar->quirks.iomirror.offset + addr, bar); +#ifdef ENABLE_VFIO_LOG + vfio_device_t *dev = bar->dev; + vfio_log_op("VFIO %s: I/O mirror: Read %04X from %04X (%08X)\n", dev->name, + ret, addr, bar->quirks.iomirror.offset + addr); +#endif + return ret; +} + +static uint32_t +vfio_quirk_iomirror_readl(uint16_t addr, void *priv) +{ + vfio_region_t *bar = (vfio_region_t *) priv; + + /* Read I/O port mirror from memory-mapped space. */ + uint32_t ret = vfio_mem_readl_fd(bar->emulated_offset + bar->quirks.iomirror.offset + addr, bar); +#ifdef ENABLE_VFIO_LOG + vfio_device_t *dev = bar->dev; + vfio_log_op("VFIO %s: I/O mirror: Read %08X from %04X (%08X)\n", dev->name, + ret, addr, bar->quirks.iomirror.offset + addr); +#endif + return ret; +} + +static void +vfio_quirk_iomirror_writeb(uint16_t addr, uint8_t val, void *priv) +{ + vfio_region_t *bar = (vfio_region_t *) priv; + + /* Write I/O port mirror to memory-mapped space. */ +#ifdef ENABLE_VFIO_LOG + vfio_device_t *dev = bar->dev; + vfio_log_op("VFIO %s: I/O mirror: Write %02X to %04X (%08X)\n", dev->name, + val, addr, bar->quirks.iomirror.offset + addr); +#endif + vfio_mem_writeb_fd(bar->emulated_offset + bar->quirks.iomirror.offset + addr, val, bar); +} + +static void +vfio_quirk_iomirror_writew(uint16_t addr, uint16_t val, void *priv) +{ + vfio_region_t *bar = (vfio_region_t *) priv; + + /* Write I/O port mirror to memory-mapped space. */ +#ifdef ENABLE_VFIO_LOG + vfio_device_t *dev = bar->dev; + vfio_log_op("VFIO %s: I/O mirror: Write %04X to %04X (%08X)\n", dev->name, + val, addr, bar->quirks.iomirror.offset + addr); +#endif + vfio_mem_writew_fd(bar->emulated_offset + bar->quirks.iomirror.offset + addr, val, bar); +} + +static void +vfio_quirk_iomirror_writel(uint16_t addr, uint32_t val, void *priv) +{ + vfio_region_t *bar = (vfio_region_t *) priv; + + /* Write I/O port mirror to memory-mapped space. */ +#ifdef ENABLE_VFIO_LOG + vfio_device_t *dev = bar->dev; + vfio_log_op("VFIO %s: I/O mirror: Write %08X to %04X (%08X)\n", dev->name, + val, addr, bar->quirks.iomirror.offset + addr); +#endif + vfio_mem_writel_fd(bar->emulated_offset + bar->quirks.iomirror.offset + addr, val, bar); +} + +static void +vfio_quirk_iomirror(vfio_device_t *dev, vfio_region_t *bar, + uint32_t offset, uint16_t base, uint16_t length, uint8_t enable) +{ + vfio_log("VFIO %s: %sapping I/O mirror for %s @ %08X\n", + dev->name, enable ? "M" : "Unm", bar->name, bar->emulated_offset + offset); + + /* Save I/O mirror offset, only one per BAR for now. */ + bar->quirks.iomirror.offset = offset; + + /* Add or remove quirk handler from port range. */ + if (enable) + io_sethandler(base, length, + bar->read ? vfio_quirk_iomirror_readb : NULL, + bar->read ? vfio_quirk_iomirror_readw : NULL, + bar->read ? vfio_quirk_iomirror_readl : NULL, + bar->write ? vfio_quirk_iomirror_writeb : NULL, + bar->write ? vfio_quirk_iomirror_writew : NULL, + bar->write ? vfio_quirk_iomirror_writel : NULL, + bar); + else + io_removehandler(base, length, + bar->read ? vfio_quirk_iomirror_readb : NULL, + bar->read ? vfio_quirk_iomirror_readw : NULL, + bar->read ? vfio_quirk_iomirror_readl : NULL, + bar->write ? vfio_quirk_iomirror_writeb : NULL, + bar->write ? vfio_quirk_iomirror_writew : NULL, + bar->write ? vfio_quirk_iomirror_writel : NULL, + bar); +} + +static uint8_t +vfio_quirk_ati3c3_readb(uint16_t addr, void *priv) +{ + vfio_device_t *dev = (vfio_device_t *) priv; + + /* Read high byte of the I/O BAR address. */ + uint8_t ret = dev->quirks.ati3c3.bar->emulated_offset >> 8; + vfio_log_op("VFIO %s: ATI 3C3: Read %02X\n", ret); + + return ret; +} + +static void +vfio_quirk_nvidiabar5(vfio_device_t *dev) +{ + /* Remap config window based on BAR enable status and the master/enable registers. */ + vfio_quirk_configwindow(dev, &dev->bars[5], 0x08, 4, 0x0c, 4, 0x1800, 0x88000, + dev->quirks.nvidiabar5.bar_enable && ((dev->quirks.nvidiabar5.master_enable & 0x0000000100000001) == 0x0000000100000001)); +} + +static void +vfio_quirk_nvidiabar5_writeb(uint16_t addr, uint8_t val, void *priv) +{ + vfio_device_t *dev = (vfio_device_t *) priv; + + /* Write master/enable registers. */ + vfio_log_op("VFIO %s: NVIDIA BAR 5: Write [%d] %02X\n", + dev->name, addr & 7, val); + uint8_t offset = (addr & 7) << 3; + dev->quirks.nvidiabar5.master_enable &= ~(0x00000000000000ff << offset); + dev->quirks.nvidiabar5.master_enable |= val << offset; + + /* Update window to account for changes in master/enable registers. */ + vfio_quirk_nvidiabar5(dev); + + /* Cascade to the main handler. */ + vfio_io_writeb_fd(addr, val, &dev->bars[5]); +} + +static void +vfio_quirk_nvidiabar5_writew(uint16_t addr, uint16_t val, void *priv) +{ + vfio_device_t *dev = (vfio_device_t *) priv; + + /* Write master/enable registers. */ + vfio_log_op("VFIO %s: NVIDIA BAR 5: Write [%d] %04X\n", + dev->name, addr & 7, val); + uint8_t offset = (addr & 6) << 3; + dev->quirks.nvidiabar5.master_enable &= ~(0x000000000000ffff << offset); + dev->quirks.nvidiabar5.master_enable |= val << offset; + + /* Update window to account for changes in master/enable registers. */ + vfio_quirk_nvidiabar5(dev); + + /* Cascade to the main handler. */ + vfio_io_writew_fd(addr, val, &dev->bars[5]); +} + +static void +vfio_quirk_nvidiabar5_writel(uint16_t addr, uint32_t val, void *priv) +{ + vfio_device_t *dev = (vfio_device_t *) priv; + + /* Write master/enable registers. */ + vfio_log_op("VFIO %s: NVIDIA BAR 5: Write [%d] %08X\n", + dev->name, addr & 7, val); + uint8_t offset = (addr & 4) << 3; + dev->quirks.nvidiabar5.master_enable &= ~(0x00000000ffffffff << offset); + dev->quirks.nvidiabar5.master_enable |= val << offset; + + /* Update window to account for changes in master/enable registers. */ + vfio_quirk_nvidiabar5(dev); + + /* Cascade to the main handler. */ + vfio_io_writel_fd(addr, val, &dev->bars[5]); +} + +static uint8_t +vfio_quirk_nvidia3d0_state_readb(uint16_t addr, void *priv) +{ + vfio_device_t *dev = (vfio_device_t *) priv; + + /* Reset state on read. */ + dev->quirks.nvidia3d0.state = NVIDIA_3D0_NONE; + vfio_log_op("VFIO %s: NVIDIA 3D0: Switching to NONE state (byte read)\n", dev->name); + + /* Cascade to the main handler. */ + return vfio_io_readb_fd(addr, &dev->vga_io_hi); +} + +static uint16_t +vfio_quirk_nvidia3d0_state_readw(uint16_t addr, void *priv) +{ + vfio_device_t *dev = (vfio_device_t *) priv; + + /* Reset state on read. */ + dev->quirks.nvidia3d0.state = NVIDIA_3D0_NONE; + vfio_log_op("VFIO %s: NVIDIA 3D0: Switching to NONE state (word read)\n", dev->name); + + /* Cascade to the main handler. */ + return vfio_io_readw_fd(addr, &dev->vga_io_hi); +} + +static uint32_t +vfio_quirk_nvidia3d0_state_readl(uint16_t addr, void *priv) +{ + vfio_device_t *dev = (vfio_device_t *) priv; + + /* Reset state on read. */ + dev->quirks.nvidia3d0.state = NVIDIA_3D0_NONE; + vfio_log_op("VFIO %s: NVIDIA 3D0: Switching to NONE state (dword read)\n", dev->name); + + /* Cascade to the main handler. */ + return vfio_io_readl_fd(addr, &dev->vga_io_hi); +} + +static void +vfio_quirk_nvidia3d0_state_writeb(uint16_t addr, uint8_t val, void *priv) +{ + vfio_device_t *dev = (vfio_device_t *) priv; + + /* Commands don't fit in a byte; just reset state and move on. */ + dev->quirks.nvidia3d0.state = NVIDIA_3D0_NONE; + vfio_log_op("VFIO %s: NVIDIA 3D0: Switching to NONE state (byte write)\n", dev->name); + + /* Cascade to the main handler. */ + vfio_io_writeb_fd(addr, val, &dev->vga_io_hi); +} + +static void +vfio_quirk_nvidia3d0_state_writew(uint16_t addr, uint16_t val, void *priv) +{ + vfio_device_t *dev = (vfio_device_t *) priv; + + uint8_t prev_state = dev->quirks.nvidia3d0.state; + dev->quirks.nvidia3d0.state = NVIDIA_3D0_NONE; + + /* Interpret NVIDIA commands. */ + switch (val) { + case 0x338: + if (prev_state == NVIDIA_3D0_NONE) { + dev->quirks.nvidia3d0.state = NVIDIA_3D0_SELECT; + vfio_log_op("VFIO %s: NVIDIA 3D0: Switching to SELECT state (word write)\n", dev->name); + } + break; + + case 0x538: + if (prev_state == NVIDIA_3D0_WINDOW) { + dev->quirks.nvidia3d0.state = NVIDIA_3D0_READ; + vfio_log_op("VFIO %s: NVIDIA 3D0: Switching to READ state (word write)\n", dev->name); + } + break; + + case 0x738: + if (prev_state == NVIDIA_3D0_WINDOW) { + dev->quirks.nvidia3d0.state = NVIDIA_3D0_WRITE; + vfio_log_op("VFIO %s: NVIDIA 3D0: Switching to WRITE state (word write)\n", dev->name); + } + break; + } + + /* Cascade to the main handler. */ + vfio_io_writew_fd(addr, val, &dev->vga_io_hi); +} + +static void +vfio_quirk_nvidia3d0_state_writel(uint16_t addr, uint32_t val, void *priv) +{ + vfio_device_t *dev = (vfio_device_t *) priv; + + uint8_t prev_state = dev->quirks.nvidia3d0.state; + dev->quirks.nvidia3d0.state = NVIDIA_3D0_NONE; + + /* Interpret NVIDIA commands. */ + switch (val) { + case 0x338: + if (prev_state == NVIDIA_3D0_NONE) { + dev->quirks.nvidia3d0.state = NVIDIA_3D0_SELECT; + vfio_log_op("VFIO %s: NVIDIA 3D0: Switching to SELECT state (dword write)\n", dev->name); + } + break; + + case 0x538: + if (prev_state == NVIDIA_3D0_WINDOW) { + dev->quirks.nvidia3d0.state = NVIDIA_3D0_READ; + vfio_log_op("VFIO %s: NVIDIA 3D0: Switching to READ state (dword write)\n", dev->name); + } + break; + + case 0x738: + if (prev_state == NVIDIA_3D0_WINDOW) { + dev->quirks.nvidia3d0.state = NVIDIA_3D0_WRITE; + vfio_log_op("VFIO %s: NVIDIA 3D0: Switching to WRITE state (dword write)\n", dev->name); + } + break; + } + + /* Cascade to the main handler. */ + vfio_io_writel_fd(addr, val, &dev->vga_io_hi); +} + +static uint8_t +vfio_quirk_nvidia3d0_data_readb(uint16_t addr, void *priv) +{ + vfio_device_t *dev = (vfio_device_t *) priv; + + /* Cascade to the main handler. */ + uint8_t prev_state = dev->quirks.nvidia3d0.state; + uint8_t ret = vfio_io_readb_fd(addr, &dev->vga_io_hi); + dev->quirks.nvidia3d0.state = NVIDIA_3D0_NONE; + + /* Read configuration register if part of the main PCI configuration space. */ + if ((prev_state == NVIDIA_3D0_READ) && (((dev->quirks.nvidia3d0.index & 0xffffff00) == 0x00001800) || ((dev->quirks.nvidia3d0.index & 0xffffff00) == 0x00088000))) { + ret = vfio_config_readb(0, dev->quirks.nvidia3d0.index, dev); + vfio_log_op("VFIO %s: NVIDIA 3D0: Read %02X from index %08X\n", dev->name, + ret, dev->quirks.nvidia3d0.index); + } + + return ret; +} + +static uint16_t +vfio_quirk_nvidia3d0_data_readw(uint16_t addr, void *priv) +{ + vfio_device_t *dev = (vfio_device_t *) priv; + + /* Cascade to the main handler. */ + uint8_t prev_state = dev->quirks.nvidia3d0.state; + uint16_t ret = vfio_io_readw_fd(addr, &dev->vga_io_hi); + dev->quirks.nvidia3d0.state = NVIDIA_3D0_NONE; + + /* Read configuration register if part of the main PCI configuration space. */ + if ((prev_state == NVIDIA_3D0_READ) && (((dev->quirks.nvidia3d0.index & 0xffffff00) == 0x00001800) || ((dev->quirks.nvidia3d0.index & 0xffffff00) == 0x00088000))) { + ret = vfio_config_readw(0, dev->quirks.nvidia3d0.index, dev); + vfio_log_op("VFIO %s: NVIDIA 3D0: Read %04X from index %08X\n", dev->name, + ret, dev->quirks.nvidia3d0.index); + } + + return ret; +} + +static uint32_t +vfio_quirk_nvidia3d0_data_readl(uint16_t addr, void *priv) +{ + vfio_device_t *dev = (vfio_device_t *) priv; + + /* Cascade to the main handler. */ + uint8_t prev_state = dev->quirks.nvidia3d0.state; + uint32_t ret = vfio_io_readl_fd(addr, &dev->vga_io_hi); + dev->quirks.nvidia3d0.state = NVIDIA_3D0_NONE; + + /* Read configuration register if part of the main PCI configuration space. */ + if ((prev_state == NVIDIA_3D0_READ) && (((dev->quirks.nvidia3d0.index & 0xffffff00) == 0x00001800) || ((dev->quirks.nvidia3d0.index & 0xffffff00) == 0x00088000))) { + ret = vfio_config_readl(0, dev->quirks.nvidia3d0.index, dev); + vfio_log_op("VFIO %s: NVIDIA 3D0: Read %08X from index %08X\n", dev->name, + ret, dev->quirks.nvidia3d0.index); + } + + return ret; +} + +static void +vfio_quirk_nvidia3d0_data_writeb(uint16_t addr, uint8_t val, void *priv) +{ + vfio_device_t *dev = (vfio_device_t *) priv; + + uint8_t prev_state = dev->quirks.nvidia3d0.state; + dev->quirks.nvidia3d0.state = NVIDIA_3D0_NONE; + + if (prev_state == NVIDIA_3D0_SELECT) { + /* Write MMIO index. */ + dev->quirks.nvidia3d0.index = val; + dev->quirks.nvidia3d0.state = NVIDIA_3D0_WINDOW; + vfio_log_op("VFIO %s: NVIDIA 3D0: Write index %02X\n", dev->name, val); + } else if (prev_state == NVIDIA_3D0_WRITE) { + /* Write configuration register if part of the main PCI configuration space. */ + if (((dev->quirks.nvidia3d0.index & 0xffffff00) == 0x00001800) || ((dev->quirks.nvidia3d0.index & 0xffffff00) == 0x00088000)) { + /* Write configuration register. */ + vfio_log_op("VFIO %s: NVIDIA 3D0: Write %02X to index %08X\n", dev->name, + val, dev->quirks.nvidia3d0.index); + vfio_config_writeb(0, dev->quirks.nvidia3d0.index, val, dev); + return; + } + } + + /* Cascade to the main handler. */ + vfio_io_writeb_fd(addr, val, &dev->vga_io_hi); +} + +static void +vfio_quirk_nvidia3d0_data_writew(uint16_t addr, uint16_t val, void *priv) +{ + vfio_device_t *dev = (vfio_device_t *) priv; + + uint8_t prev_state = dev->quirks.nvidia3d0.state; + dev->quirks.nvidia3d0.state = NVIDIA_3D0_NONE; + + if (prev_state == NVIDIA_3D0_SELECT) { + /* Write MMIO index. */ + dev->quirks.nvidia3d0.index = val; + dev->quirks.nvidia3d0.state = NVIDIA_3D0_WINDOW; + vfio_log_op("VFIO %s: NVIDIA 3D0: Write index %04X\n", dev->name, val); + } else if (prev_state == NVIDIA_3D0_WRITE) { + /* Write configuration register if part of the main PCI configuration space. */ + if (((dev->quirks.nvidia3d0.index & 0xffffff00) == 0x00001800) || ((dev->quirks.nvidia3d0.index & 0xffffff00) == 0x00088000)) { + vfio_log_op("VFIO %s: NVIDIA 3D0: Write %04X to index %08X\n", dev->name, + val, dev->quirks.nvidia3d0.index); + vfio_config_writew(0, dev->quirks.nvidia3d0.index, val, dev); + return; + } + } + + /* Cascade to the main handler. */ + vfio_io_writew_fd(addr, val, &dev->vga_io_hi); +} + +static void +vfio_quirk_nvidia3d0_data_writel(uint16_t addr, uint32_t val, void *priv) +{ + vfio_device_t *dev = (vfio_device_t *) priv; + + uint8_t prev_state = dev->quirks.nvidia3d0.state; + dev->quirks.nvidia3d0.state = NVIDIA_3D0_NONE; + + if (prev_state == NVIDIA_3D0_SELECT) { + /* Write MMIO index. */ + dev->quirks.nvidia3d0.index = val; + dev->quirks.nvidia3d0.state = NVIDIA_3D0_WINDOW; + vfio_log_op("VFIO %s: NVIDIA 3D0: Write index %08X\n", dev->name, val); + } else if (prev_state == NVIDIA_3D0_WRITE) { + /* Write configuration register if part of the main PCI configuration space. */ + if (((dev->quirks.nvidia3d0.index & 0xffffff00) == 0x00001800) || ((dev->quirks.nvidia3d0.index & 0xffffff00) == 0x00088000)) { + /* Write configuration register. */ + vfio_log_op("VFIO %s: NVIDIA 3D0: Write %08X to index %08X\n", dev->name, + val, dev->quirks.nvidia3d0.index); + vfio_config_writel(0, dev->quirks.nvidia3d0.index, val, dev); + return; + } + } + + /* Cascade to the main handler. */ + vfio_io_writel_fd(addr, val, &dev->vga_io_hi); +} + +static void +vfio_quirk_remap(vfio_device_t *dev, vfio_region_t *bar, uint8_t enable) +{ + /* Read vendor ID. */ + uint16_t vendor; + if (pread(dev->config.fd, &vendor, sizeof(vendor), dev->config.offset) != sizeof(vendor)) + vendor = 0x0000; + + int i, j; + switch (vendor) { + case 0x1002: /* ATI */ + i = (vfio_bar_gettype(dev, &dev->bars[1]) == 0x01) && (dev->bars[1].size >= 256); + j = (vfio_bar_gettype(dev, &dev->bars[4]) == 0x01) && (dev->bars[4].size >= 256); + + /* ATI/AMD cards report the I/O BAR's high byte on port 3C3, and according + to the Red Hat slide deck, this is used for VBIOS bootstrapping purposes. + This I/O BAR can be either 1 or 4, so we probe which one it is. If unsure + (shouldn't really happen), pick 1 which is mostly used by older cards. */ + if ((bar == &dev->vga_io_hi) && (i || j)) { + dev->quirks.ati3c3.bar = (j && !i) ? &dev->bars[4] : &dev->bars[1]; + vfio_log("VFIO %s: %sapping ATI 3C3 quirk (BAR %d)\n", dev->name, + enable ? "M" : "Unm", dev->quirks.ati3c3.bar->bar_id); + vfio_quirk_capture_io(dev, bar, 0x3c3, 1, enable, + vfio_quirk_ati3c3_readb, NULL, NULL, + NULL, NULL, NULL); + } + + /* BAR 2 configuration space mirror, and BAR 1/4 configuration space window. */ + if (j && !i) { + /* QEMU only enables the mirror here if BAR 2 is 64-bit capable. */ + if ((bar->bar_id == 2) && ((vfio_config_readb(0, 0x18, dev) & 0x07) == 0x04)) + vfio_quirk_configmirror(dev, bar, 0x4000, 0, enable); + else if (bar->bar_id == 4) + vfio_quirk_configwindow(dev, bar, 0x00, 4, 0x04, 4, 0x4000, 0x4000, enable); + } else { + if (bar->bar_id == 2) + vfio_quirk_configmirror(dev, bar, 0xf00, 0, enable); + else if (bar->bar_id == 1) + vfio_quirk_configwindow(dev, bar, 0x00, 4, 0x04, 4, 0xf00, 0xf00, enable); + } + break; + + case 0x1023: /* Trident */ + /* Mirror TGUI acceleration port range to memory-mapped space, since the PCI bridge + VGA decode policy doesn't allow it to be forwarded directly to the real card. */ + if ((bar->bar_id == 1) && (vfio_bar_gettype(dev, bar) == 0x00) && (bar->size >= 65536)) { + /* Port range from vid_tgui9440.c */ + vfio_quirk_iomirror(dev, bar, 0, 0x2100, 256, enable); + } + break; + + case 0x10de: /* NVIDIA */ + /* BAR 0 configuration space mirrors. */ + if ((bar->bar_id == 0) && (vfio_bar_gettype(dev, bar) == 0x00)) { + vfio_quirk_configmirror(dev, bar, 0x1800, 0, enable); + vfio_quirk_configmirror(dev, bar, 0x88000, 1, enable); + } + + /* BAR 5 configuration space window. */ + if ((bar->bar_id == 5) && (vfio_bar_gettype(dev, bar) == 0x01)) { + vfio_log("VFIO %s: %sapping NVIDIA BAR 5 quirk\n", dev->name, enable ? "M" : "Unm"); + vfio_quirk_capture_io(dev, bar, bar->emulated_offset, 8, enable, + vfio_io_readb_fd, + vfio_io_readw_fd, + vfio_io_readl_fd, + vfio_quirk_nvidiabar5_writeb, + vfio_quirk_nvidiabar5_writew, + vfio_quirk_nvidiabar5_writel); + + /* Update window to account for changes in BAR enable status. */ + dev->quirks.nvidiabar5.bar_enable = enable; + vfio_quirk_nvidiabar5(dev); + } + + /* Port 3D0 configuration space window. */ + if ((bar == &dev->vga_io_hi) && dev->bars[1].size) { + vfio_log("VFIO %s: %sapping NVIDIA 3D0 quirk\n", dev->name, enable ? "M" : "Unm"); + vfio_quirk_capture_io(dev, bar, 0x3d0, 1, enable, + vfio_quirk_nvidia3d0_data_readb, + vfio_quirk_nvidia3d0_data_readw, + vfio_quirk_nvidia3d0_data_readl, + vfio_quirk_nvidia3d0_data_writeb, + vfio_quirk_nvidia3d0_data_writew, + vfio_quirk_nvidia3d0_data_writel); + vfio_quirk_capture_io(dev, bar, 0x3d4, 1, enable, + vfio_quirk_nvidia3d0_state_readb, + vfio_quirk_nvidia3d0_state_readw, + vfio_quirk_nvidia3d0_state_readl, + vfio_quirk_nvidia3d0_state_writeb, + vfio_quirk_nvidia3d0_state_writew, + vfio_quirk_nvidia3d0_state_writel); + } + break; + + case 0x5333: /* S3 */ + /* Mirror enhanced command port ranges to memory-mapped space, since the PCI bridge + VGA decode policy doesn't allow those to be forwarded directly to the real card. */ + if (vfio_bar_gettype(dev, &dev->bars[0]) != 0x00) + break; + if ((dev->bars[0].size == 33554432) && (dev->bar_count == 1)) { + /* Older chips can only remap to VGA A0000. We can tell + those through BAR 0 being 32M and the only BAR. */ + if (bar == &dev->vga_mem) { + i = 0; + + /* Main port list from vid_s3.c */ + vfio_quirk_iomirror(dev, bar, i, 0x42e8, 2, enable); + vfio_quirk_iomirror(dev, bar, i, 0x46e8, 2, enable); + vfio_quirk_iomirror(dev, bar, i, 0x4ae8, 2, enable); + +s3_old_mmio: + vfio_quirk_iomirror(dev, bar, i, 0x82e8, 4, enable); + vfio_quirk_iomirror(dev, bar, i, 0x86e8, 4, enable); + vfio_quirk_iomirror(dev, bar, i, 0x8ae8, 4, enable); + vfio_quirk_iomirror(dev, bar, i, 0x8ee8, 4, enable); + vfio_quirk_iomirror(dev, bar, i, 0x92e8, 4, enable); + vfio_quirk_iomirror(dev, bar, i, 0x96e8, 4, enable); + + vfio_quirk_iomirror(dev, bar, i, 0x9ae8, 4, enable); + + vfio_quirk_iomirror(dev, bar, i, 0x9ee8, 2, enable); + vfio_quirk_iomirror(dev, bar, i, 0xa2e8, 4, enable); + vfio_quirk_iomirror(dev, bar, i, 0xa6e8, 4, enable); + vfio_quirk_iomirror(dev, bar, i, 0xaae8, 4, enable); + vfio_quirk_iomirror(dev, bar, i, 0xaee8, 4, enable); + + vfio_quirk_iomirror(dev, bar, i, 0xb2e8, 4, enable); + + vfio_quirk_iomirror(dev, bar, i, 0xb6e8, 2, enable); + vfio_quirk_iomirror(dev, bar, i, 0xbae8, 2, enable); + vfio_quirk_iomirror(dev, bar, i, 0xbee8, 2, enable); + vfio_quirk_iomirror(dev, bar, i, 0xe2e8, 2, enable); + + vfio_quirk_iomirror(dev, bar, i, 0xd2e8, 2, enable); + vfio_quirk_iomirror(dev, bar, i, 0xe6e8, 4, enable); + vfio_quirk_iomirror(dev, bar, i, 0xeae8, 4, enable); + vfio_quirk_iomirror(dev, bar, i, 0xeee8, 4, enable); + } + } else if ((dev->bars[0].size == 67108864) && (dev->bar_count == 1)) { + /* Trio64V+ and ViRGE chips can remap to BAR 0 + 16M. We can tell those through + BAR 0 being 64M = ((16M linear + 16M MMIO) * both endians) and the only BAR. */ + if (bar->bar_id == 0) { + i = 0x1000000; /* 16M MMIO offset */ + +s3_new_mmio: /* There's a configuration space mirror in here as well. */ + vfio_quirk_configmirror(dev, bar, i + 0x8000, 0, enable); + + /* Subsystem Control/Status and Advanced Function Control. */ + vfio_quirk_iomirror(dev, bar, i + 0x8504 - 0x42e8, 0x42e8, 2, enable); + vfio_quirk_iomirror(dev, bar, i + 0x850c - 0x4ae8, 0x4ae8, 2, enable); + + /* The rest maps exactly as older chips. */ + goto s3_old_mmio; + } + } else if ((dev->bars[0].size >= 524288) && (vfio_bar_gettype(dev, &dev->bars[1]) == 0x00)) { + /* Savage chips break the linear framebuffer out to + BAR 1+, eliminating the 16M MMIO offset from BAR 0. */ + if (bar->bar_id == 0) { + i = 0; + goto s3_new_mmio; + } + } + break; + } +} + +static uint8_t +vfio_bar_gettype(vfio_device_t *dev, vfio_region_t *bar) +{ + /* Read and store BAR type from device if unknown. */ + if (bar->type == 0xff) { + if (pread(dev->config.fd, &bar->type, sizeof(bar->type), + dev->config.offset + 0x10 + (bar->bar_id << 2)) + == sizeof(bar->type)) + bar->type &= 0x01; + else + bar->type = 0xff; + } + + /* Return stored BAR type. */ + return bar->type; +} + +static void +vfio_bar_remap(vfio_device_t *dev, vfio_region_t *bar, uint32_t new_offset) +{ + vfio_log("VFIO %s: bar_remap(%s, %08X)\n", dev->name, bar->name, new_offset); + + /* Act according to the BAR type. */ + uint8_t bar_type = vfio_bar_gettype(dev, bar); + if (bar_type == 0x00) { /* Memory BAR */ + if (bar->emulated_offset) { + vfio_log("VFIO %s: Unmapping %s memory @ %08X-%08X\n", dev->name, + bar->name, bar->emulated_offset, bar->emulated_offset + bar->size - 1); + + /* Unmap any quirks. */ + vfio_quirk_remap(dev, bar, 0); + + /* Disable memory mapping. */ + mem_mapping_disable(&bar->mem_mapping); + + /* Disable MSI-X table and PBA mappings if applicable to this BAR. */ + if (dev->irq.msix.table_bar == bar->bar_id) + mem_mapping_disable(&dev->irq.msix.table_mapping); + if (dev->irq.msix.pba_bar == bar->bar_id) + mem_mapping_disable(&dev->irq.msix.pba_mapping); + } + + bar->mmap_precalc = bar->mmap_base - new_offset; + /* Expansion ROM requires both ROM enable and memory enable. */ + if (((bar->bar_id != 0xff) || dev->rom_enabled) && dev->mem_enabled && new_offset) { + vfio_log("VFIO %s: Mapping %s memory @ %08X-%08X\n", dev->name, + bar->name, new_offset, new_offset + bar->size - 1); + + /* Enable memory mapping. */ + if (bar->mmap_base) /* mmap available */ + mem_mapping_set_p(&bar->mem_mapping, bar->mmap_precalc); + mem_mapping_set_addr(&bar->mem_mapping, new_offset, bar->size); + + /* Map any quirks. */ + vfio_quirk_remap(dev, bar, 1); + + /* Enable MSI-X table and PBA mappings if applicable to this BAR. */ + if (dev->irq.msix.table_bar == bar->bar_id) { + dev->irq.msix.table_offset_precalc = new_offset + dev->irq.msix.table_offset; + mem_mapping_set_addr(&dev->irq.msix.table_mapping, + dev->irq.msix.table_offset_precalc, + dev->irq.msix.table_size); + } + if (dev->irq.msix.pba_bar == bar->bar_id) { + dev->irq.msix.pba_offset_precalc = new_offset + dev->irq.msix.pba_offset; + mem_mapping_set_addr(&dev->irq.msix.pba_mapping, + dev->irq.msix.pba_offset_precalc, + dev->irq.msix.pba_size); + } + } + } else if (bar_type == 0x01) { /* I/O BAR */ + if (bar->emulated_offset) { + vfio_log("VFIO %s: Unmapping %s I/O @ %04X-%04X\n", dev->name, + bar->name, bar->emulated_offset, bar->emulated_offset + bar->size - 1); + + /* Unmap any quirks. */ + vfio_quirk_remap(dev, bar, 0); + + /* Disable I/O mapping. */ + if (bar->mmap_base) /* mmap available */ + io_removehandler(bar->emulated_offset, bar->size, + bar->read ? vfio_io_readb_mm : NULL, + bar->read ? vfio_io_readw_mm : NULL, + bar->read ? vfio_io_readl_mm : NULL, + bar->write ? vfio_io_writeb_mm : NULL, + bar->write ? vfio_io_writew_mm : NULL, + bar->write ? vfio_io_writel_mm : NULL, + bar->mmap_precalc); + else /* mmap not available */ + io_removehandler(bar->emulated_offset, bar->size, + bar->read ? vfio_io_readb_fd : NULL, + bar->read ? vfio_io_readw_fd : NULL, + bar->read ? vfio_io_readl_fd : NULL, + bar->write ? vfio_io_writeb_fd : NULL, + bar->write ? vfio_io_writew_fd : NULL, + bar->write ? vfio_io_writel_fd : NULL, + bar); + } + + bar->mmap_precalc = bar->mmap_base - new_offset; + if (dev->io_enabled && new_offset) { + vfio_log("VFIO %s: Mapping %s I/O @ %04X-%04X\n", dev->name, + bar->name, new_offset, new_offset + bar->size - 1); + + /* Enable I/O mapping. */ + if (bar->mmap_base) /* mmap available */ + io_sethandler(new_offset, bar->size, + bar->read ? vfio_io_readb_mm : NULL, + bar->read ? vfio_io_readw_mm : NULL, + bar->read ? vfio_io_readl_mm : NULL, + bar->write ? vfio_io_writeb_mm : NULL, + bar->write ? vfio_io_writew_mm : NULL, + bar->write ? vfio_io_writel_mm : NULL, + bar->mmap_precalc); + else /* mmap not available */ + io_sethandler(new_offset, bar->size, + bar->read ? vfio_io_readb_fd : NULL, + bar->read ? vfio_io_readw_fd : NULL, + bar->read ? vfio_io_readl_fd : NULL, + bar->write ? vfio_io_writeb_fd : NULL, + bar->write ? vfio_io_writew_fd : NULL, + bar->write ? vfio_io_writel_fd : NULL, + bar); + + /* Map any quirks. */ + vfio_quirk_remap(dev, bar, 1); + } + } + + /* Set new emulated and precalculated offsets. + The precalculated offsets speed up read/write operations. */ + bar->emulated_offset = new_offset; + bar->precalc_offset = bar->offset - new_offset; +} + +static uint32_t +ceilpow2(uint32_t size) +{ + uint32_t pow_size = 1 << log2i(size); + if (pow_size < size) + return pow_size << 1; + return pow_size; +} + +static uint8_t +vfio_config_readb(int func, int addr, void *priv) +{ + vfio_device_t *dev = (vfio_device_t *) priv; + if (func) + return 0xff; + + intx_high = 0; + + /* Read register from device. */ + addr &= 0xff; + uint8_t ret; + if (pread(dev->config.fd, &ret, 1, dev->config.offset + addr) != 1) { + vfio_log("VFIO %s: config_readb(%d, %02X) failed\n", dev->name, + func, addr); + return 0xff; + } + + /* Change value accordingly. */ + uint8_t bar_id, offset, new; + switch (addr) { + case 0x10 ... 0x27: /* BARs */ + /* Stop if this BAR is absent. */ + bar_id = (addr - 0x10) >> 2; + if (!dev->bars[bar_id].read && !dev->bars[bar_id].write) { + ret = 0x00; + break; + } + + /* Mask off and insert static bits. */ + offset = (addr & 3) << 3; + new = dev->bars[bar_id].emulated_offset >> offset; + if (!offset) { + switch (vfio_bar_gettype(dev, &dev->bars[bar_id])) { + case 0x00: /* Memory BAR */ + new = (new & ~0x07) | (ret & 0x07); + break; + + case 0x01: /* I/O BAR */ + new = (new & ~0x03) | (ret & 0x03); + break; + } + } + ret = new; + break; + + case 0x30 ... 0x33: /* Expansion ROM */ + /* Stop if the ROM is absent. */ + if (!dev->rom.read) { + ret = 0x00; + break; + } + + /* Mask off and insert ROM enable bit. */ + offset = (addr & 3) << 3; + ret = dev->rom.emulated_offset >> offset; + if (!offset) + ret = (ret & ~0x01) | dev->rom_enabled; + break; + + default: /* other (capabilities) */ + if (dev->msi_cap && (addr >= dev->msi_cap)) { /* MSI */ + /* Adjust register offset to account for different structure levels. */ + offset = addr - dev->msi_cap; + if (!(dev->irq.msi.ctl & 0x0080) && (offset >= 0x08)) + offset += 4; + switch (offset) { + case 0x02 ... 0x03: /* Message Control */ + offset = (offset - 0x02) << 3; + ret = dev->irq.msi.ctl >> offset; + goto end; + + case 0x04 ... 0x07: /* Message Address */ + offset = (offset - 0x04) << 3; + ret = dev->irq.msi.address >> offset; + goto end; + + case 0x08 ... 0x0b: /* Message Upper Address */ + offset = (offset - 0x08) << 3; + ret = dev->irq.msi.address_upper >> offset; + goto end; + + case 0x0c ... 0x0d: /* Message Data */ + offset = (offset - 0x0c) << 3; + ret = dev->irq.msi.data >> offset; + goto end; + + case 0x10 ... 0x13: /* Mask Bits */ + if (dev->irq.msi.ctl & 0x0100) { + offset = (offset - 0x10) << 3; + ret = dev->irq.msi.mask >> offset; + goto end; + } + break; + + case 0x14 ... 0x17: /* Pending Bits */ + if (dev->irq.msi.ctl & 0x0100) { + offset = (offset - 0x14) << 3; + ret = dev->irq.msi.pending >> offset; + goto end; + } + break; + } + } + if (dev->msix_cap && (addr >= dev->msix_cap)) { /* MSI-X */ + offset = addr - dev->msix_cap; + switch (offset) { + case 0x02 ... 0x03: /* Message Control */ + offset = (offset - 0x02) << 3; + ret = dev->irq.msix.ctl >> offset; + goto end; + } + } +end: + break; + } + + vfio_log("VFIO %s: config_readb(%02X) = %02X\n", dev->name, + addr, ret); + + return ret; +} + +static uint16_t +vfio_config_readw(int func, int addr, void *priv) +{ + return vfio_config_readb(func, addr, priv) | (vfio_config_readb(func, addr + 1, priv) << 8); +} + +static uint32_t +vfio_config_readl(int func, int addr, void *priv) +{ + return vfio_config_readb(func, addr, priv) | (vfio_config_readb(func, addr + 1, priv) << 8) | (vfio_config_readb(func, addr + 2, priv) << 16) | (vfio_config_readb(func, addr + 3, priv) << 24); +} + +static void +vfio_config_writeb(int func, int addr, uint8_t val, void *priv) +{ + vfio_device_t *dev = (vfio_device_t *) priv; + if (func) + return; + + addr &= 0xff; + vfio_log("VFIO %s: config_writeb(%02X, %02X)\n", dev->name, addr, val); + + intx_high = 0; + + /* VFIO should block anything we shouldn't write to, such as BARs. */ + (void) !pwrite(dev->config.fd, &val, 1, dev->config.offset + addr); + + /* Act on some written values. */ + uint8_t new_mem_enabled; + uint8_t new_io_enabled; + uint8_t bar_id; + uint8_t offset; + uint32_t new_value; + uint64_t val64; + + switch (addr) { + case 0x04: /* Command */ + /* Determine new memory and I/O enable states. */ + new_mem_enabled = !!(val & PCI_COMMAND_MEM); + new_io_enabled = !!(val & PCI_COMMAND_IO); + + vfio_log("VFIO %s: Command Memory[%d] I/O[%d]\n", dev->name, + new_mem_enabled, new_io_enabled); + + /* Remap regions only if their respective enable bits have changed. */ + if (dev->mem_enabled ^ new_mem_enabled) { + /* Set new memory enable state. */ + dev->mem_enabled = new_mem_enabled; + + /* Remap memory BARs. */ + for (uint8_t i = 0; i < 6; i++) { + if (vfio_bar_gettype(dev, &dev->bars[i]) == 0x00) + vfio_bar_remap(dev, &dev->bars[i], dev->bars[i].emulated_offset); + } + + /* Remap ROM if present. */ + if (dev->rom.read) + vfio_bar_remap(dev, &dev->rom, dev->rom.emulated_offset); + + /* Remap VGA framebuffer region if present. */ + if (dev->vga_mem.bar_id) + vfio_bar_remap(dev, &dev->vga_mem, 0xa0000); + } + if (dev->io_enabled ^ new_io_enabled) { + /* Set new I/O enable state. */ + dev->io_enabled = new_io_enabled; + + /* Remap I/O BARs. */ + for (uint8_t i = 0; i < 6; i++) { + if (vfio_bar_gettype(dev, &dev->bars[i]) == 0x01) + vfio_bar_remap(dev, &dev->bars[i], dev->bars[i].emulated_offset); + } + + /* Remap VGA I/O regions if present. */ + if (dev->vga_io_lo.bar_id) { + vfio_bar_remap(dev, &dev->vga_io_lo, 0x3b0); + vfio_bar_remap(dev, &dev->vga_io_hi, 0x3c0); + } + } + break; + + case 0x10 ... 0x27: /* BARs */ + /* Stop if this BAR is absent. */ + bar_id = (addr - 0x10) >> 2; + if (!dev->bars[bar_id].read && !dev->bars[bar_id].write) + break; + + /* Mask off static bits. */ + offset = (addr & 3) << 3; + if (!offset) { + switch (vfio_bar_gettype(dev, &dev->bars[bar_id])) { + case 0x00: /* Memory BAR */ + val &= ~0x07; + break; + + case 0x01: /* I/O BAR */ + val &= ~0x03; + break; + } + } + + /* Remap BAR. */ + new_value = dev->bars[bar_id].emulated_offset & ~(0x000000ff << offset); + new_value |= val << offset; + new_value &= ~(ceilpow2(dev->bars[bar_id].size) - 1); + vfio_bar_remap(dev, &dev->bars[bar_id], new_value); + break; + + case 0x30 ... 0x33: /* Expansion ROM */ + /* Stop if the ROM is absent. */ + if (!dev->rom.read) + break; + + /* Set ROM enable bit. */ + offset = (addr & 3) << 3; + if (!offset) { + dev->rom_enabled = val & 0x01; + val &= 0xfe; + } + + /* Remap ROM. */ + new_value = (dev->rom.emulated_offset & ~(0x000000ff << offset)); + new_value |= val << offset; + new_value &= ~(ceilpow2(dev->rom.size) - 1); + vfio_bar_remap(dev, &dev->rom, new_value); + break; + + case 0x3d: /* Interrupt Pin */ + if (val != dev->irq.intx.pin) + vfio_irq_intx_setpin(dev); + break; + + default: /* other (capabilities) */ + if (dev->msi_cap && (addr >= dev->msi_cap)) { /* MSI */ + /* Adjust register offset to account for different structure levels. */ + offset = addr - dev->msi_cap; + if (!(dev->irq.msi.ctl & 0x0080) && (offset >= 0x08)) + offset += 4; + switch (offset) { + case 0x00 ... 0x01: /* Capability */ + goto end; + + case 0x02 ... 0x03: /* Message Control */ + offset = (offset - 0x02) << 3; + new_value = dev->irq.msi.ctl & ~(0x00ff << offset); + new_value |= val << offset; + + /* Enable or disable MSI if requested and not conflicting with MSI-X. */ + if (dev->irq.type != VFIO_PCI_MSIX_IRQ_INDEX) { + if (!(dev->irq.msi.ctl & 0x0001) && (new_value & 0x0001)) + vfio_irq_enable(dev, VFIO_PCI_MSI_IRQ_INDEX); + else if ((dev->irq.msi.ctl & 0x0001) && !(new_value & 0x0001)) + vfio_irq_msi_disable(dev); + } + + /* Update control register. */ + dev->irq.msi.ctl = (new_value & 0x0071) | (dev->irq.msi.ctl & 0xff8e); + + /* Update enabled vector count and mask. */ + dev->irq.msi.vector_enable_count = MIN(1 << ((dev->irq.msi.ctl >> 1) & 3), dev->irq.msi.vector_count); + dev->irq.msi.vector_enable_mask = dev->irq.msi.vector_enable_count - 1; + goto end; + + case 0x04 ... 0x07: /* Message Address */ + offset = (offset - 0x04) << 3; + new_value = dev->irq.msi.address & ~(0x000000ff << offset); + new_value |= val << offset; + dev->irq.msi.address = new_value & 0xfffffffc; + goto end; + + case 0x08 ... 0x0b: /* Message Upper Address */ + offset = (offset - 0x08) << 3; + new_value = dev->irq.msi.address_upper & ~(0x000000ff << offset); + new_value |= val << offset; + dev->irq.msi.address_upper = new_value; + goto end; + + case 0x0c ... 0x0d: /* Message Data */ + offset = (offset - 0x0c) << 3; + new_value = dev->irq.msi.data & ~(0x00ff << offset); + new_value |= val << offset; + dev->irq.msi.data = new_value; + goto end; + + case 0x0e ... 0x0f: /* Reserved */ + case 0x14 ... 0x17: /* Pending Bits */ + if (dev->irq.msi.ctl & 0x0100) + goto end; + break; + + case 0x10 ... 0x13: /* Mask Bits */ + if (dev->irq.msi.ctl & 0x0100) { + offset = (offset - 0x10) << 3; + new_value = dev->irq.msi.mask & ~(0x000000ff << offset); + new_value |= val << offset; + dev->irq.msi.mask = new_value; + + /* Service any unmasked pending interrupts if MSI is enabled. */ + if (dev->irq.msi.ctl & 0x0001) { + new_value = ~new_value; + val64 = 1; + for (uint8_t i = 0; i < dev->irq.msi.vector_enable_count; i++) { + if (dev->irq.msi.pending & ((1 << i) & new_value)) + (void) !write(dev->irq.vectors[i].fd, &val64, sizeof(val64)); + } + dev->irq.msi.pending &= new_value; + } + + goto end; + } + break; + } + } + if (dev->msix_cap && (addr >= dev->msix_cap)) { /* MSI-X */ + offset = addr - dev->msix_cap; + switch (offset) { + case 0x00 ... 0x01: /* Capability */ + case 0x04 ... 0x0b: /* Table/PBA Offset */ + goto end; + + case 0x02 ... 0x03: /* Message Control */ + offset = (offset - 0x02) << 3; + new_value = dev->irq.msix.ctl & ~(0x00ff << offset); + new_value |= val << offset; + + /* Enable or disable MSI-X if requested. */ + if (!(dev->irq.msix.ctl & 0x8000) && (new_value & 0x8000)) + vfio_irq_enable(dev, VFIO_PCI_MSIX_IRQ_INDEX); + else if ((dev->irq.msix.ctl & 0x8000) && !(new_value & 0x8000)) + vfio_irq_msix_disable(dev); + + /* Update control register. */ + dev->irq.msix.ctl = (new_value & 0xc000) | (dev->irq.msix.ctl & 0x3fff); + + /* Service any unmasked pending interrupts if MSI-X + is enabled and the global mask bit was cleared. */ + if ((dev->irq.msix.ctl & 0xc000) == 0x8000) { + for (uint16_t i = 0x000c; i < dev->irq.msix.table_size; i += 0x0010) + vfio_irq_msix_updatemask(dev, i); + } + goto end; + } + } +end: + break; + } +} + +static void +vfio_config_writew(int func, int addr, uint16_t val, void *priv) +{ + vfio_config_writeb(func, addr, val, priv); + vfio_config_writeb(func, addr | 1, val >> 8, priv); +} + +static void +vfio_config_writel(int func, int addr, uint32_t val, void *priv) +{ + vfio_config_writeb(func, addr, val, priv); + vfio_config_writeb(func, addr | 1, val >> 8, priv); + vfio_config_writeb(func, addr | 2, val >> 16, priv); + vfio_config_writeb(func, addr | 3, val >> 24, priv); +} + +static void +vfio_irq_thread(void *priv) +{ + int nfds, i; + uint64_t buf; + struct epoll_event events[16]; + struct vfio_irq_set irq_set = { + .argsz = sizeof(irq_set), + .index = VFIO_PCI_INTX_IRQ_INDEX, + .start = 0, + .count = 1 + }; + vfio_device_t *dev; + vfio_irq_t *irq; + + vfio_log("VFIO: IRQ thread started\n"); + + while (epoll_fd >= 0) { + /* Wait for an interrupt to come in. */ + nfds = epoll_wait(epoll_fd, events, sizeof(events) / sizeof(events[0]), -1); + if (nfds < 0) { + vfio_log("VFIO %s: epoll_wait failed (%d)\n", errno); + break; + } + + /* Process all interrupts which came in. */ + for (i = 0; i < nfds; i++) { + /* Only handle read events. */ + if (!(events[i].events & EPOLLIN)) + continue; + + /* Get the IRQ and device structures for this interrupt. */ + irq = (vfio_irq_t *) events[i].data.ptr; + if (!irq) { + /* Do nothing if this is the wake eventfd, which has no data. */ + (void) !read(irq_thread_wake_fd, &buf, sizeof(buf)); + continue; + } + dev = irq->dev; + + /* Reset eventfd counter. */ + (void) !read(irq->fd, &buf, sizeof(buf)); + + /* Don't hang waiting for the timer if we're closing. */ + if (closing) + continue; + + /* Log VFIO IRQ type and vector. */ + vfio_log_op("VFIO %s: %s IRQ on vector %d\n", dev->name, + ((irq->type == VFIO_PCI_INTX_IRQ_INDEX) ? "INTx" : (((irq->type == VFIO_PCI_MSI_IRQ_INDEX) ? "MSI" : ((irq->type == VFIO_PCI_MSIX_IRQ_INDEX) ? "MSI-X" : NULL)))), + irq->vector); + + /* Perform pre-checks for specific IRQ types. */ + switch (irq->type) { + case VFIO_PCI_INTX_IRQ_INDEX: + /* Mask host IRQ. */ + irq_set.flags = VFIO_IRQ_SET_DATA_NONE | VFIO_IRQ_SET_ACTION_MASK; + ioctl(dev->fd, VFIO_DEVICE_SET_IRQS, &irq_set); + break; + + case VFIO_PCI_MSI_IRQ_INDEX: + /* Ignore MSI if this vector is not enabled. */ + if (irq->vector >= dev->irq.msi.vector_enable_count) { + vfio_log_op("VFIO %s: MSI vector not enabled (%d >= %d)\n", dev->name, + irq->vector, dev->irq.msi.vector_enable_count); + continue; + } + + /* Ignore MSI if the upper 32 bits of a 64-bit address are non-zero. */ + if (dev->irq.msi.address_upper) { + vfio_log_op("VFIO %s: MSI 64-bit address %08X%08X\n", dev->name, + dev->irq.msi.address_upper, dev->irq.msi.address); + continue; + } + + /* Mark MSI as pending if this vector is masked through per-vector masking. */ + if (dev->irq.msi.mask & (1 << irq->vector)) { + vfio_log_op("VFIO %s: MSI masked\n", dev->name); + dev->irq.msi.pending |= 1 << irq->vector; + continue; + } + break; + + case VFIO_PCI_MSIX_IRQ_INDEX: + /* Ignore MSI-X if the upper 32 bits of a 64-bit address are non-zero. */ + if (*((uint32_t *) &dev->irq.msix.table[irq->msix_offset | 0x4])) { + vfio_log_op("VFIO %s: MSI-X 64-bit address %016X\n", dev->name, + *((uint64_t *) &dev->irq.msix.table[irq->msix_offset])); + continue; + } + + /* Mark MSI-X as pending if this vector or all vectors are masked. */ + if ((dev->irq.msix.ctl & 0x4000) || (dev->irq.msix.table[irq->msix_offset | 0xc] & 0x01)) { + vfio_log_op("VFIO %s: MSI-X masked\n", dev->name); + dev->irq.msix.pba[irq->vector >> 3] |= 1 << (irq->vector & 0x07); + continue; + } + break; + } + + /* Tell the timer to service this interrupt. */ + current_irq = irq; + + /* Wait for the timer to do its job. */ + thread_wait_event(irq_event, -1); + thread_reset_event(irq_event); + vfio_log_op("VFIO %s: IRQ serviced\n", dev->name); + + /* Unmask host IRQ if this is INTx. */ + if (irq->type == VFIO_PCI_INTX_IRQ_INDEX) { + irq_set.flags = VFIO_IRQ_SET_DATA_NONE | VFIO_IRQ_SET_ACTION_UNMASK; + ioctl(dev->fd, VFIO_DEVICE_SET_IRQS, &irq_set); + } + } + + /* Pause if we were asked to. */ + thread_wait_event(irq_thread_resume, -1); + } + + /* We're done here. */ + vfio_log("VFIO: IRQ thread finished\n"); +} + +static void +vfio_irq_timer(void *priv) +{ + /* Schedule next run. */ + timer_on_auto(&irq_timer, 100.0); + + /* Stop if we're not servicing an IRQ at the moment. */ + if (!current_irq) + return; + vfio_device_t *dev = current_irq->dev; + + /* Act according to the IRQ type. */ + uint16_t val; + switch (current_irq->type) { + case VFIO_PCI_INTX_IRQ_INDEX: + if (!dev->irq.intx.raised) { /* rising edge */ + vfio_log_op("VFIO %s: Raising IRQ on pin INT%c\n", dev->name, + '@' + dev->irq.intx.pin); + + /* Raise IRQ. */ + pci_set_irq(dev->slot, dev->irq.intx.pin, &dev->irq.intx.state); + + /* Mark the IRQ as active, so that a BAR read/write can lower it. */ + dev->irq.intx.raised = intx_high = 1; + } else if (!intx_high) { /* falling edge */ + vfio_log_op("VFIO %s: Lowering IRQ on pin INT%c\n", dev->name, + '@' + dev->irq.intx.pin); + + /* Lower IRQ. */ + pci_clear_irq(dev->slot, dev->irq.intx.pin, &dev->irq.intx.state); + + /* Mark the IRQ as no longer high. */ + dev->irq.intx.raised = intx_high = 0; + + /* Allow the IRQ thread to be unblocked. */ + break; + } + + /* Don't unblock the IRQ thread unless otherwise stated. */ + return; + + case VFIO_PCI_MSI_IRQ_INDEX: + /* Insert the vector number into the value's lower bits. */ + val = (dev->irq.msi.data & ~dev->irq.msi.vector_enable_mask) | (current_irq->vector & dev->irq.msi.vector_enable_mask); + + /* Write value. */ + vfio_log_op("VFIO %s: Writing MSI value %04X to %04X\n", dev->name, val, dev->irq.msi.address); + mem_writew_phys(dev->irq.msi.address, val); + break; + + case VFIO_PCI_MSIX_IRQ_INDEX: + /* Write value. */ + vfio_log_op("VFIO %s: Writing MSI-X value %08X to %08X\n", dev->name, + *((uint32_t *) &dev->irq.msix.table[current_irq->msix_offset | 0x8]), + *((uint32_t *) &dev->irq.msix.table[current_irq->msix_offset])); + mem_writel_phys(*((uint32_t *) &dev->irq.msix.table[current_irq->msix_offset]), + *((uint32_t *) &dev->irq.msix.table[current_irq->msix_offset | 0x8])); + break; + } + + /* Unblock the IRQ thread. */ + current_irq = NULL; + thread_set_event(irq_event); +} + +static void +vfio_irq_disabletype(vfio_device_t *dev, int type) +{ + struct vfio_irq_set irq_set = { + .argsz = sizeof(irq_set), + .flags = VFIO_IRQ_SET_DATA_NONE | VFIO_IRQ_SET_ACTION_TRIGGER, + .index = type, + .start = 0, + .count = 0, + }; + ioctl(dev->fd, VFIO_DEVICE_SET_IRQS, &irq_set); +} + +static void +vfio_irq_intx_disable(vfio_device_t *dev) +{ + /* Disable INTx on VFIO. */ + vfio_irq_disabletype(dev, VFIO_PCI_INTX_IRQ_INDEX); + + /* Clear pending interrupts. */ + dev->irq.intx.raised = intx_high = 0; + if (dev->irq.intx.pin) + pci_clear_irq(dev->slot, dev->irq.intx.pin, &dev->irq.intx.state); + + /* Disable interrupts altogether. */ + dev->irq.type = VFIO_PCI_NUM_IRQS; +} + +static void +vfio_irq_intx_setpin(vfio_device_t *dev) +{ + uint8_t val; + if (pread(dev->config.fd, &val, sizeof(val), dev->config.offset + 0x3d) == sizeof(val)) + dev->irq.intx.pin = val; + vfio_log("VFIO %s: IRQ pin is INT%c\n", dev->name, '@' + MIN(dev->irq.intx.pin, 'Z')); +} + +static void +vfio_irq_msi_disable(vfio_device_t *dev) +{ + /* Clear pending interrupts. */ + dev->irq.msi.pending = 0; + + /* Disable MSI on VFIO. */ + vfio_irq_disabletype(dev, VFIO_PCI_MSI_IRQ_INDEX); + + /* Re-enable INTx interrupts. */ + vfio_irq_enable(dev, VFIO_PCI_INTX_IRQ_INDEX); +} + +static void +vfio_irq_msix_disable(vfio_device_t *dev) +{ + /* Clear pending interrupts. */ + memset(dev->irq.msix.pba, 0, dev->irq.vector_count); + + /* Disable MSI-X on VFIO. */ + vfio_irq_disabletype(dev, VFIO_PCI_MSIX_IRQ_INDEX); + + /* Re-enable INTx interrupts. */ + vfio_irq_enable(dev, VFIO_PCI_INTX_IRQ_INDEX); +} + +static void +vfio_irq_msix_updatemask(vfio_device_t *dev, uint16_t offset) +{ + /* Service any unmasked pending interrupts. */ + if (((dev->irq.msix.ctl & 0xc000) == 0x8000) && !(dev->irq.msix.table[offset] & 0x01) && (dev->irq.msix.pba[offset >> 7] & (1 << (offset & 0x07)))) { + uint64_t val = 1; + (void) !write(dev->irq.vectors[offset >> 4].fd, &val, sizeof(val)); + dev->irq.msix.pba[offset >> 7] &= ~(1 << (offset & 0x07)); + } +} + +#define VFIO_RW_MSIX(length_char, val_type, val_slength) \ + static val_type \ + vfio_irq_msix_table_read##length_char(uint32_t addr, void *priv) \ + { \ + vfio_device_t *dev = (vfio_device_t *) priv; \ + val_type ret = dev->irq.msix.table[addr - dev->irq.msix.table_offset_precalc]; \ + vfio_log_op("[%08X:%04X] VFIO %s: msix_table_read" #length_char "(%08X) = %0" #val_slength "X\n", CS, cpu_state.pc, dev->name, addr, ret); \ + return ret; \ + } \ + \ + static void \ + vfio_irq_msix_table_write##length_char(uint32_t addr, val_type val, void *priv) \ + { \ + vfio_device_t *dev = (vfio_device_t *) priv; \ + vfio_log_op("[%08X:%04X] VFIO %s: msix_table_write" #length_char "(%08X, %0" #val_slength "X)\n", CS, cpu_state.pc, dev->name, addr, val); \ + uint16_t offset = addr - dev->irq.msix.table_offset_precalc; \ + dev->irq.msix.table[offset] = val; \ + if ((offset & 0x000f) == 0x000c) \ + vfio_irq_msix_updatemask(dev, offset); \ + } \ + \ + static val_type \ + vfio_irq_msix_pba_read##length_char(uint32_t addr, void *priv) \ + { \ + vfio_device_t *dev = (vfio_device_t *) priv; \ + val_type ret = dev->irq.msix.table[addr - dev->irq.msix.pba_offset_precalc]; \ + vfio_log_op("[%08X:%04X] VFIO %s: msix_pba_read" #length_char "(%08X) = %0" #val_slength "X\n", CS, cpu_state.pc, dev->name, addr, ret); \ + return ret; \ + } \ + \ + static void \ + vfio_irq_msix_pba_write##length_char(uint32_t addr, val_type val, void *priv) \ + { \ + vfio_device_t *dev = (vfio_device_t *) priv; \ + vfio_log_op("[%08X:%04X] VFIO %s: msix_pba_write" #length_char "(%08X, %0" #val_slength "X)\n", CS, cpu_state.pc, dev->name, addr, val); \ + } + +VFIO_RW_MSIX(b, uint8_t, 2) +VFIO_RW_MSIX(w, uint16_t, 4) +VFIO_RW_MSIX(l, uint32_t, 8) + +static void +vfio_irq_disable(vfio_device_t *dev) +{ + /* Do nothing if IRQs are already disabled. */ + if (dev->irq.type == VFIO_PCI_NUM_IRQS) + return; + vfio_log("VFIO %s: irq_disable(%d)\n", dev->name, dev->irq.type); + + /* Pause IRQ thread. */ + thread_reset_event(irq_thread_resume); + uint64_t val = 1; + (void) !write(irq_thread_wake_fd, &val, sizeof(val)); + + /* Always disable INTx after disabling MSI/MSI-X. */ + if (dev->irq.type == VFIO_PCI_MSIX_IRQ_INDEX) + vfio_irq_msix_disable(dev); + else if (dev->irq.type == VFIO_PCI_MSI_IRQ_INDEX) + vfio_irq_msi_disable(dev); + if (dev->irq.type == VFIO_PCI_INTX_IRQ_INDEX) + vfio_irq_intx_disable(dev); + + /* Invalidate all IRQ vectors. */ + if (dev->irq.vectors) { + for (int i = 0; i < dev->irq.vector_count; i++) { + if (dev->irq.vectors[i].fd >= 0) { + /* Remove eventfd from epoll. */ + epoll_ctl(epoll_fd, EPOLL_CTL_DEL, dev->irq.vectors[i].fd, NULL); + close(dev->irq.vectors[i].fd); + } + } + free(dev->irq.vectors); + dev->irq.vectors = NULL; + dev->irq.vector_count = 0; + } + + /* Resume IRQ thread. */ + thread_set_event(irq_thread_resume); +} + +static void +vfio_irq_enable(vfio_device_t *dev, int type) +{ + /* Disable any existing IRQs. */ + vfio_irq_disable(dev); + + vfio_log("VFIO %s: irq_enable(%d)\n", dev->name, type); + + /* Determine the number of vectors needed. */ + switch (type) { + case VFIO_PCI_INTX_IRQ_INDEX: + /* Only one vector needed. */ + dev->irq.vector_count = 1; + break; + + case VFIO_PCI_MSI_IRQ_INDEX: + /* Up to the number of vectors read during init is needed. */ + dev->irq.vector_count = dev->irq.msi.vector_count; + break; + + case VFIO_PCI_MSIX_IRQ_INDEX: + /* The number of vectors read during init is needed. */ + dev->irq.vector_count = dev->irq.msix.vector_count; + break; + } + + /* Prepare structure for enabling the interrupt type. */ + struct vfio_irq_set irq_set = { + .argsz = sizeof(irq_set) + (sizeof(int32_t) * dev->irq.vector_count), + .flags = VFIO_IRQ_SET_DATA_EVENTFD | VFIO_IRQ_SET_ACTION_TRIGGER, + .index = type, + .start = 0, + .count = dev->irq.vector_count + }; + int32_t *fd_list = (int32_t *) &irq_set.data; + struct epoll_event event = { .events = EPOLLIN }; + + /* Create interrupt vectors with their respective eventfds. */ + dev->irq.vectors = (vfio_irq_t *) malloc(sizeof(vfio_irq_t) * dev->irq.vector_count); + for (int i = 0; i < dev->irq.vector_count; i++) { + dev->irq.vectors[i].dev = dev; + dev->irq.vectors[i].type = type; + dev->irq.vectors[i].vector = i; + fd_list[i] = dev->irq.vectors[i].fd = eventfd(0, 0); + if (fd_list[i] < 0) + pclog("VFIO %s: IRQ eventfd %d failed (%d)\n", dev->name, i, errno); + else { + /* Add eventfd to epoll. */ + event.data.ptr = &dev->irq.vectors[i]; + epoll_ctl(epoll_fd, EPOLL_CTL_ADD, fd_list[i], &event); + } + dev->irq.vectors[i].msix_offset = i << 4; /* pre-calculated value to save operations on MSI-X processing */ + } + + /* Enable interrupt type on VFIO. */ + if (ioctl(dev->fd, VFIO_DEVICE_SET_IRQS, &irq_set)) + pclog("VFIO %s: SET_IRQS(%d, %d) failed (%d)\n", dev->name, + type, dev->irq.vector_count, errno); + dev->irq.type = type; +} + +static void +vfio_region_init(vfio_device_t *dev, struct vfio_region_info *reg, vfio_region_t *region) +{ + /* Set region structure information. */ + region->fd = dev->fd; + region->offset = reg->offset; + if (reg->index == VFIO_PCI_VGA_REGION_INDEX) { + region->bar_id = 0xfe; + if (region == &dev->vga_io_lo) { + region->offset += 0x3b0; + region->size = 12; + region->type = 0x01; + } else if (region == &dev->vga_io_hi) { + region->offset += 0x3c0; + region->size = 32; + region->type = 0x01; + } else { + region->offset += 0xa0000; + region->size = 131072; + region->type = 0x00; + } + } else { + region->size = reg->size; + region->type = 0xff; + } + region->read = !!(reg->flags & VFIO_REGION_INFO_FLAG_READ); + region->write = !!(reg->flags & VFIO_REGION_INFO_FLAG_WRITE); + region->dev = dev; + + /* Use special memory mapping for expansion ROMs. */ + if (reg->index == VFIO_PCI_ROM_REGION_INDEX) { + /* Use MMIO only. */ + region->fd = -1; + + /* Open ROM file if one was given. */ + FILE *fp = NULL; + if (dev->rom_fn) { + pclog("VFIO %s: Loading ROM from file: %s\n", dev->name, dev->rom_fn); + fp = fopen(dev->rom_fn, "rb"); + if (fp) { + /* Determine region size if the device has no ROM region. */ + if (!region->size) { + fseek(fp, 0, SEEK_END); + region->size = ceilpow2(ftell(fp)); + if (region->size < 2048) /* minimum size for an expansion ROM */ + region->size = 2048; + fseek(fp, 0, SEEK_SET); + } + } else { + /* Fall back to the device's ROM if it has one. */ + pclog("VFIO %s: Could not read ROM file, ", dev->name); + if (region->size) { + pclog("falling back to device ROM\n"); + } else { + /* Disable ROM. */ + pclog("not enabling ROM\n"); + region->read = region->write = 0; + goto end; + } + } + } + + /* Mark this as the expansion ROM region. */ + region->type = 0x00; + region->bar_id = 0xff; + + /* Allocate ROM shadow area. */ + region->mmap_base = region->mmap_precalc = plat_mmap(region->size, 0); + if (region->mmap_base == ((void *) -1)) { + pclog("VFIO %s: ROM mmap(%" PRIu64 ") failed\n", dev->name, region->size); + region->mmap_base = NULL; + goto end; + } + memset(region->mmap_base, 0xff, region->size); + + int i, j = 0; + if (fp) { + /* Read ROM from file. */ + while ((i = fread(region->mmap_precalc, 1, + region->size - j, + fp)) + != 0) { + region->mmap_precalc += i; + j += i; + } + fclose(fp); + } else { + /* Read ROM from device. */ + while ((i = pread(dev->fd, region->mmap_precalc, + region->size - j, + region->offset + j)) + != 0) { + region->mmap_precalc += i; + j += i; + } + } + + /* Perform a few sanity checks on the ROM, starting with the signature. */ + j = 0; + if (*((uint16_t *) ®ion->mmap_base[0x00]) == 0xaa55) { + /* Check ROM length. */ + uint32_t rom_len = region->mmap_base[0x02] << 9; /* 512-byte blocks */ + if (rom_len > region->size) { + pclog("VFIO %s: Warning: ROM length (%d bytes) is larger than ROM region (%" PRIu64 " bytes)\n", + dev->name, rom_len, region->size); + j = 1; + } + + /* Check PCI pointer. */ + uint16_t pci_ptr = *((uint16_t *) ®ion->mmap_base[0x18]); + if (pci_ptr && (pci_ptr != 0xffff)) { + /* Check PCI pointer bounds. */ + if (pci_ptr <= (region->size - 0x12)) { + /* Check PCI header ROM length only if <= 130048 bytes, as the + ROM length is 8 bits in the main header and 16 bits in here. */ + uint32_t pci_len = *((uint16_t *) ®ion->mmap_base[pci_ptr + 0x18]) << 9; /* 512-byte blocks */ + if ((pci_len <= (254 << 9)) && (pci_len != rom_len)) { + pclog("VFIO %s: Warning: ROM length in main header (%d bytes) is " + "different from length in PCI header (%d bytes)\n", + dev->name, rom_len, pci_len); + j = 1; + } + } else { + pclog("VFIO %s: Warning: ROM has invalid PCI header pointer: %04X\n", + dev->name, pci_ptr); + j = 1; + } + } else { + pclog("VFIO %s: Warning: ROM has no PCI header pointer\n", + dev->name); + j = 1; + } + + /* Compare checksum. */ + uint8_t checksum = 0; + if (rom_len > region->size) /* don't go out of bounds */ + rom_len = region->size; + rom_len -= 1; + for (i = 0; i < rom_len; i++) + checksum -= region->mmap_base[i]; + if (checksum != region->mmap_base[i]) { + pclog("VFIO %s: Warning: ROM has bad checksum; expected %02X, got %02X\n", + dev->name, checksum, region->mmap_base[i]); + j = 1; + } + } else { + pclog("VFIO %s: Warning: ROM has no 55 AA signature\n", dev->name); + j = 1; + } + + /* Add a helpful reminder if a sanity check warning was printed + and no ROM file was specified in this device's configuration. */ + if (j && !dev->rom_fn) + pclog("VFIO %s: A custom ROM can be loaded with the _rom_fn directive.\n", dev->name); + } else { + /* Attempt to mmap the region. */ + region->mmap_base = mmap(NULL, region->size, + (region->read ? PROT_READ : 0) | (region->write ? PROT_WRITE : 0), + MAP_SHARED, region->fd, region->offset); + if (region->mmap_base == ((void *) -1)) /* mmap failed */ + region->mmap_base = NULL; + } + region->mmap_precalc = region->mmap_base; + +end: + vfio_log("VFIO %s: Region: %s (offset %lX) (%d bytes) ", dev->name, + region->name, region->offset, region->size); + + /* Create memory mapping for if we need it. */ + if (region->mmap_base) { /* mmap available */ + vfio_log("(MM)"); + mem_mapping_add(®ion->mem_mapping, 0, 0, + region->read ? vfio_mem_readb_mm : NULL, + region->read ? vfio_mem_readw_mm : NULL, + region->read ? vfio_mem_readl_mm : NULL, + region->write ? vfio_mem_writeb_mm : NULL, + region->write ? vfio_mem_writew_mm : NULL, + region->write ? vfio_mem_writel_mm : NULL, + NULL, MEM_MAPPING_EXTERNAL, region->mmap_precalc); + } else if (region->fd >= 0) { /* mmap not available, but fd is */ + vfio_log("(FD)"); + mem_mapping_add(®ion->mem_mapping, 0, 0, + region->read ? vfio_mem_readb_fd : NULL, + region->read ? vfio_mem_readw_fd : NULL, + region->read ? vfio_mem_readl_fd : NULL, + region->write ? vfio_mem_writeb_fd : NULL, + region->write ? vfio_mem_writew_fd : NULL, + region->write ? vfio_mem_writel_fd : NULL, + NULL, MEM_MAPPING_EXTERNAL, region); + } else { + vfio_log("(not mapped)"); + } + + vfio_log(" (%c%c)\n", region->read ? 'R' : '-', region->write ? 'W' : '-'); +} + +static void +vfio_region_close(vfio_device_t *dev, vfio_region_t *region) +{ + /* Stop if this region was not initialized. */ + if (!region->size) + return; + + /* Unmap memory if mmap was available. */ + if (region->mmap_base) + plat_munmap(region->mmap_base, region->size); +} + +static vfio_group_t * +vfio_group_get(int id, uint8_t add) +{ + /* Look for an existing group. */ + vfio_group_t *group = first_group; + while (group) { + if (group->id == id) + return group; + else if (group->next) + group = group->next; + else + break; + } + + /* Don't add a group if told not to. */ + if (!add) + return NULL; + + /* Add group if no matches were found. */ + if (group) { + group->next = (vfio_group_t *) malloc(sizeof(vfio_group_t)); + group = group->next; + } else { + group = first_group = (vfio_group_t *) malloc(sizeof(vfio_group_t)); + } + memset(group, 0, sizeof(vfio_group_t)); + group->id = id; + + /* Open VFIO group. */ + char group_file[32]; + snprintf(group_file, sizeof(group_file), "/dev/vfio/%d", group->id); + group->fd = open(group_file, O_RDWR); + if (group->fd < 0) { + pclog("VFIO: Group %d not found\n", group->id); + goto end; + } + + /* Check if the group is viable. */ + struct vfio_group_status group_status = { .argsz = sizeof(group_status) }; + if (ioctl(group->fd, VFIO_GROUP_GET_STATUS, &group_status)) { + pclog("VFIO: Group %d GET_STATUS failed (%d)\n", group->id, errno); + goto close_fd; + } else if (!(group_status.flags & VFIO_GROUP_FLAGS_VIABLE)) { + pclog("VFIO: Group %d not viable\n", group->id); + goto close_fd; + } + + /* Claim the group. */ + if (ioctl(group->fd, VFIO_GROUP_SET_CONTAINER, &container_fd)) { + pclog("VFIO: Group %d SET_CONTAINER failed\n", group->id); + goto close_fd; + } + + goto end; + +close_fd: + close(group->fd); + group->fd = -1; +end: + return group; +} + +static void +vfio_dev_prereset(vfio_device_t *dev) +{ + vfio_log("VFIO %s: prereset()\n", dev->name); + + /* Disable interrupts. */ + vfio_irq_disable(dev); + + /* Extra steps for devices with power management capability. */ + if (dev->pm_cap) { + /* Make sure the device is in D0 state. */ + uint8_t pm_ctrl = vfio_config_readb(0, dev->pm_cap + 4, dev), + state = pm_ctrl & 0x03; + if (state) { + pm_ctrl &= ~0x03; + vfio_config_writeb(0, dev->pm_cap + 4, pm_ctrl, dev); + + pm_ctrl = vfio_config_readb(0, dev->pm_cap + 4, dev); + state = pm_ctrl & 0x03; + if (state) + vfio_log("VFIO %s: Device stuck in D%d state\n", dev->name, state); + } + + /* Enable PM reset if the device supports it. */ + dev->can_pm_reset = !(pm_ctrl & 0x08); + } + + /* Enable function-level reset if supported. */ + dev->can_flr_reset = (dev->pcie_cap && (vfio_config_readb(0, dev->pcie_cap + 7, dev) & 0x10)) || (dev->af_cap && (vfio_config_readb(0, dev->af_cap + 3, dev) & 0x02)); + + /* Disable bus master, BARs, expansion ROM and VGA regions; also enable INTx. */ + vfio_config_writew(0, 0x04, vfio_config_readw(0, 0x04, dev) & ~0x0407, dev); +} + +static void +vfio_dev_postreset(vfio_device_t *dev) +{ + vfio_log("VFIO %s: postreset()\n", dev->name); + + /* Enable INTx interrupts. MSI(-X) can be enabled by the OS later. */ + if (!closing) + vfio_irq_enable(dev, VFIO_PCI_INTX_IRQ_INDEX); + + /* Reset BARs, whatever this does. */ + uint32_t val = 0; + for (uint8_t i = 0x10; i < 0x28; i++) + (void) !pwrite(dev->config.fd, &val, sizeof(val), dev->config.offset + i); +} + +static int +vfio_dev_init(vfio_device_t *dev) +{ + vfio_log("VFIO %s: init()\n", dev->name); + + /* Grab device. */ + dev->fd = ioctl(current_group->fd, VFIO_GROUP_GET_DEVICE_FD, dev->name); + if (dev->fd < 0) { + vfio_log("VFIO %s: GET_DEVICE_FD failed (%d)\n", dev->name, errno); + goto end; + } + + /* Get device information. */ + struct vfio_device_info device_info = { .argsz = sizeof(device_info) }; + if (ioctl(dev->fd, VFIO_DEVICE_GET_INFO, &device_info)) { + pclog("VFIO %s: GET_INFO failed (%d), check for error in kernel log\n", dev->name, errno); + goto end; + } + + /* Check if any regions were returned. */ + if (!device_info.num_regions) { + pclog("VFIO %s: No regions returned, check for error in kernel log\n", dev->name); + goto end; + } + + /* Set main reset flag. */ + dev->can_reset = !!(device_info.flags & VFIO_DEVICE_FLAGS_RESET); + + /* Establish region names. */ + for (uint8_t i = 0; i < 6; i++) { + sprintf(dev->bars[i].name, "BAR #%d", dev->bars[i].bar_id = i); + dev->bars[i].type = 0xff; + } + strcpy(dev->rom.name, "Expansion ROM"); + strcpy(dev->config.name, "Configuration space"); + strcpy(dev->vga_io_lo.name, "VGA MDA"); + strcpy(dev->vga_io_hi.name, "VGA CGA/EGA"); + strcpy(dev->vga_mem.name, "VGA Framebuffer"); + + /* Initialize all regions. */ + struct vfio_region_info reg = { .argsz = sizeof(reg) }; + uint8_t cls; + for (int i = 0; i < device_info.num_regions; i++) { + /* Get region information. */ + reg.index = i; + ioctl(dev->fd, VFIO_DEVICE_GET_REGION_INFO, ®); + + /* Move on to the next region if this one is not valid. */ + if (!reg.size) + continue; + + /* Initialize region according to its type. */ + switch (reg.index) { + case VFIO_PCI_BAR0_REGION_INDEX ... VFIO_PCI_BAR5_REGION_INDEX: + vfio_region_init(dev, ®, &dev->bars[reg.index - VFIO_PCI_BAR0_REGION_INDEX]); + if (reg.size) + dev->bar_count++; + break; + + case VFIO_PCI_ROM_REGION_INDEX: + vfio_region_init(dev, ®, &dev->rom); + break; + + case VFIO_PCI_CONFIG_REGION_INDEX: + vfio_region_init(dev, ®, &dev->config); + break; + + case VFIO_PCI_VGA_REGION_INDEX: + /* Don't initialize VGA region if this is not a video card. */ + if ((dev->config.fd > 0) && (pread(dev->config.fd, &cls, sizeof(cls), dev->config.offset + 0x0b) == sizeof(cls)) && (cls != 0x03)) + break; + + vfio_region_init(dev, ®, &dev->vga_io_lo); /* I/O [3B0:3BB] */ + vfio_region_init(dev, ®, &dev->vga_io_hi); /* I/O [3C0:3DF] */ + vfio_region_init(dev, ®, &dev->vga_mem); /* memory [A0000:BFFFF] */ + + /* Inform that a PCI VGA video card is attached if no video card is emulated. */ + if (gfxcard == VID_NONE) + video_inform(VIDEO_FLAG_TYPE_SPECIAL, &timing_default); + break; + + default: + vfio_log("VFIO %s: Unknown region %d (offset %lX) (%d bytes) (%c%c)\n", + dev->name, reg.index, reg.offset, reg.size, + (reg.flags & VFIO_REGION_INFO_FLAG_READ) ? 'R' : '-', + (reg.flags & VFIO_REGION_INFO_FLAG_WRITE) ? 'W' : '-'); + break; + } + } + + /* Make sure we have a valid device. */ + if (!dev->config.fd || !dev->config.read) { + pclog("VFIO %s: No configuration space region\n", dev->name); + goto end; + } + + /* Initialize ROM region if the device doesn't have one and we're loading a ROM from file. */ + if (dev->rom_fn && !dev->rom.fd) { + reg.index = VFIO_PCI_ROM_REGION_INDEX; + reg.offset = reg.size = 0; + reg.flags = VFIO_REGION_INFO_FLAG_READ; + vfio_region_init(dev, ®, &dev->rom); + } + + /* Go through PCI capability list if the device declares one. */ + dev->irq.msix.table_bar = dev->irq.msix.pba_bar = 0x07; + uint8_t cap_ptr; + uint8_t cap_id; + if ((pread(dev->config.fd, &cap_ptr, sizeof(cap_ptr), dev->config.offset + 0x06) == sizeof(cap_ptr)) && (cap_ptr & 0x10)) { + vfio_log("VFIO %s: Device capabilities:", dev->name); + + /* Read pointer to the first capability. */ + if (pread(dev->config.fd, &cap_ptr, sizeof(cap_ptr), dev->config.offset + 0x34) != sizeof(cap_ptr)) + cap_ptr = 0; + while (cap_ptr && (cap_ptr != 0xff)) { /* check 0xff just in case */ + /* Read capability ID, and store pointers to ones we care about. */ + if (pread(dev->config.fd, &cap_id, sizeof(cap_id), dev->config.offset + cap_ptr) != sizeof(cap_id)) + cap_id = 0; + switch (cap_id) { + case 0x01: + vfio_log(" PM"); + dev->pm_cap = cap_ptr; + break; + + case 0x05: + vfio_log(" MSI"); + if (dev->msi_cap) /* multiple copies not permitted by spec */ + break; + dev->msi_cap = cap_ptr; + + /* Read control register. */ + if (pread(dev->config.fd, &dev->irq.msi.ctl, sizeof(dev->irq.msi.ctl), + dev->config.offset + dev->msi_cap + 2) + != sizeof(dev->irq.msi.ctl)) + dev->irq.msi.ctl = 0; + + /* Set vector count. */ + dev->irq.msi.vector_count = (dev->irq.msi.ctl >> 1) & 0x07; + break; + + case 0x10: + vfio_log(" PCIe"); + dev->pcie_cap = cap_ptr; + break; + + case 0x11: + vfio_log(" MSI-X"); + if (dev->msix_cap) /* multiple copies not permitted by spec */ + break; + dev->msix_cap = cap_ptr; + + /* Read control register. */ + if (pread(dev->config.fd, &dev->irq.msix.ctl, sizeof(dev->irq.msix.ctl), + dev->config.offset + dev->msix_cap + 2) + != sizeof(dev->irq.msix.ctl)) + dev->irq.msix.ctl = 0; + + /* Set vector count. */ + dev->irq.msix.vector_count = (dev->irq.msix.ctl & 0x07ff) + 1; + + /* Read table and PBA BARs and offsets. */ + if (pread(dev->config.fd, &dev->irq.msix.table_offset, sizeof(dev->irq.msix.table_offset), + dev->config.offset + dev->msix_cap + 4) + != sizeof(dev->irq.msix.table_offset)) + dev->irq.msix.table_offset = 0x00000007; + dev->irq.msix.table_bar = dev->irq.msix.table_offset & 0x00000007; + dev->irq.msix.table_offset &= 0xfffffff8; + + if (pread(dev->config.fd, &dev->irq.msix.pba_offset, sizeof(dev->irq.msix.pba_offset), + dev->config.offset + dev->msix_cap + 8) + != sizeof(dev->irq.msix.pba_offset)) + dev->irq.msix.pba_offset = 0x00000007; + dev->irq.msix.pba_bar = dev->irq.msix.pba_offset & 0x00000007; + dev->irq.msix.pba_offset &= 0xfffffff8; + + /* Allocate table and PBA structures. */ + dev->irq.msix.table_size = dev->irq.msix.vector_count << 4; + dev->irq.msix.table = malloc(dev->irq.msix.table_size); + if (!dev->irq.msix.table) { + pclog("VFIO %s: MSI-X table malloc(%d) failed\n", dev->name, dev->irq.msix.table_size); + dev->irq.msix.table_size = dev->irq.msix.vector_count = 0; + } + + dev->irq.msix.pba_size = ((dev->irq.msix.vector_count - 1) >> 3) + 1; + dev->irq.msix.pba = malloc(dev->irq.msix.pba_size); + if (!dev->irq.msix.pba) { + pclog("VFIO %s: MSI-X PBA malloc(%d) failed\n", dev->name, dev->irq.msix.pba_size); + dev->irq.msix.pba_size = dev->irq.msix.vector_count = 0; + } + + /* Add table and PBA mappings. + Being added after region setup, they should override the main BAR mapping. */ + mem_mapping_add(&dev->irq.msix.table_mapping, 0, 0, + vfio_irq_msix_table_readb, + vfio_irq_msix_table_readw, + vfio_irq_msix_table_readl, + vfio_irq_msix_table_writeb, + vfio_irq_msix_table_writew, + vfio_irq_msix_table_writel, + NULL, MEM_MAPPING_EXTERNAL, dev); + + mem_mapping_add(&dev->irq.msix.pba_mapping, 0, 0, + vfio_irq_msix_pba_readb, + vfio_irq_msix_pba_readw, + vfio_irq_msix_pba_readl, + vfio_irq_msix_pba_writeb, + vfio_irq_msix_pba_writew, + vfio_irq_msix_pba_writel, + NULL, MEM_MAPPING_EXTERNAL, dev); + break; + + case 0x13: + vfio_log(" AF"); + dev->af_cap = cap_ptr; + break; + + default: + vfio_log(" [%02X]", cap_id); + break; + } + + /* Read pointer to the next capability. */ + if (pread(dev->config.fd, &cap_ptr, sizeof(cap_ptr), dev->config.offset + cap_ptr + 1) != sizeof(cap_ptr)) + cap_ptr = 0; + } + + vfio_log("\n"); + } + + /* Read INTx IRQ pin. */ + vfio_irq_intx_setpin(dev); + + /* Add PCI card while mapping the configuration space. */ + pci_add_card(PCI_ADD_NORMAL, vfio_config_readb, vfio_config_writeb, dev, &dev->slot); + + return 0; + +end: + if (dev->fd >= 0) + close(dev->fd); + return 1; +} + +static void +vfio_dev_close(vfio_device_t *dev) +{ + vfio_log("VFIO %s: close()\n", dev->name); + + /* Close all regions. */ + for (uint8_t i = 0; i < 6; i++) + vfio_region_close(dev, &dev->bars[i]); + vfio_region_close(dev, &dev->rom); + vfio_region_close(dev, &dev->config); + vfio_region_close(dev, &dev->vga_io_lo); + vfio_region_close(dev, &dev->vga_io_hi); + vfio_region_close(dev, &dev->vga_mem); + + /* Close device fd. */ + if (dev->fd >= 0) { + close(dev->fd); + dev->fd = -1; + } + + /* Clean up. */ + if (dev->irq.msix.table) + free(dev->irq.msix.table); + if (dev->irq.msix.pba) + free(dev->irq.msix.pba); + free(dev->name); +} + +void +vfio_unmap_dma(uint32_t offset, uint32_t size) +{ + struct vfio_iommu_type1_dma_unmap dma_unmap = { + .argsz = sizeof(dma_unmap), + .iova = offset, + .size = size + }; + + vfio_log("VFIO: unmap_dma(%08X, %d)\n", offset, size); + + /* Unmap DMA region. */ + if (!ioctl(container_fd, VFIO_IOMMU_UNMAP_DMA, &dma_unmap)) + return; + + vfio_log("VFIO: unmap_dma(%08X, %d) failed (%d)\n", offset, size, errno); +} + +void +vfio_map_dma(uint8_t *ptr, uint32_t offset, uint32_t size) +{ + struct vfio_iommu_type1_dma_map dma_map = { + .argsz = sizeof(dma_map), + .vaddr = (uint64_t) ptr, + .iova = offset, + .size = size, + .flags = VFIO_DMA_MAP_FLAG_READ | VFIO_DMA_MAP_FLAG_WRITE + }; + + vfio_log("VFIO: map_dma(%08X, %d)\n", offset, size); + + /* Map DMA region. */ + if (!ioctl(container_fd, VFIO_IOMMU_MAP_DMA, &dma_map)) + return; + + /* QEMU says mapping should be retried in case of EBUSY. */ + if (errno == EBUSY) { + vfio_unmap_dma(offset, size); + if (!ioctl(container_fd, VFIO_IOMMU_MAP_DMA, &dma_map)) + return; + } + + pclog("VFIO: map_dma(%08X, %d) failed (%d)\n", offset, size, errno); +} + +static void +vfio_reset(void *priv) +{ + vfio_log("VFIO: reset()\n"); + + /* Pre-reset and figure out the reset type for all devices. */ + int size; + int count; + struct vfio_pci_hot_reset_info *hot_reset_info; + struct vfio_pci_dependent_device *devices; + char name[13]; + vfio_group_t *group = first_group; + vfio_device_t *dev; + while (group) { + dev = group->first_device; + while (dev) { + /* Pre-reset this device. */ + vfio_dev_prereset(dev); + + /* Clear hot reset capable flag for this device. */ + dev->can_hot_reset = 0; + + /* Get hot reset information for the first time to get the entry count. */ + size = sizeof(struct vfio_pci_hot_reset_info); + hot_reset_info = (struct vfio_pci_hot_reset_info *) malloc(size); + if (!hot_reset_info) { + vfio_log("VFIO %s: malloc(hot_reset_info) 1 failed\n", dev->name); + goto next1; + } + memset(hot_reset_info, 0, size); + hot_reset_info->argsz = size; + if (ioctl(dev->fd, VFIO_DEVICE_GET_PCI_HOT_RESET_INFO, hot_reset_info) && (errno != ENOSPC)) { + vfio_log("VFIO %s: GET_PCI_HOT_RESET_INFO 1 failed (%d)\n", dev->name, errno); + goto next1; + } + count = hot_reset_info->count; + free(hot_reset_info); + + /* Get hot reset information for the second time to get the actual entries. */ + size = sizeof(struct vfio_pci_hot_reset) + (sizeof(struct vfio_pci_dependent_device) * count); + hot_reset_info = (struct vfio_pci_hot_reset_info *) malloc(size); + if (!hot_reset_info) { + vfio_log("VFIO %s: malloc(hot_reset_info) 2 failed\n", dev->name); + goto next1; + } + memset(hot_reset_info, 0, size); + hot_reset_info->argsz = size; + if (ioctl(dev->fd, VFIO_DEVICE_GET_PCI_HOT_RESET_INFO, hot_reset_info)) { + vfio_log("VFIO %s: GET_PCI_HOT_RESET_INFO 2 failed (%d)\n", dev->name, errno); + goto next1; + } + devices = &hot_reset_info->devices[0]; + + /* Go through the dependent device entries. */ + for (int i = 0; i < count; i++) { + /* Build this dependent device's name. */ + snprintf(name, sizeof(name), "%04x:%02x:%02x.%1x", + devices[i].segment, devices[i].bus, + PCI_SLOT(devices[i].devfn), PCI_FUNC(devices[i].devfn)); + + /* Check if we own this device's group. */ + if (!vfio_group_get(devices[i].group_id, 0)) { + vfio_log("VFIO %s: Cannot hot reset; we don't own" + "group %d for dependent device %s\n", + dev->name, devices[i].group_id, name); + goto next1; + } + } + + /* Mark this device as hot reset capable. */ + dev->can_hot_reset = 1; + +next1: + if (hot_reset_info) + free(hot_reset_info); + dev = dev->next; + } + group = group->next; + } + + /* Count the number of groups we own. */ + count = 0; + group = first_group; + while (group) { + count++; + group = group->next; + } + + /* Allocate hot reset structure. */ + struct vfio_pci_hot_reset *hot_reset; + size = sizeof(struct vfio_pci_hot_reset) + (sizeof(int32_t) * count); + hot_reset = (struct vfio_pci_hot_reset *) calloc(1, size); + hot_reset->argsz = size; + int32_t *fds = &hot_reset->group_fds[0]; + + /* Add group fds. */ + group = first_group; + while (group) { + fds[hot_reset->count++] = group->fd; + group = group->next; + } + + /* Reset all devices. */ + group = first_group; + while (group) { + dev = group->first_device; + while (dev) { + /* Try function-level reset. + I don't really understand the !pm_reset check, but QEMU does it. */ + if (dev->can_reset && (!dev->can_pm_reset || dev->can_flr_reset)) { + if (ioctl(dev->fd, VFIO_DEVICE_RESET)) + vfio_log("VFIO %s: DEVICE_RESET 1 failed (%d)\n", dev->name, errno); + else { + vfio_log("VFIO %s: FLR reset successful\n", dev->name); + goto next2; + } + } + + /* Try hot reset. */ + if (dev->can_hot_reset) { + if (ioctl(dev->fd, VFIO_DEVICE_PCI_HOT_RESET, hot_reset)) + vfio_log("VFIO %s: PCI_HOT_RESET failed (%d)\n", dev->name, errno); + else { + vfio_log("VFIO %s: Hot reset successful\n", dev->name); + goto next2; + } + } + + /* Try PM reset. */ + if (dev->can_reset && dev->can_pm_reset) { + if (ioctl(dev->fd, VFIO_DEVICE_RESET)) + vfio_log("VFIO %s: DEVICE_RESET 2 failed (%d)\n", dev->name, errno); + else { + vfio_log("VFIO %s: PM reset successful\n", dev->name); + goto next2; + } + } + + /* Warn if no reset types were successful. */ + pclog("VFIO %s: Device was not reset!\n", dev->name); + +next2: + dev = dev->next; + } + group = group->next; + } + + /* Clean up. */ + free(hot_reset); + + /* Post-reset all devices. */ + group = first_group; + while (group) { + dev = group->first_device; + while (dev) { + vfio_dev_postreset(dev); + dev = dev->next; + } + group = group->next; + } +} + +void +vfio_init(void) +{ + vfio_log("VFIO: init()\n"); + + /* Stay quiet if VFIO is not configured. */ + char *category = "VFIO", + *devices = config_get_string(category, "devices", NULL); + if (!devices || !strlen(devices)) + return; + + /* Open VFIO container. */ + container_fd = open("/dev/vfio/vfio", O_RDWR); + if (container_fd < 0) { + pclog("VFIO: Container not found (is vfio-pci loaded?)\n"); + return; + } + + /* Check VFIO API version. */ + int api = ioctl(container_fd, VFIO_GET_API_VERSION); + if (api != VFIO_API_VERSION) { + pclog("VFIO: Unknown API version %d (expected %d)\n", api, VFIO_API_VERSION); + goto close_container; + } + + /* Check for Type1 IOMMU support. */ + if (!ioctl(container_fd, VFIO_CHECK_EXTENSION, VFIO_TYPE1_IOMMU)) { + pclog("VFIO: Type1 IOMMU not supported\n"); + goto close_container; + } + + /* Parse device list. */ + char *strtok_save; + char *token = strtok_r(devices, " ", &strtok_save); + char *p; + char *dev_name; + char *sysfs_device; + char *config_key; + int i; + int domain_id; + int bus_id; + int dev_id; + int func_id; + vfio_device_t *dev = NULL; + vfio_device_t *prev_dev; + vfio_group_t *group; + while (token) { + /* Determine if the device was specified by location or sysfs path. */ + dev_name = NULL; + if (token[0] == '/') { + /* sysfs path: use basename as device name. */ + i = strlen(token); + dev_name = malloc(i + 1); + strncpy(dev_name, path_get_basename(token), i); + + /* Just append iommu_group to the path. */ + sysfs_device = malloc(i + 13); + snprintf(sysfs_device, i + 13, + "%s/iommu_group", token); + } else if (token[0]) { + /* Location: read domain/bus/device/function. */ + i = sscanf(token, "%x:%x:%x.%x", &domain_id, &bus_id, &dev_id, &func_id); + if (i < 3) { + domain_id = 0; + i = sscanf(token, "%x:%x.%x", &bus_id, &dev_id, &func_id); + if (i < 2) { + bus_id = 0; + i = sscanf(token, "%x.%x", &dev_id, &func_id); + if (i < 1) { + pclog("VFIO: Invalid device location: %s\n", token); + goto next; + } else if (i == 1) { + func_id = 0; + } + } else if (i == 2) { + func_id = 0; + } + } else if (i == 3) { + func_id = 0; + } + + /* Use dddd:bb:dd.f as device name. */ + dev_name = malloc(13); + snprintf(dev_name, 13, + "%04x:%02x:%02x.%1x", domain_id, bus_id, dev_id, func_id); + + /* Generate sysfs path. */ + sysfs_device = malloc(46); + snprintf(sysfs_device, 46, + "/sys/bus/pci/devices/%s/iommu_group", dev_name); + } else { + /* Skip blank token. */ + goto next; + } + + pclog("VFIO %s: IOMMU group ", dev_name); + + p = realpath(sysfs_device, NULL); + free(sysfs_device); + if (p) { + /* Parse group ID. */ + if (sscanf(path_get_basename(p), "%d", &i) != 1) { + pclog("path could not be parsed: %s\n", p); + free(p); + goto next; + } + + pclog("%d\n", i); + free(p); + } else { + /* No symlink found, move on to the next device. */ + pclog("not found (%d)\n", errno); + goto next; + } + + /* Get group by ID, and move on to the next device + if the group failed to initialize. (Not viable, etc.) */ + group = vfio_group_get(i, 1); + if (group->fd < 0) { + pclog("VFIO %s: Skipping because group failed to initialize\n", dev_name); + goto next; + } + + /* Allocate device structure. */ + prev_dev = group->current_device; + dev = group->current_device = (vfio_device_t *) calloc(1, sizeof(vfio_device_t)); + + /* Initialize device structure. */ + dev->name = dev_name; + dev_name = NULL; /* don't free it further down */ + dev->irq.type = VFIO_PCI_NUM_IRQS; + + /* Read device-specific settings. */ + i = strlen(token) + 8; + config_key = malloc(i); + snprintf(config_key, i, "%s_rom_fn", token); + dev->rom_fn = config_get_string(category, config_key, NULL); + free(config_key); + + /* Add to linked device list. */ + if (prev_dev) + prev_dev->next = dev; + else + group->first_device = dev; + +next: /* Clean up. */ + if (dev_name) + free(dev_name); + + /* Read next device name. */ + token = strtok_r(NULL, " ", &strtok_save); + } + + /* Stop if no devices were added. */ + if (!dev) + goto close_container; + + /* Set IOMMU type. */ + if (ioctl(container_fd, VFIO_SET_IOMMU, VFIO_TYPE1_IOMMU)) { + pclog("VFIO: SET_IOMMU failed (%d)\n", errno); + goto close_container; + } + + /* Map RAM to container for DMA. */ + vfio_map_dma(ram, 0, 1024UL * MIN(mem_size, 1048576)); + if (ram2) + vfio_map_dma(ram2, 1024UL * 1048576, 1024UL * (mem_size - 1048576)); + + /* Initialize epoll. */ + epoll_fd = epoll_create1(0); + if (epoll_fd < 0) { + pclog("VFIO: epoll_create1 failed (%d)\n", errno); + goto close_container; + } + + /* Initialize IRQ thread wake eventfd. */ + irq_thread_wake_fd = eventfd(0, 0); + if (irq_thread_wake_fd <= 0) { + pclog("VFIO: eventfd failed (%d)\n", errno); + goto close_container; + } + struct epoll_event event = { .events = EPOLLIN }; + if (epoll_ctl(epoll_fd, EPOLL_CTL_ADD, irq_thread_wake_fd, &event) < 0) { + pclog("VFIO: EPOLL_CTL_ADD failed (%d)\n", errno); + goto close_container; + } + + /* Initialize and start IRQ thread. */ + irq_event = thread_create_event(); + irq_thread_resume = thread_create_event(); + thread_set_event(irq_thread_resume); + irq_thread = thread_create(vfio_irq_thread, NULL); + + /* Start IRQ timer. */ + timer_add(&irq_timer, vfio_irq_timer, NULL, 0); + vfio_irq_timer(NULL); + + /* Initialize all devices. */ + current_group = first_group; + while (current_group) { + prev_dev = NULL; + dev = current_group->first_device; + while (dev) { + current_group->current_device = dev; + if (vfio_dev_init(dev)) { + pclog("VFIO %s: dev_init failed\n", dev->name); + + /* Deallocate this device if initialization failed. */ + if (prev_dev) + prev_dev->next = dev->next; + else + current_group->first_device = dev->next; + dev = dev->next; + free(current_group->current_device); + continue; + } + prev_dev = dev; + dev = dev->next; + } + current_group = current_group->next; + } + + /* Reset all devices. */ + vfio_log("VFIO: Performing initial reset\n"); + closing = 0; + + /* Add device_t to keep track of reset and close. */ + device_add(&vfio_device); + +close_container: + close(container_fd); + container_fd = -1; +} + +void +vfio_close(void *priv) +{ + vfio_log("VFIO: close()\n"); + + /* Reset all devices. */ + closing = 1; + vfio_reset(priv); + + /* Stop IRQ timer. */ + timer_on_auto(&irq_timer, 0.0); + + /* Stop IRQ thread by closing the epoll fd. */ + if (epoll_fd >= 0) { + close(epoll_fd); + epoll_fd = -1; + } + thread_set_event(irq_thread_resume); + + /* Close all groups. */ + while (first_group) { + current_group = first_group; + + /* Close all devices. */ + while (current_group->first_device) { + current_group->current_device = current_group->first_device; + + /* Close device. */ + vfio_dev_close(current_group->current_device); + + /* Deallocate device. */ + current_group->first_device = current_group->current_device->next; + free(current_group->current_device); + } + + /* Close group fd. */ + if (current_group->fd >= 0) + close(current_group->fd); + + /* Deallocate group. */ + first_group = current_group->next; + free(current_group); + } + + /* Close container. */ + if (container_fd >= 0) { + close(container_fd); + container_fd = -1; + } +} + +static void +vfio_speed_changed(void *priv) +{ + /* Set operation timings. */ + timing_readb = (int) (pci_timing * timing_default.read_b); + timing_readw = (int) (pci_timing * timing_default.read_w); + timing_readl = (int) (pci_timing * timing_default.read_l); + timing_writeb = (int) (pci_timing * timing_default.write_b); + timing_writew = (int) (pci_timing * timing_default.write_w); + timing_writel = (int) (pci_timing * timing_default.write_l); +} + +static const device_t vfio_device = { + .name = "VFIO PCI Passthrough", + .internal_name = "vfio", + .flags = DEVICE_PCI, + .local = 0, + .init = NULL, + .close = vfio_close, + .reset = vfio_reset, + .available = NULL, + .speed_changed = vfio_speed_changed, + .force_redraw = NULL, + .config = NULL +}; diff --git a/src/include/86box/vfio.h b/src/include/86box/vfio.h new file mode 100644 index 000000000..2166070a0 --- /dev/null +++ b/src/include/86box/vfio.h @@ -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. + * + * Definitions for Virtual Function I/O PCI passthrough. + * + * Authors: RichardG, + * + * Copyright 2021-2025 RichardG. + */ +#if !defined(EMU_VFIO_H) && defined(USE_VFIO) +# define EMU_VFIO_H + +extern void vfio_init(void); + +#endif From cb3ba18645b3bafad270c64f7ec35b15cd4b1700 Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Wed, 17 Sep 2025 18:53:02 -0400 Subject: [PATCH 27/36] GHA Build cleanups --- .github/workflows/cmake_linux.yml | 6 +- .github/workflows/cmake_macos.yml | 109 +++++----------------- .github/workflows/cmake_windows_msys2.yml | 24 ++--- 3 files changed, 39 insertions(+), 100 deletions(-) diff --git a/.github/workflows/cmake_linux.yml b/.github/workflows/cmake_linux.yml index 5dc0387d8..3fb8b0d61 100644 --- a/.github/workflows/cmake_linux.yml +++ b/.github/workflows/cmake_linux.yml @@ -55,6 +55,7 @@ jobs: - name: SDL GUI qt: off qt6: off + slug: -SDL static: on - name: Qt 5 GUI qt: on @@ -121,10 +122,9 @@ jobs: - name: Configure CMake run: >- - cmake -G Ninja -S . -B build --preset ${{ matrix.build.preset }} - --toolchain ${{ matrix.environment.toolchain }} + cmake -S . -B build --preset ${{ matrix.build.preset }} + --toolchain ${{ matrix.environment.toolchain }} -D NEW_DYNAREC=${{ matrix.dynarec.new }} - -D CMAKE_INSTALL_PREFIX=./build/artifacts -D QT=${{ matrix.ui.qt }} -D USE_QT6=${{ matrix.ui.qt6 }} diff --git a/.github/workflows/cmake_macos.yml b/.github/workflows/cmake_macos.yml index c917932fe..ace5314c8 100644 --- a/.github/workflows/cmake_macos.yml +++ b/.github/workflows/cmake_macos.yml @@ -26,11 +26,11 @@ on: jobs: - macos13-x86_64: + macos: - name: "${{ matrix.ui.name }}, ${{ matrix.build.name }}, ${{ matrix.dynarec.name }}, x86_64" + name: "${{ matrix.ui.name }}, ${{ matrix.build.name }}, ${{ matrix.dynarec.name }}, ${{ matrix.environment.arch }}" - runs-on: macos-13 + runs-on: ${{ matrix.environment.runner }} strategy: fail-fast: true @@ -54,12 +54,27 @@ jobs: ui: - name: SDL GUI qt: off + slug: -SDL static: on - - name: Qt GUI + - name: Qt 5 GUI qt: on - slug: -Qt + slug: -Qt5 packages: >- qt@5 + environment: + - arch: x86_64 + toolchain: ./cmake/flags-gcc-x86_64.cmake + slug: -x86_64 + runner: macos-13 + - arch: arm64 + toolchain: ./cmake/llvm-macos-aarch64.cmake + slug: -arm64 + runner: macos-14 + exclude: + - dynarec: + new: off + environment: + arch: arm64 steps: - name: Install dependencies @@ -81,10 +96,9 @@ jobs: - name: Configure CMake run: >- - cmake -G Ninja -S . -B build --preset ${{ matrix.build.preset }} - --toolchain ./cmake/flags-gcc-x86_64.cmake + cmake -S . -B build --preset ${{ matrix.build.preset }} + --toolchain ${{ matrix.environment.toolchain }} -D NEW_DYNAREC=${{ matrix.dynarec.new }} - -D CMAKE_INSTALL_PREFIX=./build/artifacts -D QT=${{ matrix.ui.qt }} -D Qt5_ROOT=$(brew --prefix qt@5) -D Qt5LinguistTools_ROOT=$(brew --prefix qt@5) @@ -100,82 +114,5 @@ jobs: - name: Upload artifact uses: actions/upload-artifact@v4 with: - name: '86Box${{ matrix.ui.slug }}${{ matrix.dynarec.slug }}${{ matrix.build.slug }}-macOS-x86_64-gha${{ github.run_number }}' - path: build/artifacts/** - - macos14-arm64: - - name: "${{ matrix.ui.name }}, ${{ matrix.build.name }}, ${{ matrix.dynarec.name }}, arm64" - - runs-on: macos-14 - - strategy: - fail-fast: true - matrix: - build: -# - name: Regular -# preset: regular - - name: Debug - preset: dev_debug - slug: -Debug - - name: Dev - preset: development - slug: -Dev - dynarec: -# - name: ODR -# new: off -# slug: -ODR - - name: NDR - new: on - slug: -NDR - ui: - - name: SDL GUI - qt: off - static: on - - name: Qt GUI - qt: on - slug: -Qt - packages: >- - qt@5 - - steps: - - name: Install dependencies - run: >- - brew install - sdl2 - rtmidi - openal-soft - fluidsynth - libslirp - vde - libserialport - ${{ matrix.ui.packages }} - - - name: Checkout repository - uses: actions/checkout@v4 - with: - fetch-depth: 0 # Shallow clones should be disabled for a better relevancy of analysis - - - name: Configure CMake - run: >- - cmake -G Ninja -S . -B build --preset ${{ matrix.build.preset }} - --toolchain ./cmake/llvm-macos-aarch64.cmake - -D NEW_DYNAREC=${{ matrix.dynarec.new }} - -D CMAKE_INSTALL_PREFIX=./build/artifacts - -D QT=${{ matrix.ui.qt }} - -D Qt5_ROOT=$(brew --prefix qt@5) - -D Qt5LinguistTools_ROOT=$(brew --prefix qt@5) - -D OpenAL_ROOT=$(brew --prefix openal-soft) - -D LIBSERIALPORT_ROOT=$(brew --prefix libserialport) - - - name: Build - run: cmake --build build - - - name: Generate package - run: cmake --install build - - - name: Upload artifact - uses: actions/upload-artifact@v4 - with: - name: '86Box${{ matrix.ui.slug }}${{ matrix.dynarec.slug }}${{ matrix.build.slug }}-macOS-arm64-gha${{ github.run_number }}' + name: '86Box${{ matrix.ui.slug }}${{ matrix.dynarec.slug }}${{ matrix.build.slug }}-macOS${{ matrix.environment.slug }}-gha${{ github.run_number }}' path: build/artifacts/** diff --git a/.github/workflows/cmake_windows_msys2.yml b/.github/workflows/cmake_windows_msys2.yml index eb83d4674..8959395eb 100644 --- a/.github/workflows/cmake_windows_msys2.yml +++ b/.github/workflows/cmake_windows_msys2.yml @@ -1,4 +1,4 @@ -name: CMake (Windows, msys2) +name: CMake (Windows) on: @@ -26,9 +26,9 @@ on: jobs: - msys2: + windows: - name: "${{ matrix.build.name }}, ${{ matrix.dynarec.name }}, ${{ matrix.environment.msystem }}" + name: "${{ matrix.ui.name }}, ${{ matrix.build.name }}, ${{ matrix.dynarec.name }}, ${{ matrix.environment.msystem }}" runs-on: ${{ matrix.environment.runner }} @@ -56,14 +56,15 @@ jobs: new: on slug: -NDR ui: - - name: Qt GUI + - name: Qt 5 GUI qt: on + slug: -Qt5 static: on - slug: -Qt packages: >- - qt5-base:p - qt5-tools:p + qt5-static:p vulkan-headers:p +# qt5-base:p +# qt5-tools:p environment: # - msystem: MSYS # toolchain: ./cmake/flags-gcc-x86_64.cmake @@ -77,10 +78,12 @@ jobs: # prefix: mingw-w64-clang-x86_64 # toolchain: ./cmake/llvm-win32-x86_64.cmake # slug: "CLANG64" +# runner: windows-2022 # - msystem: UCRT64 # prefix: mingw-w64-ucrt-x86_64 # toolchain: ./cmake/flags-gcc-x86_64.cmake # slug: "UCRT64" +# runner: windows-2022 - msystem: CLANGARM64 toolchain: ./cmake/flags-gcc-aarch64.cmake slug: -arm64 @@ -112,8 +115,7 @@ jobs: libslirp:p fluidsynth:p libserialport:p - qt5-static:p - vulkan-headers:p + ${{ matrix.ui.packages }} openmp:p - name: Checkout repository @@ -123,10 +125,10 @@ jobs: - name: Configure CMake run: >- - cmake -G Ninja -S . -B build --preset ${{ matrix.build.preset }} + cmake -S . -B build --preset ${{ matrix.build.preset }} --toolchain ${{ matrix.environment.toolchain }} -D NEW_DYNAREC=${{ matrix.dynarec.new }} - -D CMAKE_INSTALL_PREFIX=./build/artifacts + -D QT=${{ matrix.ui.qt }} - name: Build run: cmake --build build From f3943bd2e556698c0403a699a8c0d1cd55ef84bd Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Wed, 17 Sep 2025 21:02:11 -0400 Subject: [PATCH 28/36] Fix CodeQL Builds --- .github/workflows/codeql_linux.yml | 2 +- .github/workflows/codeql_macos.yml | 2 +- .github/workflows/codeql_windows_msys2.yml | 2 +- sonar-project.properties | 8 ++++++-- 4 files changed, 9 insertions(+), 5 deletions(-) diff --git a/.github/workflows/codeql_linux.yml b/.github/workflows/codeql_linux.yml index b8fb93ef6..48c477706 100644 --- a/.github/workflows/codeql_linux.yml +++ b/.github/workflows/codeql_linux.yml @@ -140,4 +140,4 @@ jobs: with: # Consult https://docs.sonarsource.com/sonarqube-server/latest/analyzing-source-code/scanners/sonarscanner/ for more information and options args: > - --define sonar.cfamily.compile-commands="${{ env.BUILD_WRAPPER_OUT_DIR }}/compile_commands.json" + --define sonar.cfamily.compile-commands=build/compile_commands.json diff --git a/.github/workflows/codeql_macos.yml b/.github/workflows/codeql_macos.yml index 203f385ff..22566f01f 100644 --- a/.github/workflows/codeql_macos.yml +++ b/.github/workflows/codeql_macos.yml @@ -133,4 +133,4 @@ jobs: with: # Consult https://docs.sonarsource.com/sonarqube-server/latest/analyzing-source-code/scanners/sonarscanner/ for more information and options args: > - --define sonar.cfamily.compile-commands="${{ env.BUILD_WRAPPER_OUT_DIR }}/compile_commands.json" + --define sonar.cfamily.compile-commands=build/compile_commands.json diff --git a/.github/workflows/codeql_windows_msys2.yml b/.github/workflows/codeql_windows_msys2.yml index c7edae77f..487e8dc05 100644 --- a/.github/workflows/codeql_windows_msys2.yml +++ b/.github/workflows/codeql_windows_msys2.yml @@ -177,4 +177,4 @@ jobs: with: # Consult https://docs.sonarsource.com/sonarqube-server/latest/analyzing-source-code/scanners/sonarscanner/ for more information and options args: > - --define sonar.cfamily.compile-commands="${{ env.BUILD_WRAPPER_OUT_DIR }}/compile_commands.json" + --define sonar.cfamily.compile-commands=build/compile_commands.json diff --git a/sonar-project.properties b/sonar-project.properties index 781fad035..34cb02b6b 100644 --- a/sonar-project.properties +++ b/sonar-project.properties @@ -1,12 +1,16 @@ sonar.projectKey=86Box_86Box + sonar.organization=86box # This is the name and version displayed in the SonarCloud UI. -#sonar.projectName=86Box +sonar.projectName=86Box + #sonar.projectVersion=1.0 -# Path is relative to the sonar-project.properties file. Replace "\" by "/" on Windows. +# Path is relative to the sonar-project.properties file. Defaults to . #sonar.sources=. # Encoding of the source code. Default is default system encoding #sonar.sourceEncoding=UTF-8 + +sonar.cfamily.compile-commands=build/compile_commands.json From f47b5dc75e72a3e962836426a3920cb2e3bd54a9 Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Wed, 17 Sep 2025 23:31:15 -0400 Subject: [PATCH 29/36] CodeQL Build Cleanups --- .github/workflows/codeql_linux.yml | 29 ++++++++++++++---- .github/workflows/codeql_macos.yml | 35 +++++++++++++++------- .github/workflows/codeql_windows_msys2.yml | 14 ++++----- 3 files changed, 55 insertions(+), 23 deletions(-) diff --git a/.github/workflows/codeql_linux.yml b/.github/workflows/codeql_linux.yml index 48c477706..957c7090b 100644 --- a/.github/workflows/codeql_linux.yml +++ b/.github/workflows/codeql_linux.yml @@ -33,7 +33,7 @@ jobs: analyze-linux: - name: "Analyze (${{ matrix.ui.name }}, ${{ matrix.build.name }}, ${{ matrix.dynarec.name }}, x86_64)" + name: "${{ matrix.ui.name }}, ${{ matrix.build.name }}, ${{ matrix.dynarec.name }}, ${{ matrix.environment.arch }}" runs-on: ubuntu-22.04 @@ -68,10 +68,13 @@ jobs: ui: - name: SDL GUI qt: off + qt6: off + slug: -SDL static: on - - name: Qt GUI + - name: Qt 5 GUI qt: on - slug: -Qt + qt6: off + slug: -Qt5 packages: >- qtbase5-dev qtbase5-private-dev @@ -79,6 +82,20 @@ jobs: qttranslations5-l10n libevdev-dev libxkbcommon-x11-dev + environment: + - arch: x86_64 + toolchain: ./cmake/flags-gcc-x86_64.cmake + slug: "-x86_64" + runner: ubuntu-22.04 +# - arch: arm64 +# toolchain: ./cmake/flags-gcc-aarch64.cmake +# slug: -arm64 +# runner: ubuntu-22.04-arm +# exclude: +# - dynarec: +# new: off +# environment: +# arch: arm64 steps: - name: Install dependencies @@ -114,11 +131,11 @@ jobs: - name: Configure CMake run: >- - cmake -G Ninja -S . -B build --preset ${{ matrix.build.preset }} - --toolchain ./cmake/flags-gcc-x86_64.cmake + cmake -S . -B build --preset ${{ matrix.build.preset }} + --toolchain ${{ matrix.environment.toolchain }} -D NEW_DYNAREC=${{ matrix.dynarec.new }} - -D CMAKE_INSTALL_PREFIX=./build/artifacts -D QT=${{ matrix.ui.qt }} + -D USE_QT6=${{ matrix.ui.qt6 }} - name: Build run: | diff --git a/.github/workflows/codeql_macos.yml b/.github/workflows/codeql_macos.yml index 22566f01f..488cbfd49 100644 --- a/.github/workflows/codeql_macos.yml +++ b/.github/workflows/codeql_macos.yml @@ -31,11 +31,11 @@ on: jobs: - analyze-macos13-x86_64: + analyze-macos: - name: "Analyze (${{ matrix.ui.name }}, ${{ matrix.build.name }}, ${{ matrix.dynarec.name }}, x86_64)" + name: "${{ matrix.ui.name }}, ${{ matrix.build.name }}, ${{ matrix.dynarec.name }}, ${{ matrix.environment.arch }}" - runs-on: macos-13 + runs-on: ${{ matrix.environment.runner }} env: BUILD_WRAPPER_OUT_DIR: build_wrapper_output_directory # Directory where build-wrapper output will be placed @@ -66,13 +66,29 @@ jobs: new: on slug: -NDR ui: - - name: SDL GUI - qt: off - - name: Qt GUI +# - name: SDL GUI +# qt: off +# slug: -SDL +# static: on + - name: Qt 5 GUI qt: on - slug: -Qt + slug: -Qt5 packages: >- qt@5 + environment: + - arch: x86_64 + toolchain: ./cmake/flags-gcc-x86_64.cmake + slug: -x86_64 + runner: macos-13 +# - arch: arm64 +# toolchain: ./cmake/llvm-macos-aarch64.cmake +# slug: -arm64 +# runner: macos-14 +# exclude: +# - dynarec: +# new: off +# environment: +# arch: arm64 steps: - name: Install dependencies @@ -103,10 +119,9 @@ jobs: - name: Configure CMake run: >- - cmake -G Ninja -S . -B build --preset ${{ matrix.build.preset }} - --toolchain ./cmake/flags-gcc-x86_64.cmake + cmake -S . -B build --preset ${{ matrix.build.preset }} + --toolchain ${{ matrix.environment.toolchain }} -D NEW_DYNAREC=${{ matrix.dynarec.new }} - -D CMAKE_INSTALL_PREFIX=./build/artifacts -D QT=${{ matrix.ui.qt }} -D Qt5_ROOT=$(brew --prefix qt@5) -D Qt5LinguistTools_ROOT=$(brew --prefix qt@5) diff --git a/.github/workflows/codeql_windows_msys2.yml b/.github/workflows/codeql_windows_msys2.yml index 487e8dc05..d70c6fd5f 100644 --- a/.github/workflows/codeql_windows_msys2.yml +++ b/.github/workflows/codeql_windows_msys2.yml @@ -1,4 +1,4 @@ -name: CodeQL Analysis (Windows, msys2) +name: CodeQL Analysis (Windows) on: @@ -31,9 +31,9 @@ on: jobs: - analyze-msys2: + analyze-windows: - name: "Analyze (${{ matrix.ui.name }}, ${{ matrix.build.name }}, ${{ matrix.dynarec.name }}, ${{ matrix.environment.msystem }})" + name: "${{ matrix.ui.name }}, ${{ matrix.build.name }}, ${{ matrix.dynarec.name }}, ${{ matrix.environment.msystem }}" runs-on: ${{ matrix.environment.runner }} @@ -70,14 +70,15 @@ jobs: new: on slug: -NDR ui: - - name: Qt GUI + - name: Qt 5 GUI qt: on + slug: -Qt5 static: off - slug: -Qt packages: >- qt5-base:p qt5-tools:p vulkan-headers:p +# qt5-static:p environment: # - msystem: MSYS # toolchain: ./cmake/flags-gcc-x86_64.cmake @@ -147,10 +148,9 @@ jobs: - name: Configure CMake run: >- - cmake -G Ninja -S . -B build --preset ${{ matrix.build.preset }} + cmake -S . -B build --preset ${{ matrix.build.preset }} --toolchain ${{ matrix.environment.toolchain }} -D NEW_DYNAREC=${{ matrix.dynarec.new }} - -D CMAKE_INSTALL_PREFIX=./build/artifacts -D QT=${{ matrix.ui.qt }} -D STATIC_BUILD=${{ matrix.ui.static }} From e4acf4d0136966ba509713fecd314db9bb427ac6 Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Sun, 21 Sep 2025 19:42:16 -0300 Subject: [PATCH 30/36] Revert "Temporary audio system override" [skip ci] This reverts commit da7bec3beb715209aaab46dc08642e9ab13d61e0. --- .ci/Jenkinsfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.ci/Jenkinsfile b/.ci/Jenkinsfile index f9395674c..94070569e 100644 --- a/.ci/Jenkinsfile +++ b/.ci/Jenkinsfile @@ -83,7 +83,7 @@ def presetSlugs = [ ] def presetFlags = [ - 'Regular': '-t --preset=regular -D CMAKE_BUILD_TYPE=Release -D OPENAL=OFF', + 'Regular': '-t --preset=regular -D CMAKE_BUILD_TYPE=Release', 'Debug': '--preset=debug -D CMAKE_BUILD_TYPE=Debug -D STATIC_BUILD=OFF', 'Dev': '--preset=experimental -D CMAKE_BUILD_TYPE=Debug -D VNC=OFF -D STATIC_BUILD=OFF' ] From 1859e7cf68991a6dd644998cec9c9584e4a32f86 Mon Sep 17 00:00:00 2001 From: Toni Riikonen Date: Mon, 22 Sep 2025 02:03:07 +0300 Subject: [PATCH 31/36] Floppy disks sound emulation prototype for reviewing (#6166) * Initial spindle emulation working for windows atleast * Spingle motor spin-up, spin-down implemented with smooth transitions to motor-on loop. * Moved fdd audio emulation to a separate file * Multiple drives sound emulation * Single sector movement sound emulations implemented * Rename project to Immersive86Box and update details Updated README to reflect the new project name and added details about the Immersive86Box features and future plans. * Revise contribution guidelines in CONTRIBUTING.md * Update vulnerability reporting instructions * System fan-sound next feature after basic fdd sound emulation is ready * v0.5 multitrack audio seek sfx * Removed unnecessary stuff * no .vs folder for git * Added currently used fdd sound effects and readme.txt for source of the files and intallation instructions * Add audio emulation installation instructions Added instructions for audio emulation installation. * Code and audio samples merged * Simplify audio emulation installation instructions * FDC seeking fixed, not instant anymore drive is set to busy during the operation and when it's finished at call fdc to set the appropriate fdc flags. Also added time logic to fdd to calculate seek duration and a callback function for it. * FDD sound samples volume control * Menu options to enable / disable fdd sound for all drives. DISABLE_FDD_AUDIO definition added, to disable the feature via cmake/build. * Revert readme etc. changes * Revert "Revise contribution guidelines in CONTRIBUTING.md" This reverts commit 98a0478225bbf8bf0fb0e7edfd5c00636ecc0eed. * Revert "Update vulnerability reporting instructions" This reverts commit 7d32cb659b018b26bdaa4a1e06ee9c3d09278aac. * Fixed merge issue * Removed excess files * Fixed PCJr seeking not to break the FDC implementation. Now seeking will take the "correct" amount of time for each system and the seek time is based on the track count. E.g. 40 track FDD system causes 40 track seek time to be 80/40 * 6ms * 40 tracks + 50ms = 480ms + 50ms -> 530ms. 80 track system full seek is 80/80 * 6ms * 80 + 50ms = 530ms, 40 track seek would take 240 + 50 = 290ms. * Fixed PS/1, PS/2 and PS/55 FDD issues. * FDD_AUDIO: Updating samples looked in executablePath/samples and if now found there, looks in the executable directory * Updated installation instructions * Removed samples path strcat use * fdd_audio 5.25 samples and support added * FDD audio timing/volume tunings * Timing fixes for authentity and special longer timings for PCJr * Fixed second drive motor keeps running when first drive is only accessed. * Fixed PCJr random failure issue, timings * CodeQL fix for load_wav-function. Check the filename to be proper filename * Revert "Fixed second drive motor keeps running when first drive is only accessed." This reverts commit 307b173ae7d40c9efafed8d432e01cce9808b111. * Teac 5.25" drive samples added. Added per drive audio selection to FDD settings. * Fixed mistake in samples folder recreation --------- Co-authored-by: Toni Riikonen --- .gitignore | 2 + ...5_5.25_1.2MB_motor_loop_48000_16_1_PCM.wav | Bin 0 -> 138308 bytes ..._5.25_1.2MB_motor_start_48000_16_1_PCM.wav | Bin 0 -> 94708 bytes ...5_5.25_1.2MB_motor_stop_48000_16_1_PCM.wav | Bin 0 -> 122478 bytes ...cks_285ms_5ms_per_track_48000_16_1_PCM.wav | Bin 0 -> 27378 bytes ...cks_285ms_5ms_per_track_48000_16_1_PCM.wav | Bin 0 -> 27378 bytes ...5_5.25_1.2MB_track_step_48000_16_1_PCM.wav | Bin 0 -> 4232 bytes ...R_5.25_1.2MB_motor_loop_48000_16_1_PCM.wav | Bin 0 -> 62924 bytes ..._5.25_1.2MB_motor_start_48000_16_1_PCM.wav | Bin 0 -> 31146 bytes ...R_5.25_1.2MB_motor_stop_48000_16_1_PCM.wav | Bin 0 -> 64278 bytes ...R_5.25_1.2MB_track_step_48000_16_1_PCM.wav | Bin 0 -> 13188 bytes ...kupdown_80_tracks1100ms_48000_16_1_PCM.wav | Bin 0 -> 106992 bytes ...ffseek_80_tracks_1000ms_48000_16_1_PCM.wav | Bin 0 -> 94412 bytes ...mi_seek_80_tracks_380ms_48000_16_1_PCM.wav | Bin 0 -> 37754 bytes ...mi_seek_80_tracks_495ms_48000_16_1_PCM.wav | Bin 0 -> 47530 bytes ...sumi_spindle_motor_loop_48000_16_1_PCM.wav | Bin 0 -> 172700 bytes ...umi_spindle_motor_start_48000_16_1_PCM.wav | Bin 0 -> 44172 bytes ...sumi_spindle_motor_stop_48000_16_1_PCM.wav | Bin 0 -> 50200 bytes samples/mitsumi_track_step_48000_16_1_PCM.wav | Bin 0 -> 8952 bytes samples/readme.txt | 13 + src/86box.c | 1 + src/config.c | 23 + src/floppy/CMakeLists.txt | 4 + src/floppy/fdc.c | 40 +- src/floppy/fdd.c | 152 +++- src/floppy/fdd_audio.c | 667 ++++++++++++++++++ src/include/86box/86box.h | 1 + src/include/86box/fdc.h | 3 + src/include/86box/fdd.h | 13 + src/include/86box/fdd_audio.h | 86 +++ src/include/86box/sound.h | 4 + src/qt/qt_settingsfloppycdrom.cpp | 84 ++- src/qt/qt_settingsfloppycdrom.hpp | 1 + src/qt/qt_settingsfloppycdrom.ui | 86 ++- src/sound/audio4.c | 24 +- src/sound/openal.c | 41 +- src/sound/sndio.c | 16 +- src/sound/sound.c | 72 +- src/sound/xaudio2.c | 26 +- 39 files changed, 1269 insertions(+), 90 deletions(-) create mode 100644 samples/Panasonic_JU-475-5_5.25_1.2MB_motor_loop_48000_16_1_PCM.wav create mode 100644 samples/Panasonic_JU-475-5_5.25_1.2MB_motor_start_48000_16_1_PCM.wav create mode 100644 samples/Panasonic_JU-475-5_5.25_1.2MB_motor_stop_48000_16_1_PCM.wav create mode 100644 samples/Panasonic_JU-475-5_5.25_1.2MB_seekdown_40_tracks_285ms_5ms_per_track_48000_16_1_PCM.wav create mode 100644 samples/Panasonic_JU-475-5_5.25_1.2MB_seekup_40_tracks_285ms_5ms_per_track_48000_16_1_PCM.wav create mode 100644 samples/Panasonic_JU-475-5_5.25_1.2MB_track_step_48000_16_1_PCM.wav create mode 100644 samples/TeacFD-55GFR_5.25_1.2MB_motor_loop_48000_16_1_PCM.wav create mode 100644 samples/TeacFD-55GFR_5.25_1.2MB_motor_start_48000_16_1_PCM.wav create mode 100644 samples/TeacFD-55GFR_5.25_1.2MB_motor_stop_48000_16_1_PCM.wav create mode 100644 samples/TeacFD-55GFR_5.25_1.2MB_track_step_48000_16_1_PCM.wav create mode 100644 samples/TeacFD_55GFR_5.25_1.2MB_seekupdown_80_tracks1100ms_48000_16_1_PCM.wav create mode 100644 samples/mitsumi_offseek_80_tracks_1000ms_48000_16_1_PCM.wav create mode 100644 samples/mitsumi_seek_80_tracks_380ms_48000_16_1_PCM.wav create mode 100644 samples/mitsumi_seek_80_tracks_495ms_48000_16_1_PCM.wav create mode 100644 samples/mitsumi_spindle_motor_loop_48000_16_1_PCM.wav create mode 100644 samples/mitsumi_spindle_motor_start_48000_16_1_PCM.wav create mode 100644 samples/mitsumi_spindle_motor_stop_48000_16_1_PCM.wav create mode 100644 samples/mitsumi_track_step_48000_16_1_PCM.wav create mode 100644 samples/readme.txt create mode 100644 src/floppy/fdd_audio.c create mode 100644 src/include/86box/fdd_audio.h diff --git a/.gitignore b/.gitignore index 5935efd38..470a352ea 100644 --- a/.gitignore +++ b/.gitignore @@ -8,6 +8,8 @@ Makefile /src/*.exe /src/86Box /src/include/86box/version.h +/src/.vs +/src/out # Legacy Makefile /src/*.o diff --git a/samples/Panasonic_JU-475-5_5.25_1.2MB_motor_loop_48000_16_1_PCM.wav b/samples/Panasonic_JU-475-5_5.25_1.2MB_motor_loop_48000_16_1_PCM.wav new file mode 100644 index 0000000000000000000000000000000000000000..90897531e24400e59e937f111f95e4755b6ee7ea GIT binary patch literal 138308 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 z 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�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 literal 0 HcmV?d00001 diff --git a/samples/Panasonic_JU-475-5_5.25_1.2MB_seekdown_40_tracks_285ms_5ms_per_track_48000_16_1_PCM.wav b/samples/Panasonic_JU-475-5_5.25_1.2MB_seekdown_40_tracks_285ms_5ms_per_track_48000_16_1_PCM.wav new file mode 100644 index 0000000000000000000000000000000000000000..3330fc7b81530eeb01729e5387e221b80a414630 GIT binary patch literal 27378 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 literal 0 HcmV?d00001 diff --git a/samples/Panasonic_JU-475-5_5.25_1.2MB_seekup_40_tracks_285ms_5ms_per_track_48000_16_1_PCM.wav b/samples/Panasonic_JU-475-5_5.25_1.2MB_seekup_40_tracks_285ms_5ms_per_track_48000_16_1_PCM.wav new file mode 100644 index 0000000000000000000000000000000000000000..620a32d4d61a573e53c1ef8864b2bf9aef83da00 GIT binary patch literal 27378 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 literal 0 HcmV?d00001 diff --git a/samples/TeacFD-55GFR_5.25_1.2MB_motor_loop_48000_16_1_PCM.wav b/samples/TeacFD-55GFR_5.25_1.2MB_motor_loop_48000_16_1_PCM.wav new file mode 100644 index 0000000000000000000000000000000000000000..bd8a4cce5cb4eea307257e06fbbd3248f8bcab81 GIT binary patch literal 62924 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 literal 0 HcmV?d00001 diff --git a/samples/readme.txt b/samples/readme.txt new file mode 100644 index 000000000..5aca6b001 --- /dev/null +++ b/samples/readme.txt @@ -0,0 +1,13 @@ +These samples have been edited from Shiru's recordings. + +Originals can be found here: +http://shiru.untergrund.net/files/flopster.zip + +Original samples can edited and used separately from the Flopster VSTi under the +Creative Commons Attribution (CC-BY) license terms. + +Installation instructions +- Currently these samples need to be manually copied to the 86box executable path under '/samples' + or to the same directory with 86box executable. +- The samples are 48kHz 16bit 1 channel PCM WAVE samples. Immersive86box code does not make any resampling, + and assumes that the host audio system is using 48kHz 16bit output. \ No newline at end of file diff --git a/src/86box.c b/src/86box.c index 95f714747..591772458 100644 --- a/src/86box.c +++ b/src/86box.c @@ -239,6 +239,7 @@ char monitor_edid_path[1024] = { 0 }; /* (C) Path to double video_gl_input_scale = 1.0; /* (C) OpenGL 3.x input scale */ int video_gl_input_scale_mode = FULLSCR_SCALE_FULL; /* (C) OpenGL 3.x input stretch mode */ int color_scheme = 0; /* (C) Color scheme of UI (Windows-only) */ +int fdd_sounds_enabled = 1; /* (C) Floppy drive sounds enabled */ // Accelerator key array struct accelKey acc_keys[NUM_ACCELS]; diff --git a/src/config.c b/src/config.c index 42d4fe012..d4afe9d81 100644 --- a/src/config.c +++ b/src/config.c @@ -265,6 +265,7 @@ load_general(void) do_auto_pause = ini_section_get_int(cat, "do_auto_pause", 0); force_constant_mouse = ini_section_get_int(cat, "force_constant_mouse", 0); + fdd_sounds_enabled = ini_section_get_int(cat, "fdd_sounds_enabled", 1); p = ini_section_get_string(cat, "uuid", NULL); if (p != NULL) @@ -1436,6 +1437,15 @@ load_floppy_and_cdrom_drives(void) sprintf(temp, "fdd_%02i_check_bpb", c + 1); ini_section_delete_var(cat, temp); } + sprintf(temp, "fdd_%02i_audio", c + 1); + int def_prof = FDD_AUDIO_PROFILE_NONE; + int prof = ini_section_get_int(cat, temp, def_prof); + if (prof < 0 || prof >= FDD_AUDIO_PROFILE_MAX) + prof = def_prof; + fdd_set_audio_profile(c, prof); + if (prof == def_prof) + ini_section_delete_var(cat, temp); + for (int i = 0; i < MAX_PREV_IMAGES; i++) { fdd_image_history[c][i] = (char *) calloc((MAX_IMAGE_PATH_LEN + 1) << 1, sizeof(char)); sprintf(temp, "fdd_%02i_image_history_%02i", c + 1, i + 1); @@ -2479,6 +2489,11 @@ save_general(void) else ini_section_delete_var(cat, "force_constant_mouse"); + if (fdd_sounds_enabled == 1) + ini_section_delete_var(cat, "fdd_sounds_enabled"); + else + ini_section_set_int(cat, "fdd_sounds_enabled", fdd_sounds_enabled); + char cpu_buf[128] = { 0 }; plat_get_cpu_string(cpu_buf, 128); ini_section_set_string(cat, "host_cpu", cpu_buf); @@ -3416,6 +3431,14 @@ save_floppy_and_cdrom_drives(void) else save_image_file(cat, temp, fdd_image_history[c][i]); } + + sprintf(temp, "fdd_%02i_audio", c + 1); + int def_prof = FDD_AUDIO_PROFILE_NONE; + int prof = fdd_get_audio_profile(c); + if (prof == def_prof) + ini_section_delete_var(cat, temp); + else + ini_section_set_int(cat, temp, prof); } for (c = 0; c < CDROM_NUM; c++) { diff --git a/src/floppy/CMakeLists.txt b/src/floppy/CMakeLists.txt index c16ca06f4..c51d3717c 100644 --- a/src/floppy/CMakeLists.txt +++ b/src/floppy/CMakeLists.txt @@ -10,9 +10,12 @@ # # Authors: David Hrdlička, # Jasmine Iwanek, +# Toni Riikonen, # # Copyright 2020-2021 David Hrdlička. # Copyright 2024 Jasmine Iwanek. +# Copyright 2025 Toni Riikonen. +# All rights reserved. # add_library(fdd OBJECT @@ -31,6 +34,7 @@ add_library(fdd OBJECT fdd_pcjs.c fdd_mfm.c fdd_td0.c + fdd_audio.c ) add_subdirectory(lzw) diff --git a/src/floppy/fdc.c b/src/floppy/fdc.c index 75938e21a..bcf4a1299 100644 --- a/src/floppy/fdc.c +++ b/src/floppy/fdc.c @@ -11,9 +11,11 @@ * * Authors: Sarah Walker, * Miran Grca, + * Toni Riikonen, * * Copyright 2008-2020 Sarah Walker. * Copyright 2016-2020 Miran Grca. + * Copyright 2025 Toni Riikonen. */ #include #include @@ -662,6 +664,33 @@ real_drive(fdc_t *fdc, int drive) return drive; } +/* FDD notifies FDC when seek operation is complete */ +void +fdc_seek_complete_interrupt(fdc_t *fdc, int drive) +{ + if (!fdc) { + fdc_log("ERROR: fdc_seek_complete_interrupt called with NULL fdc!\n"); + return; + } + + if (FDC_FLAG_PCJR & fdc->flags) { + fdc->fintr = 1; + fdc->interrupt = -4; + fdc_callback(fdc); + return; + } + + fdc_log("FDD %c: Seek complete interrupt\n", 0x41 + drive); + + fdc->fintr = 1; + fdc->interrupt = -3; + fdc->st0 = 0x20 | (drive & 3); + if (fdd_get_head(drive)) + fdc->st0 |= 0x04; + + fdc_callback(fdc); +} + void fdc_seek(fdc_t *fdc, int drive, int params) { @@ -1229,7 +1258,7 @@ fdc_write(uint16_t addr, uint8_t val, void *priv) case 0x0f: /* Seek */ fdc->rw_drive = fdc->params[0] & 3; fdc->stat = (1 << fdc->drive); - if (!(fdc->flags & FDC_FLAG_PCJR)) + if (!(fdc->flags & FDC_FLAG_PCJR)) fdc->stat |= 0x80; fdc->head = 0; /* TODO: See if this is correct. */ fdc->st0 = fdc->params[0] & 0x03; @@ -1901,14 +1930,7 @@ fdc_callback(void *priv) case 0x0f: /*Seek*/ fdc->st0 = 0x20 | (fdc->params[0] & 3); fdc->stat = 0x80 | (1 << fdc->rw_drive); - if (fdc->flags & FDC_FLAG_PCJR) { - fdc->fintr = 1; - fdc->interrupt = -4; - timer_set_delay_u64(&fdc->timer, 1024 * TIMER_USEC); - } else { - fdc->interrupt = -3; - fdc_callback(fdc); - } + // Interrupts and callbacks in the fdd callback function return; case 0x10: /*Version*/ case 0x18: /*NSC*/ diff --git a/src/floppy/fdd.c b/src/floppy/fdd.c index 8e834c2fc..a0bef7ac6 100644 --- a/src/floppy/fdd.c +++ b/src/floppy/fdd.c @@ -11,16 +11,20 @@ * Authors: Sarah Walker, * Miran Grca, * Fred N. van Kempen, + * Toni Riikonen, * * Copyright 2008-2019 Sarah Walker. * Copyright 2016-2019 Miran Grca. * Copyright 2018-2019 Fred N. van Kempen. + * Copyright 2025 Toni Riikonen. */ #include #include #include #include #include +#include + #define HAVE_STDARG_H #include <86box/86box.h> #include <86box/timer.h> @@ -37,6 +41,7 @@ #include <86box/fdd_mfm.h> #include <86box/fdd_td0.h> #include <86box/fdc.h> +#include <86box/fdd_audio.h> /* Flags: Bit 0: 300 rpm supported; @@ -78,15 +83,17 @@ char floppyfns[FDD_NUM][512]; char *fdd_image_history[FDD_NUM][FLOPPY_IMAGE_HISTORY]; pc_timer_t fdd_poll_time[FDD_NUM]; +pc_timer_t fdd_seek_timer[FDD_NUM]; static int fdd_notfound = 0; static int driveloaders[FDD_NUM]; +static int fdd_audio_profile[FDD_NUM] = { 0 }; int writeprot[FDD_NUM]; int fwriteprot[FDD_NUM]; int fdd_changed[FDD_NUM]; int ui_writeprot[FDD_NUM] = { 0, 0, 0, 0 }; -int drive_empty[FDD_NUM] = { 1, 1, 1, 1 }; +int drive_empty[FDD_NUM] = { 1, 1, 1, 1 }; DRIVE drives[FDD_NUM]; @@ -99,9 +106,9 @@ d86f_handler_t d86f_handler[FDD_NUM]; static const struct { const char *ext; - void (*load)(int drive, char *fn); - void (*close)(int drive); - int size; + void (*load)(int drive, char *fn); + void (*close)(int drive); + int size; } loaders[] = { { "001", img_load, img_close, -1 }, { "002", img_load, img_close, -1 }, @@ -145,35 +152,35 @@ static const struct { const char *internal_name; } drive_types[] = { /* None */ - { 0, 0, "None", "none" }, + { 0, 0, "None", "none" }, /* 5.25" 1DD */ - { 43, FLAG_RPM_300 | FLAG_525 | FLAG_HOLE0, "5.25\" 180k", "525_1dd" }, + { 43, FLAG_RPM_300 | FLAG_525 | FLAG_HOLE0, "5.25\" 180k", "525_1dd" }, /* 5.25" DD */ - { 43, FLAG_RPM_300 | FLAG_525 | FLAG_DS | FLAG_HOLE0, "5.25\" 360k", "525_2dd" }, + { 43, FLAG_RPM_300 | FLAG_525 | FLAG_DS | FLAG_HOLE0, "5.25\" 360k", "525_2dd" }, /* 5.25" QD */ - { 86, FLAG_RPM_300 | FLAG_525 | FLAG_DS | FLAG_HOLE0 | FLAG_DOUBLE_STEP, "5.25\" 720k", "525_2qd" }, + { 86, FLAG_RPM_300 | FLAG_525 | FLAG_DS | FLAG_HOLE0 | FLAG_DOUBLE_STEP, "5.25\" 720k", "525_2qd" }, /* 5.25" HD */ - { 86, FLAG_RPM_360 | FLAG_525 | FLAG_DS | FLAG_HOLE0 | FLAG_HOLE1 | FLAG_DOUBLE_STEP | FLAG_PS2, "5.25\" 1.2M", "525_2hd" }, + { 86, FLAG_RPM_360 | FLAG_525 | FLAG_DS | FLAG_HOLE0 | FLAG_HOLE1 | FLAG_DOUBLE_STEP | FLAG_PS2, "5.25\" 1.2M", "525_2hd" }, /* 5.25" HD Dual RPM */ - { 86, FLAG_RPM_300 | FLAG_RPM_360 | FLAG_525 | FLAG_DS | FLAG_HOLE0 | FLAG_HOLE1 | FLAG_DOUBLE_STEP, "5.25\" 1.2M 300/360 RPM", "525_2hd_dualrpm" }, + { 86, FLAG_RPM_300 | FLAG_RPM_360 | FLAG_525 | FLAG_DS | FLAG_HOLE0 | FLAG_HOLE1 | FLAG_DOUBLE_STEP, "5.25\" 1.2M 300/360 RPM", "525_2hd_dualrpm" }, /* 3.5" 1DD */ - { 86, FLAG_RPM_300 | FLAG_HOLE0 | FLAG_DOUBLE_STEP, "3.5\" 360k", "35_1dd" }, + { 86, FLAG_RPM_300 | FLAG_HOLE0 | FLAG_DOUBLE_STEP, "3.5\" 360k", "35_1dd" }, /* 3.5" DD, Equivalent to TEAC FD-235F */ - { 86, FLAG_RPM_300 | FLAG_DS | FLAG_HOLE0 | FLAG_DOUBLE_STEP, "3.5\" 720k", "35_2dd" }, + { 86, FLAG_RPM_300 | FLAG_DS | FLAG_HOLE0 | FLAG_DOUBLE_STEP, "3.5\" 720k", "35_2dd" }, /* 3.5" HD, Equivalent to TEAC FD-235HF */ - { 86, FLAG_RPM_300 | FLAG_DS | FLAG_HOLE0 | FLAG_HOLE1 | FLAG_DOUBLE_STEP | FLAG_PS2, "3.5\" 1.44M", "35_2hd" }, + { 86, FLAG_RPM_300 | FLAG_DS | FLAG_HOLE0 | FLAG_HOLE1 | FLAG_DOUBLE_STEP | FLAG_PS2, "3.5\" 1.44M", "35_2hd" }, /* TODO: 3.5" DD, Equivalent to TEAC FD-235GF */ -// { 86, FLAG_RPM_300 | FLAG_RPM_360 | FLAG_DS | FLAG_HOLE0 | FLAG_HOLE1 | FLAG_DOUBLE_STEP, "3.5\" 1.25M", "35_2hd_2mode" }, + // { 86, FLAG_RPM_300 | FLAG_RPM_360 | FLAG_DS | FLAG_HOLE0 | FLAG_HOLE1 | FLAG_DOUBLE_STEP, "3.5\" 1.25M", "35_2hd_2mode" }, /* 3.5" HD PC-98 */ - { 86, FLAG_RPM_300 | FLAG_RPM_360 | FLAG_DS | FLAG_HOLE0 | FLAG_HOLE1 | FLAG_DOUBLE_STEP | FLAG_INVERT_DENSEL, "3.5\" 1.25M PC-98", "35_2hd_nec" }, + { 86, FLAG_RPM_300 | FLAG_RPM_360 | FLAG_DS | FLAG_HOLE0 | FLAG_HOLE1 | FLAG_DOUBLE_STEP | FLAG_INVERT_DENSEL, "3.5\" 1.25M PC-98", "35_2hd_nec" }, /* 3.5" HD 3-Mode, Equivalent to TEAC FD-235HG */ - { 86, FLAG_RPM_300 | FLAG_RPM_360 | FLAG_DS | FLAG_HOLE0 | FLAG_HOLE1 | FLAG_DOUBLE_STEP, "3.5\" 1.44M 300/360 RPM", "35_2hd_3mode" }, + { 86, FLAG_RPM_300 | FLAG_RPM_360 | FLAG_DS | FLAG_HOLE0 | FLAG_HOLE1 | FLAG_DOUBLE_STEP, "3.5\" 1.44M 300/360 RPM", "35_2hd_3mode" }, /* 3.5" ED, Equivalent to TEAC FD-235J */ - { 86, FLAG_RPM_300 | FLAG_DS | FLAG_HOLE0 | FLAG_HOLE1 | FLAG_HOLE2 | FLAG_DOUBLE_STEP, "3.5\" 2.88M", "35_2ed" }, + { 86, FLAG_RPM_300 | FLAG_DS | FLAG_HOLE0 | FLAG_HOLE1 | FLAG_HOLE2 | FLAG_DOUBLE_STEP, "3.5\" 2.88M", "35_2ed" }, /* 3.5" ED Dual RPM, Equivalent to TEAC FD-335J */ - { 86, FLAG_RPM_300 | FLAG_RPM_360 | FLAG_DS | FLAG_HOLE0 | FLAG_HOLE1 | FLAG_HOLE2 | FLAG_DOUBLE_STEP, "3.5\" 2.88M 300/360 RPM", "35_2ed_dualrpm" }, + { 86, FLAG_RPM_300 | FLAG_RPM_360 | FLAG_DS | FLAG_HOLE0 | FLAG_HOLE1 | FLAG_HOLE2 | FLAG_DOUBLE_STEP, "3.5\" 2.88M 300/360 RPM", "35_2ed_dualrpm" }, /* End of list */ - { -1, -1, "", "" } + { -1, -1, "", "" } }; #ifdef ENABLE_FDD_LOG @@ -182,11 +189,32 @@ int fdd_do_log = ENABLE_FDD_LOG; static void fdd_log(const char *fmt, ...) { - va_list ap; + va_list ap, ap_copy; + char timebuf[32]; + char fullbuf[1056]; // 32 + 1024 bytes for timestamp + message if (fdd_do_log) { + uint32_t ticks = plat_get_ticks(); + uint32_t seconds = ticks / 1000; + uint32_t milliseconds = ticks % 1000; + + snprintf(timebuf, sizeof(timebuf), "[%07u.%03u] ", seconds, milliseconds); + va_start(ap, fmt); - pclog_ex(fmt, ap); + va_copy(ap_copy, ap); + + strcpy(fullbuf, timebuf); + vsnprintf(fullbuf + strlen(timebuf), sizeof(fullbuf) - strlen(timebuf), fmt, ap_copy); + + va_end(ap_copy); + va_end(ap); + + va_start(ap, fmt); + va_end(ap); + + char *msg = fullbuf; + va_start(ap, fmt); + pclog_ex("%s", (va_list) &msg); va_end(ap); } } @@ -194,6 +222,24 @@ fdd_log(const char *fmt, ...) # define fdd_log(fmt, ...) #endif +void +fdd_set_audio_profile(int drive, int profile) +{ + if (drive < 0 || drive >= FDD_NUM) + return; + if (profile < 0 || profile >= FDD_AUDIO_PROFILE_MAX) + profile = 0; + fdd_audio_profile[drive] = profile; +} + +int +fdd_get_audio_profile(int drive) +{ + if (drive < 0 || drive >= FDD_NUM) + return 0; + return fdd_audio_profile[drive]; +} + char * fdd_getname(int type) { @@ -242,12 +288,26 @@ fdd_forced_seek(int drive, int track_diff) fdd_do_seek(drive, fdd[drive].track); } +static void +fdd_seek_complete_callback(void *priv) +{ + DRIVE *drive = (DRIVE *) priv; + + fdd_log("fdd_seek_complete_callback(drive=%d) - TIMER FIRED! seek_in_progress=1\n", drive->id); + fdd_log("Notifying FDC of seek completion\n"); + fdd_do_seek(drive->id, fdd[drive->id].track); + fdc_seek_complete_interrupt(fdd_fdc, drive->id); +} + void fdd_seek(int drive, int track_diff) { + fdd_log("fdd_seek(drive=%d, track_diff=%d)\n", drive, track_diff); if (!track_diff) return; + int old_track = fdd[drive].track; + fdd[drive].track += track_diff; if (fdd[drive].track < 0) @@ -258,12 +318,36 @@ fdd_seek(int drive, int track_diff) fdd_changed[drive] = 0; - fdd_do_seek(drive, fdd[drive].track); + /* Trigger appropriate audio for track movements */ + int actual_track_diff = abs(old_track - fdd[drive].track); + if (actual_track_diff == 1) { + /* Single track movement */ + fdd_audio_play_single_track_step(drive, old_track, fdd[drive].track); + } else if (actual_track_diff > 1) { + /* Multi-track seek */ + fdd_audio_play_multi_track_seek(drive, old_track, fdd[drive].track); + } + + if (old_track + track_diff < 0) { + fdd_do_seek(drive, fdd[drive].track); + return; + } + + if (!fdd_seek_timer[drive].callback) { + timer_add(&(fdd_seek_timer[drive]), fdd_seek_complete_callback, &drives[drive], 0); + } + + double initial_seek_time = FDC_FLAG_PCJR & fdd_fdc->flags ? 40000.0 : 15000.0; + double track_seek_time = FDC_FLAG_PCJR & fdd_fdc->flags ? 10000.0 : 6000.0; + uint64_t seek_time_us = (initial_seek_time + (abs(actual_track_diff) * track_seek_time)) * TIMER_USEC; + timer_set_delay_u64(&fdd_seek_timer[drive], seek_time_us); } int fdd_track0(int drive) { + fdd_log("fdd_track0(drive=%d)\n", drive); + /* If drive is disabled, TRK0 never gets set. */ if (!drive_types[fdd[drive].type].max_track) return 0; @@ -406,6 +490,7 @@ fdd_is_double_sided(int drive) void fdd_set_head(int drive, int head) { + fdd_log("fdd_set_head(%d, %d)\n", drive, head); if (head && !fdd_is_double_sided(drive)) fdd[drive].head = 0; else @@ -453,14 +538,13 @@ fdd_get_densel(int drive) void fdd_load(int drive, char *fn) { + fdd_log("fdd_load(%d, %s)\n", drive, fn); int c = 0; int size; const char *p; FILE *fp; int offs = 0; - fdd_log("FDD: loading drive %d with '%s'\n", drive, fn); - if (!fn) return; if (strstr(fn, "wp://") == fn) { @@ -493,7 +577,6 @@ fdd_load(int drive, char *fn) c++; } } - fdd_log("FDD: could not load '%s' %s\n", fn, p); drive_empty[drive] = 1; fdd_set_head(drive, 0); memset(floppyfns[drive], 0, sizeof(floppyfns[drive])); @@ -503,8 +586,6 @@ fdd_load(int drive, char *fn) void fdd_close(int drive) { - fdd_log("FDD: closing drive %d\n", drive); - d86f_stop(drive); /* Call this first of all to make sure the 86F poll is back to idle state. */ if (loaders[driveloaders[drive]].close) loaders[driveloaders[drive]].close(drive); @@ -546,11 +627,14 @@ fdd_byteperiod(int drive) void fdd_set_motor_enable(int drive, int motor_enable) { - /* I think here is where spin-up and spin-down should be implemented. */ - if (motor_enable && !motoron[drive]) + fdd_log("fdd_set_motor_enable(%d, %d)\n", drive, motor_enable); + fdd_audio_set_motor_enable(drive, motor_enable); + + if (motor_enable && !motoron[drive]) { timer_set_delay_u64(&fdd_poll_time[drive], fdd_byteperiod(drive)); - else if (!motor_enable) + } else if (!motor_enable && motoron[drive]) { timer_disable(&fdd_poll_time[drive]); + } motoron[drive] = motor_enable; } @@ -615,6 +699,7 @@ fdd_reset(void) void fdd_readsector(int drive, int sector, int track, int side, int density, int sector_size) { + fdd_log("fdd_readsector(%d, %d, %d, %d, %d, %d)\n", drive, sector, track, side, density, sector_size); if (drives[drive].readsector) drives[drive].readsector(drive, sector, track, side, density, sector_size); else @@ -624,6 +709,7 @@ fdd_readsector(int drive, int sector, int track, int side, int density, int sect void fdd_writesector(int drive, int sector, int track, int side, int density, int sector_size) { + fdd_log("fdd_writesector(%d, %d, %d, %d, %d, %d)\n", drive, sector, track, side, density, sector_size); if (drives[drive].writesector) drives[drive].writesector(drive, sector, track, side, density, sector_size); else @@ -688,10 +774,14 @@ fdd_init(void) for (i = 0; i < FDD_NUM; i++) { fdd_load(i, floppyfns[i]); } + + if (fdd_sounds_enabled) { + fdd_audio_init(); + } } void fdd_do_writeback(int drive) { d86f_handler[drive].writeback(drive); -} +} \ No newline at end of file diff --git a/src/floppy/fdd_audio.c b/src/floppy/fdd_audio.c new file mode 100644 index 000000000..9ef4bf991 --- /dev/null +++ b/src/floppy/fdd_audio.c @@ -0,0 +1,667 @@ +/* + * 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 floppy drive audio emulation. + * + * Authors: Toni Riikonen, + * + * Copyright 2025 Toni Riikonen. + */ +#include +#include +#include +#include +#include +#include + +#define HAVE_STDARG_H +#include <86box/86box.h> +#include <86box/timer.h> +#include <86box/fdd.h> +#include <86box/fdd_audio.h> +#include <86box/sound.h> +#include <86box/plat.h> +#include <86box/path.h> + +#ifndef DISABLE_FDD_AUDIO + +/* Audio sample structure */ +typedef struct { + const char *filename; + int16_t *buffer; + int samples; + float volume; +} audio_sample_t; + +/* Single step audio state */ +typedef struct { + int position; + int active; +} single_step_state_t; + +/* Multi-track seek audio state */ +typedef struct { + int position; + int active; + int duration_samples; + int from_track; + int to_track; +} multi_seek_state_t; + +/* Drive type specific audio samples */ +typedef struct { + audio_sample_t spindlemotor_start; + audio_sample_t spindlemotor_loop; + audio_sample_t spindlemotor_stop; + audio_sample_t single_track_step; + audio_sample_t multi_track_seek; +} drive_audio_samples_t; + +/* 5.25" Teac FD-55GFR sample set */ +static drive_audio_samples_t samples_teac = { + .spindlemotor_start = { + .filename = "TeacFD-55GFR_5.25_1.2MB_motor_start_48000_16_1_PCM.wav", + .buffer = NULL, .samples = 0, .volume = 3.0f + }, + .spindlemotor_loop = { + .filename = "TeacFD-55GFR_5.25_1.2MB_motor_loop_48000_16_1_PCM.wav", + .buffer = NULL, .samples = 0, .volume = 3.0f + }, + .spindlemotor_stop = { + .filename = "TeacFD-55GFR_5.25_1.2MB_motor_stop_48000_16_1_PCM.wav", + .buffer = NULL, .samples = 0, .volume = 3.0f + }, + .single_track_step = { + .filename = "TeacFD-55GFR_5.25_1.2MB_track_step_48000_16_1_PCM.wav", + .buffer = NULL, .samples = 0, .volume = 2.0f + }, + .multi_track_seek = { + .filename = "TeacFD-55GFR_5.25_1.2MB_seekupdown_80_tracks1100ms_48000_16_1_PCM.wav", + .buffer = NULL, .samples = 0, .volume = 2.0f + } +}; + +/* 3.5" drive audio samples (Mitsumi) */ +static drive_audio_samples_t samples_35 = { + .spindlemotor_start = { + .filename = "mitsumi_spindle_motor_start_48000_16_1_PCM.wav", + .buffer = NULL, .samples = 0, .volume = 0.2f + }, + .spindlemotor_loop = { + .filename = "mitsumi_spindle_motor_loop_48000_16_1_PCM.wav", + .buffer = NULL, .samples = 0, .volume = 0.2f + }, + .spindlemotor_stop = { + .filename = "mitsumi_spindle_motor_stop_48000_16_1_PCM.wav", + .buffer = NULL, .samples = 0, .volume = 0.2f + }, + .single_track_step = { + .filename = "mitsumi_track_step_48000_16_1_PCM.wav", + .buffer = NULL, .samples = 0, .volume = 1.0f + }, + .multi_track_seek = { + .filename = "mitsumi_seek_80_tracks_495ms_48000_16_1_PCM.wav", + .buffer = NULL, .samples = 0, .volume = 1.0f + } +}; + +/* 5.25" drive audio samples (Panasonic) */ +static drive_audio_samples_t samples_525 = { + .spindlemotor_start = { + .filename = "Panasonic_JU-475-5_5.25_1.2MB_motor_start_48000_16_1_PCM.wav", + .buffer = NULL, .samples = 0, .volume = 1.0f + }, + .spindlemotor_loop = { + .filename = "Panasonic_JU-475-5_5.25_1.2MB_motor_loop_48000_16_1_PCM.wav", + .buffer = NULL, .samples = 0, .volume = 1.0f + }, + .spindlemotor_stop = { + .filename = "Panasonic_JU-475-5_5.25_1.2MB_motor_stop_48000_16_1_PCM.wav", + .buffer = NULL, .samples = 0, .volume = 1.0f + }, + .single_track_step = { + .filename = "Panasonic_JU-475-5_5.25_1.2MB_track_step_48000_16_1_PCM.wav", + .buffer = NULL, .samples = 0, .volume = 2.0f + }, + .multi_track_seek = { + .filename = "Panasonic_JU-475-5_5.25_1.2MB_seekup_40_tracks_285ms_5ms_per_track_48000_16_1_PCM.wav", + .buffer = NULL, .samples = 0, .volume = 2.0f + } +}; + +/* Audio state for each drive */ +static int spindlemotor_pos[FDD_NUM] = {}; +static motor_state_t spindlemotor_state[FDD_NUM] = {}; +static float spindlemotor_fade_volume[FDD_NUM] = {}; +static int spindlemotor_fade_samples_remaining[FDD_NUM] = {}; + +/* Single step audio state for each drive */ +static single_step_state_t single_step_state[FDD_NUM] = {}; + +/* Multi-track seek audio state for each drive */ +static multi_seek_state_t multi_seek_state[FDD_NUM] = {}; + +extern uint64_t motoron[FDD_NUM]; +extern char exe_path[2048]; /* path (dir) of executable */ + +extern int fdd_get_audio_profile(int drive); /* from fdd.h */ + +/* Forward declaration */ +static int16_t *load_wav(const char *filename, int *sample_count); + + +static drive_audio_samples_t * +get_drive_samples(int drive) +{ + switch (fdd_get_audio_profile(drive)) { + case FDD_AUDIO_PROFILE_PANASONIC: + return &samples_525; + case FDD_AUDIO_PROFILE_TEAC: + return &samples_teac; + case FDD_AUDIO_PROFILE_MITSUMI: + return &samples_35; + default: + return NULL; + } +} + +static int16_t * +load_wav(const char *filename, int *sample_count) +{ + FILE *f = NULL; + char full_path[2048]; + + if (!filename || strlen(filename) == 0) { + return NULL; + } + + if (strstr(filename, "..") != NULL || strchr(filename, '/') != NULL || strchr(filename, '\\') != NULL) { + return NULL; + } + + for (const char *p = filename; *p; p++) { + if (!isalnum(*p) && *p != '.' && *p != '_' && *p != '-') { + return NULL; + } + } + + path_append_filename(full_path, exe_path, "roms"); + path_append_filename(full_path, full_path, "samples"); + path_append_filename(full_path, full_path, "fdd"); + path_append_filename(full_path, full_path, filename); + f = fopen(full_path, "rb"); + if (!f) { + path_append_filename(full_path, exe_path, "samples"); + path_append_filename(full_path, full_path, filename); + f = fopen(full_path, "rb"); + if (!f) + return NULL; + } + + wav_header_t hdr; + if (fread(&hdr, sizeof(hdr), 1, f) != 1) { + fclose(f); + return NULL; + } + + if (memcmp(hdr.riff, "RIFF", 4) || memcmp(hdr.wave, "WAVE", 4) || memcmp(hdr.fmt, "fmt ", 4) || memcmp(hdr.data, "data", 4)) { + fclose(f); + return NULL; + } + + /* Accept both mono and stereo, 16-bit PCM */ + if (hdr.audio_format != 1 || hdr.bits_per_sample != 16 || (hdr.num_channels != 1 && hdr.num_channels != 2)) { + fclose(f); + return NULL; + } + + int input_samples = hdr.data_size / 2; /* 2 bytes per sample */ + int16_t *input_data = malloc(hdr.data_size); + if (!input_data) { + fclose(f); + return NULL; + } + + if (fread(input_data, 1, hdr.data_size, f) != hdr.data_size) { + free(input_data); + fclose(f); + return NULL; + } + fclose(f); + + int16_t *output_data; + int output_samples; + + if (hdr.num_channels == 1) { + /* Convert mono to stereo */ + output_samples = input_samples; /* Number of stereo sample pairs */ + output_data = malloc(input_samples * 2 * sizeof(int16_t)); /* Allocate for stereo */ + if (!output_data) { + free(input_data); + return NULL; + } + + /* Convert mono to stereo by duplicating each sample */ + for (int i = 0; i < input_samples; i++) { + output_data[i * 2] = input_data[i]; /* Left channel */ + output_data[i * 2 + 1] = input_data[i]; /* Right channel */ + } + + free(input_data); + } else { + /* Already stereo */ + output_data = input_data; + output_samples = input_samples / 2; /* Number of stereo sample pairs */ + } + + if (sample_count) + *sample_count = output_samples; + + return output_data; +} + +void +fdd_audio_init(void) +{ + int i; + + /* Load audio samples for both drive types */ + samples_35.spindlemotor_start.buffer = load_wav(samples_35.spindlemotor_start.filename, &samples_35.spindlemotor_start.samples); + samples_35.spindlemotor_loop.buffer = load_wav(samples_35.spindlemotor_loop.filename, &samples_35.spindlemotor_loop.samples); + samples_35.spindlemotor_stop.buffer = load_wav(samples_35.spindlemotor_stop.filename, &samples_35.spindlemotor_stop.samples); + samples_35.single_track_step.buffer = load_wav(samples_35.single_track_step.filename, &samples_35.single_track_step.samples); + samples_35.multi_track_seek.buffer = load_wav(samples_35.multi_track_seek.filename, &samples_35.multi_track_seek.samples); + + samples_525.spindlemotor_start.buffer = load_wav(samples_525.spindlemotor_start.filename, &samples_525.spindlemotor_start.samples); + samples_525.spindlemotor_loop.buffer = load_wav(samples_525.spindlemotor_loop.filename, &samples_525.spindlemotor_loop.samples); + samples_525.spindlemotor_stop.buffer = load_wav(samples_525.spindlemotor_stop.filename, &samples_525.spindlemotor_stop.samples); + samples_525.single_track_step.buffer = load_wav(samples_525.single_track_step.filename, &samples_525.single_track_step.samples); + samples_525.multi_track_seek.buffer = load_wav(samples_525.multi_track_seek.filename, &samples_525.multi_track_seek.samples); + + samples_teac.spindlemotor_start.buffer = load_wav(samples_teac.spindlemotor_start.filename, &samples_teac.spindlemotor_start.samples); + samples_teac.spindlemotor_loop.buffer = load_wav(samples_teac.spindlemotor_loop.filename, &samples_teac.spindlemotor_loop.samples); + samples_teac.spindlemotor_stop.buffer = load_wav(samples_teac.spindlemotor_stop.filename, &samples_teac.spindlemotor_stop.samples); + samples_teac.single_track_step.buffer = load_wav(samples_teac.single_track_step.filename, &samples_teac.single_track_step.samples); + samples_teac.multi_track_seek.buffer = load_wav(samples_teac.multi_track_seek.filename, &samples_teac.multi_track_seek.samples); + + /* Initialize audio state for all drives */ + for (i = 0; i < FDD_NUM; i++) { + spindlemotor_pos[i] = 0; + spindlemotor_state[i] = MOTOR_STATE_STOPPED; + spindlemotor_fade_volume[i] = 1.0f; + spindlemotor_fade_samples_remaining[i] = 0; + + /* Initialize single step state */ + single_step_state[i].position = 0; + single_step_state[i].active = 0; + + /* Initialize multi-track seek state */ + multi_seek_state[i].position = 0; + multi_seek_state[i].active = 0; + multi_seek_state[i].duration_samples = 0; + multi_seek_state[i].from_track = -1; + multi_seek_state[i].to_track = -1; + } + + /* Initialize sound thread */ + sound_fdd_thread_init(); +} + +void +fdd_audio_close(void) +{ + /* Free 3.5" samples */ + if (samples_35.spindlemotor_start.buffer) { + free(samples_35.spindlemotor_start.buffer); + samples_35.spindlemotor_start.buffer = NULL; + samples_35.spindlemotor_start.samples = 0; + } + if (samples_35.spindlemotor_loop.buffer) { + free(samples_35.spindlemotor_loop.buffer); + samples_35.spindlemotor_loop.buffer = NULL; + samples_35.spindlemotor_loop.samples = 0; + } + if (samples_35.spindlemotor_stop.buffer) { + free(samples_35.spindlemotor_stop.buffer); + samples_35.spindlemotor_stop.buffer = NULL; + samples_35.spindlemotor_stop.samples = 0; + } + if (samples_35.single_track_step.buffer) { + free(samples_35.single_track_step.buffer); + samples_35.single_track_step.buffer = NULL; + samples_35.single_track_step.samples = 0; + } + if (samples_35.multi_track_seek.buffer) { + free(samples_35.multi_track_seek.buffer); + samples_35.multi_track_seek.buffer = NULL; + samples_35.multi_track_seek.samples = 0; + } + + /* Free 5.25" samples */ + if (samples_525.spindlemotor_start.buffer) { + free(samples_525.spindlemotor_start.buffer); + samples_525.spindlemotor_start.buffer = NULL; + samples_525.spindlemotor_start.samples = 0; + } + if (samples_525.spindlemotor_loop.buffer) { + free(samples_525.spindlemotor_loop.buffer); + samples_525.spindlemotor_loop.buffer = NULL; + samples_525.spindlemotor_loop.samples = 0; + } + if (samples_525.spindlemotor_stop.buffer) { + free(samples_525.spindlemotor_stop.buffer); + samples_525.spindlemotor_stop.buffer = NULL; + samples_525.spindlemotor_stop.samples = 0; + } + if (samples_525.single_track_step.buffer) { + free(samples_525.single_track_step.buffer); + samples_525.single_track_step.buffer = NULL; + samples_525.single_track_step.samples = 0; + } + if (samples_525.multi_track_seek.buffer) { + free(samples_525.multi_track_seek.buffer); + samples_525.multi_track_seek.buffer = NULL; + samples_525.multi_track_seek.samples = 0; + } + + if (samples_teac.spindlemotor_start.buffer) { + free(samples_teac.spindlemotor_start.buffer); + samples_teac.spindlemotor_start.buffer = NULL; + samples_teac.spindlemotor_start.samples = 0; + } + if (samples_teac.spindlemotor_loop.buffer) { + free(samples_teac.spindlemotor_loop.buffer); + samples_teac.spindlemotor_loop.buffer = NULL; + samples_teac.spindlemotor_loop.samples = 0; + } + if (samples_teac.spindlemotor_stop.buffer) { + free(samples_teac.spindlemotor_stop.buffer); + samples_teac.spindlemotor_stop.buffer = NULL; + samples_teac.spindlemotor_stop.samples = 0; + } + if (samples_teac.single_track_step.buffer) { + free(samples_teac.single_track_step.buffer); + samples_teac.single_track_step.buffer = NULL; + samples_teac.single_track_step.samples = 0; + } + if (samples_teac.multi_track_seek.buffer) { + free(samples_teac.multi_track_seek.buffer); + samples_teac.multi_track_seek.buffer = NULL; + samples_teac.multi_track_seek.samples = 0; + } + + /* End sound thread */ + sound_fdd_thread_end(); +} + +void +fdd_audio_set_motor_enable(int drive, int motor_enable) +{ + if (!fdd_sounds_enabled) + return; + + drive_audio_samples_t *samples = get_drive_samples(drive); + if (!samples) + return; + + if (motor_enable && !motoron[drive]) { + /* Motor starting up */ + if (spindlemotor_state[drive] == MOTOR_STATE_STOPPING) { + /* Interrupt stop sequence and transition back to loop */ + spindlemotor_state[drive] = MOTOR_STATE_RUNNING; + spindlemotor_pos[drive] = 0; + spindlemotor_fade_volume[drive] = 1.0f; + spindlemotor_fade_samples_remaining[drive] = 0; + } else { + /* Normal startup */ + spindlemotor_state[drive] = MOTOR_STATE_STARTING; + spindlemotor_pos[drive] = 0; + spindlemotor_fade_volume[drive] = 1.0f; + spindlemotor_fade_samples_remaining[drive] = 0; + } + } else if (!motor_enable && motoron[drive]) { + /* Motor stopping */ + spindlemotor_state[drive] = MOTOR_STATE_STOPPING; + spindlemotor_pos[drive] = 0; + spindlemotor_fade_volume[drive] = 1.0f; + spindlemotor_fade_samples_remaining[drive] = FADE_SAMPLES; + } +} + +void +fdd_audio_play_single_track_step(int drive, int from_track, int to_track) +{ + if (!fdd_sounds_enabled) + return; + + if (drive < 0 || drive >= FDD_NUM) + return; + if (abs(from_track - to_track) != 1) + return; /* Only single track movements */ + + single_step_state[drive].position = 0; + single_step_state[drive].active = 1; +} + +void +fdd_audio_play_multi_track_seek(int drive, int from_track, int to_track) +{ + if (!fdd_sounds_enabled) + return; + + if (drive < 0 || drive >= FDD_NUM) + return; + + int track_diff = abs(from_track - to_track); + if (track_diff <= 1) + return; /* Use single step for 1 track movements */ + + drive_audio_samples_t *samples = get_drive_samples(drive); + if (!samples || !samples->multi_track_seek.buffer || samples->multi_track_seek.samples == 0) + return; /* No multi-track seek sample loaded */ + + /* Check if a seek is already active */ + if (multi_seek_state[drive].active && + multi_seek_state[drive].from_track == from_track && + multi_seek_state[drive].to_track == to_track) { + return; + } + + /* Calculate duration based on drive type */ + int duration_samples; + if (fdd_is_525(drive)) { + /* 5.25": 285ms for 40 tracks = 7.125ms per track at 48kHz sample rate */ + /* 7.125ms = 0.007125s, at 48000 Hz = 342 samples per track */ + duration_samples = track_diff * 342; + } else { + /* 3.5": 495ms for 80 tracks = 6.1875ms per track at 48kHz sample rate */ + /* 6.1875ms = 0.0061875s, at 48000 Hz = 297 samples per track */ + duration_samples = track_diff * 297; + } + + /* Clamp to maximum available sample length */ + if (duration_samples > samples->multi_track_seek.samples) + duration_samples = samples->multi_track_seek.samples; + + /* Start new seek (or restart interrupted seek) */ + multi_seek_state[drive].position = 0; + multi_seek_state[drive].active = 1; + multi_seek_state[drive].duration_samples = duration_samples; + multi_seek_state[drive].from_track = from_track; + multi_seek_state[drive].to_track = to_track; +} + +void +fdd_audio_callback(int16_t *buffer, int length) +{ + /* Clear buffer */ + memset(buffer, 0, length * sizeof(int16_t)); + /* Check if any motor is running or transitioning, or any audio is active */ + int any_audio_active = 0; + for (int drive = 0; drive < FDD_NUM; drive++) { + if (spindlemotor_state[drive] != MOTOR_STATE_STOPPED || + single_step_state[drive].active || + multi_seek_state[drive].active) { + any_audio_active = 1; + break; + } + } + + if (!any_audio_active) + return; + + float *float_buffer = (float *) buffer; + int samples_in_buffer = length / 2; + + /* Process audio for all drives */ + for (int drive = 0; drive < FDD_NUM; drive++) { + drive_audio_samples_t *samples = get_drive_samples(drive); + if (!samples) + continue; + + for (int i = 0; i < samples_in_buffer; i++) { + float left_sample = 0.0f; + float right_sample = 0.0f; + + /* Process motor audio */ + if (spindlemotor_state[drive] != MOTOR_STATE_STOPPED) { + switch (spindlemotor_state[drive]) { + case MOTOR_STATE_STARTING: + if (samples->spindlemotor_start.buffer && spindlemotor_pos[drive] < samples->spindlemotor_start.samples) { + /* Play start sound with volume control */ + left_sample = (float) samples->spindlemotor_start.buffer[spindlemotor_pos[drive] * 2] / 32768.0f * samples->spindlemotor_start.volume; + right_sample = (float) samples->spindlemotor_start.buffer[spindlemotor_pos[drive] * 2 + 1] / 32768.0f * samples->spindlemotor_start.volume; + spindlemotor_pos[drive]++; + } else { + /* Start sound finished, transition to loop */ + spindlemotor_state[drive] = MOTOR_STATE_RUNNING; + spindlemotor_pos[drive] = 0; + } + break; + + case MOTOR_STATE_RUNNING: + if (samples->spindlemotor_loop.buffer && samples->spindlemotor_loop.samples > 0) { + /* Play loop sound with volume control */ + left_sample = (float) samples->spindlemotor_loop.buffer[spindlemotor_pos[drive] * 2] / 32768.0f * samples->spindlemotor_loop.volume; + right_sample = (float) samples->spindlemotor_loop.buffer[spindlemotor_pos[drive] * 2 + 1] / 32768.0f * samples->spindlemotor_loop.volume; + spindlemotor_pos[drive]++; + + /* Loop back to beginning */ + if (spindlemotor_pos[drive] >= samples->spindlemotor_loop.samples) { + spindlemotor_pos[drive] = 0; + } + } + break; + + case MOTOR_STATE_STOPPING: + if (spindlemotor_fade_samples_remaining[drive] > 0) { + /* Mix fading loop sound with rising stop sound */ + float loop_volume = spindlemotor_fade_volume[drive]; + float stop_volume = 1.0f - loop_volume; + + float loop_left = 0.0f, loop_right = 0.0f; + float stop_left = 0.0f, stop_right = 0.0f; + + /* Get loop sample (continue from current position) with volume control */ + if (samples->spindlemotor_loop.buffer && samples->spindlemotor_loop.samples > 0) { + int loop_pos = spindlemotor_pos[drive] % samples->spindlemotor_loop.samples; + loop_left = (float) samples->spindlemotor_loop.buffer[loop_pos * 2] / 32768.0f * samples->spindlemotor_loop.volume; + loop_right = (float) samples->spindlemotor_loop.buffer[loop_pos * 2 + 1] / 32768.0f * samples->spindlemotor_loop.volume; + } + + /* Get stop sample with volume control */ + if (samples->spindlemotor_stop.buffer && spindlemotor_pos[drive] < samples->spindlemotor_stop.samples) { + stop_left = (float) samples->spindlemotor_stop.buffer[spindlemotor_pos[drive] * 2] / 32768.0f * samples->spindlemotor_stop.volume; + stop_right = (float) samples->spindlemotor_stop.buffer[spindlemotor_pos[drive] * 2 + 1] / 32768.0f * samples->spindlemotor_stop.volume; + } + + /* Mix the sounds */ + left_sample = loop_left * loop_volume + stop_left * stop_volume; + right_sample = loop_right * loop_volume + stop_right * stop_volume; + + spindlemotor_pos[drive]++; + spindlemotor_fade_samples_remaining[drive]--; + + /* Update fade volume */ + spindlemotor_fade_volume[drive] = (float) spindlemotor_fade_samples_remaining[drive] / FADE_SAMPLES; + } else { + /* Fade completed, play remaining stop sound with volume control */ + if (samples->spindlemotor_stop.buffer && spindlemotor_pos[drive] < samples->spindlemotor_stop.samples) { + left_sample = (float) samples->spindlemotor_stop.buffer[spindlemotor_pos[drive] * 2] / 32768.0f * samples->spindlemotor_stop.volume; + right_sample = (float) samples->spindlemotor_stop.buffer[spindlemotor_pos[drive] * 2 + 1] / 32768.0f * samples->spindlemotor_stop.volume; + spindlemotor_pos[drive]++; + } else { + /* Stop sound finished */ + spindlemotor_state[drive] = MOTOR_STATE_STOPPED; + /* Note: Timer disabling is handled by fdd.c, not here */ + } + } + break; + + default: + break; + } + } + + /* Process single step audio */ + if (single_step_state[drive].active) { + if (samples->single_track_step.buffer && single_step_state[drive].position < samples->single_track_step.samples) { + /* Mix step sound with motor sound with volume control */ + float step_left = (float) samples->single_track_step.buffer[single_step_state[drive].position * 2] / 32768.0f * samples->single_track_step.volume; + float step_right = (float) samples->single_track_step.buffer[single_step_state[drive].position * 2 + 1] / 32768.0f * samples->single_track_step.volume; + + left_sample += step_left; + right_sample += step_right; + + single_step_state[drive].position++; + } else { + /* Step sound finished */ + single_step_state[drive].active = 0; + single_step_state[drive].position = 0; + } + } + + /* Process multi-track seek audio */ + if (multi_seek_state[drive].active) { + if (samples->multi_track_seek.buffer && + multi_seek_state[drive].position < multi_seek_state[drive].duration_samples && + multi_seek_state[drive].position < samples->multi_track_seek.samples) { + /* Mix seek sound with motor sound with volume control */ + float seek_left = (float) samples->multi_track_seek.buffer[multi_seek_state[drive].position * 2] / 32768.0f * samples->multi_track_seek.volume; + float seek_right = (float) samples->multi_track_seek.buffer[multi_seek_state[drive].position * 2 + 1] / 32768.0f * samples->multi_track_seek.volume; + + left_sample += seek_left; + right_sample += seek_right; + + multi_seek_state[drive].position++; + } else { + /* Seek sound finished */ + multi_seek_state[drive].active = 0; + multi_seek_state[drive].position = 0; + multi_seek_state[drive].duration_samples = 0; + multi_seek_state[drive].from_track = -1; + multi_seek_state[drive].to_track = -1; + } + } + + /* Mix this drive's audio into the buffer */ + float_buffer[i * 2] += left_sample; + float_buffer[i * 2 + 1] += right_sample; + } + } +} +#else + +void fdd_audio_init(void) {} +void fdd_audio_close(void) {} +void fdd_audio_set_motor_enable(int drive, int motor_enable) { (void) drive; (void) motor_enable; } +void fdd_audio_play_single_track_step(int drive, int from_track, int to_track) { (void) drive; (void) from_track; (void) to_track; } +void fdd_audio_play_multi_track_seek(int drive, int from_track, int to_track) { (void) drive; (void) from_track; (void) to_track; } +void fdd_audio_callback(int16_t *buffer, int length) { memset(buffer, 0, length * sizeof(int16_t)); } + +#endif /* DISABLE_FDD_AUDIO */ \ No newline at end of file diff --git a/src/include/86box/86box.h b/src/include/86box/86box.h index 701e93e28..6c924e031 100644 --- a/src/include/86box/86box.h +++ b/src/include/86box/86box.h @@ -219,6 +219,7 @@ extern int monitor_edid; /* (C) Which EDID to use. 0=default, extern char monitor_edid_path[1024]; /* (C) Path to custom EDID */ extern int color_scheme; /* (C) Color scheme of UI (Windows-only) */ +extern int fdd_sounds_enabled; /* (C) Enable floppy drive sounds */ #ifndef USE_NEW_DYNAREC extern FILE *stdlog; /* file to log output to */ diff --git a/src/include/86box/fdc.h b/src/include/86box/fdc.h index cd1e58db7..06ccafa39 100644 --- a/src/include/86box/fdc.h +++ b/src/include/86box/fdc.h @@ -14,10 +14,12 @@ * Authors: Sarah Walker, * Miran Grca, * Fred N. van Kempen, + * Toni Riikonen, * * Copyright 2008-2020 Sarah Walker. * Copyright 2016-2020 Miran Grca. * Copyright 2018-2020 Fred N. van Kempen. + * Copyright 2025 Toni Riikonen. */ #ifndef EMU_FDC_H #define EMU_FDC_H @@ -251,6 +253,7 @@ extern uint8_t fdc_read(uint16_t addr, void *priv); extern void fdc_reset(void *priv); extern uint8_t fdc_get_current_drive(void); +extern void fdc_seek_complete_interrupt(fdc_t *fdc, int drive); #ifdef EMU_DEVICE_H extern const device_t fdc_xt_device; diff --git a/src/include/86box/fdd.h b/src/include/86box/fdd.h index d6ade3bc6..b73365de2 100644 --- a/src/include/86box/fdd.h +++ b/src/include/86box/fdd.h @@ -11,10 +11,12 @@ * Authors: Sarah Walker, * Miran Grca, * Fred N. van Kempen, + * Toni Riikonen, * * Copyright 2008-2025 Sarah Walker. * Copyright 2016-2025 Miran Grca. * Copyright 2018-2025 Fred N. van Kempen. + * Copyright 2025 Toni Riikonen. */ #ifndef EMU_FDD_H #define EMU_FDD_H @@ -23,6 +25,13 @@ #define FLOPPY_IMAGE_HISTORY 10 #define SEEK_RECALIBRATE -999 +/* Per-drive audio profiles */ +#define FDD_AUDIO_PROFILE_NONE 0 +#define FDD_AUDIO_PROFILE_MITSUMI 1 +#define FDD_AUDIO_PROFILE_PANASONIC 2 +#define FDD_AUDIO_PROFILE_TEAC 3 +#define FDD_AUDIO_PROFILE_MAX 4 + #ifdef __cplusplus extern "C" { #endif @@ -53,6 +62,10 @@ extern int fdd_get_check_bpb(int drive); extern void fdd_set_type(int drive, int type); extern int fdd_get_type(int drive); +/* New audio profile accessors */ +extern void fdd_set_audio_profile(int drive, int profile); +extern int fdd_get_audio_profile(int drive); + extern int fdd_get_flags(int drive); extern int fdd_get_densel(int drive); diff --git a/src/include/86box/fdd_audio.h b/src/include/86box/fdd_audio.h new file mode 100644 index 000000000..acd4e9350 --- /dev/null +++ b/src/include/86box/fdd_audio.h @@ -0,0 +1,86 @@ +/* + * 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. + * + * Definitions for the floppy drive audio emulation. + * + * Authors: Toni Riikonen, + * + * Copyright 2025 Toni Riikonen. + */ +#ifndef EMU_FDD_AUDIO_H +#define EMU_FDD_AUDIO_H + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef DISABLE_FDD_AUDIO + +/* Motor sound states */ +typedef enum { + MOTOR_STATE_STOPPED = 0, + MOTOR_STATE_STARTING, + MOTOR_STATE_RUNNING, + MOTOR_STATE_STOPPING +} motor_state_t; + +/* WAV header structure */ +typedef struct { + char riff[4]; + uint32_t size; + char wave[4]; + char fmt[4]; + uint32_t fmt_size; + uint16_t audio_format; + uint16_t num_channels; + uint32_t sample_rate; + uint32_t byte_rate; + uint16_t block_align; + uint16_t bits_per_sample; + char data[4]; + uint32_t data_size; +} wav_header_t; + +/* Fade duration: 75ms at 48kHz = 3600 samples */ +#define FADE_DURATION_MS 75 +#define FADE_SAMPLES (48000 * FADE_DURATION_MS / 1000) + +#else + +typedef enum { + MOTOR_STATE_STOPPED = 0 +} motor_state_t; + +#endif /* DISABLE_FDD_AUDIO */ + +/* FDD audio initialization and cleanup */ +extern void fdd_audio_init(void); +extern void fdd_audio_close(void); + +/* Motor control for audio */ +extern void fdd_audio_set_motor_enable(int drive, int motor_enable); + +/* Single sector movement audio */ +extern void fdd_audio_play_single_track_step(int drive, int from_track, int to_track); + +/* Multi-track seek audio */ +extern void fdd_audio_play_multi_track_seek(int drive, int from_track, int to_track); + +/* Audio callback function */ +extern void fdd_audio_callback(int16_t *buffer, int length); + +/* State name helper function */ +extern const char *fdd_audio_motor_state_name(motor_state_t state); + +#ifdef __cplusplus +} +#endif + +#endif /*EMU_FDD_AUDIO_H*/ \ No newline at end of file diff --git a/src/include/86box/sound.h b/src/include/86box/sound.h index bbd2ff820..5815d3f66 100644 --- a/src/include/86box/sound.h +++ b/src/include/86box/sound.h @@ -103,12 +103,16 @@ extern void sound_card_reset(void); extern void sound_cd_thread_end(void); extern void sound_cd_thread_reset(void); +extern void sound_fdd_thread_init(void); +extern void sound_fdd_thread_end(void); + extern void closeal(void); extern void inital(void); extern void givealbuffer(const void *buf); extern void givealbuffer_music(const void *buf); extern void givealbuffer_wt(const void *buf); extern void givealbuffer_cd(const void *buf); +extern void givealbuffer_fdd(const void *buf, const uint32_t size); #define sb_vibra16c_onboard_relocate_base sb_vibra16s_onboard_relocate_base #define sb_vibra16cl_onboard_relocate_base sb_vibra16s_onboard_relocate_base diff --git a/src/qt/qt_settingsfloppycdrom.cpp b/src/qt/qt_settingsfloppycdrom.cpp index 588b1aff9..6ec130044 100644 --- a/src/qt/qt_settingsfloppycdrom.cpp +++ b/src/qt/qt_settingsfloppycdrom.cpp @@ -129,11 +129,12 @@ SettingsFloppyCDROM::SettingsFloppyCDROM(QWidget *parent) ++i; } - model = new QStandardItemModel(0, 3, this); + model = new QStandardItemModel(0, 4, this); ui->tableViewFloppy->setModel(model); model->setHeaderData(0, Qt::Horizontal, tr("Type")); model->setHeaderData(1, Qt::Horizontal, tr("Turbo")); model->setHeaderData(2, Qt::Horizontal, tr("Check BPB")); + model->setHeaderData(3, Qt::Horizontal, tr("Audio")); model->insertRows(0, FDD_NUM); /* Floppy drives category */ @@ -143,6 +144,26 @@ SettingsFloppyCDROM::SettingsFloppyCDROM(QWidget *parent) setFloppyType(model, idx, type); model->setData(idx.siblingAtColumn(1), fdd_get_turbo(i) > 0 ? tr("On") : tr("Off")); model->setData(idx.siblingAtColumn(2), fdd_get_check_bpb(i) > 0 ? tr("On") : tr("Off")); + + int prof = fdd_get_audio_profile(i); + QString profName; + switch (prof) { + case FDD_AUDIO_PROFILE_PANASONIC: + profName = tr("Panasonic"); + break; + case FDD_AUDIO_PROFILE_TEAC: + profName = tr("Teac"); + break; + case FDD_AUDIO_PROFILE_MITSUMI: + profName = tr("Mitsumi"); + break; + default: + profName = tr("None"); + break; + } + auto audioIdx = model->index(i, 3); + model->setData(audioIdx, profName); + model->setData(audioIdx, prof, Qt::UserRole); } ui->tableViewFloppy->resizeColumnsToContents(); @@ -150,7 +171,22 @@ SettingsFloppyCDROM::SettingsFloppyCDROM(QWidget *parent) connect(ui->tableViewFloppy->selectionModel(), &QItemSelectionModel::currentRowChanged, this, &SettingsFloppyCDROM::onFloppyRowChanged); + +#ifndef DISABLE_FDD_AUDIO + ui->comboBoxFloppyAudio->setVisible(true); + ui->comboBoxFloppyAudio->addItem(tr("None"), FDD_AUDIO_PROFILE_NONE); + ui->comboBoxFloppyAudio->addItem(tr("Generic Mitsumi 3.5\" 1.44MB"), FDD_AUDIO_PROFILE_MITSUMI); + ui->comboBoxFloppyAudio->addItem(tr("Panasonic JU-475-5 5.25\" 1.2MB"), FDD_AUDIO_PROFILE_PANASONIC); + ui->comboBoxFloppyAudio->addItem(tr("Teac FD-55GFR 5.25\" 1.2MB"), FDD_AUDIO_PROFILE_TEAC); + ui->comboBoxFloppyAudio->setSizeAdjustPolicy(QComboBox::AdjustToContents); +#else + ui->comboBoxFloppyAudio->setVisible(false); +#endif + + // Set initial selection and trigger the row changed event to update controls ui->tableViewFloppy->setCurrentIndex(model->index(0, 0)); + // Manually trigger the row changed event to ensure audio selection is updated + onFloppyRowChanged(model->index(0, 0)); cdrom_disabled_icon = QIcon(":/settings/qt/icons/cdrom_disabled.ico"); cdrom_icon = QIcon(":/settings/qt/icons/cdrom.ico"); @@ -233,6 +269,9 @@ SettingsFloppyCDROM::save() fdd_set_type(i, model->index(i, 0).data(Qt::UserRole).toInt()); fdd_set_turbo(i, model->index(i, 1).data() == tr("On") ? 1 : 0); fdd_set_check_bpb(i, model->index(i, 2).data() == tr("On") ? 1 : 0); +#ifndef DISABLE_FDD_AUDIO + fdd_set_audio_profile(i, model->index(i, 3).data(Qt::UserRole).toInt()); +#endif } /* Removable devices category */ @@ -250,6 +289,12 @@ SettingsFloppyCDROM::save() cdrom[i].speed = model->index(i, 1).data(Qt::UserRole).toUInt(); cdrom_set_type(i, model->index(i, 2).data(Qt::UserRole).toInt()); } + +#ifdef DISABLE_FDD_AUDIO + fdd_sounds_enabled = 0; +#else + fdd_sounds_enabled = 1; +#endif } void @@ -259,6 +304,10 @@ SettingsFloppyCDROM::onFloppyRowChanged(const QModelIndex ¤t) ui->comboBoxFloppyType->setCurrentIndex(type); ui->checkBoxTurboTimings->setChecked(current.siblingAtColumn(1).data() == tr("On")); ui->checkBoxCheckBPB->setChecked(current.siblingAtColumn(2).data() == tr("On")); + + int prof = current.siblingAtColumn(3).data(Qt::UserRole).toInt(); + int comboIndex = ui->comboBoxFloppyAudio->findData(prof); + ui->comboBoxFloppyAudio->setCurrentIndex(comboIndex); } void @@ -318,7 +367,7 @@ void SettingsFloppyCDROM::on_checkBoxTurboTimings_stateChanged(int arg1) { auto idx = ui->tableViewFloppy->selectionModel()->currentIndex(); - ui->tableViewFloppy->model()->setData(idx.siblingAtColumn(1), arg1 == Qt::Checked ? + ui->tableViewFloppy->model()->setData(idx.siblingAtColumn(1), arg1 == Qt::Checked ? tr("On") : tr("Off")); } @@ -326,10 +375,11 @@ void SettingsFloppyCDROM::on_checkBoxCheckBPB_stateChanged(int arg1) { auto idx = ui->tableViewFloppy->selectionModel()->currentIndex(); - ui->tableViewFloppy->model()->setData(idx.siblingAtColumn(2), arg1 == Qt::Checked ? + ui->tableViewFloppy->model()->setData(idx.siblingAtColumn(2), arg1 == Qt::Checked ? tr("On") : tr("Off")); } + void SettingsFloppyCDROM::on_comboBoxFloppyType_activated(int index) { @@ -337,6 +387,34 @@ SettingsFloppyCDROM::on_comboBoxFloppyType_activated(int index) ui->tableViewFloppy->selectionModel()->currentIndex(), index); } +void +SettingsFloppyCDROM::on_comboBoxFloppyAudio_activated(int) +{ + auto idx = ui->tableViewFloppy->selectionModel()->currentIndex(); + int prof = ui->comboBoxFloppyAudio->currentData().toInt(); + QString profName; + switch (prof) { + case FDD_AUDIO_PROFILE_NONE: + profName = tr("None"); + break; + case FDD_AUDIO_PROFILE_PANASONIC: + profName = tr("Panasonic"); + break; + case FDD_AUDIO_PROFILE_TEAC: + profName = tr("Teac"); + break; + case FDD_AUDIO_PROFILE_MITSUMI: + profName = tr("Mitsumi"); + break; + default: + profName = tr("None"); + break; + } + auto audioIdx = idx.siblingAtColumn(3); + ui->tableViewFloppy->model()->setData(audioIdx, profName); + ui->tableViewFloppy->model()->setData(audioIdx, prof, Qt::UserRole); +} + void SettingsFloppyCDROM::reloadBusChannels() { auto selected = ui->comboBoxChannel->currentIndex(); Harddrives::populateBusChannels(ui->comboBoxChannel->model(), ui->comboBoxBus->currentData().toInt(), Harddrives::busTrackClass); diff --git a/src/qt/qt_settingsfloppycdrom.hpp b/src/qt/qt_settingsfloppycdrom.hpp index ba7b396b7..9a53dd88f 100644 --- a/src/qt/qt_settingsfloppycdrom.hpp +++ b/src/qt/qt_settingsfloppycdrom.hpp @@ -26,6 +26,7 @@ private slots: void on_comboBoxFloppyType_activated(int index); void on_checkBoxTurboTimings_stateChanged(int arg1); void on_checkBoxCheckBPB_stateChanged(int arg1); + void on_comboBoxFloppyAudio_activated(int index); void onCDROMRowChanged(const QModelIndex ¤t); void on_comboBoxBus_activated(int index); diff --git a/src/qt/qt_settingsfloppycdrom.ui b/src/qt/qt_settingsfloppycdrom.ui index 6b1036b5c..ff54a5020 100644 --- a/src/qt/qt_settingsfloppycdrom.ui +++ b/src/qt/qt_settingsfloppycdrom.ui @@ -66,34 +66,69 @@ - + - - - Type: - - + + + + + Type: + + + + + + + 30 + + + + + + + Turbo timings + + + + + + + Check BPB + + + + - - - 30 - - - - - - - Turbo timings - - - - - - - Check BPB - - + + + + + Audio: + + + + + + + 10 + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + @@ -205,6 +240,7 @@ comboBoxFloppyType checkBoxTurboTimings checkBoxCheckBPB + comboBoxFloppyAudio tableViewCDROM comboBoxBus comboBoxChannel diff --git a/src/sound/audio4.c b/src/sound/audio4.c index db43fa5d9..060e574e6 100644 --- a/src/sound/audio4.c +++ b/src/sound/audio4.c @@ -33,18 +33,20 @@ #endif #define I_NORMAL 0 -#define I_MUSIC 1 -#define I_WT 2 -#define I_CD 3 -#define I_MIDI 4 +#define I_MUSIC 1 +#define I_WT 2 +#define I_CD 3 +#define I_FDD 4 +#define I_MIDI 5 + +static int audio[6] = {-1, -1, -1, -1, -1, -1}; -static int audio[5] = { -1, -1, -1, -1, -1 }; #ifdef USE_NEW_API static struct audio_swpar info[5]; #else -static audio_info_t info[5]; +static audio_info_t info[6]; #endif -static int freqs[5] = { SOUND_FREQ, MUSIC_FREQ, WT_FREQ, CD_FREQ, 0 }; +static int freqs[6] = {SOUND_FREQ, MUSIC_FREQ, WT_FREQ, CD_FREQ, SOUND_FREQ, 0}; void closeal(void) @@ -165,12 +167,18 @@ givealbuffer_cd(const void *buf) givealbuffer_common(buf, I_CD, CD_BUFLEN << 1); } +void +givealbuffer_fdd(const void *buf, const uint32_t size) +{ + givealbuffer_common(buf, I_FDD, (int) size); +} + void givealbuffer_midi(const void *buf, const uint32_t size) { givealbuffer_common(buf, I_MIDI, (int) size); } - + void al_set_midi(const int freq, UNUSED(const int buf_size)) { diff --git a/src/sound/openal.c b/src/sound/openal.c index 9734470b0..d163150af 100644 --- a/src/sound/openal.c +++ b/src/sound/openal.c @@ -39,14 +39,16 @@ #define I_MUSIC 1 #define I_WT 2 #define I_CD 3 -#define I_MIDI 4 +#define I_FDD 4 +#define I_MIDI 5 ALuint buffers[4]; /* front and back buffers */ ALuint buffers_music[4]; /* front and back buffers */ ALuint buffers_wt[4]; /* front and back buffers */ ALuint buffers_cd[4]; /* front and back buffers */ +ALuint buffers_fdd[4]; /* front and back buffers */ ALuint buffers_midi[4]; /* front and back buffers */ -static ALuint source[5]; /* audio source */ +static ALuint source[6]; /* audio source - CHANGED FROM 5 TO 6 */ static int midi_freq = 44100; static int midi_buf_size = 4410; @@ -103,8 +105,9 @@ closeal(void) alSourceStopv(sources, source); alDeleteSources(sources, source); - if (sources == 4) + if (sources >= 6) alDeleteBuffers(4, buffers_midi); + alDeleteBuffers(4, buffers_fdd); alDeleteBuffers(4, buffers_cd); alDeleteBuffers(4, buffers_music); alDeleteBuffers(4, buffers); @@ -122,11 +125,13 @@ inital(void) float *wt_buf = NULL; float *cd_buf = NULL; float *midi_buf = NULL; + float *fdd_buf = NULL; int16_t *buf_int16 = NULL; int16_t *music_buf_int16 = NULL; int16_t *wt_buf_int16 = NULL; int16_t *cd_buf_int16 = NULL; int16_t *midi_buf_int16 = NULL; + int16_t *fdd_buf_int16 = NULL; int init_midi = 0; @@ -140,13 +145,14 @@ inital(void) if ((strcmp(mdn, "none") != 0) && (strcmp(mdn, SYSTEM_MIDI_INTERNAL_NAME) != 0)) init_midi = 1; /* If the device is neither none, nor system MIDI, initialize the MIDI buffer and source, otherwise, do not. */ - sources = 4 + !!init_midi; + sources = 5 + !!init_midi; if (sound_is_float) { buf = (float *) calloc((BUFLEN << 1), sizeof(float)); music_buf = (float *) calloc((MUSICBUFLEN << 1), sizeof(float)); wt_buf = (float *) calloc((WTBUFLEN << 1), sizeof(float)); cd_buf = (float *) calloc((CD_BUFLEN << 1), sizeof(float)); + fdd_buf = (float *) calloc((BUFLEN << 1), sizeof(float)); if (init_midi) midi_buf = (float *) calloc(midi_buf_size, sizeof(float)); } else { @@ -154,17 +160,22 @@ inital(void) music_buf_int16 = (int16_t *) calloc((MUSICBUFLEN << 1), sizeof(int16_t)); wt_buf_int16 = (int16_t *) calloc((WTBUFLEN << 1), sizeof(int16_t)); cd_buf_int16 = (int16_t *) calloc((CD_BUFLEN << 1), sizeof(int16_t)); + fdd_buf_int16 = (int16_t *) calloc((BUFLEN << 1), sizeof(int16_t)); if (init_midi) midi_buf_int16 = (int16_t *) calloc(midi_buf_size, sizeof(int16_t)); } alGenBuffers(4, buffers); alGenBuffers(4, buffers_cd); + alGenBuffers(4, buffers_fdd); alGenBuffers(4, buffers_music); alGenBuffers(4, buffers_wt); if (init_midi) alGenBuffers(4, buffers_midi); + // Create sources: 0=main, 1=music, 2=wt, 3=cd, 4=fdd, 5=midi(optional) + alGenSources(sources, source); + if (init_midi) alGenSources(5, source); else @@ -194,6 +205,12 @@ inital(void) alSourcef(source[I_CD], AL_ROLLOFF_FACTOR, 0.0f); alSourcei(source[I_CD], AL_SOURCE_RELATIVE, AL_TRUE); + alSource3f(source[I_FDD], AL_POSITION, 0.0f, 0.0f, 0.0f); + alSource3f(source[I_FDD], AL_VELOCITY, 0.0f, 0.0f, 0.0f); + alSource3f(source[I_FDD], AL_DIRECTION, 0.0f, 0.0f, 0.0f); + alSourcef(source[I_FDD], AL_ROLLOFF_FACTOR, 0.0f); + alSourcei(source[I_FDD], AL_SOURCE_RELATIVE, AL_TRUE); + if (init_midi) { alSource3f(source[I_MIDI], AL_POSITION, 0.0f, 0.0f, 0.0f); alSource3f(source[I_MIDI], AL_VELOCITY, 0.0f, 0.0f, 0.0f); @@ -207,6 +224,7 @@ inital(void) memset(cd_buf, 0, CD_BUFLEN * 2 * sizeof(float)); memset(music_buf, 0, MUSICBUFLEN * 2 * sizeof(float)); memset(wt_buf, 0, WTBUFLEN * 2 * sizeof(float)); + memset(fdd_buf, 0, BUFLEN * 2 * sizeof(float)); if (init_midi) memset(midi_buf, 0, midi_buf_size * sizeof(float)); } else { @@ -214,6 +232,7 @@ inital(void) memset(cd_buf_int16, 0, CD_BUFLEN * 2 * sizeof(int16_t)); memset(music_buf_int16, 0, MUSICBUFLEN * 2 * sizeof(int16_t)); memset(wt_buf_int16, 0, WTBUFLEN * 2 * sizeof(int16_t)); + memset(fdd_buf_int16, 0, BUFLEN * 2 * sizeof(int16_t)); if (init_midi) memset(midi_buf_int16, 0, midi_buf_size * sizeof(int16_t)); } @@ -224,6 +243,7 @@ inital(void) alBufferData(buffers_music[c], AL_FORMAT_STEREO_FLOAT32, music_buf, MUSICBUFLEN * 2 * sizeof(float), MUSIC_FREQ); alBufferData(buffers_wt[c], AL_FORMAT_STEREO_FLOAT32, wt_buf, WTBUFLEN * 2 * sizeof(float), WT_FREQ); alBufferData(buffers_cd[c], AL_FORMAT_STEREO_FLOAT32, cd_buf, CD_BUFLEN * 2 * sizeof(float), CD_FREQ); + alBufferData(buffers_fdd[c], AL_FORMAT_STEREO_FLOAT32, fdd_buf, BUFLEN * 2 * sizeof(float), FREQ); if (init_midi) alBufferData(buffers_midi[c], AL_FORMAT_STEREO_FLOAT32, midi_buf, midi_buf_size * (int) sizeof(float), midi_freq); } else { @@ -231,6 +251,7 @@ inital(void) alBufferData(buffers_music[c], AL_FORMAT_STEREO16, music_buf_int16, MUSICBUFLEN * 2 * sizeof(int16_t), MUSIC_FREQ); alBufferData(buffers_wt[c], AL_FORMAT_STEREO16, wt_buf_int16, WTBUFLEN * 2 * sizeof(int16_t), WT_FREQ); alBufferData(buffers_cd[c], AL_FORMAT_STEREO16, cd_buf_int16, CD_BUFLEN * 2 * sizeof(int16_t), CD_FREQ); + alBufferData(buffers_fdd[c], AL_FORMAT_STEREO16, fdd_buf_int16, BUFLEN * 2 * sizeof(int16_t), FREQ); if (init_midi) alBufferData(buffers_midi[c], AL_FORMAT_STEREO16, midi_buf_int16, midi_buf_size * (int) sizeof(int16_t), midi_freq); } @@ -240,12 +261,14 @@ inital(void) alSourceQueueBuffers(source[I_MUSIC], 4, buffers_music); alSourceQueueBuffers(source[I_WT], 4, buffers_wt); alSourceQueueBuffers(source[I_CD], 4, buffers_cd); + alSourceQueueBuffers(source[I_FDD], 4, buffers_fdd); if (init_midi) alSourceQueueBuffers(source[I_MIDI], 4, buffers_midi); alSourcePlay(source[I_NORMAL]); alSourcePlay(source[I_MUSIC]); alSourcePlay(source[I_WT]); alSourcePlay(source[I_CD]); + alSourcePlay(source[I_FDD]); if (init_midi) alSourcePlay(source[I_MIDI]); @@ -256,6 +279,7 @@ inital(void) free(wt_buf); free(music_buf); free(buf); + free(fdd_buf); } else { if (init_midi) free(midi_buf_int16); @@ -263,6 +287,7 @@ inital(void) free(wt_buf_int16); free(music_buf_int16); free(buf_int16); + free(fdd_buf_int16); } initialized = 1; @@ -327,5 +352,11 @@ givealbuffer_cd(const void *buf) void givealbuffer_midi(const void *buf, const uint32_t size) { - givealbuffer_common(buf, 4, (int) size, midi_freq); + givealbuffer_common(buf, 5, (int) size, midi_freq); } + +void +givealbuffer_fdd(const void *buf, const uint32_t size) +{ + givealbuffer_common(buf, 4, (int) size, FREQ); +} \ No newline at end of file diff --git a/src/sound/sndio.c b/src/sound/sndio.c index b5a54e420..6363163a2 100644 --- a/src/sound/sndio.c +++ b/src/sound/sndio.c @@ -18,7 +18,6 @@ #include #include #include - #include #include <86box/86box.h> @@ -30,10 +29,11 @@ #define I_WT 2 #define I_CD 3 #define I_MIDI 4 +#define I_FDD 5 -static struct sio_hdl* audio[5] = { NULL, NULL, NULL, NULL, NULL }; -static struct sio_par info[5]; -static int freqs[5] = { SOUND_FREQ, MUSIC_FREQ, WT_FREQ, CD_FREQ, 0 }; +static struct sio_hdl* audio[6] = {NULL, NULL, NULL, NULL, NULL, NULL}; +static struct sio_par info[6]; +static int freqs[6] = { SOUND_FREQ, MUSIC_FREQ, WT_FREQ, CD_FREQ, SOUND_FREQ, 0 }; void closeal(void) @@ -147,7 +147,13 @@ givealbuffer_midi(const void *buf, const uint32_t size) { givealbuffer_common(buf, I_MIDI, (int) size); } - + +void +givealbuffer_fdd(const void *buf, const uint32_t size) +{ + givealbuffer_common(buf, I_FDD, (int) size); +} + void al_set_midi(const int freq, UNUSED(const int buf_size)) { diff --git a/src/sound/sound.c b/src/sound/sound.c index 1e406cc8e..7503c55da 100644 --- a/src/sound/sound.c +++ b/src/sound/sound.c @@ -36,6 +36,7 @@ #include <86box/timer.h> #include <86box/snd_mpu401.h> #include <86box/sound.h> +#include <86box/fdd_audio.h> typedef struct { const device_t *device; @@ -89,6 +90,13 @@ static int cd_buf_update = CD_BUFLEN / SOUNDBUFLEN; static volatile int cdaudioon = 0; static int cd_thread_enable = 0; +static thread_t *sound_fdd_thread_h; +static event_t *sound_fdd_event; +static event_t *sound_fdd_start_event; +static int16_t fdd_out_buffer[SOUNDBUFLEN * 2]; +static volatile int fddaudioon = 0; +static int fdd_thread_enable = 0; + static void (*filter_cd_audio)(int channel, double *buffer, void *priv) = NULL; static void *filter_cd_audio_p = NULL; @@ -597,6 +605,9 @@ sound_poll(UNUSED(void *priv)) } } + if (fdd_thread_enable) { + thread_set_event(sound_fdd_event); + } sound_pos_global = 0; } } @@ -698,17 +709,14 @@ sound_reset(void) inital(); timer_add(&sound_poll_timer, sound_poll, NULL, 1); - sound_handlers_num = 0; memset(sound_handlers, 0x00, 8 * sizeof(sound_handler_t)); timer_add(&music_poll_timer, music_poll, NULL, 1); - music_handlers_num = 0; memset(music_handlers, 0x00, 8 * sizeof(sound_handler_t)); timer_add(&wavetable_poll_timer, wavetable_poll, NULL, 1); - wavetable_handlers_num = 0; memset(wavetable_handlers, 0x00, 8 * sizeof(sound_handler_t)); @@ -785,3 +793,61 @@ sound_cd_thread_reset(void) cd_thread_enable = available_cdrom_drives ? 1 : 0; } + +static void +sound_fdd_thread(UNUSED(void *param)) +{ + thread_set_event(sound_fdd_start_event); + while (fddaudioon) { + thread_wait_event(sound_fdd_event, -1); + thread_reset_event(sound_fdd_event); + + if (!fddaudioon) + break; + + static float fdd_float_buffer[SOUNDBUFLEN * 2]; + memset(fdd_float_buffer, 0, sizeof(fdd_float_buffer)); + fdd_audio_callback((int16_t*)fdd_float_buffer, SOUNDBUFLEN * 2); + givealbuffer_fdd(fdd_float_buffer, SOUNDBUFLEN * 2); + } +} + +void +sound_fdd_thread_init(void) +{ + if (!fddaudioon) { + fddaudioon = 1; + fdd_thread_enable = 1; + + sound_fdd_start_event = thread_create_event(); + sound_fdd_event = thread_create_event(); + sound_fdd_thread_h = thread_create(sound_fdd_thread, NULL); + + thread_wait_event(sound_fdd_start_event, -1); + thread_reset_event(sound_fdd_start_event); + } +} + +void +sound_fdd_thread_end(void) +{ + if (fddaudioon) { + fddaudioon = 0; + fdd_thread_enable = 0; + + thread_set_event(sound_fdd_event); + thread_wait(sound_fdd_thread_h); + + if (sound_fdd_event) { + thread_destroy_event(sound_fdd_event); + sound_fdd_event = NULL; + } + + sound_fdd_thread_h = NULL; + + if (sound_fdd_start_event) { + thread_destroy_event(sound_fdd_start_event); + sound_fdd_start_event = NULL; + } + } +} \ No newline at end of file diff --git a/src/sound/xaudio2.c b/src/sound/xaudio2.c index 148175f33..8596c2a49 100644 --- a/src/sound/xaudio2.c +++ b/src/sound/xaudio2.c @@ -53,6 +53,7 @@ static IXAudio2SourceVoice *srcvoicemusic = NULL; static IXAudio2SourceVoice *srcvoicewt = NULL; static IXAudio2SourceVoice *srcvoicemidi = NULL; static IXAudio2SourceVoice *srcvoicecd = NULL; +static IXAudio2SourceVoice *srcvoicefdd = NULL; #define FREQ SOUND_FREQ #define BUFLEN SOUNDBUFLEN @@ -178,11 +179,18 @@ inital(void) (void) IXAudio2_CreateSourceVoice(xaudio2, &srcvoicecd, &fmt, 0, 2.0f, &callbacks, NULL, NULL); + fmt.nSamplesPerSec = FREQ; + fmt.nBlockAlign = fmt.nChannels * fmt.wBitsPerSample / 8; + fmt.nAvgBytesPerSec = fmt.nSamplesPerSec * fmt.nBlockAlign; + + (void) IXAudio2_CreateSourceVoice(xaudio2, &srcvoicefdd, &fmt, 0, 2.0f, &callbacks, NULL, NULL); + (void) IXAudio2SourceVoice_SetVolume(srcvoice, 1, XAUDIO2_COMMIT_NOW); (void) IXAudio2SourceVoice_Start(srcvoice, 0, XAUDIO2_COMMIT_NOW); (void) IXAudio2SourceVoice_Start(srcvoicecd, 0, XAUDIO2_COMMIT_NOW); (void) IXAudio2SourceVoice_Start(srcvoicemusic, 0, XAUDIO2_COMMIT_NOW); (void) IXAudio2SourceVoice_Start(srcvoicewt, 0, XAUDIO2_COMMIT_NOW); + (void) IXAudio2SourceVoice_Start(srcvoicefdd, 0, XAUDIO2_COMMIT_NOW); const char *mdn = midi_out_device_get_internal_name(midi_output_device_current); @@ -213,6 +221,8 @@ closeal(void) (void) IXAudio2SourceVoice_FlushSourceBuffers(srcvoicewt); (void) IXAudio2SourceVoice_Stop(srcvoicecd, 0, XAUDIO2_COMMIT_NOW); (void) IXAudio2SourceVoice_FlushSourceBuffers(srcvoicecd); + (void) IXAudio2SourceVoice_Stop(srcvoicefdd, 0, XAUDIO2_COMMIT_NOW); + (void) IXAudio2SourceVoice_FlushSourceBuffers(srcvoicefdd); if (srcvoicemidi) { (void) IXAudio2SourceVoice_Stop(srcvoicemidi, 0, XAUDIO2_COMMIT_NOW); (void) IXAudio2SourceVoice_FlushSourceBuffers(srcvoicemidi); @@ -220,6 +230,7 @@ closeal(void) } IXAudio2SourceVoice_DestroyVoice(srcvoicewt); IXAudio2SourceVoice_DestroyVoice(srcvoicecd); + IXAudio2SourceVoice_DestroyVoice(srcvoicefdd); IXAudio2SourceVoice_DestroyVoice(srcvoicemusic); IXAudio2SourceVoice_DestroyVoice(srcvoice); IXAudio2MasteringVoice_DestroyVoice(mastervoice); @@ -227,6 +238,7 @@ closeal(void) srcvoice = NULL; srcvoicecd = NULL; srcvoicemidi = NULL; + srcvoicefdd = NULL; mastervoice = NULL; xaudio2 = NULL; @@ -288,6 +300,18 @@ givealbuffer_cd(const void *buf) givealbuffer_common(buf, srcvoicecd, CD_BUFLEN << 1); } +void +givealbuffer_fdd(const void *buf, const uint32_t size) +{ + if (!initialized) + return; + + if (!srcvoicefdd) + return; + + givealbuffer_common(buf, srcvoicefdd, size); +} + void al_set_midi(const int freq, const int buf_size) { @@ -321,4 +345,4 @@ void givealbuffer_midi(const void *buf, const uint32_t size) { givealbuffer_common(buf, srcvoicemidi, size); -} +} \ No newline at end of file From 151c3d87309ac849dfd64cf091dd90dc9ac8263c Mon Sep 17 00:00:00 2001 From: OBattler Date: Mon, 22 Sep 2025 01:30:11 +0200 Subject: [PATCH 32/36] Fixes to the floppy samples work. --- src/floppy/fdd_audio.c | 60 +++++++----------- src/qt/qt_settingsfloppycdrom.ui | 103 ++++++++++++------------------- src/sound/sound.c | 1 - 3 files changed, 63 insertions(+), 101 deletions(-) diff --git a/src/floppy/fdd_audio.c b/src/floppy/fdd_audio.c index 9ef4bf991..ca4457921 100644 --- a/src/floppy/fdd_audio.c +++ b/src/floppy/fdd_audio.c @@ -24,6 +24,8 @@ #include <86box/timer.h> #include <86box/fdd.h> #include <86box/fdd_audio.h> +#include <86box/mem.h> +#include <86box/rom.h> #include <86box/sound.h> #include <86box/plat.h> #include <86box/path.h> @@ -65,23 +67,23 @@ typedef struct { /* 5.25" Teac FD-55GFR sample set */ static drive_audio_samples_t samples_teac = { .spindlemotor_start = { - .filename = "TeacFD-55GFR_5.25_1.2MB_motor_start_48000_16_1_PCM.wav", + .filename = "roms/floppy/samples/TeacFD-55GFR_5.25_1.2MB_motor_start_48000_16_1_PCM.wav", .buffer = NULL, .samples = 0, .volume = 3.0f }, .spindlemotor_loop = { - .filename = "TeacFD-55GFR_5.25_1.2MB_motor_loop_48000_16_1_PCM.wav", + .filename = "roms/floppy/samples/TeacFD-55GFR_5.25_1.2MB_motor_loop_48000_16_1_PCM.wav", .buffer = NULL, .samples = 0, .volume = 3.0f }, .spindlemotor_stop = { - .filename = "TeacFD-55GFR_5.25_1.2MB_motor_stop_48000_16_1_PCM.wav", + .filename = "roms/floppy/samples/TeacFD-55GFR_5.25_1.2MB_motor_stop_48000_16_1_PCM.wav", .buffer = NULL, .samples = 0, .volume = 3.0f }, .single_track_step = { - .filename = "TeacFD-55GFR_5.25_1.2MB_track_step_48000_16_1_PCM.wav", + .filename = "roms/floppy/samples/TeacFD-55GFR_5.25_1.2MB_track_step_48000_16_1_PCM.wav", .buffer = NULL, .samples = 0, .volume = 2.0f }, .multi_track_seek = { - .filename = "TeacFD-55GFR_5.25_1.2MB_seekupdown_80_tracks1100ms_48000_16_1_PCM.wav", + .filename = "roms/floppy/samples/TeacFD_55GFR_5.25_1.2MB_seekupdown_80_tracks1100ms_48000_16_1_PCM.wav", .buffer = NULL, .samples = 0, .volume = 2.0f } }; @@ -89,23 +91,23 @@ static drive_audio_samples_t samples_teac = { /* 3.5" drive audio samples (Mitsumi) */ static drive_audio_samples_t samples_35 = { .spindlemotor_start = { - .filename = "mitsumi_spindle_motor_start_48000_16_1_PCM.wav", + .filename = "roms/floppy/samples/mitsumi_spindle_motor_start_48000_16_1_PCM.wav", .buffer = NULL, .samples = 0, .volume = 0.2f }, .spindlemotor_loop = { - .filename = "mitsumi_spindle_motor_loop_48000_16_1_PCM.wav", + .filename = "roms/floppy/samples/mitsumi_spindle_motor_loop_48000_16_1_PCM.wav", .buffer = NULL, .samples = 0, .volume = 0.2f }, .spindlemotor_stop = { - .filename = "mitsumi_spindle_motor_stop_48000_16_1_PCM.wav", + .filename = "roms/floppy/samples/mitsumi_spindle_motor_stop_48000_16_1_PCM.wav", .buffer = NULL, .samples = 0, .volume = 0.2f }, .single_track_step = { - .filename = "mitsumi_track_step_48000_16_1_PCM.wav", + .filename = "roms/floppy/samples/mitsumi_track_step_48000_16_1_PCM.wav", .buffer = NULL, .samples = 0, .volume = 1.0f }, .multi_track_seek = { - .filename = "mitsumi_seek_80_tracks_495ms_48000_16_1_PCM.wav", + .filename = "roms/floppy/samples/mitsumi_seek_80_tracks_495ms_48000_16_1_PCM.wav", .buffer = NULL, .samples = 0, .volume = 1.0f } }; @@ -113,23 +115,23 @@ static drive_audio_samples_t samples_35 = { /* 5.25" drive audio samples (Panasonic) */ static drive_audio_samples_t samples_525 = { .spindlemotor_start = { - .filename = "Panasonic_JU-475-5_5.25_1.2MB_motor_start_48000_16_1_PCM.wav", + .filename = "roms/floppy/samples/Panasonic_JU-475-5_5.25_1.2MB_motor_start_48000_16_1_PCM.wav", .buffer = NULL, .samples = 0, .volume = 1.0f }, .spindlemotor_loop = { - .filename = "Panasonic_JU-475-5_5.25_1.2MB_motor_loop_48000_16_1_PCM.wav", + .filename = "roms/floppy/samples/Panasonic_JU-475-5_5.25_1.2MB_motor_loop_48000_16_1_PCM.wav", .buffer = NULL, .samples = 0, .volume = 1.0f }, .spindlemotor_stop = { - .filename = "Panasonic_JU-475-5_5.25_1.2MB_motor_stop_48000_16_1_PCM.wav", + .filename = "roms/floppy/samples/Panasonic_JU-475-5_5.25_1.2MB_motor_stop_48000_16_1_PCM.wav", .buffer = NULL, .samples = 0, .volume = 1.0f }, .single_track_step = { - .filename = "Panasonic_JU-475-5_5.25_1.2MB_track_step_48000_16_1_PCM.wav", + .filename = "roms/floppy/samples/Panasonic_JU-475-5_5.25_1.2MB_track_step_48000_16_1_PCM.wav", .buffer = NULL, .samples = 0, .volume = 2.0f }, .multi_track_seek = { - .filename = "Panasonic_JU-475-5_5.25_1.2MB_seekup_40_tracks_285ms_5ms_per_track_48000_16_1_PCM.wav", + .filename = "roms/floppy/samples/Panasonic_JU-475-5_5.25_1.2MB_seekup_40_tracks_285ms_5ms_per_track_48000_16_1_PCM.wav", .buffer = NULL, .samples = 0, .volume = 2.0f } }; @@ -174,34 +176,16 @@ static int16_t * load_wav(const char *filename, int *sample_count) { FILE *f = NULL; - char full_path[2048]; - if (!filename || strlen(filename) == 0) { + if ((filename == NULL) || (strlen(filename) == 0)) return NULL; - } - if (strstr(filename, "..") != NULL || strchr(filename, '/') != NULL || strchr(filename, '\\') != NULL) { + if (strstr(filename, "..") != NULL) return NULL; - } - for (const char *p = filename; *p; p++) { - if (!isalnum(*p) && *p != '.' && *p != '_' && *p != '-') { - return NULL; - } - } - - path_append_filename(full_path, exe_path, "roms"); - path_append_filename(full_path, full_path, "samples"); - path_append_filename(full_path, full_path, "fdd"); - path_append_filename(full_path, full_path, filename); - f = fopen(full_path, "rb"); - if (!f) { - path_append_filename(full_path, exe_path, "samples"); - path_append_filename(full_path, full_path, filename); - f = fopen(full_path, "rb"); - if (!f) - return NULL; - } + f = rom_fopen(filename, "rb"); + if (f == NULL) + return NULL; wav_header_t hdr; if (fread(&hdr, sizeof(hdr), 1, f) != 1) { diff --git a/src/qt/qt_settingsfloppycdrom.ui b/src/qt/qt_settingsfloppycdrom.ui index ff54a5020..0c9283834 100644 --- a/src/qt/qt_settingsfloppycdrom.ui +++ b/src/qt/qt_settingsfloppycdrom.ui @@ -66,69 +66,48 @@ - - - - - - - Type: - - - - - - - 30 - - - - - - - Turbo timings - - - - - - - Check BPB - - - - + + + + + Type: + + - - - - - - Audio: - - - - - - - 10 - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - + + + + 30 + + + + + + + Turbo timings + + + + + + + Check BPB + + + + + + + Audio: + + + + + + + 30 + + diff --git a/src/sound/sound.c b/src/sound/sound.c index 7503c55da..9373f067e 100644 --- a/src/sound/sound.c +++ b/src/sound/sound.c @@ -93,7 +93,6 @@ static int cd_thread_enable = 0; static thread_t *sound_fdd_thread_h; static event_t *sound_fdd_event; static event_t *sound_fdd_start_event; -static int16_t fdd_out_buffer[SOUNDBUFLEN * 2]; static volatile int fddaudioon = 0; static int fdd_thread_enable = 0; From b81dee7998e3cc4184048d87a5d73590d903f31d Mon Sep 17 00:00:00 2001 From: OBattler Date: Mon, 22 Sep 2025 05:18:04 +0200 Subject: [PATCH 33/36] Fix three network-related warnings. --- src/network/net_netswitch.c | 1 + src/network/netswitch.c | 1 + src/network/pb_encode.c | 3 ++- 3 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/network/net_netswitch.c b/src/network/net_netswitch.c index e95c9aeaf..1cd0a81a7 100644 --- a/src/network/net_netswitch.c +++ b/src/network/net_netswitch.c @@ -401,6 +401,7 @@ net_netswitch_init(const netcard_t *card, const uint8_t *mac_addr, void *priv, c memcpy(ns_args.mac_addr, net_netswitch->mac_addr, 6); /* The remote switch hostname */ strncpy(ns_args.nrs_hostname, netcard->nrs_hostname, sizeof(ns_args.nrs_hostname) - 1); + ns_args.nrs_hostname[127] = 0x00; net_switch_log("%s Net Switch: Starting up virtual switch with group %d, flags %d\n", net_netswitch->switch_type, ns_args.group, ns_args.flags); diff --git a/src/network/netswitch.c b/src/network/netswitch.c index e7b913d0d..1ec2c5e6f 100644 --- a/src/network/netswitch.c +++ b/src/network/netswitch.c @@ -242,6 +242,7 @@ ns_open(struct ns_open_args *open_args) { /* Remote switch hostname */ strncpy(conn->nrs_hostname, open_args->nrs_hostname, sizeof(conn->nrs_hostname) - 1); + conn->nrs_hostname[127] = 0x00; /* Switch type */ if(conn->switch_type == SWITCH_TYPE_REMOTE) { diff --git a/src/network/pb_encode.c b/src/network/pb_encode.c index 7f5620125..a4e30b471 100644 --- a/src/network/pb_encode.c +++ b/src/network/pb_encode.c @@ -53,7 +53,8 @@ static bool checkreturn buf_write(pb_ostream_t *stream, const pb_byte_t *buf, si { pb_byte_t *dest = (pb_byte_t*)stream->state; stream->state = dest + count; - + + if ((dest != NULL) && (buf != NULL)) memcpy(dest, buf, count * sizeof(pb_byte_t)); return true; From 3dc819de6edb3698dfda515a9b83b997cb380343 Mon Sep 17 00:00:00 2001 From: OBattler Date: Mon, 22 Sep 2025 18:08:27 +0200 Subject: [PATCH 34/36] FDD Audio: Fix sound when sound is set to INT16 and halve the volume. --- src/floppy/fdd_audio.c | 169 ++++++++++++++++++++++++++++++++++++----- 1 file changed, 152 insertions(+), 17 deletions(-) diff --git a/src/floppy/fdd_audio.c b/src/floppy/fdd_audio.c index ca4457921..1c4853d6f 100644 --- a/src/floppy/fdd_audio.c +++ b/src/floppy/fdd_audio.c @@ -499,11 +499,12 @@ fdd_audio_callback(int16_t *buffer, int length) if (!any_audio_active) return; - float *float_buffer = (float *) buffer; - int samples_in_buffer = length / 2; + float *float_buffer = (float *) buffer; + int16_t *int16_buffer = (int16_t *) buffer; + int samples_in_buffer = length / 2; /* Process audio for all drives */ - for (int drive = 0; drive < FDD_NUM; drive++) { + if (sound_is_float) for (int drive = 0; drive < FDD_NUM; drive++) { drive_audio_samples_t *samples = get_drive_samples(drive); if (!samples) continue; @@ -518,8 +519,8 @@ fdd_audio_callback(int16_t *buffer, int length) case MOTOR_STATE_STARTING: if (samples->spindlemotor_start.buffer && spindlemotor_pos[drive] < samples->spindlemotor_start.samples) { /* Play start sound with volume control */ - left_sample = (float) samples->spindlemotor_start.buffer[spindlemotor_pos[drive] * 2] / 32768.0f * samples->spindlemotor_start.volume; - right_sample = (float) samples->spindlemotor_start.buffer[spindlemotor_pos[drive] * 2 + 1] / 32768.0f * samples->spindlemotor_start.volume; + left_sample = (float) samples->spindlemotor_start.buffer[spindlemotor_pos[drive] * 2] / 65536.0f * samples->spindlemotor_start.volume; + right_sample = (float) samples->spindlemotor_start.buffer[spindlemotor_pos[drive] * 2 + 1] / 65536.0f * samples->spindlemotor_start.volume; spindlemotor_pos[drive]++; } else { /* Start sound finished, transition to loop */ @@ -531,8 +532,8 @@ fdd_audio_callback(int16_t *buffer, int length) case MOTOR_STATE_RUNNING: if (samples->spindlemotor_loop.buffer && samples->spindlemotor_loop.samples > 0) { /* Play loop sound with volume control */ - left_sample = (float) samples->spindlemotor_loop.buffer[spindlemotor_pos[drive] * 2] / 32768.0f * samples->spindlemotor_loop.volume; - right_sample = (float) samples->spindlemotor_loop.buffer[spindlemotor_pos[drive] * 2 + 1] / 32768.0f * samples->spindlemotor_loop.volume; + left_sample = (float) samples->spindlemotor_loop.buffer[spindlemotor_pos[drive] * 2] / 65536.0f * samples->spindlemotor_loop.volume; + right_sample = (float) samples->spindlemotor_loop.buffer[spindlemotor_pos[drive] * 2 + 1] / 65536.0f * samples->spindlemotor_loop.volume; spindlemotor_pos[drive]++; /* Loop back to beginning */ @@ -554,14 +555,14 @@ fdd_audio_callback(int16_t *buffer, int length) /* Get loop sample (continue from current position) with volume control */ if (samples->spindlemotor_loop.buffer && samples->spindlemotor_loop.samples > 0) { int loop_pos = spindlemotor_pos[drive] % samples->spindlemotor_loop.samples; - loop_left = (float) samples->spindlemotor_loop.buffer[loop_pos * 2] / 32768.0f * samples->spindlemotor_loop.volume; - loop_right = (float) samples->spindlemotor_loop.buffer[loop_pos * 2 + 1] / 32768.0f * samples->spindlemotor_loop.volume; + loop_left = (float) samples->spindlemotor_loop.buffer[loop_pos * 2] / 65536.0f * samples->spindlemotor_loop.volume; + loop_right = (float) samples->spindlemotor_loop.buffer[loop_pos * 2 + 1] / 65536.0f * samples->spindlemotor_loop.volume; } /* Get stop sample with volume control */ if (samples->spindlemotor_stop.buffer && spindlemotor_pos[drive] < samples->spindlemotor_stop.samples) { - stop_left = (float) samples->spindlemotor_stop.buffer[spindlemotor_pos[drive] * 2] / 32768.0f * samples->spindlemotor_stop.volume; - stop_right = (float) samples->spindlemotor_stop.buffer[spindlemotor_pos[drive] * 2 + 1] / 32768.0f * samples->spindlemotor_stop.volume; + stop_left = (float) samples->spindlemotor_stop.buffer[spindlemotor_pos[drive] * 2] / 65536.0f * samples->spindlemotor_stop.volume; + stop_right = (float) samples->spindlemotor_stop.buffer[spindlemotor_pos[drive] * 2 + 1] / 65536.0f * samples->spindlemotor_stop.volume; } /* Mix the sounds */ @@ -576,8 +577,8 @@ fdd_audio_callback(int16_t *buffer, int length) } else { /* Fade completed, play remaining stop sound with volume control */ if (samples->spindlemotor_stop.buffer && spindlemotor_pos[drive] < samples->spindlemotor_stop.samples) { - left_sample = (float) samples->spindlemotor_stop.buffer[spindlemotor_pos[drive] * 2] / 32768.0f * samples->spindlemotor_stop.volume; - right_sample = (float) samples->spindlemotor_stop.buffer[spindlemotor_pos[drive] * 2 + 1] / 32768.0f * samples->spindlemotor_stop.volume; + left_sample = (float) samples->spindlemotor_stop.buffer[spindlemotor_pos[drive] * 2] / 65536.0f * samples->spindlemotor_stop.volume; + right_sample = (float) samples->spindlemotor_stop.buffer[spindlemotor_pos[drive] * 2 + 1] / 65536.0f * samples->spindlemotor_stop.volume; spindlemotor_pos[drive]++; } else { /* Stop sound finished */ @@ -596,8 +597,8 @@ fdd_audio_callback(int16_t *buffer, int length) if (single_step_state[drive].active) { if (samples->single_track_step.buffer && single_step_state[drive].position < samples->single_track_step.samples) { /* Mix step sound with motor sound with volume control */ - float step_left = (float) samples->single_track_step.buffer[single_step_state[drive].position * 2] / 32768.0f * samples->single_track_step.volume; - float step_right = (float) samples->single_track_step.buffer[single_step_state[drive].position * 2 + 1] / 32768.0f * samples->single_track_step.volume; + float step_left = (float) samples->single_track_step.buffer[single_step_state[drive].position * 2] / 65536.0f * samples->single_track_step.volume; + float step_right = (float) samples->single_track_step.buffer[single_step_state[drive].position * 2 + 1] / 65536.0f * samples->single_track_step.volume; left_sample += step_left; right_sample += step_right; @@ -616,8 +617,8 @@ fdd_audio_callback(int16_t *buffer, int length) multi_seek_state[drive].position < multi_seek_state[drive].duration_samples && multi_seek_state[drive].position < samples->multi_track_seek.samples) { /* Mix seek sound with motor sound with volume control */ - float seek_left = (float) samples->multi_track_seek.buffer[multi_seek_state[drive].position * 2] / 32768.0f * samples->multi_track_seek.volume; - float seek_right = (float) samples->multi_track_seek.buffer[multi_seek_state[drive].position * 2 + 1] / 32768.0f * samples->multi_track_seek.volume; + float seek_left = (float) samples->multi_track_seek.buffer[multi_seek_state[drive].position * 2] / 65536.0f * samples->multi_track_seek.volume; + float seek_right = (float) samples->multi_track_seek.buffer[multi_seek_state[drive].position * 2 + 1] / 65536.0f * samples->multi_track_seek.volume; left_sample += seek_left; right_sample += seek_right; @@ -637,6 +638,140 @@ fdd_audio_callback(int16_t *buffer, int length) float_buffer[i * 2] += left_sample; float_buffer[i * 2 + 1] += right_sample; } + } else for (int drive = 0; drive < FDD_NUM; drive++) { + drive_audio_samples_t *samples = get_drive_samples(drive); + if (!samples) + continue; + + for (int i = 0; i < samples_in_buffer; i++) { + int16_t left_sample = 0.0f; + int16_t right_sample = 0.0f; + + /* Process motor audio */ + if (spindlemotor_state[drive] != MOTOR_STATE_STOPPED) { + switch (spindlemotor_state[drive]) { + case MOTOR_STATE_STARTING: + if (samples->spindlemotor_start.buffer && spindlemotor_pos[drive] < samples->spindlemotor_start.samples) { + /* Play start sound with volume control */ + left_sample = (int16_t) samples->spindlemotor_start.buffer[spindlemotor_pos[drive] * 2] / 32768.0f * samples->spindlemotor_start.volume; + right_sample = (int16_t) samples->spindlemotor_start.buffer[spindlemotor_pos[drive] * 2 + 1] / 32768.0f * samples->spindlemotor_start.volume; + spindlemotor_pos[drive]++; + } else { + /* Start sound finished, transition to loop */ + spindlemotor_state[drive] = MOTOR_STATE_RUNNING; + spindlemotor_pos[drive] = 0; + } + break; + + case MOTOR_STATE_RUNNING: + if (samples->spindlemotor_loop.buffer && samples->spindlemotor_loop.samples > 0) { + /* Play loop sound with volume control */ + left_sample = (int16_t) samples->spindlemotor_loop.buffer[spindlemotor_pos[drive] * 2] / 32768.0f * samples->spindlemotor_loop.volume; + right_sample = (int16_t) samples->spindlemotor_loop.buffer[spindlemotor_pos[drive] * 2 + 1] / 32768.0f * samples->spindlemotor_loop.volume; + spindlemotor_pos[drive]++; + + /* Loop back to beginning */ + if (spindlemotor_pos[drive] >= samples->spindlemotor_loop.samples) { + spindlemotor_pos[drive] = 0; + } + } + break; + + case MOTOR_STATE_STOPPING: + if (spindlemotor_fade_samples_remaining[drive] > 0) { + /* Mix fading loop sound with rising stop sound */ + float loop_volume = spindlemotor_fade_volume[drive]; + float stop_volume = 1.0f - loop_volume; + + int16_t loop_left = 0x0000, loop_right = 0x0000; + int16_t stop_left = 0x0000, stop_right = 0x0000; + + /* Get loop sample (continue from current position) with volume control */ + if (samples->spindlemotor_loop.buffer && samples->spindlemotor_loop.samples > 0) { + int loop_pos = spindlemotor_pos[drive] % samples->spindlemotor_loop.samples; + loop_left = (int16_t) (float) samples->spindlemotor_loop.buffer[loop_pos * 2] / 2.0f * samples->spindlemotor_loop.volume; + loop_right = (int16_t) (float) samples->spindlemotor_loop.buffer[loop_pos * 2 + 1] / 2.0f * samples->spindlemotor_loop.volume; + } + + /* Get stop sample with volume control */ + if (samples->spindlemotor_stop.buffer && spindlemotor_pos[drive] < samples->spindlemotor_stop.samples) { + stop_left = (int16_t) (float) samples->spindlemotor_stop.buffer[spindlemotor_pos[drive] * 2] / 2.0f * samples->spindlemotor_stop.volume; + stop_right = (int16_t) samples->spindlemotor_stop.buffer[spindlemotor_pos[drive] * 2 + 1] / 2.0f * samples->spindlemotor_stop.volume; + } + + /* Mix the sounds */ + left_sample = loop_left * loop_volume + stop_left * stop_volume; + right_sample = loop_right * loop_volume + stop_right * stop_volume; + + spindlemotor_pos[drive]++; + spindlemotor_fade_samples_remaining[drive]--; + + /* Update fade volume */ + spindlemotor_fade_volume[drive] = (int16_t) (float) spindlemotor_fade_samples_remaining[drive] / FADE_SAMPLES; + } else { + /* Fade completed, play remaining stop sound with volume control */ + if (samples->spindlemotor_stop.buffer && spindlemotor_pos[drive] < samples->spindlemotor_stop.samples) { + left_sample = (int16_t) (float) samples->spindlemotor_stop.buffer[spindlemotor_pos[drive] * 2] / 2.0f * samples->spindlemotor_stop.volume; + right_sample = (int16_t) (float) samples->spindlemotor_stop.buffer[spindlemotor_pos[drive] * 2 + 1] / 2.0f * samples->spindlemotor_stop.volume; + spindlemotor_pos[drive]++; + } else { + /* Stop sound finished */ + spindlemotor_state[drive] = MOTOR_STATE_STOPPED; + /* Note: Timer disabling is handled by fdd.c, not here */ + } + } + break; + + default: + break; + } + } + + /* Process single step audio */ + if (single_step_state[drive].active) { + if (samples->single_track_step.buffer && single_step_state[drive].position < samples->single_track_step.samples) { + /* Mix step sound with motor sound with volume control */ + int16_t step_left = (int16_t) (float) samples->single_track_step.buffer[single_step_state[drive].position * 2] / 2.0f * samples->single_track_step.volume; + int16_t step_right = (int16_t) (float) samples->single_track_step.buffer[single_step_state[drive].position * 2 + 1] / 2.0f * samples->single_track_step.volume; + + left_sample += step_left; + right_sample += step_right; + + single_step_state[drive].position++; + } else { + /* Step sound finished */ + single_step_state[drive].active = 0; + single_step_state[drive].position = 0; + } + } + + /* Process multi-track seek audio */ + if (multi_seek_state[drive].active) { + if (samples->multi_track_seek.buffer && + multi_seek_state[drive].position < multi_seek_state[drive].duration_samples && + multi_seek_state[drive].position < samples->multi_track_seek.samples) { + /* Mix seek sound with motor sound with volume control */ + int16_t seek_left = (int16_t) (float) samples->multi_track_seek.buffer[multi_seek_state[drive].position * 2] / 2.0f * samples->multi_track_seek.volume; + int16_t seek_right = (int16_t) (float) samples->multi_track_seek.buffer[multi_seek_state[drive].position * 2 + 1] / 2.0f * samples->multi_track_seek.volume; + + left_sample += seek_left; + right_sample += seek_right; + + multi_seek_state[drive].position++; + } else { + /* Seek sound finished */ + multi_seek_state[drive].active = 0; + multi_seek_state[drive].position = 0; + multi_seek_state[drive].duration_samples = 0; + multi_seek_state[drive].from_track = -1; + multi_seek_state[drive].to_track = -1; + } + } + + /* Mix this drive's audio into the buffer */ + int16_buffer[i * 2] += left_sample; + int16_buffer[i * 2 + 1] += right_sample; + } } } #else From c0b7ad4b94f74d72fa004fd19f0eb766e6b03678 Mon Sep 17 00:00:00 2001 From: OBattler Date: Mon, 22 Sep 2025 18:10:45 +0200 Subject: [PATCH 35/36] More fixes. --- src/floppy/fdd_audio.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/floppy/fdd_audio.c b/src/floppy/fdd_audio.c index 1c4853d6f..fd397f230 100644 --- a/src/floppy/fdd_audio.c +++ b/src/floppy/fdd_audio.c @@ -653,8 +653,8 @@ fdd_audio_callback(int16_t *buffer, int length) case MOTOR_STATE_STARTING: if (samples->spindlemotor_start.buffer && spindlemotor_pos[drive] < samples->spindlemotor_start.samples) { /* Play start sound with volume control */ - left_sample = (int16_t) samples->spindlemotor_start.buffer[spindlemotor_pos[drive] * 2] / 32768.0f * samples->spindlemotor_start.volume; - right_sample = (int16_t) samples->spindlemotor_start.buffer[spindlemotor_pos[drive] * 2 + 1] / 32768.0f * samples->spindlemotor_start.volume; + left_sample = (int16_t) (float) samples->spindlemotor_start.buffer[spindlemotor_pos[drive] * 2] / 2.0f * samples->spindlemotor_start.volume; + right_sample = (int16_t) (float) samples->spindlemotor_start.buffer[spindlemotor_pos[drive] * 2 + 1] / 2.0f * samples->spindlemotor_start.volume; spindlemotor_pos[drive]++; } else { /* Start sound finished, transition to loop */ @@ -666,8 +666,8 @@ fdd_audio_callback(int16_t *buffer, int length) case MOTOR_STATE_RUNNING: if (samples->spindlemotor_loop.buffer && samples->spindlemotor_loop.samples > 0) { /* Play loop sound with volume control */ - left_sample = (int16_t) samples->spindlemotor_loop.buffer[spindlemotor_pos[drive] * 2] / 32768.0f * samples->spindlemotor_loop.volume; - right_sample = (int16_t) samples->spindlemotor_loop.buffer[spindlemotor_pos[drive] * 2 + 1] / 32768.0f * samples->spindlemotor_loop.volume; + left_sample = (int16_t) (float) samples->spindlemotor_loop.buffer[spindlemotor_pos[drive] * 2] / 2.0f * samples->spindlemotor_loop.volume; + right_sample = (int16_t) (float) samples->spindlemotor_loop.buffer[spindlemotor_pos[drive] * 2 + 1] / 2.0f * samples->spindlemotor_loop.volume; spindlemotor_pos[drive]++; /* Loop back to beginning */ From 4f0cdcad0be7097a20425bc975f32af56eb92fc2 Mon Sep 17 00:00:00 2001 From: OBattler Date: Mon, 22 Sep 2025 18:47:16 +0200 Subject: [PATCH 36/36] FDD Audio: Halve the volume again. --- src/floppy/fdd_audio.c | 56 +++++++++++++++++++++--------------------- 1 file changed, 28 insertions(+), 28 deletions(-) diff --git a/src/floppy/fdd_audio.c b/src/floppy/fdd_audio.c index fd397f230..409ddfe8c 100644 --- a/src/floppy/fdd_audio.c +++ b/src/floppy/fdd_audio.c @@ -519,8 +519,8 @@ fdd_audio_callback(int16_t *buffer, int length) case MOTOR_STATE_STARTING: if (samples->spindlemotor_start.buffer && spindlemotor_pos[drive] < samples->spindlemotor_start.samples) { /* Play start sound with volume control */ - left_sample = (float) samples->spindlemotor_start.buffer[spindlemotor_pos[drive] * 2] / 65536.0f * samples->spindlemotor_start.volume; - right_sample = (float) samples->spindlemotor_start.buffer[spindlemotor_pos[drive] * 2 + 1] / 65536.0f * samples->spindlemotor_start.volume; + left_sample = (float) samples->spindlemotor_start.buffer[spindlemotor_pos[drive] * 2] / 131072.0f * samples->spindlemotor_start.volume; + right_sample = (float) samples->spindlemotor_start.buffer[spindlemotor_pos[drive] * 2 + 1] / 131072.0f * samples->spindlemotor_start.volume; spindlemotor_pos[drive]++; } else { /* Start sound finished, transition to loop */ @@ -532,8 +532,8 @@ fdd_audio_callback(int16_t *buffer, int length) case MOTOR_STATE_RUNNING: if (samples->spindlemotor_loop.buffer && samples->spindlemotor_loop.samples > 0) { /* Play loop sound with volume control */ - left_sample = (float) samples->spindlemotor_loop.buffer[spindlemotor_pos[drive] * 2] / 65536.0f * samples->spindlemotor_loop.volume; - right_sample = (float) samples->spindlemotor_loop.buffer[spindlemotor_pos[drive] * 2 + 1] / 65536.0f * samples->spindlemotor_loop.volume; + left_sample = (float) samples->spindlemotor_loop.buffer[spindlemotor_pos[drive] * 2] / 131072.0f * samples->spindlemotor_loop.volume; + right_sample = (float) samples->spindlemotor_loop.buffer[spindlemotor_pos[drive] * 2 + 1] / 131072.0f * samples->spindlemotor_loop.volume; spindlemotor_pos[drive]++; /* Loop back to beginning */ @@ -555,14 +555,14 @@ fdd_audio_callback(int16_t *buffer, int length) /* Get loop sample (continue from current position) with volume control */ if (samples->spindlemotor_loop.buffer && samples->spindlemotor_loop.samples > 0) { int loop_pos = spindlemotor_pos[drive] % samples->spindlemotor_loop.samples; - loop_left = (float) samples->spindlemotor_loop.buffer[loop_pos * 2] / 65536.0f * samples->spindlemotor_loop.volume; - loop_right = (float) samples->spindlemotor_loop.buffer[loop_pos * 2 + 1] / 65536.0f * samples->spindlemotor_loop.volume; + loop_left = (float) samples->spindlemotor_loop.buffer[loop_pos * 2] / 131072.0f * samples->spindlemotor_loop.volume; + loop_right = (float) samples->spindlemotor_loop.buffer[loop_pos * 2 + 1] / 131072.0f * samples->spindlemotor_loop.volume; } /* Get stop sample with volume control */ if (samples->spindlemotor_stop.buffer && spindlemotor_pos[drive] < samples->spindlemotor_stop.samples) { - stop_left = (float) samples->spindlemotor_stop.buffer[spindlemotor_pos[drive] * 2] / 65536.0f * samples->spindlemotor_stop.volume; - stop_right = (float) samples->spindlemotor_stop.buffer[spindlemotor_pos[drive] * 2 + 1] / 65536.0f * samples->spindlemotor_stop.volume; + stop_left = (float) samples->spindlemotor_stop.buffer[spindlemotor_pos[drive] * 2] / 131072.0f * samples->spindlemotor_stop.volume; + stop_right = (float) samples->spindlemotor_stop.buffer[spindlemotor_pos[drive] * 2 + 1] / 131072.0f * samples->spindlemotor_stop.volume; } /* Mix the sounds */ @@ -577,8 +577,8 @@ fdd_audio_callback(int16_t *buffer, int length) } else { /* Fade completed, play remaining stop sound with volume control */ if (samples->spindlemotor_stop.buffer && spindlemotor_pos[drive] < samples->spindlemotor_stop.samples) { - left_sample = (float) samples->spindlemotor_stop.buffer[spindlemotor_pos[drive] * 2] / 65536.0f * samples->spindlemotor_stop.volume; - right_sample = (float) samples->spindlemotor_stop.buffer[spindlemotor_pos[drive] * 2 + 1] / 65536.0f * samples->spindlemotor_stop.volume; + left_sample = (float) samples->spindlemotor_stop.buffer[spindlemotor_pos[drive] * 2] / 131072.0f * samples->spindlemotor_stop.volume; + right_sample = (float) samples->spindlemotor_stop.buffer[spindlemotor_pos[drive] * 2 + 1] / 131072.0f * samples->spindlemotor_stop.volume; spindlemotor_pos[drive]++; } else { /* Stop sound finished */ @@ -597,8 +597,8 @@ fdd_audio_callback(int16_t *buffer, int length) if (single_step_state[drive].active) { if (samples->single_track_step.buffer && single_step_state[drive].position < samples->single_track_step.samples) { /* Mix step sound with motor sound with volume control */ - float step_left = (float) samples->single_track_step.buffer[single_step_state[drive].position * 2] / 65536.0f * samples->single_track_step.volume; - float step_right = (float) samples->single_track_step.buffer[single_step_state[drive].position * 2 + 1] / 65536.0f * samples->single_track_step.volume; + float step_left = (float) samples->single_track_step.buffer[single_step_state[drive].position * 2] / 131072.0f * samples->single_track_step.volume; + float step_right = (float) samples->single_track_step.buffer[single_step_state[drive].position * 2 + 1] / 131072.0f * samples->single_track_step.volume; left_sample += step_left; right_sample += step_right; @@ -617,8 +617,8 @@ fdd_audio_callback(int16_t *buffer, int length) multi_seek_state[drive].position < multi_seek_state[drive].duration_samples && multi_seek_state[drive].position < samples->multi_track_seek.samples) { /* Mix seek sound with motor sound with volume control */ - float seek_left = (float) samples->multi_track_seek.buffer[multi_seek_state[drive].position * 2] / 65536.0f * samples->multi_track_seek.volume; - float seek_right = (float) samples->multi_track_seek.buffer[multi_seek_state[drive].position * 2 + 1] / 65536.0f * samples->multi_track_seek.volume; + float seek_left = (float) samples->multi_track_seek.buffer[multi_seek_state[drive].position * 2] / 131072.0f * samples->multi_track_seek.volume; + float seek_right = (float) samples->multi_track_seek.buffer[multi_seek_state[drive].position * 2 + 1] / 131072.0f * samples->multi_track_seek.volume; left_sample += seek_left; right_sample += seek_right; @@ -653,8 +653,8 @@ fdd_audio_callback(int16_t *buffer, int length) case MOTOR_STATE_STARTING: if (samples->spindlemotor_start.buffer && spindlemotor_pos[drive] < samples->spindlemotor_start.samples) { /* Play start sound with volume control */ - left_sample = (int16_t) (float) samples->spindlemotor_start.buffer[spindlemotor_pos[drive] * 2] / 2.0f * samples->spindlemotor_start.volume; - right_sample = (int16_t) (float) samples->spindlemotor_start.buffer[spindlemotor_pos[drive] * 2 + 1] / 2.0f * samples->spindlemotor_start.volume; + left_sample = (int16_t) (float) samples->spindlemotor_start.buffer[spindlemotor_pos[drive] * 2] / 4.0f * samples->spindlemotor_start.volume; + right_sample = (int16_t) (float) samples->spindlemotor_start.buffer[spindlemotor_pos[drive] * 2 + 1] / 4.0f * samples->spindlemotor_start.volume; spindlemotor_pos[drive]++; } else { /* Start sound finished, transition to loop */ @@ -666,8 +666,8 @@ fdd_audio_callback(int16_t *buffer, int length) case MOTOR_STATE_RUNNING: if (samples->spindlemotor_loop.buffer && samples->spindlemotor_loop.samples > 0) { /* Play loop sound with volume control */ - left_sample = (int16_t) (float) samples->spindlemotor_loop.buffer[spindlemotor_pos[drive] * 2] / 2.0f * samples->spindlemotor_loop.volume; - right_sample = (int16_t) (float) samples->spindlemotor_loop.buffer[spindlemotor_pos[drive] * 2 + 1] / 2.0f * samples->spindlemotor_loop.volume; + left_sample = (int16_t) (float) samples->spindlemotor_loop.buffer[spindlemotor_pos[drive] * 2] / 4.0f * samples->spindlemotor_loop.volume; + right_sample = (int16_t) (float) samples->spindlemotor_loop.buffer[spindlemotor_pos[drive] * 2 + 1] / 4.0f * samples->spindlemotor_loop.volume; spindlemotor_pos[drive]++; /* Loop back to beginning */ @@ -689,14 +689,14 @@ fdd_audio_callback(int16_t *buffer, int length) /* Get loop sample (continue from current position) with volume control */ if (samples->spindlemotor_loop.buffer && samples->spindlemotor_loop.samples > 0) { int loop_pos = spindlemotor_pos[drive] % samples->spindlemotor_loop.samples; - loop_left = (int16_t) (float) samples->spindlemotor_loop.buffer[loop_pos * 2] / 2.0f * samples->spindlemotor_loop.volume; - loop_right = (int16_t) (float) samples->spindlemotor_loop.buffer[loop_pos * 2 + 1] / 2.0f * samples->spindlemotor_loop.volume; + loop_left = (int16_t) (float) samples->spindlemotor_loop.buffer[loop_pos * 2] / 4.0f * samples->spindlemotor_loop.volume; + loop_right = (int16_t) (float) samples->spindlemotor_loop.buffer[loop_pos * 2 + 1] / 4.0f * samples->spindlemotor_loop.volume; } /* Get stop sample with volume control */ if (samples->spindlemotor_stop.buffer && spindlemotor_pos[drive] < samples->spindlemotor_stop.samples) { - stop_left = (int16_t) (float) samples->spindlemotor_stop.buffer[spindlemotor_pos[drive] * 2] / 2.0f * samples->spindlemotor_stop.volume; - stop_right = (int16_t) samples->spindlemotor_stop.buffer[spindlemotor_pos[drive] * 2 + 1] / 2.0f * samples->spindlemotor_stop.volume; + stop_left = (int16_t) (float) samples->spindlemotor_stop.buffer[spindlemotor_pos[drive] * 2] / 4.0f * samples->spindlemotor_stop.volume; + stop_right = (int16_t) samples->spindlemotor_stop.buffer[spindlemotor_pos[drive] * 2 + 1] / 4.0f * samples->spindlemotor_stop.volume; } /* Mix the sounds */ @@ -711,8 +711,8 @@ fdd_audio_callback(int16_t *buffer, int length) } else { /* Fade completed, play remaining stop sound with volume control */ if (samples->spindlemotor_stop.buffer && spindlemotor_pos[drive] < samples->spindlemotor_stop.samples) { - left_sample = (int16_t) (float) samples->spindlemotor_stop.buffer[spindlemotor_pos[drive] * 2] / 2.0f * samples->spindlemotor_stop.volume; - right_sample = (int16_t) (float) samples->spindlemotor_stop.buffer[spindlemotor_pos[drive] * 2 + 1] / 2.0f * samples->spindlemotor_stop.volume; + left_sample = (int16_t) (float) samples->spindlemotor_stop.buffer[spindlemotor_pos[drive] * 2] / 4.0f * samples->spindlemotor_stop.volume; + right_sample = (int16_t) (float) samples->spindlemotor_stop.buffer[spindlemotor_pos[drive] * 2 + 1] / 4.0f * samples->spindlemotor_stop.volume; spindlemotor_pos[drive]++; } else { /* Stop sound finished */ @@ -731,8 +731,8 @@ fdd_audio_callback(int16_t *buffer, int length) if (single_step_state[drive].active) { if (samples->single_track_step.buffer && single_step_state[drive].position < samples->single_track_step.samples) { /* Mix step sound with motor sound with volume control */ - int16_t step_left = (int16_t) (float) samples->single_track_step.buffer[single_step_state[drive].position * 2] / 2.0f * samples->single_track_step.volume; - int16_t step_right = (int16_t) (float) samples->single_track_step.buffer[single_step_state[drive].position * 2 + 1] / 2.0f * samples->single_track_step.volume; + int16_t step_left = (int16_t) (float) samples->single_track_step.buffer[single_step_state[drive].position * 2] / 4.0f * samples->single_track_step.volume; + int16_t step_right = (int16_t) (float) samples->single_track_step.buffer[single_step_state[drive].position * 2 + 1] / 4.0f * samples->single_track_step.volume; left_sample += step_left; right_sample += step_right; @@ -751,8 +751,8 @@ fdd_audio_callback(int16_t *buffer, int length) multi_seek_state[drive].position < multi_seek_state[drive].duration_samples && multi_seek_state[drive].position < samples->multi_track_seek.samples) { /* Mix seek sound with motor sound with volume control */ - int16_t seek_left = (int16_t) (float) samples->multi_track_seek.buffer[multi_seek_state[drive].position * 2] / 2.0f * samples->multi_track_seek.volume; - int16_t seek_right = (int16_t) (float) samples->multi_track_seek.buffer[multi_seek_state[drive].position * 2 + 1] / 2.0f * samples->multi_track_seek.volume; + int16_t seek_left = (int16_t) (float) samples->multi_track_seek.buffer[multi_seek_state[drive].position * 2] / 4.0f * samples->multi_track_seek.volume; + int16_t seek_right = (int16_t) (float) samples->multi_track_seek.buffer[multi_seek_state[drive].position * 2 + 1] / 4.0f * samples->multi_track_seek.volume; left_sample += seek_left; right_sample += seek_right;

2YA-8Nu_`sP@&Wovx+F^a}d|*x>8S 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 literal 0 HcmV?d00001 diff --git a/samples/TeacFD_55GFR_5.25_1.2MB_seekupdown_80_tracks1100ms_48000_16_1_PCM.wav b/samples/TeacFD_55GFR_5.25_1.2MB_seekupdown_80_tracks1100ms_48000_16_1_PCM.wav new file mode 100644 index 0000000000000000000000000000000000000000..0b6be1124929835052eb17fd76498307d2de4334 GIT binary patch literal 106992 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�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 C@z8+) literal 0 HcmV?d00001 diff --git a/samples/mitsumi_offseek_80_tracks_1000ms_48000_16_1_PCM.wav b/samples/mitsumi_offseek_80_tracks_1000ms_48000_16_1_PCM.wav new file mode 100644 index 0000000000000000000000000000000000000000..afd95b8d0ffb7610c1fb7d7e8348bc23a1c653e0 GIT binary patch literal 94412 zcmX6_1AH9Y+nzb+40hwxZED+Q+TPl>o4QSH+qP}nwrwkIoa~PAJ^g=of5q);GIQSd zJbI@^{W^7SMDtwR$Tt5)4H}Unl;b!ak16Nzm(e^&xKOTF_YvK<;59?Jf*j>6H;i+* zHvBaHJMZW7k)~uiSx1hLgJd3QPeRC5ekd>SbGckxA#MzJgnQ5B;ivFt`D^@PeiJ{Q zkK`@xEZ2i$+!nXLJKR0xQm!&LfE&m);R3mZZn(R`Dec7BJMHOqAG^EV+RkVHur65( ztOY3$b zfz5;32VV_-9h?wcHY7A;Xz+rd+kxo<0|Fj+Y}u6?dZIluJ?Xr419}8%fo+2t2fqtx z8^(qI2|F4#BP?6krO-j4nL}5FG!8i(awYUc*uAh;VTVH}g#HNa8@4!XMcA;gT451k z<-`69O9=fKl0CR@pf@1B_nfDicUr*kpxq(U!}f>o4Bs7AC-hu!nV|5%vH`EXBLYqa z9t~20jt4~sjSrj{FxNZ4Oun*}B$vh~7sv4#B5bKI+XPvB?k;B`IYJTK&UX}tK8 zm7^v3XlI}~N>8gF(O((OEwA(4jp7TCu4D(vNz2gZq%;}BPvUsDx_!_5Wi&TV>V9pR z_DJibr|3CO3`I9s{v3tU|_^t6T;x{CePl`(>shfSnlvk=p zAF69wcCC;4PN}N2@yDiSPHB;}Iw3HAPwczD)BhI!d*<)8*bZ?<9E)EX*ClRp-2FH; zu2y`T_;&Gw;#yfRti(NulM~A%>Ish%?k2oX=%4sLab;42 z+STidPjY`9%L*t z_8QSfQKN`a)2M6oF@6~{P%V$mL^Fd`)|zC+SV8tZtm?z&baO5Kb%?d!E^i;VcGzp| z$@Ubxo?YDzwhPr7WqgVa)|UNZOBH_ zj*en`gk55FX@FE+`Xk;GzlzzU3DRb1hO|ifA+?pS%iTO#z1zGOy(_%=ygNMwJ$K}x zau)fAbW&O&os(+H%rncA*W1t=>*2kYC&D|-JH?wFudM4ylo!YW@@eU>)LqW(x#bz) zO&{O}911KQv^B^IDj&=Rw+q@3m?m&}02ff++s?C7E+(gu%gD9lqH;EQp!`i9@A-vq zPxY+xWbrJJ|4MzO4AOT|6U$4@rD$n~l{p9KLD7ljCkyWXH+*Lj-pTzHyJX1<1 z#fd&KUi>CL5f!lp-Z4?CD%}zniCe|%;#F~tSXdk_tY#-^INe9Klk4O>c}6S}PdT_Y-6ZexVbM?6X=)POs zKTdz=BYIqjonlq9&)7AbM^0V$s+*ph!v*tEd{aIh|CU?8W#JaMpPgEcYu~bG*!}U2 z>Go~AkTcbZbtbu!uo2WG-$)Var5DIBlEgRWW&RwOfs1k#CzE^9ty-9 zgqq@JF_*Ma`YO$mri)VqNoXqM7OP67C<_oFmj@UWh=DZNJTutedK zsEhYSSu8G0XHRJa-AR(j6Pn153xQ&9F;46()sfbTM}+yTA)QHjkzksY5uvxRlC2>X zxJW0)x@%rF9_T3=(~7Hm6r$w!xAnbEo#Gp;?ALx9Y3;ObQLYNN!foQ5x4N3mj1Br_ zZHKx}S>&JQ+nvg%4ou0H@;Z5Va?a$#Np51c#IXsv5`q!}67IyGh<_PhE}?J2Ed1)7 zP$%(g;)TSlNxPGxlMAHuPU)XABBguErQ{1qd=g7qnzSS7Z{p#E-tpbyZvJimr^26H ze{%kbjoBTuH)d1J%$T+@HDdfdDr{ACRe=7fd@i%X5aO}Rn(%*%Dl$iQ48-LIF zT{5QXpQC@T#M*K1;x{GiPwbvFI<=;UrqtH zi`&#qa27kgoTbieXP7hAx#CoGx4DEH&fVui`D(xvqj?{{fi$6wsYwc9 z%ZfKO;C{g3z%)U(g1!cw2s#`@gLen#4!Ir@5Nd`@52+B6H$)668L~YjZD?%BvXBuW zeM6!{s)tk#sS;8rBx^|1;HyEEg02N61-%UXFKA@YfCr}717D$4F zL&}FV3#}Cw z6c)TO_F8mVS3)h5uf+q0d7NMB1 zk-eb%aTShmdALRHdFMUw+E^f=u4X@Asv7nmd$cplY2#dX-Z>YYNzO~VzJ16_Fo&Bt zP1ziY9p{OBQ(|zxbb~ifhZJ+tv5RATh3B9g9 zS>K~?)6eR$dI_VSvB|h*d@>Z{E7063qou(citg&Nk<}Pt+%ZCc$VON#fX3qNyY@Ql zTRrhOZd0d*)7=?@BkSOdcMdow@w0&NP?fN^|A$s|1(i4t4K4nVdz~EpAy`tUY+FwU${UtVP>@2TW`&;W**BjZ=sTNnxBk4#(v|lvCWubG&Kqul5tz_t|tSD9n#9_ zK3y~#8`F)|MuM^4Txzwo@7X_aJ~&5q3OIwEn~vWJbW@xG&M#ny6IQS_*Ng`SIi?rT zYw5N1!+I0rp|R1NVqDW#0HJ3w-XO;{>B2Mv{}s>Wj}G!awc~MJKaRmkbLF` z^T)W~ZdG@RlVTsSvpB~c(f#4Ha&BOyv;k`<>MV4=IKggyH=X+)M?c2N=KRF<+Gszu zYFQ<%0XVjT9vG_W`Ob0NHr{@6V7HP`;Ohz zIqQtWb-u~H;zsf!T}dLyG(H;Fc9h%Az2ek#zS$X_f=&r%D{3a2^9)SsqkY;wYA>-* z*zKGE_a$~~lWV}w<@1viGLBxSL99J%z`oJu^elP9ujMSfKf;N2zByN&G;Rs^yt|)I zM~aeS^enB${<0y0EM^odh}Fdywx6{Vp0ky#5sSyO<7sDFl9r%xWD6Ni`jAPaF-hU) z^Zocq{0x2_zn}lZ_aX_TH+@UPnaEP9hCXqD@q&-_W9#T_vY#)_KjXG@Yq>XEJ+Q&o z{BwROswJ5GAp2-ZHkut}CgX$zHi31a^N7iB1#4{0U*bw}uiTATq1$o1l-mVfnTxN( zf8urn_XKdm-1_cxHw`zK+ssYpp1LF5nr?cx4eG(m6-ULS)6BX?{LQk=`)DrvSKfK%4JH%^yx_BnZbTBfr%f5hk_)o7lWiiQYY!Spl*~Mc*J>d>3#>UYzB#bQOi|{_+*Ae`E{ugiaJc+^Iw(xWKS^N%u2%m?41Wa3j zzr~;6gGhFAp0B}Q1IwPoO@)Fn&kev@Sm%gNd3yyI`c3PQ)zZ3V`Oz~9*tP7Zc4KtV zM(CPpfQQ%HU#!X266?1Wh_2YudSFg6)0wl4ANnx8h(23ORy(Ve)k11swT)UpO|NG$ zvw-Wjv`p)!9g0f(iOMWu@3RDJ9$08rGtlf~Mw{2o3FceuSA+Cp+H@_WHeNli%vahe zSrpYj#NX22*+0WS+TY&4*k3}SKw&-9OX>`5sNThp&E{r9^NR6R$f&S;M{RePxo z&;qnfT5YYHHbPsjEzu&i+v*DShMG+~pw-b&>59HdkI?sOQ?*Lkb9JhkRlTCzQKHoz zS_S>5UJgBZuQAMctM|n|dPy6vO;_7%^^6+ENkcLXql@V?7vK!#!zx|^HkWFDwGUb! zpn#;J-**91Oox4Sz5X4{`JI|uo25k=Ma)IUQe&tw7JR%mK4+e}(aK=AwfCWKPDI}s z!oB6=Nnv`A^u`r>&Ij^AoC_q7Y>$WHlLyLAL;Hf=*Ir=`HD8&V%y<*KjWyo>Y4>oJ zqds?WX@JTb&{4Dv%|}0w-{dn9=x=g|93!)^s!NepcrY@NugI6>^I^qQ0ryPiE24Al zB9!)^k7z}#;ygkw;R?&dIzvYoOMJkQRnTviqBou9-}42@6*87au&3;;umlx!P23<( z6g%|Mq@j%{GA1+R$85~~3-ePwCbc6y0sV&&O8I*qoXS?N`>0o?dG`GBK1Np_OQ z^57?)%sYHtvYNakJ*i12vKuUg z-DeSO8MVn=GJwp4YB!ZsB|86tf5xZqk@%JfnvELxoC{|v%>SmbKcXzb5{N>eGcxGXs5TEV%>}SB38b zgjNCPz6xzg_fUcLW^33bX0S3~u33eftQxyR3(ys$9=h;HbfIp1A^r|GABc+Q9=f~T zfo=;o%3bX~aBsMK+#YUYx0yS{xo9tdu6fhy3|y5Fdr)KOkrwunO6DD-tT9smt4%_+ zHr1lETiPbg*4F4r`f%fhkqw>0HRoG@tWr=J9qX(0$y#rvv38&@)HCy#iNG`m^ceJ% z{^||om~uclsO(T?DFxMxN)^APc$83OnG&vUQB^gK7OQSn8>>t`snk>6`xSqvGFjQ6 zR8l3qpq{9W(!1zhy^*#WYFMQ5(qF~@%QxFM%Qw@v(dYN|^?&rg^Z)fXQ<9Z^>JTkS z%K^2imTqe|v>%#+|LdR^*QaX7)sE^I@W(GoWhLH!#=p`3%->LXtqfKR;XR}E!FoCH zzhteywpGohZdM8@R9UGkR$FRAwAtDf^teOXMD3!MLHB8QwVwFw{MuCfR27tO{>sW6 z<%3dQeWd2l61DrfV7@lrTa%r5yDOAq4|J%`*k89(pTwYjFHA* zqrOqc7-w+iBeOR2@JslW{6c;#a7_t*2bY~&3G`Ln$?SN+4w^cZ zoginrvx%F>ui(p(#Uwva)=Kt`eP>04FTzCZjE+!Uc*2^o8*~jFiEi@>-N=V(3WMVH z8WnwktRnYGb$W$XW)s;5R#ccL>=F(MlZ9%6DEwry@Ev>Y3GC4yP{U0~0)Lx-i%M*S z?)IBR(-iR5y;y@e#S-9YRpnvw3)zyN%0=Xz;!NQa-dmqlX4RR43Tj1H(s}4Mg7{91 z71K*WQU!6gkPcPmWy8@=9Fl`Jq629Hc|>ofH1`X(*Cc10bju2lP}&D1I?QM0Rel=RwNy}dqD=ZyhyXlesvb%1B{&Nu`1 zKHA7>?9+SeYxF26)SYxi&5GXWs1MZI>IJ2ua>t*+-`{7Y_D{`_>ZXiL4fXZ+J@VD_ zyZ$9mus*8AwUyc@sNo&JBR6Wl)P+#AMyu`B-fBa9e{1!!no}#Tc{E*(M8_Gf4c4}4 z#r0j#!b=+EjbweVz7l=ytkzbmtA%TSRiPe^_KkfWZS!cEL-kAf0nPhbWr(R(dvMbqda4yFi&-AJK5`DM+ z+}vzGgG0pNi(Ph)yC=Zu-?(So1h*acfg8?OA+@jvZAZP7z)JiL&2lGD|2gdTH@HM@ z9MJDIsJhG0EBc_m8uByw>-=XZ?zhm-X7Ssw&;O=Rg>+&=@e@{9EW5(O(QldvjnT8N z2%%yRVEB!|BR_?sSo=vrf}jhEP+y!a9u`lCW5o306`-DZ!dM}*Fqplf9jSo+a09p2TAm_5k`_u~P=xo0Peo4hiO<9f;(oD+ zlptmFJoYT|+`+#7=AV8pRuzX~XZ=hopmRjyCoBVZF$b+kC!<$vqoGjjnhMLHDj#P& zi>AHkX8HqMXBn786#2vt;9H?GLVy7c{tV8+L1371IGsopIsnMElyFWcf@{}H%qd#9qCddedJ8#l?&`8n zbSmvcN6?G(JM`@>ELbRveL;X?A0hk)ZLg28NLYtIBZQCOo-=@sdV#rppvUPcdYAsD zUx3cOVTUP0-;qU70|Lo2tiZRtNX8SL{KHFM>1|-CtE30XO`f95o&q0_$I4#pzIK~( z3EU*?Y4h;fzH}Zi^3e!OTG;LveI~DyoB;p)HtNiM>Sp4>w%LLh7MKTSY*6KPZ@^yT!vG-!cwffzz5fC zY>v)+`-1huEM{&pQuQ+W4lS4VL*1%gRiCL})l8bAMr#Arrb;7quX;#LRb7?SZm5gY z|5RChsfEc@ z=2W9K_~CHPR(GmR)Pib0^}V`OYpPGs*XaxN$NF#cC{R#{Q`_n0ggO)9>P<(NnrWFp zrA5qL`f+WDp2e7MPOvVZf8_(}j4|WjYj3ko+Pj^$aFxD7dFst4K~YSB8q)>3%WgLf z*f!_JJJsE4(8`WE>z&D54}KoMlT4ylSqCu$N^@HHX=f#m6eaEugT-6I9N{xd3+H7Q z6r*&ABMjyXqtkilP~h(&YzGi}FE$FlYGPOZfPFPRi$*1s!j3yg2oeT@2{fna=@0CD zDnAUhSc`k(K6jxE@$Kj`_Cd%Z)t0M!GJDT?vjn6K7~zff43vG)CeE;Z@VH)}uco8L zv3fhPXy_Xw#K}^u)JN_npOwO;rs5ExJsSnI^zEN&1&(H-MjMb5M52Y!ndhJzEu-~m zMtEiQ$TsY@wXoM(Kuh_d<86kH`^U`=udXo|LQzh2b8~%wZ)TDp;53J}V8vMgi=~Ia zYEMAbN#x2v+kJ^NKt9*w76E_Q=zehra%F*XBGDVako5EzxxycU({#nj>D+`edE9PFN9qED9p+krmt1uRyOp3@w!r?9h1FhH& zaW7$s@JeujVgp1$d?-W<>4j}f1<&aRDv0`4)RoE9t zk(y*a_KO`f4b-Z-ES#;OL3A0Z4DF}{i6WbTzeRX{Dp=h>>=)VjDM0wT>$)kxlD3;4 zzS1LZD&GtoI~Yfp6F}c3OLx<(PTR{LpnG&Glwg zD-}*fyd4fbI6F|(6z2w9EDac{tTWrbW0kUMn3W7u-;aLtTOY3)6c-rCDWE zH@BFYSDo+#+-Km%^ z>xZ>5=yVdkDTi+B>vzYeT7P_>nJ;GeCOd&+OMxSqjyVU#etm@UkKI9raf z%>0a>_OIE-%I;jZo7i!dYxaijFX6ckW~zAvs?iy{m9xj5=WK_cQOe!yWO35i1+2>E zY9rX_q1OTDl+BJ-k~tNgLTe|~?clC+&p}1Ez#b|=No~eI9M09;-+xzP=Arg9;Ld;ZlYTfUR8`U$z94-CJ*RK=7S>62_9js_*EJ$9hQztMWoT< zcBn?{;e&mJk}(78yrIxm*dq7@k9boUf%UjuI4LX^1`CaZzQR=@GZcu=(1tW|spu7Z z2=CZ9C{DA`En>-R=rsrVt9(lmNy|fRza-|6D|-rf3k0MDLLSSz1}szPT|(}jsO9*gNhW#1@hIw6Qba* zRt3YTfnMk5|MEAWz4|zvv$_5Mx(C;Q>jW(H3M{ZDI>JLff;30Aqc%SKGOb6C5`i@3 zS3*H|oIX(A2O%kvWM6iUySuqM;FKHj4vNYgOr`<*Od|QnF1{wZej>+kL?^&1Cy}?L z6*%t(;J#Nv1~EYV1LTw)dh!cl47$fTu&8;!q9>tHEdZ~J0>bl>1AG&(){N-Bv!QSO zLnPgxLJbAd@YA{II$PoO4;S}A6WR%M6d;}z#sl?K7IF(JINBt(4SgyXI#Uq-|1KMY zzI+<^vl6abI9%pzz)fk;9VQEffSNCWSx=T2vL8{>d9k3lRww}ezXHz58|X$^X&8+m zakv&Vp2Cslp_%D*sB;H#_J_hr{N~0Z z4YmqvyBqlPPj>~koTe9~v>CiG%ki^U^Y|E9eGZ>p?+(+?Q+ z;KjDLzE}}_@n+qLFfXU&yH3;jRsv|3ZG3XMm^cRbee=tcGG`a3NT~#p+S*EF4bm#@{f+&GKSJ%TEz%bnp>T71 znXOF|I?;P$9$q~Gnp-hr5<2K-bhGB_StXOYO#KfG@Up(y7;GwLL#wM((oJ^mIy^Ab z5i7(RgcRCHV9$O)URzBIsPqr=hM!H@8V232qg~iJ^jUu`EJu=v9w| zXTnM_DnEAR=|J;Cpd`n`eH+goKC4C?wW)>r5+HWK5|88bkUx($8o72C;1VwaDBZtX`-V;BF0&jmI5 zC#i!vxJl#aFM1jpbQHOanq9>&hEnkbxl_m81@Et)y9LhwBQUU>ZV;Ty7N~^V++Os~ z=IAqwwL>k8VmW~RD$?itQ6x~iyIY+A=d%6MuIW5ty0@A!Aj5yZOKGZs2}*pKvk!Ez*n1 zz%lu7?xMv{;sJudV4og06Z}s=q(Lc-fbx9 zi@?3=vN>R1Gg(LIMe~7gpF&4m2VZRfSobM$tXNWv5!MJRgxyG6bi!`*hb6Q0;Ba|` z>`>Vcvu>;~u5cgpn~U&IML~f+oev6RH(>zwBVN2E7M9XT7x78m;9s1DYX1WnyMgGQ zJ%lh^o0GuL7WRo+$VaWA&uCgG=+UeIn~Id#N}Q>h=%@9dLbiu{G8+tYD>z$Wpw1~s z^mPUr%*FrW?s9jy7%n~3v{?v(o$byD1(239fG zjKChA(PUOLE6Lho=Rn?U2=Wr?;R1butKH5{#r0@yUBm0P!D}6DxO#x`8;WsJ{e#Bo zTlL1qS@`F5pqpm}V%l%Lh93SD`H3u6TJx2@2EN)t<+FdVKc~Nif1Uq}e-yOpmr!uZ z>y?133c|Y@W7s%?;$|9iKlGjx`XoJ4zlW|-0(x{WZ4G!=O|__c2Y9KMT1@?>tW(k} zUHtQWUsLm@E>Fpj@-10R>5^in{7lW}&#bIhd+4`}&*m;mvX@)O%!S4{prDf4Aa#yn z`n&kk!P~2))Ky=C*;UbYX)!=dL-a#>RcL8_4Px}vPiv*M!)lz8;?Lzj=KIgr&=>9> ztyI*e>3s~!|g?JY^n4N@NE(Y^eFzXpfvr2ICpJ&T;FmEx4nh zix$TU-vJig-Wg~|SksJDc!iQy1l?WHP8-{-LDnwop;g5WaBex*-J9HZzAaYf8mQD| zP>W|+Ss{F+cK$#iyzHcP4?@=(@6>b$agX^}vYS2u zvd9n3;I)`4zmf0A4dhPJETE&4@XQXPS6u|R;KXEMJ&?#{ILa5%nSMck{sMJ73mpW1 z>=5fD5b=t*Um7VV%0Bs!++1EQ?G=wBkx-N^gx0Yh8H7&IVY|>`NOz(3q_UpU$cL`< z?(uH$26zj2-pX5LzqCo}3@@3NHUdBO5W}S>(iHiU%*&_nuNIh18TONYgno1eZemYb zo(96rc?Si#0+XP~R}t@sy`(rWz@gG+ajUR~eS~kloi2v19fxkWk`LqGaXhd_Gd>nd zQfuV5x51s>ie$t;^wovVr%TYE;;4Z=e=9u*Rca&8_>Is(YPp8<)2RYhn4UYtt>ODY zxk-d8+7A_z51zql_=cIuaDFCu;(2$D8|^MY`hG2U0KI7>Jf<_;L7=Y@NK`!MQaPE= z!Vlt2FzX0-Y@Jv}Xmx*t#!%ZTO2v>8Zz$#gV)`wd7P<%;8_p7;{*}`U?&gYeoIC*eV=A(we(|p6=Nc@LOG0h{iS|FZ>oPp!h8%g;RLm#ViWE^GUMCL*AOKQhZ(gON+xf;oae)=%rZ)y-ODjx@UKJ+;ozg&M-| zDz1!Eo+*Lq4)w7*T05a`@=rvs$cGHTS$~L9M;Wa2QX-HH`079IAB4Wp#=qIml>AB= z<%@bp>!%&j7T`!YZH-FR9!R2Y^7rw-^X>6n@_qBA`l|U8{HK+>YG?h7F&9S@1Q%Yk zOIW4NNaLQ~RzCvGYcrCUI#jN3s7yW3A9yI@ZMB8)=W0UyUgSv|H3t8E;V z7=hTl7oT&B^oQGb0Q>74Fp(c{rT+r=3-Uy17*y*y>^{vx=aLFYHB3MjY6{H=+>;{I zkXFh&k*S&Go#X9-jCyBJe)*ZmBY*q?pVbZ8$X0NIBsvnVbptT8=R$M1fF{^VE+|?5 z{wo6?@hZQa&z zp}zt*EpU&y9_Y|n`0acgISlU6f$f5CIRnU{8r1e3v>nYr{(uudahY4%*$t*P#r|v0 zbQ-u-kf(XiS4VaIhW}rWEa6q;Yx8h(pgLu99w15Sbw(lAamo$gvLR0x1=ns3wDo`3 zs+60_4MyS#`6+z&S-u+yqqk^(Fw$tj5XK>geI2^rA@Py;8p-jR(BZs7CpeEciHFPt z6AVGd{URRUptg60BYOpyaTR*pH98$W+Ct&AkOtYJnc`w`JpN28-WIwGw^&BjlwKzN z;2l%}v-|`#`Y!E?bkR@b4jgfT6ew4a(_=^Bq-Nr7@cFgCJPi8ZU|Nl4ry|tDeQ;>k z(|&9pTMYfG7_gZi(<+6K+TSfU5EF#k=!0L;4Fw^Bm8RQ~r?`X6U2)nPD~2+sf7HMpiz%p0_7$XM<{+oK+TyLT<_lEO z6+O59MmvXm&=;+MRuf+Og#RT9{sX#6)^_Mc!G|29AsEjP^M?5eo?Tb7y7|T^W7N^p zYDvmZ|9}1szSh2I-vM6)vfc%hnaT?_7u2YuaO6K}H}qc6)eD&=Ffr8^380tyGJSw9 z>2csn&$I+>1yu4hngwsZhT2D&;os;h>wBHLE45W>y40dTPwi5_r>+63>+SELOjT!T z-Sk>U3}$tPU_Ps``5mgg#~20{*-gu!<#hZOQeGm{yG1b<^am;P2SU|8mAhq%SvSm&CP z3)#%{Tr8J|z?r4R*-};ku5k^l$AaP@VH&%Jyw5Un5tCijxz6qfC)v4;^iy%ndaXo8 z^EuLsyScsGM@-4(f~MLA`uP>)A+OLh@Z1_o+oYn>b);7`;Sze%5Mie9QHVqiDI7Y~ zJNQOv;K=P4#$o*~MGg00)35^vLlMa&bVj;pgXlrRriyd~8tyNaosEEJxC5$ZKOm-5 zwg%ay^ zVRFM}KY;3^$RBP`E!PYg zz?pFS%5Yxpl3Ut6;Pi0Xf?fY|I^+3k++`rAis%w8!HPB32v{|v7%37Yy(U8sKM8(Z zSGW)MItxg(D%j6<{sEtaBk%)rh8YWdOdIgwf7G8Y} zJKjn12K&l8T*dV`Up;6ToBJ=<1!ep%W@rQ?n;J_AVq@`~P!ha6JCwkU|9CdHnA^jp z!&$z9Ok^5pV?q2Jt{nQ!DXuSH0-93+_=kJJ+2Y{pjiSfF{s$s87t8JA8ge$07&G18 z?o_xB_gx9^>%>)qDzz4l#CPYgv(lO7jB^@0MUfmhfCNEz`-64T%3(D#M;Q0v*>}_5 zfvZhN5^z6KlNYqc+D)~tIv$SNHSM;Z#>j;n&N}0Pkp>$2S@Vvmo9!&0)f^LKJ?&BU ze7m5%5q+bP*XL%S{9k3^T1OJ z)Ou>Xat4}{s#M1_qtzK|C)L%88y$@TW?N|6F~&FeYY*{Rm*LGdQ5q<%l@&@om1-xo znR*A~mO;#MW?^uo@94pbxy)>4{xl+u>u?!|V&34Ho($FdsXkG!te4lD=_jGaPeE?s z6%y*@@%i=5+0gVO&82YpGwN-%d+I!Om)cG%fOqo9PK1Dmc0(FzHFTyBBq}-^JAn?@ z>6wkB$Z|Cd_&PV6}`EeJha1$_z)WZA^?q)MaubG-3yVNb=L(NWt`Gdyw2-1$_UK zJpf+6kNtBD@dGiW@MSSEwwc7DvL*oG97A>g#NPi2Ie|9F0!P9fYQr|rLNpDng6F=| zrtAb1_rgL2VW99$m@TG?|1!m+q+QZO>5g<0PGL>)8I-CJc+wM)iJ63Yn@lf2IXZ({ zuxNjpf*t=GH1&O8V5^aiK1CWM0p&nnYL925>2CT7%2zj}qb|}!T;qftKst|Lc_{{{3<3H`2*=O7a`{eB>(WiXQ0#hXzCUnT{N5GMtLb zYyi{X#+Rq5P}DvmW40RTxIS_~Z?V@j_v|nOs_%f&x_>6Tp;W(Bp0r<0FGBccqw#3iu^cwQ=oViPDd*tR5;9rqT2~@ z-!{`c^b7cV9iY`f=<%tf5PDr2VCvFH5^P4^VJr5pra*g(#7tr>p%puZ`Nol0LG6%y zYKc#%hz|Y=8Kr`}j>+*?90B6=c3@{f~cN#Z1{mr!zA9 zLu|!*kC~SMYmUhSfqX+6X$)q@mmxQp&M0AQMTh!fxJC_gEUK+PYJ0nx-db**x3*hF ztm)=kgEK<)2(5!U7i!N5|5*P~|8M^h#Z=y6MF~}B zst?t9(4~33nm!i2sGgoqKd6mH{`!>m4*zNb`DM_D>x=b#NIqo+cS}&`s@>G#>L+!g zR#mTLFms1l!`gr;_nYX0H}(12IHW=I!E2m@PamibQ}3!BwFq6+bt69#6a#V8-|UT; ziK>C~8sdI(`r^F(>-d>5*H8?VQ_TsnBW(%&=YYN2zHimUG=A0vx+fL>wugn7^+CP>-jy_gaH zAeWURq;FW|)8Kjev04s7ImiiR)*uDp)ZC?O*&O6$CW#%y2=NP6Z7}qvC+sJfMr%x} zZiIhU4mss{$SoYed|Z8eUS23ugD_)US}rAzk+aKTa$(FoWX8nt04a;qUAlq^=Fd`I z=_U5|GD0R+7+Ld`z)GKa9W#r?{--33q@{p(R-?v-vxDf3lcC-oVS#KrDxx4%sU^tV zti_)-P*-=M!5&5z+D3AarARTQazWq_!@&76^SAiSa5vME7yKh+hi>!t{+DEZkCf5{ zWK}cp?=dlkiF(YaeZbUDEmX{X;I~YCdv1+O+&7Nllyx_OrzIgx_5xM)4C%24c=t5E z7=Ik|tS4O!)zcUALwj)jha=PcFUfg{qv$I#bi+4f2=el?;kDjES7Jz(jRkgUDZE67 zc!V9GH1hBck>R7qLSfv4)KD~%R+-5M9N$e~saE7Y83Xh*6yE=GXz1&4PWB?Z{s()4 zj^EE9CE!PXz6q@kwz`2HM&^4yrlDVA(&#Unj%#xpvm+P8!N_}`1O`rpBcNdw^@YAD zU}ty$MXe5$t=4ok+{s)>URK1nWP~GH6Ijm+XEjU=0*6ch)@#SQLGx^l$7oC!ETJlT z;2QXHQ-OI8^5^)wNM?ONO5i1#Nt9*l1n zX6z($xM3mF^9^b6nZ`!rg3%tmwGYUMFH|>S0=PC1 z(=v2|x9UKBHSQO%$9Mu~YZ4Mj|E5Y_AqSaRTdJlaZGH$Yzox8K2O}5x9{KS?=$$`} zGQdIk&2L~`!;tb^t#d{@JUqBh!&=;V;04~@M-4_!;3RNbL8KHeXgBrjW(V9!qr2V7 z)~q*3E`{rB)M4PH-~7DNQkkw?S7PwmH@MHiV||TL75D8pY9291>UT7cJ{gIJ$=Ydc zm?mo%(IY!*t@LF^Ci9o|7?XRu?DKYnQxOTLYW96|urVCT%lCRXrcOmO7j&k9KzSoD z^An9+{dX%Z@~)P()~<#G$7lCBHxyZdoP;A^q3@Q)T_<)z+gRa@aB2Ym9>FYYF8H(c z_>u5XMzQBWMaQtKod(v=P5vXPm~v?Xj@b=)q(aTe>JL6LU)Kq{mRV z`!NsI_`;YW7y)!X9MhdH*BkEeZN3!PRX-YtL`wnG0R0~-dxHNT$R1*6?g01tFfs@t zR&Pu3sA!3`rB+geB*Xa$hW@)q+=7V(3cb56kXM+{7rEoNv;g+q^HAC+2}Ib<9zzd) zjeEJA0FTK?he2ifOjEI|+fX+C<%J!rUsi zD0YE|&J)M;zl3HobgMB?qTX{|d5vES6p=#5fuT2svUVHw{}cI*e{*PO&|k;W=}`5P zX)9pc18g4Dph#evInc+ug1y&9kBmgs|GN)DN1zZ1sC5MVwp%PWI^0R&4pjAFLOAx7 zR!DG_fwCQf>vIB`#^b=ekD#KjW&+NC2dIjr(Ax|CyYmS!baqw{*K;@KVYXnxuMJ$j z(a0eD!&J-g7zJN&2fn2rUQ-p{_kq=f%lj9J&)=98x(t^k1kY_oziotL-G>~sWBafL2(6EHV5GTfmGLa zBg+`5WOlQ)VjX;zOB%*IwOtH4ZR~!8wKS&H`1azk$kAA z-_Vw7H<4cWroDi&UlE#FRwM`x0tK~%_g6!86-ya`Ig^*#9q8TX%}Th#&s{6GC7E~i z651B!h`$x)_M-h4{kp$4=2J$hv$gShobeJ$-EwP_H6E$%NXN26?K61iTr0D6$2?@d zG`nE}ahd%d({zV$jt79x?Le~PjM>82fegelwJcEF8RH!CGW9SwZo55D8-uVDH$qxq zr5lO8c|&IgP+Nme#nCTe<|ip7UGT?<)y{YkG@JJLUzHC>oV?4r*;y$#weJTelN+M% zXUDH{TvMpyf4MMRm1fAOS46F@p{08iBi zwMYamv@kg|3)zBwNEU>UB%YB5@b7Y=XJ5j!Uqxt7$Dm<##9T^6V4+dSH$^}LYzP%_ z7At{1KL{+b6cVS?@Ttc!ubl-RUJ~+WTaab=4cG7ya#dN8^3r<4Zs=;Bb7M?+Ey{-kBXq*{lW2lp##C~n+n^|6DQ(5BjGF50AI@qMt%!-{z>7p zk`d%C^nhbHViov%FL+!l{v}rzcObX|r{am5lN*P-BXkBMr~ zsDYRuuZ_vN_U6;6fl+A5cH9I0@u-cpfedL32 z{-5d#{)KsabdD~1W+>#v;pL6d@9Ra3$Hr)rho?Tu?uD#o3^c9ZU^4TOFXGHxMi#v! zCh9~rT>YhFQ9mo0)jvv8{}TTsWfP|9M!?^?4}5eTPS-fhwPaAgD-)DPaQ9{?7Zqfn z)E}6tP10Ip_G~x4^RqTjs|H1zZ_RM~Fm#P`n0yb$ z{hvzM1#oA!ykH83QyMwHF5oCH!QFZSGfd!oP!p4IzlXx`wC4juJ$HILv91Yi;}yvX zG*c6k-xr~7rxmWT@3b25Mgh!hdZp%S(Whq&lhzX5Q%*AX$_IM|%pcPQp6x3HdCg1m9lB)n)3Z9l8 zY;7BKmGj_mM=64Fn=EIw;L|Na!coG#U?w9GzFa5)hph$lnrNg42BIU* z!Sq~FqQC(OhyHhwodquWf$YN{xMG9R30ELvP?~n5M`%8Hjv0~Mju)E1?R$=?>KE|; zR*Tuh)kt0*VWF%){fTpR3mN>OKxx_GYOF&V0wc%`hMyDzYG}ICb-aMeAaX?8A z@rl9Un6q$YcVYExfXnAW(qTK$(jUBc6{dEd(;{>{vcFZ39XNoaDFsET8&Vdx$sDBb zsvz5R8FzW=id5WAOf8Po9}3c8!7n20q-iKuhW_! zdEOo!rGd5`3~7)y4tyyB+3*F(nZHLSVY)xrw+imxB%mhUm%~5GUth_Hw8L_BfEJ|J zK)$>^m}CmRkE$QR`z|Qkm2JuwWeV6|1iZjUz7kUn z`X;25P8$o2*ZO1VQZZ2Kufy9D!9LS!g)rr-YQvEAss}|pt5wooV->THLk?wfhCFCV$ z8Xw|5DNEd1a6_)~FG+D$5ol!q&@;uv#$ephgzzVE7o9=ynf~JLW*y;tOy)8nOSpl% z#y=*NFb{AFxut6?fhNN5?So|SX!Z=Nz7mj86xQr(dWek@W{7j8=Ey$f^$hZ4^putJ zNv*}}$h5pe&aVYLp*h%}j|v^c?_wUQGP>6!+->YRI9WNm2r28e&|4BQP1BLQrCo)O zVm`UQXPRko2tt%t(3;W!BgcL zo}qFVDYF2JG73@a5B5& zOvZwH702|Nj92X^=}|3}X*#IpHAp$WA{1JWE4dlnP+XY}m~tG7d)MrN26PJ?@iDGN z?*HTH9N^p9qd18B4{o2JRV z=YP&m#~I)~>IfDbL2a87tQ;&A+{RbcqSjO<7|^T;B|g~#wY ziB%8feDVNkq&U%eg=hPQq_9U0%~6Cd?+Mz=cChLn{%!6pz@v#|q zVpq_hc6hKWG7E-E9%juJaSE^AIQ`l4O@2d-DCn&v(YAQYc(-^W zJmoySJUcxx9#J#&GUych;_(PEdy=-2;Jpjc&(JR|)UJXUUDLjSucxQ-rNr$vh#EWG zjz-Dw*~((gCDSsg*~U1dm(U;b3|gQ^IB&=(6y7lDjiU$KYiu>nQLRS7AT~r*+L%O^ zTILU`p-oTMo6k5s(nyAL_?@xF=uU-P1HM#`*W|(tF*Y z^UP|ev0Lz83+*3PK{C(o+r4qjNxo`u1e>kSb_QPoc!25P3)s2A&?o~tJZB)=3vWsyNuzvG)4B~Oy0&?zUCM^M9N;&jW-eR)X? zBj2YxKC9%Mnj__ZsZ|m9fDhvaOH5WkVyPRR`Gs7WC%8(t;#5m1+wv8qx9WBsbhRNd zC?mO>``kU<#oV7=<6Xx|)(GIy`UOVPO-hfBY7q$PG${?I{9Ji2kGYkZ?6X)Ouh=ZS z#+6VC)+Legu3S}4$W16K9s?ULL*Fw3<#Z*mr-Q=3q%oAk`R-*hsD>tMFFoZk$836< zSh|>_umCeqiu*`jOeeGe!~L zul?h!==}5-=iW|t+B294UE0OKe}UTQkqeW-mX73tL})wDI4pcGy5l>F=ZVa6*53?* zx9Bn_I2ypMuLDaN!x>PF4)Gwb(I6B`Bbb9LGcol>F*#K(C7wlnZoq`(^(D;=xnCE2jnSS1narVt5+6&;J4IEz9lDB{^28p?2=F>?w9ff zxV52jW3auU{EYE(F7#ld@vJRE9T1DBuaUeREo)!;r$1;C+R{yR<~#o7>oPHEo);qpgFMW~xA876B(vrnziVQ8-&2mF zj;q1>!REmSf%1Wx{tmuTBqePF&(_iY#ewnrZR;fn`38f*?XqH&5mMHN2Vlg~5K z^U-tGTbCMCfqCb!dDSX|bEB2j)T)b{IFWT7d`U&Kun@#N+z7+z76~$x+Bm3{@lFEs z$>Xi%&FszUJ>wbW>CER`Pj^pEPg&0h&vMUG&l2xw?K*Sab$tkm^kJnig^s=oDX@tGD@f!`M~1Z=XbPjO z`>Xn*s7bTYYgYFSu~S(mja6hJ)S)A6VD`5PGr848tJEO)5$^kl!-umg8iZ(ta~jIx z9e56El7~?TWlBf7l?$9iWrgKr?A2w8D1pwfBHH8=j(PL}dmS%?&G@>a;qjUYu?`nZ z`+i3cXFaf@tE6qt1m$Ro*Ws%&L45{Swj0gUUbVZrPT7v<^aEJ^i#9CUb$l2|AY(-nG{kqWQ)7M zyNo**o|V-u!?nXz#+3+-(P2V%Q)#X)R?n-6)CS69s#aULq1Mu4sSf!cdFAr> z!m5M3{s+2o1i!>(G6;4scNqM%6QCT$B`0&L0uH+gwrVx$D>v~VKLUka%JlPwOsPlw z*2$RgyySJf7CQc|Z4XdumSOHIiY{j&lWj7R2fLCG^9KxWJpaE5RaF_LjDMIP2ZFda zgukl-_E7@W&BMSGwBz93H5!o3g@_mPaRTkw1`{ z>9qwarw1VTm$?q!NcljstAYkK0wEelT?&JHD4^J=nR?+q>4?9iCJx}cpxb-!{3hX@ z?u0Js5C8p{lb`}g1XIbA*bI6;gTL#{BmE&`!F1j<91M?PoQSe%<%~ds}szk`BBTChd0SduKGGU{Qda;s(_Q<;|#dXNzw`= z>KBNU&fgyeJ55lPbtKtmN+2~nTu#S%M~@U??94vhk;ygg}rO4yY+SCJC)N~ zfkw^Hj%q3OpX4uffbILPr$#AIfh4-#Fp1OAa^A-Y_=%Zuxmf{~Riu#>HTxSlwuK<> z8LdK35;d$5p)m6J!L6@r6dT(Hi91C@}m8^?4RPl<$H)H z@2vF_#nw7|lRe*Rgx0(fY(!%;1|I(y=DW(=2Q5)>KB5~Ea9oYXzjhyGe^c(F{N&Ik zar6()<$bP1Zc`5S4txkc2%dAKpf}hemW0b0$EPG+L>F~jnkxIH1#&?}=jv+$VtNI6 z_aM&BKJ-HqIV%rxwXfvfc6)zW!L_@BPO22w{{y)Ku2VzFtIk*dsO?*ks0tBG7OBuTO+%I324%$wM`S*4NzyY+fS2@H4>C*SD;qlwSPLSQXJ|0ZG5FU%|(*s&Ty_r z`r7$gku8^*$>S}_1eL&{s#sw-=w6s1q?cy4U!XfWWkpyo$^TzPGROvIzslx9^RrpS zDrtqFn2xdbT1!b#o@M2<)|);fhmjUF_Xku-T|k6vZ$s^!7NZ~4kI*wzC2`<~Q57v@ z3Q(9HRtoDZ+HCTBpj)aLYif7Erw!nRm@+D8cuFM0e(= zyr#QqM@_my^{r&~CIv+&0kf-looRFh74Z*=P%n)2XcHP(<#Dz&v3BA}`3KGX6*L0t zt@*x#fiO~DTai0Z9~R&jII{>9 zxpzL2ZQI;Y+7Sm+B#{0Tj%Im3_hxS}MH{EE%HD+E(pUL5cttkl4bF!oAQn6SK4w1r zR(I6zc-?DYhd3_iEPTs-W$<9g2KgcRg;K(`eGpE9JLSYrGX+0Q1PF6x?)jIT-a2aC3OJ4wTg;#pX@n1cw^7+X2kE!T8*Mqp7 zf%BY8eoq9+Rh8jJ^Ml;gL>U*0QmTaX5VX9uvmg0?9Z=YB2-f8FRH@)8QBn>L?jg0f zJj#}EuGLKB6|A84KSUQ33mde8ER&ADSl>%3QaaynPV)m+TDpl7;7RYPM)NuQZ-TnK z(YvDEF31LeQQV=+tVdQ~IPwK3s3*bU^@qzlh9WAzub?j#RjoJanMp~Fzl%a@4r%P8 ztSK;9apdrxg`?|)o~ao=k?m$vRE;-q=v~$JlhKq>uclAa`|DZt8|*lE0D6>6Z>x{j zSL$`q1e`$4-5(t10EtW^&0B`kXrm|B*W=KO(iVVZ4b^9o$obt^gg(0fc>>2lcCO<( zo<`<^*hrM$KRZweoy^3*I!+8f9^nJNQogJ97qsK&QCm#08~RFtHx=Tn7>iEqD0#=L z{dEJE0{-A}!Q&jwmHZoovIN+6RcWj^(z!sG;aC!!gcHU`HvU+4FuX*8GcWi<7{^pn zpEQjXI7HX+aZwyVcb^HAXb9@>1*r3Erv&qLh#n#-N}70SnjA~_zMXz%lXLXnt~#0w z>^huftsE6_6QfW4tkzcVD3z6CVDk;-D^eQbRd`%HSuMc{wyzSGX>&^UB`EYcP`j=@XM|G9KeSzL%hLqUdId9t{7G zTFFXA?^UHcj-z3?mA1))(dUwNhfD5}vocEi0_c+Fz%!PjFIq*vJq1-udoese64pgTAM4aQMP5DV5`MEs`qD`-_aPOmjSJ+Nd8naGU^tS@^TxkK{q=q zj>D3^^Q6GNLS5Me_39L`xgBgjc;<_ux~u~A3l~;6PT^!2K*INW99R7UP5ry70JhLCwb9eOCD7ECLoY3SZqJ5QZmA1h2>= zdxIXtCFF5TL4k9Lofkp+<757^f#$)>^lL91x$*N|;tU@^I%aM$nKTEF>k2U8!m!g{ zq_*UCm!R*dqdrwjyJ~<14OV2izvvZiq0)&b-*KIzKj|U`(EZ+(=AjVC%~qp%bW0i3 zjbN|sz=g7a>+V7`Jd?lMt9~RWKv&bcYLmxX+;vYqrY3mk4yo7F7EFO@_#DpGs=Tfp zpezCkr${vhwra4_UKtHmFNzAM>j%^?4apx{Ep+E(fA92**I>63^fpnjMbFUYoTrB> zC7)(usEZnU4tLsGF;raX%#0emCR&=AY-C6Z3UZ9!`W0&LA~1=w|1xk}QP`hA%Y2;q zxHKr#H(0!uLJj(+c4RmWa?FEg+74?pl!+x1iRBfXair4ZWrs^;>P`{TPZG8-l;Z9? zdW727E;aRgaFUEvm9M&NTQ{K1owZqufYU zDNlAuVwj0nsEVqC@@=M)^h1;V5tghtQ(kV#PuDn|UT+4N{dMN2+d@BQ9WlRj2Y2>9 zX6O_6@uu+67tA}ie3>)m7?te-U5voFvj=rpBlJq+>6#3w6;9n@%4Jmh_vn7gqe=RY z)X*%VkF166f3@`|sZV+Nz715XQ@EX$!swqByGWt@gcxx3YMfn%9-ZeN2KH?Ca)Gp44!6;b2ke1jpu#%dTnR;~6pVi;Xcgikji}n|~ zf#=pm`jlu~b+_p&R-;-xV0<*LnJ1}3YwbkzMitm=@tD4(9qEs&?A!JgG?csTl)hT@ z1?|`aQv`)|cf7^5d^PQ&RylJ7sU%1Bfuuu{CTXP6hiX;H$juKfK3n(bm5q^9iVPsv zQ~8<}I7t?9_bSE~y_}H}rv5Eila<*SXPZsw!-|k((2%Tv!el?4W!peGy%ji7a&RIU z1waX_4t>d2+v&S)7bD%J4QiqlYJkveK4D%(~a{uDf=|we-F)M?JpN9oyki6V{GEKQ?Ww%72kGCc+AFQ5_7V~t z?&C>(#CFMLzPrAy)VO`TepLb|$xJDSFKjao$}i~sx{({7Rpmp!|x3Cj0#7$HuvvG`f=S;2SoK4-U4C44uSU`5uN07}GC<5c;a&SCN zanE|l8X4|*L3V0Ku9!e@i6f1$M<~v@m|s+xKO7(qt+*>Da#|NfMLdPOBrksYJ~-pY z!tDIvF7U|J$w29iB69_EXbp9fx>P-am#d4s3GZ-q__(g1s9vt?*-RiI;IunA_s^mL zU+&D{JirXoo3yrG++{z|A00sZQX+|H=o<=!qk#H0PGFFD!VieWq2~*i- zuJ`_V1~1*f~cmMiRnwPKK3CM%M$5PU+^1=yNLUp>S z38G(2EFD4XJ&7u}gbbMKe8o%7jKsoYu*@rt&yM0u*6Y#2ZV^6_vXP!sb~TE+bM##W z9V-3QS6)TKda@MNyC{mCxk%Z~?dHxu1U_J>?%6G1_v8Jf!l zC>MA0aY-Akl{Eq&JH_e0eAZCjf=*6!-Z$=3Chp@;8bPIALd7^m%WtzF6VIx*S4O5mR(|_OBZjk zziBC#v~YZN=MBxwY)7I4%MOAR<)083N@Dm>)Le7XY!0xC+MU^irrWc918_ipfbC4_ zbCVr69!E+QxH>;Q+jbOEQ%Tbt?0e%cL>9pqSnmk1qfelMgTV#Q1|9_V2bVMBTz0Mk zNqE6~o)x!cGtimd_!)-q?!FL2RM5-Vl@}^}ajaw#>r1cnoh*Z0;Ik9aN)5x6bj0xw zewR^TtLd5dE{afH zhd+A{V;P5FAsyJ)CTj*MF$pzGIls!=Y3Mh%L=i)Kb1)? z*&_}Dw`)mNPxe>KA;V96!&_7iMSD?k1HRWXAk!b5HE_aRCdcX>eAh)fszD_F4M8os z6g;RlI>~uxnP$?7WPsH#O>J37g?r4zA7I}5M&@oFIT4=fd(sow&A0s7FPMx)WD6uk z?U@C&$XQh7RmdYa#mTVrZ?_go?p#vo7nLj=HqkH5CikH~N~%)Ka{-vz|L9Zif{-U+ z>i>@7YzgneHI%V=QKRJ&CxGBxq6bZe@?rrB0v)C4Nha5IoTKa!L+3FVbdP)jG{c=p zacW36*^&I3o4h)qICAFjPMibZ9K>1ki42V>wmu!e6S|Z4ZcFesuHRPvw0L=k;hURB zlK&udkEPHA4Mx-S$}ERsJPnT4ncQ_>=>h1h$c@8i&t8zyIC-CvM)}K3!gP0nubXS< z@cs6U_b=v-yuq&LgWRKEQ3}N1IIByZS{u@FPm<_8n;j(u^~2tlS`Dq3)>MlC#f~G} zDLXr&%JA7t&#n9LwRFT;H(Y;DDpO{hClBHLXBjil7gaUh>nHRXY$xc#hJ@niqpIqE zw8U^}6HrEOG9H@k6I7FMVI8QQBf+~*8OPaJFvb|fGpI!pK_`+8DqGLZCT3PLF&~pP za35|msIMT$YA4Fe@nGo_P;M_bCh7yo*L>qW#@yIc%ZzrtGV09d<|M179qy~h4A;cY zh4x{cQIqO9TD$3u^A@J|rqU~+H#m!;VK;l7M)>C9XFrO9sjh#y?*Lh%5uj4vc^=En z4ftP9*iU>1+4p#h?2Z#SgD+9ZYT!7&81>}$w zRSJ?9cZ7W@UGS}>a`i_UUV{z5TiqAj>#2L!*ml$ny=AmAoa_B5XYpz7v6@UB?MX{} zE<4eSA3{eECUxORehE6{akfS&+=vd~0+|FNsK#bci?XPr+Mpko$glncmXW|~6=1qJ z376f86w5x28u)!?p#UpN{^Sx;Fr(n!dQz+J!BtlPw{?PZ%|pKx1fMp=a8#`8aOr&^ z2kH(pT@ieBp=1-Z;Qr_j^3@q0?gI>7L$KRh_~Unhcg$tW$9K~EZU+}Qs-Wh`N?kMA zAC-c>-~iK|O`cOccvDBtmTSSxVCDtU6Krrsh)twUa$h9{8(-c+YS4w;q<6VP zf4i2XsP^bSL&#mYCKmi#O?JakzJR&R!SsF}94HBO>I_-9og^pf`ohW#>hQ3OQ7NtD6udRI0kDzxSc6{K77l zM@*U$DyACXnImBXzeqo*W*Mk-IdDL}<^4(~-Dl!^&mNcOQdLle3v^SR0hDN2`c*wrOZvl9JO3Tj(URHlc_hh(5%MYCCz z8d^ikuFYd|{HBf4ld>Iny-~$1Y6UF6-Jj`80AETRxKEn82^yD_k6~!r?^^lo3w8lt zM*ld}tw(*8P*o20i~cEi?Veh_$lUvcqB9rW;5X~NkK8OW#n(Fq(gWq9>LhlcTViV4 z6&&m6EJ$K|9G9;_6?ee>ChV45$7Gk6?qCb&jE>GQEi?O;Ut zbPajvUgRF`uIEnep65Q{&gnkm>fuW3TCQeNUxTiOsO{7j>RWtxuh5AuQg(6L&tdBO z4~^hNv;##@gD#?fh`|3^5}i#E(tsZ`|INbjB`}wK;66*oM8k7q+Neqh*$~eIsk8D0O`Y3h}}8M>UuZcTlB|!wEh{g>)M|SZ}cLmUtE`q10&3 zzq6uHh)4I7ROrs#B?tQkQURnLcKVT$}nF1GbzCe@P*w8XE6XJnN{k?$+w-{g-_aMA zkj_zcZ_<~o5ORQH9dkTE@Ag@^OYZS*sXuDVZE&`wU|2V>Ykr$LSM7(+Hko=2Eb=S3 zT!48kREiUi;-%Y!tL`DLo?7&Xr<@8X`xkLC7|R_bFVxI&B$y`HF>uXa zpV=(6zZjd}C!j&TMFkmPhgk#JFH+6S0O$YQc#Qw#5+06;=$*gd92-Zz_XSS(uV%n3 z1WT3JnrSNN!dsw^%!jjN8tU-^_F| zZKfu`z8%&t=yeTQZ{Ns&@eb518Gv!s?^ONBDB2+2@CH4iD>OZD~oXlArS%w?Z&&D8PfC`r4}opdob z8GGRgr%_*4QJJ2jPwGj^~vja=nh+Hp_HBc7E%cj8X;3cN> z_IU003dMwZAls*L_kIA8&FttEj3?D*6iI_y9r=V%A*Ikn9FNafd~y_bGRn~n}w+xC7i^!S_8gpE)!6BvM+~# zMz4`uk$jnwZLfLM5cL9nhP!CG*U7ud5UQYv>M3g64_7L8WA`5SE%y=k8a9jnaIJC; z00A%TYKFq_z8nhT)EWi&De@AV^IYOd@Gi(qwio5406yX7-)GRG4`9bfA}ZemROw+- zEjYQoOnE*S{@YyBndvW%GKt0E(%r-4r{EpC$+>Ieb3X@f_mGtE&oH9XxhE1joCiS% zDyX{7l5mu#xzjQ-i=@S|&*n$*2I#mCG<=9-H&|0V-mJN7Dc_EI`5jE$43O^xY&!sY zbQrwWiwCJb{Lv1!dX)slEy?Ur0C!A%HYZepL1@Evy2)^cxr2F`{)Rew!#4VyJDEJs zNj1TG>MOA*hC1L=8Hi4@AM;&2ec*lYH%UB7wfsTPkrlQq1G~Noa;k`YCS_7>jK}D( zSf2T{5ot=FQGn#6|13ejnjdH07QDl&@i-p9-BykMXgH_W4e;p$QfvC=?#ePMRvZkk zN&@gr=Hdj5X$ty++Njm1GsUGQQ|kk$)B@af+0Yqe0S`OL^jRAA^`TsvEqd#j=9vL(3U5dyIz=Mo22kZTzQfEH_54#o!L!?+=|*0%hkO@#-mCF_tYxp{ zKM9&A^It2w-5$2>3@m&qvp0_WRC-J8m^a>Y)nj`GdB1r}v9IZb=F_jj-y23sltD}#;ZY$y1jHD=cJn~e%;C|RA;%!A~7PKE)f zMQ^y)*MZ*UQ6L`Q$w$l#*u4N8l}!6JSs)F>(Ixb@A&{eSp>JoLAF|CBVXtY`9X8(n-siY z)tMy>Tx2`=u1`3X9>GwBGs&OjeQyBc-Jj$k5~w+syP_rb{@p}=RT)ioQwvu!*91Im zyHOpbQ-f5p#bOh(Q+whuTZ86jA)4J7aS8WC2pi?{y4Ijk3UwE8-++tzkF)kDI)dV) zO4m@PqBJjy!mo-;pj&!F@@29RuluF@sC$MxyStXVynC@rbw!bwa+fJk$6r>REg`Wm zKZnWS%qTm_1nK&hCwjnd{bP4g~0cFSEb^^vvWwKDfGrr*qev6wf2cGAg;OiCegseo(G!R{Q zTV{!k@cp;Q`z{FX6h$U`GW^47K=M-IY{^Kf=0Mo(*UZ}z{ptFkzxbJ7ssUi z5DY3e`>0ZYo17zQbc?eODkM#cm5Va>9%BDr6zOa;NH6UspP~jw;`_)&wn<+3os_Wk zwhL9~DJrsKFmFzH`X}fsX2ZA7;#7)e+u%ayRB;t*kA$r#q2P5p>0&RcOGqI-fd;mq zJd&#NoO!RUl#mm!mejKj%)Y_ zwP0Ib!9lPX^?39};xCd2u7H1M6JC?8o*fs%QqGCwOwM`8-%W!GtO1#!iP9Qj8X<71Ta~cdw&ws)%ay zk9Rvr&{k5Ou7EJz2BUiD?Z)@500YYK*CAINrPOr%ea%3#KbbkK{opqZeU;f#JPc%~ zG8-5soA1duchlFv&Y>b0%Wn~dGIOe_(IZ9~B}ib|V0eun{Z2MBKf10;Jn!GyTJ1EI zGzpv`x#{5jr9kG(Sk0K|ri0&aq;r~pQ+fqIvzXNx-|%CjJQ&stro{v&u}*&ID61r! z=XUsN`2Pd*P9He!H+>_0KiLO3jP1uKd48R(OW^9M$@&WoeDdFA586Y2c@U2J!5)tL zLKzTY4;ec-k876G030#e(U&1ohnjBCMZzXeL8?>QIP;wZvK$9njlY-v4=S`pHr zr=f}Y1gBCRoS_7G=wYzb9a5LSj9M=`dp|17xokTrCg+pxJ0}SpnPS4JX>~}tOD(i= z-V`69AsC@7QwO@^VKtWmgHU0 zu{PKQZ%|V-F)>7;wR=SQh;=ALG96ldo8Ww6+HMNl;rhb5_Skp zor#%?`l2)HMCGXfPWM}$jPfEUSt(`U%jS|mat{owp;%0;OLfjB{v?%cAGxFBaQcQZ z^@M|_H6hDo7AUk|S|n$p6Y}7^P6dPTQ8|hC?F}lYvv6!n$ga!)cGXG@qnG@G=HQta z!+WpEh0te4!RNgOH(!d*tpmN%WM<$+FboCx`LAI+9>A!T<9#`Ve|n)<8m!w1GPRTm zG6tpE6Ltf?g`>U6cSNx1-3Kc069+<0(o*M=_Whddy_GPWalvNvl47JXUUfJScGTRI@im(^dHE-1{O z8IODl{}6wAnC==RG`;uTWFx^r-+Z$A*O1S4hfPNzbQnv(#*;7!h0#^DLjk#rowrTt zGJY6!VCS>L?oUKDor&}%4gL5pRM~adRz4ba&<^dQx0-h*{Z4w%cuzRHopx#-t%cFg zdd>VajGdHY+2MQAG}+7mASZ9uNd87)*x?XBtA8Xq42 z=uh0A6@SvlC-Mvdaau;Q(noK0EsOq4?`X7RBl-(Adro7fn~P5B8_51$Qo_SXP6z|z zDQ&Jd&oZMfG!Ig(+{P>Y2tMJt%!92#nR=1zy9U=_S+mpMl=9hnB$|Nl#vIb%LaiJi zO8=tqDoD0&JkFH?{Jv-WwE~Apwroi*Yqo@Zm_R)eth2y(#h`r66e!^j_wVmeZs;|!F z8c8C*KtY+wS)O-1A)7WG{qZ!I?fMRp+?#K~cBl>q(nVDfZgM>w!d00?jEA=&^O^jm zM|3TH$z1AA62M+H+;tgm$tc%-=C!=aLumx~!DN)ko9QBoCFDk-G)RnAAiY}7_0bhU zFH||CaL5I>;%?~L2Ywz0qthK+_8~5c1By;Rc14w4jbZDyfQbiPRopGywtH?!m5?Xy ziS7*U?XD+kYIQnV@{Lr)vPvg5hs=@MgVZ!5O~A|K_LY5;K4)>JhE-yu)D+aU5%~j~ zKt@L4036LsxmjtbjF&f1Wirrj-Diun0V7?LE;2nQ^&~1)Jc+zcCXQ98!+(*>=EdjL ziF?+I>U3q8~o z>RhNCE|*0|zEC~@D&3I^9*K`aDoX= zq$U*!7Dc7H3_dz9Ir;G<%N#;4P?s7N!#v#`G`whVK%f_jrq874J|W>U7gNY{lHs;n z|5)cuubGfqasiFgHme`nqH6edQ`1vrqkHPkw%U4DOa3OgJ;pwb`nxx~#&5xt|A052 z&VD2>wXG8>f&py5>qp8+PtfQ(B*fWZ)Ulw=HAy7@$E-+JQ(^szrfGk)QuI;>;of?( z31zI-MVmkx$Asj}4mVz&G9pld>Zr9Hs1f)J@;P zsTKt8I%eX)8i5z#1{g&-uIuZNz-A(}%%w?P2!oijrOOmAZ9J{>01` zjYn_i-&49X`T0+k2g-N6TxnpEQn0tF9hu?dxuecYX{4g0e!q975Z{3tjfFv9g8Sh# ziqiyNLn^rABaRtD2b?C$xJ&DRqx5EmaMJ&Ya!UCgcbmzd4tH)9WMM13eJuX923+GW z(8hRT7TTCuTzzaTbi{GRS^LG$BJ!tLF!6 zDu{lv9_c2XVCRO5W#Q*WgUbIF^7Cwa;~LI@&d7-mw<`QYRoKm+yxxP+B1A|>#dP8_ z5*f-drEaHZa`I^HP*Jv#O5vf5L>=3Wyzkp+$$!x=mE%hIjb~sXX?AYu7**{f`jmbA zdjOqVKKi)t;9E=3hJHYuP*HvXdO3t#0#TVHJLH9E7oOsV3`2`h3fJ{`rfCV+ZxNKL zTrrMhsJXV2s$7+KX+4!L1Npye=#2+3Yri6YPN3`GOx-F68kLmS-XeGRVBiV}U&G); zbTm=)q}9+ey+o(KJMcE}2M_!wlps?`(|Q@`MsM}rAJ3L-3FT8+{}ZwuYm*Uo7`69t zQg~O{&+UImamr%vLz{Vt&E8{3_fCQDHDL?MHxm6@k(M&Z?rtYWSD2CPrZi@>k-`|L z+xYpvlZ!Gy_v>jB?sal5&slB~jY`_h=t64p|DSlwO>`}Nty1KxgwuCjXtj)f%q>G=x;cJ7jHpH>@%<&jLd_L#TFX5W= zrx+`Blm{uP)W;-Z%#shn<(wnQqaEz`K-7}A(9`ZArFt7%1ygYzCE`!lqYhj|K3oY{ z@t?v4uJ~$TGxx=ssAG1(5RW3I$B^6MZR-qM)?8hptd;vo>BZ#EUR0>dFipKkWZOqN z+D~z=)JyKdPp_fYBEdJWx)7b^Dx4}SQEsZr7;?fVkxaA|9OQwD-4R8?f9f(a>lUif zJhrZOAoDUDe5-;hmFp;vkQ$_<4(w89bpRgV9XRT0i%gF=-89sU??AfpfgLr$W4DDp zwh7+l`P?N5toK$NHZ$lI(#YT8wcexN36ln*HK@#vhx|C?vXBUHnoegLeDw#CkanTZ zoQz62ihDK+#mxW^yDgyC2J>oHI?L`t6CpEG$8h+i7wkAG%gEG#ToDv zoqQE={A2XKbI6ssNXN99j%Ec2Q9iU`BdK@;!PEs5M;+)>zKA(-*foIR&xkv33RN(S zpVWq_t`0p~94FUFPN(}Id&N-)_?hW^q}I*FA-o6G=6$BMR`{tGqE>1LKRk#TIEdb4 zKOOfd^?len9f2I(1kRhYXv~4MvAF% ztPe+_SrxWrJTB?~97i2%sqEDfm{hok)OhU5puumB`ePItf}4TTfj9mwAWt!HcWu~` zQo?`5m&bRLzGH;lkB=xaQySVC>|IPU2XLen#&jhl?~>L}b^;gUH<)Z*F$K2rO*9|V!?iR9prk5+ zbMKhm)aYUUM>5_|JBq%qn{TN7+suc4{jAnOd+dGTovvj?x%o-&#ZIWI);2qY?W1vM zMn_v8_0OoDy22P9){cOxrzA_|qplf2({B~G|MNBQXZL&keaZFi%I>Cf{@K3uRBo4j znUtpp>#kYMeq<*{(KH)3Vi& zDX}DsUm@yNF1#q>U%d_L1Uz-K_}oq|V@({&1yD7Oh6}2Q?r$7?QeGyBp?q4PvXA(a zljIC%C&zW~-&Cdz{I0FRTRXt`tl<8{(=VJtrT37;$?v2JzoL>%M_cSc>2-(7as+O% zxx?vr#)g%jbTw0PwM~FM3Nm4RaqOY$^rJ_+=Ztq2<)=1bf(a9+J1&=Dtl|= zxzGCIvp)#p@}AS^6n&>aeNsVwn{mRZAnf!%Bfru|ZG{`NN* zQ*-Gf9y@{OwU^mZLowbBd~5?4eKZ{1KPWX8QwKZnESvBcG3d^#pf+eo=G-vqPCI8w zQv9wsJJFpVN6qmBmBv?a#YgC~y6|eRWd>Y=+Hy2_!)oCJ6*uAkuh2`qA}x6gxzfvc z4OhZ;t|jMT;$PqIIku{73sh$V*8pbbLFo9Bk}kRly?*AvS}ImnzXKQQKJeUw>?l%k z2ru!?Wk+@b67`ivup2N9@XOyGvvQtU&!a7~b!VnT|x3)y6g) zB=fX3VBrzkzDEAc@>HeH1J%g!G z2&CcEP0dxb1|B%2R88DZ+Tt|Ms0?%fd*F+52|H2Ue&q!E8Q2g^0q*z`47i36qzBV@ zpN~1#;04W3*DweT=35YGiQRLTIii+9=s7K80x8Il=^Z}u%ohUCEvjQwD-;o;H=M3 z2rL5`Pln>M1rzOW@S160;b(B7F5}+@n}mCU;a^7+w41Kb!=2y*O&<(HR0OPTlp`B{ zxYc0d>mBKFx9o>Q%SYfgSd~6kl|UH&h|XDAv?WEF6zxFW-Oam z$ymUKJ%bIVnj=F{uNuaEh9@8Z@dNsR1*Y^gBq;P(92-A37ZESTyf* zI{3u3RJtzf0tygct!deYhF;ILbX8zK%3M-upkR>2J9sSHDve;OU~ zMl|2w=rXQ=>AW_NvgvjX%Eik}Ln+Bg>BMX_7o~MB`>pMPW1?@Omr4gmf8V@D`eQ~E zliNuOD9k;{_9s&NN0NJ)u%941$W1}G^0(ak&0)mm!Gv8i(wYm5xmpu4n8Mggpx^>l zw50HJxlmS)C7Iv~8m0wk#a+x=7xm(Jbr*n%XEo#4&@vGR%oL_O2TG@P+H>;cTEXJw zB02L8$xt_$=(2)!e>GR*P0mZI%O;q$YpBChnWMnGroj1aGD6X0t~4)!d_N_>@;s?b zrP;$bm}I70)c* zZeYVoBs!^gT4wE$x3P9!YX-yFk?OPCs9;6VT|MzNXB$K_derv*nZC7nrwx+zn&Qsc zN2beotE>IcS0S(n{-;N9Eo#5^{zbm-^qT7mbBv}^PY0N;}qW^{O6n`zL31kVY!tdq^hKqhH(dq&h`A=Q09-O@ZOu9JH&U= zJNXg1%9-jKwA(wBgYrqX*sVi*IgDKj8n|SiU~cB5ea_Y>5E2x`PdKehko{JeG|b&{ z6SOZwNL-l(8vatridyP08FR~Bwksb=D!tuP$oehi-hdxwjQUMkirVlF--*|l`DFt0 zKu^5#zfd6;hM~?Wtpp=!LccVcdL+UhJwwlU7l(Wk94WEfv&X=1KcZ}kcLvz%U^q*V zRuuPFJ^$Ij_C&3oN~m;{gc;%bDeC;*|L&{Bgb%1vwm*g-@;EO5z%!ULg;uuY4O_ z$V~AywK9`44s8Ad{(W{Sf$v>GXVe!zbHe;RhB`bCw(=p4_$t{wtaIp@*22Ai!`(Vn-;U~_DapQ_sb!n3d)8TN zGOm_*a~3K8b&a!lQQk4bCB2bpp!0k{Zoqs} zaX%S9@!zI~O>1WqC%>tfK1ma`XWrlJs7vMj*E7sB+SA_C+>^@F+VhGoD%#Vi(q{8%J8+G}60$s3w}DU_w^~ z7ng;q6pDYRGCLUFYAd~!$h96b>`~7(3wsJ(g)7!B1z=M}`G*2A-2OQw@J` zCS1iys5-x`VNAVYxK8roIDUtQX*)Zy^3j8a`EuJY`27}B5AW)6MkaC?R{2uE?fr42 zM|ty-v-b?A%_&@{Cqbnr2@A!|yyJVAsM1OWnd{b}(y5EuvNY%WYf`b#qk;}+0=esN z6L=GV{}viL`~Bs4D}h2Db2gw~FVC4*2uI!>u+Khd^9Cw?$Yjdr9_^0ATk^p5K|QTZ zle^+uN$a%Wo*v@5$V86Q60xwnL0PXBcJ*-;ajnA*mrebpyk}GJVs(YuOwA7h)e^r- zQP&1nxci+uI>Z-}In*6mAT$>W@x~!)Naqk&$PSV)^SfX02>bbZgcC+omZTf#h*12bL=3O|(G{(s4@p2OWZ33h7eU;Ly3lSV-l5`CpT zOuI*URaSukwT3Im%C+8=On^_QA*+yzHQ4b3$M0=^oA=<-$Iw!(WAa#w=6N{vE((Tl z9IEEDyzZGm+uoye`c20ZL?N}AWb3l%aHcU$oMXN?7jQ8#PIYV+22dy8P$eHy_a?ym z-$M;r8&%RyIKzT`cEXzx5H{crx{FF|xxA56U@Y9`8!}5;qo`MvoA`A8_X|lu?epPU z34v>Tf}?1Gv$F6kxIS>7?U&Wid3OP84S^ka&nBQgRPlEx@)m=aHsiB1Nu{Mw&i*00 z>7G9u8)QHD!g2D>Mj5_`%%#UxZ8Me(+IZay@{<$Zsy!I-E+ZZH?kzJfN}z;onFBzH zEq04^Ww&KBYaO|8>&On6N!GT2ws8sW{?a6yjE5&1Y!3z3e!zFUgS~$MVsudNz)qB! zx(R}`mAvlyIB;|7)3uITYwvweb&nbUHNLt>MzK^{YppfcDrtAUSG>8j;Z&L(+97?A z@mZh41UB3_sb|Dt(nHIlon})@J}m`a7Kx1}uk>vCeiAB=qwpSN?y<(%DSQ!B)x-0;PB2F&|CebYJ+^QU;CPujUrmzAOuUE<5>&xPAv;Eb7s?|t&$w5Kt_$&MPF z$$hzJ2a!W@j!CO3ILQ6rbl4~f6wwUEI$E>cX}qw*v0s=?SMKC~9xIPlo+*Qr?s6Zl zvZ7J}FrDq-JF8$}*1%8y%XYf?;0XDZfYKODdKFm&_2jZr8Zo1@FKEj#yuOd{p|y2( zraoxWd7O8Naf4OEEn&m{=fQ*Znrw0rHRKSsk~yR~~f+NLq?f+(Bj zyE?nBtLfFf%6GXvh{p%c8 zE${-#j3M9}1;K7o(}2q^*%u)VjuZiUH2uL94x6#eB{(4V(-boZ&1rP!jWJ72-bPlde7Br zy#izlbtifRuXsQjO+WKh>8aZ4TvxzV)m_4Ul}wr;>N0Y4Q;}ejQW_2>{)swQl01S} zpjZddCCn#hyb4{<1+w~D$OGhdWbr0df?Na9xVBfxndz9vNhz2kGx1e_$RMbJ!gU&s zyET7R9);Px70HCyS-wo##9Q)eW~1mVEoBsU3Vj`G*p65S7u<{BYh2}T>2(+4kLyQ` z9{`&72u(mr_Rz%QWKYgHI{7a@F_}$tEy$M{guA*qb3h-qRmZ};-6ZjBlkc?eBzp&9 zIrZx@ea#1n&FM?wyTN|lD{O>ZV~=G^Z(dY9w)K|Xx@Ez{r_u$S@Rj$SfK#h$^);WP z1|NoVWfga!@b``_1L}O!Y6DMK&whrcaHV;h%>x0=^w#s9^K|jd_Gq35-VQisW0<_E z(_1}eYHUkZKmlALBhV%!v2L+bASLRlF6`Q5!-?ra|Fl>av_14JY4vj2J5OHE#`xy( zul_9j7H?QFx>f z8Krz-Ur*mGazfLPDl@|l2}}w`;RkZ~m%t^s={~>v>ig&V9f47I)J#lin&suNu?+%*NMQDfYz-9u1c77F?3 zF73XH4>+@{6Lm05sX*PVgl=XU`1&sLz6a4Qq(`-U5Z~8xXGs|U4DeTHrHy1e4pAO4 zF^Xzo(Dq~CG!N*RHlrliObX;kaP=Zgb#=j~KA^Mdz!~0&?Cy>@BC5jIWfoqML9jld z`*WTqr63o&iY-*QNc?ki(0k^jM=dI>MuXNSa$i9qtEvrnsrQ>VtXp$mIX z9a0?Yg0q=XJKbGleBJV&XTA@txMS72{@MKAuk?P>}?=IzoD|o}!%UF=MKKR(mz{R(Q-|tV3 z@)`WrbLexPF+Jx~!${H+)vZkJb7dbDzYjCoNN}F_Qff3IlX;J8p$a>XHtYeY)+2h$ z%#uns<>!^HMc3ouUDZ%AY-jfS$z<&#XYdLC-JQ(ec64^TU|%P&efgEzLY>L}yGHOJ z19*1Ba3EHKQymMd@_|z_BiH>7+(En93e;G5@2oFn#78qSua00vS*a|6(h$J1~O1agqL>{yzS(=)({5anPT}{{UQQ zq}AKpYB-D-I*{|E7B!};8G{Gy9Qj5knR)sdxtX~3k@nV!Jfy>Bf3}hofW5l~?>+&n zsRGLI<~W9**>B+PE`UXani-5P`Y7#=wdC3seLP!&&*BDWP)=V-JEHQAi9 z7Dr%7bV>6`t$J;JLATJ&nn87{pzqVRYqPZyJdYfDL8iGFQbCu~A#Smnk%iI?jcGp= z=H*Pwct%ZaX7-`$D$4fZuXK;as6qwMQS_rLGC|?~Lw(tjgv&m@U3M9I&y#4Z_Mn;g zY5um7`M&wmkzkp?Oyp-bS4R|SgM$Yhm7Pu4adrs2C!<_a%0&R?@Q};a@bD>D?pUYjM?Wa_?tX-CDMqk75=)q?A_fIGp%T*jai}yhT+koEdDQV0fgI(F?G*n1Wj&3-~qgUi8ytPSiE>8NJteg%$ ze;VxiT`;vXxbTyKIn@G9Zvkg97Cn;(rg9+4w&^G(N7DJ^0Ch@Em!r|?_Tn+7C>=?w zDX3h4l{gD_w1w?iPJW-s>@7J5Gxo%SD&H-;vT$Cb*PNzclGp9TJq6WToc>jju`iN|*mRIt#EU)+h|`%UWvIuCOE)VGRcqi7i10<6s6^cl%X_8tjS^8|dP z^KhLq>J!k39EaJxpKQ0X=;;!`YX*7dl2%X)C*45MDVJIuwQMmSJ;^=u0NHfW+H|<& zfAG#7?CVV;?--PIactTa_;%o7@S23pS#YDiq4KTbS(KJ2>tog??ABn=Q9TVvta-XV#(XYeL_mi55 zc`gJtyQ;N7gPRh@<|k_PZ)GHDdKb~s^j0F(QmFo(;Ev)U>vA6H1KV-Y8?3k0B8~C* zh1bGsAdD10kGaZ9;lE6RQz2f(zJkYJ--?7M`OA#MW3Hv~nQBxBj{^gL&e5X^zenz&CVy4=Z5`+bRE~Bo}8UA*120 z7R0G2T}@Tzd}k(lrd6(mu5+&6E)jo&Okhl1+(iN!<4Z8y?RFn>y(398D_Y@~@HI(H zgB4!Mo>3|W!{IQ@fZ1fAMB~I32LC1n`=EF-7)ruID1*ASJ6!TJu&IhsMJLPGL1eqb zW*jQb1LJuEA3VK~n(5#moz4IzyD#9b+38~zqIE0F)OQdhYBH13KrtPaFq92ZN45*S z!DFilN&3T%Y_|LGj4pwh@DrU&SGu2+!bBM3t6>Ee=2XqVz3%}tbY(bWLG-p;$R=+9 z&p8`D*%jzn@4yW={SD}_Ccs1x=$%}+|JI~JOn?Qx1nMci->+aB%;zhnqYoR&*EkOLU4r@enEV2CyAC~SP4hOj|+t z_g$%0BjJNLhFjm2O`K+{&TF|qoF(q28|(4e z-w)coj%pKSc+k7|x4NJ;y6U(2E$;DnLp5$10nBsl+4~0=b3uxZfaM0GLkj{C-oiPW z4=S@6C(4%KHElSdYkbSKAh?)`dR3U$1vsJIm~lFjGG30!FdX0OdiakY0(Vl#HF!f+ z%dL*Yb36?xN;m$^P)S(z1En-*r2>x-jW1_Stt9AJ1!mH7Ao&%Ihj6^J z>f5NEzi?scf&1NL{(lE828Zu$Y8+hj6y$oYSIfc4e5{pXQ~8th&`!oYeW=#ew~(nX zr_zE%m*F^T9w6C4-W**>K1uc17BLgqj^@u0AQN>N0}$h44}9EEDAJ>Jme zrGaJIn{9s>cyL~3xAf>p&w~*EByZuiu#G%{B`_Sjf_uk;cL?+?Hq@uPU`||TJ}w0F zXf6BAG4wB8IJKKVoi%2#xiBWH!qOaROU@>4Ew{aZt4e!%uIz9!dvMF=#;38Xt*3u3 zxgYKE4J>4KFwdg>S^z{|jXajzJaPi3^B8CG78^bbj?@)go9_8z{crr=c)UWWh{n@B zji*M9LpKu!w{j1DDtAeU*k`YUuJ%4G$}w!{Pr#ATLFm`9xvY&VRZY;hd7$)V(brvp z=dcR2F#@NRE97u)hv}V%dYzo-{~eET8pcyKjim2QAt%7m_rQR9NjG;_T8O4D59tu2$+x*>JJ0)V)IWbb1vbPBn4pXK zIc9^$O~5hvEgMq{9Q+_?)O&Uezv(b-Y(tZ{`1j~?Kf)j@3)A(ndDL7-F40anWn0l< zZHA3;8;8+r{`#(mTZr_5o20KC)SNf~Z`Yi@yXtB3T7G*Ddp3CD5^J%YYsqG= zZ(<|dFXKFoz1!%?W_ove2a`bejaqk9J%DS=K(bICYoj!SuBZVMTnPNm1)yV{K%455 z)D(z=Qx|m`_}3#PEj6m4ubox}XW?qNGTk(O>d$>klv41iVm!AzY2h{rc%;mB(d&=A6WwJFM;5t< zeHDxtH@(JSxFI{ygY5>ho$MF=bxcha3pc$`g+Bj}G~rN!bfFr95||4sDjJ#Ee41ldSv>xR~5J4&?5_%FtjvX_oj z%@pY3d*S(UfwSR<^*o)^kwv^i-%||S?K6yuAY3_~__Oo#uZBSxV>>N0!T)RqyQ-#a z@u+jr}ZhKAOe_41quEyo5HqYu!p1BvyaNALO%|TDy5MHGdXUpzr zYEpve{vwU-ESObCv7C6H$x^41hoHDG$a9{SGZzOtKZ$!e8vms>uwB24N7=8xqP|a; zf5`3eCy3@F#4%Mq%^ob0iEJ;HJ;)5#Zb6jUg@WO9d&6L z>P69+*IArrITxFWt@u+`mAlzjbN3|Wo;-nNA+z^W;d-TGGK|Hi#c$sr|E4mv#QX9K z73%@~q~f_m7GtkOuh8WYLOYQQty99?5sFv8L77o+62 z_T(_x$H4d81=AxfzB96YG85%PAuU|ieB7E6%mODay-&pcpk;UP*_=mD*o^%{0dX9g zhYx6>^D$G@1KXR$yj;|O$Qp{DVHCQb%rHNS_-~^XT4~mX4?YZq?@LZoVepxv=()bb z2Asn>(PlFR(`XYFRSJuDKiGI@bvH} zzj+^`|1YSlCS$UcD*Mi}2@BA&q9#5JFa0n)%I$E#CxUNp@x1eN@(zKI{Z2Wd#^9PX zmz=mrUlsIzQRv<>=_+1JcTv}@q3TtF>(m@QOfoIX_Zqg<2DKy|T{;+<-N?qAr`{!s z_`F`rxM+yD$IQ{c`0A4O>4tQPo9+V>z&bL;o-$2@!r}f1J~h`0X4XGz zMfsm`VjhX>VGo4EW_e@Z4L>d^PiZL|-eO`$+=gn<7p!7x+0MDIYyW9qAg5!aUBYn` zY&I|4aFusXecN%kQ-(j%_Qy6Kt!%uwA5Yl~@;5T{Mo2Z!T8Ho2Ui!Q%Ti~26rS4eQx%@$pqu2DH_R^Ky)*_izZs|Z z5v=ZKc-37+2@(ayf1ED32X$fu&p;3u&=Il>{>a^7lf}S!T?SvQ4zJv6e8gXaCT^nR zDFsVlBs=`+bev^jA+*H-yghZuLbXyDwC)ee$g-eq)%dSu{AvVuH9hqz8;tRe_B(7A zuCVi*N@c78qiis>t1PeiX0~(3P>L@@6WI=LCmYO%1hy)f`P~(moE@d{^sy(H$d|!y z&Brb^4eG!+Ch5tj7)H_MRtBXShN`F#j#u;8ndSmnJWCB6N8P>3-k}z*(x=e6bYd!e z>%T=0x*w!`4+%K4=#OTZ`@upUm_^Zyrp9f>0Uxaz+RG$lFN&FAA@_Yd^B1)yvoQ{3 zuR#LJ3p@m-fCjB)@16pl!CAcdKcW@6s~3h>J;IpHKl3nCbwL$dNQ>~zQ!~^1Y-JWp z#qMsqcbNL{U;f-i(DVv892}>^d5j0ZH59kcU`#f^KOhI*BO*y~k?hYrU^JQ3VrW|S z!q{x#c}mtwyTri6YY9ISjwXh9N_yIO#^LPy)7x6Q{TQf(^eY1s?R!)LD<{H75`oR(Lw zsUO!n7(t}}eP-jiicLWnK6Y2w{himY=zhHd9D+=wqy&Nz_U0K+Ksma_D#x5~%(ha@ z&Aa*y>Vj-?DSJscOY#4@gfdJu5AhrvZfnD&aly)A7Bg>wD2Dl?Y&V6A@NYJQ7=IUn znP}?a1~wE#rY`KaJHkY!gavk|W1@4aD=iL{=kPu`;~L~F=eW&#EkStq&uu#tuG~?f z0sF0@s8&wnAe0YYj+0z80si1w`la)*yR*6~;ptS@)y&n+waImtWV*HNwSSO(=X5FL z-)$hRZlP;|Yo%)s?w7yediG$u7lyMyK{icSKu|Kv+`iH{Jn{bu=V8l?75{SQOE4aE zoRHSTJ$z`dC6C2#sDT^`elh@c*j)K8dYeQx-6lGa+BoBF0#jOs;&mUlaW_28zQPV` z4r}rf&qf2dlIOX}>xg}rCC9U)8;>(fRi?#KFaW~fg9k_%;TL72+I6SqTx7Pq%Kp17 zY`~G^nEnn}m|T51A2`vv>`BXVxM7^dT0k`s2*M|`w2_Gr6dMr5ScU8hDpg=et=wCgSj z7)e@|V^UdW@^5HfM({C+YBqo!$t&4{Nst+SdKr1T{U+Rl(&BpbB)`EqbD}4DY>!}S z&+16Su5TsGat;54>uesI!5E)_+gua)qbgrZgFo3G#BLGT|6{QybL&o~@5SO7oWKS# zZLjB!_=uKz63<)7$4}RfXZt+WsXWhH3!dxRFgSA4rw-)V-u+J_X_TU%wZh8qEb=~~3!z6f2<*A^L`sXrt1_$3InhB@+3LJnJq_*`3 z18>K)7moYN3Y5aht)DOrQ=lBHZCurhfZgnXmwgZKq~yLt+yy4Xaxzh=O~-LyE^gtQ zP@(N3I2Gio!%)apL~pROx=sJe?A&u6INy!ro6|)IDd=cKb?LZZu?H3&6h?kiCVat;srg5MBV3Rwwi$Z zOJ1^D7LwGmpQ$bzo43WdQvJ{jcwEVSW0j`fi|`ZPBo2b(>GNFm?o%$Q4(&7S${faE z!)Mgd_v3b@^8N1PXUgX>5(lHdo8|R;-;!{yQ+?htzs49_KrAwouJr&%n%847h18G!>D;HQRGk zZx_fLvdG;$hDXZ=vj#ZhF}UTsY}Lga_FeK@M{Rt(YdFX8-s@s-hi)ys7=c#64MP7> zxGWx%p4+c+6Mw=n;ECfUIPFGh1Dee++i<$-nfOOUYAu~f)SXKNkU@>UWgmM zFX@hXLC9Lbt=@vVC05u9pJKWHAsRaOzpR+nxGiP%D^_~&pO&^_Z0i1s^Wjr%XUAO` zj!!|^Z4bhOJ zSEn{?f>V%$^yzXE?sOi7Nf&%_=cBcI1TK_b9z?AvCPlNiTTZWe6OL$lu#e2IEE z$ITb>!0mLwO^Ih7yv9_V5k}SwzSenW!K8ZlPW&qTh2Jy)1>ABH(0VboZL|vV8qL6M z{i2YK&14Zat)YS>M8k4@27hB4Q}b>ny8Af5hFjUJC2Z>&7(XoiksH?yw&5@GzU!)?FvGi%8Sq}s zfrjme??19w?rWFfV`hb``H38Txdc&d~fSV;hW)q8R%OH#sREtzw)AoA_1wZcj@u?qrW!jeEL~*b=_r9N2$3aa`Pj2mD!> zg7eJ=^u7hyz%0w%}}FNaa4BZbdAORawOGb z7fIst<>mJMFj(HwV-Em1Spv^03ir(la(`Idx14F%=pBbW(8t-+dBj=J)z4MN^#tFP z@nrh`!I`(D+a3@V@Fn0=K(~PV?q%*MTrZ!xa=KHxH@ObcQGKSPstPa4?XtTxXCoAL zz2N(yMyks$i-RLB$TpgU$YJq}hq`tWLo&$Nd4$wWOaP@#Ec@L++MRYma znWBFGOM8o>b_O%aT?9w|MO|*n>y;WtQXp)k7WP(fz3<}0u#~zJ&92VvxB+8w4Qz<) z@)`1*qIjNK@QkE~Kksrn=|-E=mF;GiC(9E-y6=dBxRLp@0(ep;u=0!eEsr zLvX`3+)DXy2=2_DB89YypR5-*Rwic`=MWrm4meK2C|fVBMddS}zG@%yn@Yo1k&L{qnQ1D3L4^fC(TeYLV|)YhURaj{oFOdYALretsS zpL&GdR6Sha#{066nfpxtYXq__e}$5_IT=qYv^?4>a3l{~s`9X=Pmm6m#3N`3(`gS5 zB8AB^Scv;}UUdgp%wk-cp5o(F04MSTXi)61l`fIvyByD^D&7YCvy-kyvcUwqHt zhL>Tk{7Qn}b?q}AQU(dVv&dc0lyx`=w?G9v1ZUyiu+5LFU)UT9^nc^fE9W4UuYlIt z7p;VPr~k{BO6`g8Oz~b&wx|_-y~viCr>)l;u#+@F@ZI_`-*NT5?*R4HLEh8=I8*yb zk_pDAdhCy^0#lm6E_i^bVEa_2rjf^D6 zDBc#vhHE#h=2OxTdwbd8s11*4HEwdR*zHB)((w)E%w(96CBd~HIg^n973V7C&VVxI zf$J8z<7=s16}@()f}9GJ>L>9M#&e24o=dD2v#fY#Om8z}}x@=hwjNq=Uq zi2KJWJ~qnnoS^LVSD$ew`Uz4kpf33+ln1G8jEBlqu>p_PP0B^*v;ygatA)Qd@BDmx&Q%hMSAg7x;G_^s?-0Yx*jrr2z9@%nyT2a}ml5#nW6&t} zgwym1kG?}}B(9K}5|1lmc~U=am@DxP%xd+AZ$1WJ%*EvY{zci+0tUl>Y#1HjyA|2+ zmEd;SE%@25t^z5`$7EKh2+w&Awx+M`L3j;Tc2ozsN_vF~qIbEDlS>Y~ z2TX2+EY4oeAm=V5Htq=F|kFAz%8M9hOCfwsZr{8T&>G@YN1&%<=a0bS^!n-Vzp0R^%gul5JYJOx3 z_0;%<%TP-a=W3#%?`3W_O}0+GI5ju$7U_cDNi)0wuIgU>FZ=K}DD2WR^=UA}CAM_m zIK3}9+0)Sj-{jX0Uuqac(@_NX#fjhnY^Te3)9%AnavV7ZEt!d;NO;SS-}eLD0&d|O zw?Zl9`-xh3I~<=Xa5%rKHeYIACAMkh;fd!#N2kFFaPzxrzDep;Z=|=P*XcQn^T3?M zR|z>2e#VzcxRCHP;R;%pww~*FiDyG0tbhe2WtqF_fF7ek{^@H(t=UQn)HL-AE=@@u zQu)EWhU32*PtOzvkLosFm==EEHL1s@x)>*xA9PxC`MN#T81H0otYhHdw>=@=*~%9l zbu8`+o%K3K0duH%7&nudBo*vL!`mC*&|_d!d-NS(OCJ3T42w-@gIbs$=!y!{dp=_; z+Q6*M4A?~52g&JjPGwO&VdEk=2m4BwU!wnf_pAj8qR6x zE%yhjSt0KwgKVmUEN~pYSGnR{<=j{B^Umt5;Bd)nsesLeVB13f4u4Ub9cQ$m(mwkW zS#UaBXI;tNsp)~9p+vFcVEGO|&d2yR?ZiRzl`{*K=$C7r`;q&Edzia{yQe$M{hzyr zyQMozz<_{6n3$=U?uyfQm4e^>ke|ot-0yfN?*=EohLUaz{X>#6Z3cRaiEyKTFfpW- z3&E@DMxyWkE`(I@58E|g{y50b4EM-)Sn0q>0O#Ll?ia{ zUxBd}#aCq*JA%X9@`++w9$VwYcf=!R3Dx^L{s*_goEtHp1%b)EMiCuIZp27-Y$fPN zhx_Z2dDDW*b%NbnPtyM)1PA&#HyX2AY`5-!5JkYWSi|jbh&nhEQ_*s&#UdQrzJY?z0vjyNjC+qQ;2iM& zzqm5YlDgW%`Dz;@g|N#0FE zai*yU1L_lej7+f5Z{sL23S9dZe2)^2&dhV~!M8PZdS!5tS_5`o5}&(?QhIQ$ReawW zofCM*1D#92^%}yf>j0N>7%22iQ6l_vdtDooYf)SEOs7bRi&=aPntJLpC` zgF6gEiFgxV!h#> zS4>O8J>xx1Q2EzKQMT~pU`Gy83#zl|dzRq!R?FMV zV%FS*OKn4FqNgSCcq5uOxM&5?5wfgO`GVu34=gEcbA3PO`rni zrvsZpRc-A%0ka@2E(w>wsScs_b!$iHs+_*r>IkKp_mn5m)8D%RWnF(|7|evFXjVq( z794{4Y%(wCt974m7MzHZB& z{Z#re{2m72g>V87^IyJ?T18`t`OI1g)8h`ewF93&2U^wN{$WBvX(|cz%^ZW-Irp-+ zk3J+vpE!Sjnu>Xe!H@y0OVxz@{i%cqjI;rze5nIT+7==U!)1M^iffq?C-R z_C=hi(wqdrz5xG>P4Y1GAc4-wZ0gQ4&qa#;1x}^^j9+ZZ` zKHWu1dRiPtuHb!en@v^~u>w5!o}{yECWY=JpJT^I^FQiQUuw~1Fs#M6ta$KVJcuXb zAasl)l6)fk#o#Aguw5dLrWA}S8yMFyc7oxYunr)ZQR=J?vK+uUAT*lc8X20I$@ z+AWY?vPt-aM&}2+h3~iuyoWn66<_t{@V-jH#%v;%fn~LvKD`+lp_8C;7JcP5aEc6Q zRhEzi^~3fQeb8>UH}BB`7v_%tWHz?eTX%4z3AC<)oK7MIB&&G{ZeVlLt{dYo(9G;X zA2o^F{k3_~9ALgiJ$DVA>LaF{R=&sT4%EK`NFfQvx#=B=yG69N_=9iOE|AA&*MDng z*zr5r$#vD*kudjwt|~8>kq3NfI+=1SJ^h%Ej-xiY1RtrL*RA#=O`r>W@NZgGT#qv9 zGBe^z9wQBYYkk4Y=aG1qldo6J_Y}_N9YsXvTTzje%HF!3F^QKG`Xyva2uwJW5SuvF z^T>138^OG`PARR9fGE73Vk2cL6+H4e^TXg;!B) zu$2M+)cy)|z{zkfwXC}+D|Kd>qV!FFgg9w6UHNtR0wOz|-?*J*b96&9^_E_2fb+6* z6Fj7|^!5Ygq4sssB{Ir;GM&^0F+a{bEu)mo-cSyAOy-?>9X;<~u%q7W<+8edf-}{3 zwjd*I20kl^J~efA1) zjd|#JMuIRMvArfev=v>?TlfGInI?w9c4`1WayH28QrJ5&cs!i}>1~hJ(8oNn8vb%5 zXzWxxN^Zkhssa)}h=jVAAk(MmobLK#@x9Dq6(N^v0qIYb@IH~q*8FB`34c8&JEjyQ zwWolIP!rdPUjE{2OGDVsjUh|Hj*e!YFhd**+E*Heb!ymIKiPK`qAHES`{XLDqf^wU zyl7V}Cb)gfb3K^7lN^K3uwh$FFLs7m{iJY#xn~p1kd3I_EE1Me;yw_8S7|A>eKj4^ z#3p(m#mBEnQNiK zM%Toi@fAwzPasJTP=mU8SH=o$*cSTeqk`$9E{nDKX_CPi{!FdE0}r4HE?48=qHXm* zx6)ag$$YZ2qf7GPRjn8lM2TiE^C8H0ZDXYVUdyiM)l1Sx)x+;{84lt%^%#1BZ2Af< z9vOeKO-bL-Mrc&4c+tH1r(^}@ut?UFn zdZ_eaoAz97?^}qoR4?BbHH^HuD#}jW2!48cu%Wx@jmGz+4O6DaS3?U#b1dP-83Kc- zzWx?WthZJe_q!@o(PZq$4EmW6QhO`Y5e`<9k!FwsH_l7yW?xTuP^#7oZ-Gl7Wr@D! zpkz&yQ{E8zrbuPBS|rI)1x`XP>fI_BsrO-SmC@Sx?kO#(hf~<~^&?IE4@%;SS`YXI z%V0L8!5^h3?#74BYiuw_;1~XqPW34DyEDqWaK26{eUDLsMEA|quW3dW!)d&REB?o@ z%s&2ew)es}v6`J6Rrcj`>{F%DVwlj%wwe95$$5e0kD~YlSmRk!^RMHywPIV62}E;0 zw^ws|q>EAt5;1S^p1&k!rB~>WVskGjR1r|iul7)O!LMQ96~w#xEqntn@0S?*kL;Z5 zOz?QFlJBO&92|o~*=}}1-(Xz60nI3Yie#!|ChVpKq~S#|r)gH!4W7& zp6`3dOISGX_?&a{NxGg5a&37d+@@pj_LA5%??9tZvqOFezxoNu3;S>$+b;|e-!L=H z21~NT1AoJgsSwE0bEz79<@&Ihld?d^@l&+rR$eJ=MA^F={hY^&vkaW43*p|KnMtBN z-Dk94=6ojz*TfQ1V_c(lgNKhrQ&^kX^(Z>{&$bP)w|m%zlR9yXNo)ft4kmof`P8*) zwz>XI)^~G(IhLFJzUjtKXeWy7PPia9u)SeAsn2P9Zu`J~slM$ET|+qB=5grwmctQG ziC%iH?J8(g0O!{Yi|I7{s@GCxdtH#GEg-DUW(KS9OQT%K(I_HWt>zy(FcVQw6K zQxd=Yo3tA(<`a5PKP>X4I4R@S0y{heEbk+_;6SR)7q$bn?2Dx$;POe_gOjABzZV-y zmb4v&YnB}3xW=pa80AWJn3sRa=(<5qG#ZzgLa;mTgFoHJ1FtqN##x2yOn1pifGrD; z^t$NeHBL%k?kH8~wXVgyJy_@`Y-UH$pKfsj{o)8F!fdFhtJA3uvWi(Rco!cx|CpJX z2ZCV`+&3qhfgrCnct-}}vh|q6h&XnAEBzJyyTHt2%uyiUN!p5wsNOb$D7kQ|Tu2IC zGI-qAU~#w7hQdzTs;#99>W33SMST!hczL)7XXrv=n2#dyT?@ti?J}-wpQ$8`m3GQ0 zHKm>iZeE-YWfH#r8}N)8O=bK=<%lHX*Qw#w4X4{8VQRcD0R7uIQ@E^XMcnsu5>vzf* zjDJ#D90;z$^uD8n!}7d?drB=|XF8&VXi1*KIr;*w*3dUiS&mD}0?%j=t?EinbSvYi zPF?5}FOrCC;{BUWAA(M&8C58U}nVWImz~`Xgt^R z>1E)1C5IVq;)8xc`)f?Xu~%a14#a8t0&_t<)V4=C2hsiuHcdDxxxg%YI$tmo6m%3~ z|NRog=>{s-C7kKDoXuy<5JPNFtv1$wBp{viE9kyfu`x>Id_J(sl0^PV2!=T`2Jf)t z+}IVFZt6QeINCAu-Nxy=4}DV(M@_k*eH>fB)Z!EvapX_Ir@kr{1zWFxd)Yjge|b^& zHii}cfa+9}+H}&9+BqFAcz!yhg02Cs*RIT9;SnwmxwG9sLsC26I(p!E@W@#QZ2S-j zEcsoRsax%wHPN;FCIRv{9bH8@TRric{EI_bC)jyK*w^i*4_GXggP*fX61nw@z^IM_ zGi%RnUx$xzpiMp+$F2#OM%sX~WwNO-Npf|ci z;@=b77$F(hN*o{S*oD8vBdrG~GahvOBmG+~7@#kB?ViB%Z^eJNWk!?eVM6IwOnY&D zib%3?-%zj1$?K_0v!ufKFqGva*8!{E&fok=6`KWf>MWR3h?r9>K`+x)`ii?vN@{#L z667M_mM`UIXoi013^?{?l!+#MjF~(_V`_O;DKC#0#2#cC-0YuHb65yJ!I5^_r;zqi z37l&s{P1g3nhk7ne~MqxSzm(bx&*%DEdIHL|4z>LGZjyw~|&_gxnRd9**gtcrJo`46m$4j~p>B&jS1~pI#)90R3B2v{lltA9I%%V) zIj^PGUAO`_#+O7u`}Q7gWlid6e!Yes%|u#{Kl=zL^s;gsHF1R66$i>z=mh5(IdL?Z zU|iPrs4bO2WPf(_Eb&bA_JFUn9?nBMUq)D_=RuvOFp1vtZN()a0>;B0wKo1&Rr&W( z7z_$Y1)I<>_oKgx)g`uYIq;u8WTrEBP{}^P*!U05hO7@Ip>CN`n>*tizP(#`#@EtK zRYkG)-1ue|^oQCG3OS`gq=c0xQfZR$6unns>udM;pD91{n~)t&^las%Y%bgfEiHKCA+>mPr?p2=%EIo z!K%adClrNfA_&ny7<+ZtBW;A8^quKtjC7QZ;S1EDNt4C~9J62XeXqiQBN;ltV|b}) zctDPYW4eOPS6;kFrlH0P7U!X8{R?Y(96iuVw(ZxY1a9NP!e-En*C2HtU={D9dzr(p zWo!pR;X6fuP)`stpaAI&KOrY4w?EtpyHp-_(|93^@CIfLN*xpw{n#CaGbwx7!IdQU z-NP(*0wrB3c;RbsW^akQD-(Vo1Mob)!tSp-bC8eDGRZakJ5yvSRC&4CgNKn6V#9a+ z4-WB@No|R?Jr{n6Po+sbnys^^!W1T0&S|~XvrQe4IHH*)Th(zIm_cuGE(|Rz1YBA z)Q8Qi)83WtrXkbuT{(fh>>W0FHTl}zaW*)JBi&(Cc~fN_1pOrr59OsCAd*92Q1-U_ z?7^_9s-PJVK+N;8&rPbTPvq*PfiB0JPH@zhJHq~$kLnk}?}U>4k8t3I=;*<0>BFRh&&t@4<5y2X-EA)wc?A zFT6I>p?O$q#p1oVkyo=6yM|)yeon*uFT%aM1RdBbw%g0h?etKqP*u3;qHOw7ttp7k z3wQ%(d?LPb3*d#fMz=B(|Ds<;EV`Gh#v0OB0<=Wtz=Vjpenh9 zL^T`kzH?EzTu#cl#4UI}dYb&CZ=NI3V20kGy??0wf=tYw%2!WL&$h%*2{RI`gpBy# z^;A}6Ld43AlDGJYyo#q1L9p3Im%)!l zI?H9KEuRbhdFTGM_j4?8R&{-M)o~Yek8!PMMmQn2vmX>Y37ui67X$C@4=<)G-i@8% z*8F6uyN&Ngf4KxcJx#$+9?E54W&Q^e)YWy_Ro{KXoj;&Xz-Mr$zxap0Az!5y*wkA1 zh8;kPhB%WukJ4|w$2W5hzM1*p&@^!NbWE4G;@VL{+JxfjJ#{1uJ@76n=tyq;`*=qY!*p ziL-DTchQTsM#4AYh}fIT8h}>zFy}ctPLG}V=#CS)Bt~({UgHpcScjAL$^ zgl|D(e)Xl_`3cu)FFkA&+;Elc-3J(8^Vzz6VqU9DC+4Nwe8x{V3@7vTFfRj1La7WJ zs|-5I%kp~iy6WKHw-T1dQBqV*5-Ez~xLXt#ofmju6`A8|V_9ngSAu#VMbVVWf%av!J z&;iBcK*1EY@~mgU<2{~vU6#(!r=G?6YBmg+bmVRY;Yl59?f?l1FmIsd^=JuTF}2C6 z&1x*g7c(We>OFLI^FVt8jcvHhO{VuK36`@RCzK-0MKkcyZ471|1v9)1CoxXzNq-Pz zoHp8-OU#3yC*#curikZ?#pZ519!jBfU7%I!Z6%jdNa^g2O8lPK-P0Z&t&VrfLRjEc zln`YB9>0r}0ZKAvz*k-!o_H0df^Q8K%s{ytq|G6_X(F9Y4du0Wp7*7vyQjY=ntIWf z9pGl~RHdD|6ijS_uc5Yx`7#Aaeit(LKA^BsNXZMw9doC*3Ea$eBnf1NmH7Z(dsVb8 zjnEVKRy(L?P|KZ!t+dy773TY3FsJ@XKV0U@dv+!Uk^UJ9n}9!orK$NYYvn-YRQ)fk z_nK-RzN0DRdk)|`n(49Oc>cxPL7AsC$EWz3uOn$zzx92%IAt*3;qMpE1UnIB-+a~U zU8V$*ap%@T^_#{uGtBBte>K~@MG8U`?(70R?QARBzZZ|ol$_gUbomK%6hSED>Y+c& zB!q&ER421@sy~9Rc%?PSpHet3;^8Vka6E#iQq2*@CT@v+i?jxf!C>4#hVl6#_uM;a z7mD*Vjvc5+8anpS+f=bTrD$O>?jTo4T-B{xaKjgfjqHo$Tx6p)1V@jBmAnfU%{^}6 z+-N|rQ)@K#f-{`CUH4qG+?qRQz+d+ZHgzKcW(C}Ue;Me?6CiYvWaQE&FqcsyfS1#OmOLN|q*>CY!`?~pXgeUp%QdacVTe{iRYR5mb1k;w~A6pNYk=y%mZ`=j{2}Jw(GL7zPJGbTwr+ z{~ldi5qo7a0ZyPbOUIrpkk{rs-^Btjs%hXwHQ|L91tGczUbLUNwktP6S6HV>O2$!+ zJM2d-yt4-U)1I7X?;0k*0ns|cEEYl!Bud+0M|NX>=fnrI9PF`-WFHvtc$@$0-cFM; zuJCHslE;HLl7CEX{ej+XDK}wpI8&YAZ{|Wb_XQQ;Zu>l*yA^1x)6@G6ko)pTUGY?v z=*pkt7&D)r^QEwq+wdk6VF$D*>2VBy$!jr#9IX#*;sX4C{2STEo)ik>R?~?ZSO-jP z9y4SI`mPZqt<3T-2V<&XKEfw|B3tl9I5l;{6ILcuWup1f3;{0>WzLH>m$R#@P7>xl zCbot~5%}PXj9W%!;|2QP2(aaFPUI`~BACr7^(K6wDyaJ-NjInr{xpPqoU*b!?3txdA z)F=~{RJ59kdNxeG&&F^w49^KQ*lLE%GOC1 zhN7k?H;@xH)PKn~LA)#V;}+ck6Q!{<7M|}uW}P@R@!%rp)Zemgnk$(8?zqimBNybX z|Ew(%eN$C#q;KS-6$U>p2WBWYDG$LNdV&+dZZvN7a2MDj-y`2AhEBVS zcmwq2xG+u}#_oNTyw)+(nGN4v*|m_Qlqk3WiKtkfIQlv-vOOz|r)8`w$bG>*AV5sk zE?KQ)M*`dd+ubAFUEPMu=c?hp5Bq!|&QE7t(?Oh~@h!MQj$JHxxx={$gmt-n3FrI` zZXnsE7F3_&aBf2Fi}9WM07GyhY=XX=$Sm?2(rtbA9-NE_?)(CHvh2f6JPwscPWvS0 z1CxE#Gq#g+;bv#VN#G$)K|TB>Z7*#-z?8GV`YZ!ld;vb`HPo|7z9i-F>q{jb;Af2& z>eKlQV56QvoFtURziG8i@kfG$q{mUNE1S^qIIpBfiSpdGQdo?C+IT8J8>tn0s9m@R zTmVD?r(oZ z9V!h^eFbyuSP-Ads7)?WojUVeRDvlwN6ybrnv%~8CSRa8JI+SV66o@da96x#M^an1 z%h%Ah{HC5<08tu(JN!$#8?I&yX-$1#CiS4-dd_!|fz8KW`0QWs$LURl`-qaa8oR#g zFk@#+4rvR$)O5V&A3Qq^`unnf;4`(DZMh zYJa5e%wgAg5}c|sKh0^l1BKblP4*uJIckJ+Ut`?GX0dB%&GxvhV38p-k6U2_-n}{5 zb2jmx!B=sHnbF*gOV9v3j+y{=G)Q=4Gty5!_45(~} zfn$5TrErNmNO#jfo$ejvUF*$Fr;*_K;yK~j9W+uX>rcSm0WR^QKeo;_nOp0Tkc$t3qRCCeoU zZuob#6qBwEXDE-J+RVnb#~{P^9^MW6Nxf>JpVmhFL#77k18-&2u!IhMIB(77G=f?kdp@WRL8?{k2z>m&a9?OYAq2i<$z=iR0| zZ$R3BTjZ@=b;WZQKcSf4BDW%Yag6;m{m@4-3!PCpCZZQGVIn|oGjq>(f^ED^s)z!k zF4`%Sl!53C{;DwU1wAm_jq6kvRvhpoB{Y$>B{EIXg> z?0BxjDEnwWvTpb%*xm?vU{|lAZ-@o+xyMHay9L{FIg?v6oCuzfv(lUSBaAL*8~F7$ zki6^ch9*##UZC{7fFol~s~mUsDcI&Y!1qe9iO7gwuYr$KMtFt?Ic0ZjU#NmNQRFoz zyDm2~)g7@8KVfS;)@m|K#jt0)0{bx=TQY%Z?i23ly}-gJfUf;PhxQsIW+6<@sm!Jy z`R_Eat9yd&l_c{jEvVgR*dN8%kFIlUre@5=i=e+FrDH#pNstwGu1WcUr|lcrW|m|^ z>(4ZH4}HKqs(c7{PDi+=_u)w`;{O(7UOb8WOkQxOp73%nf+a?i_}mDkaHLd_9o{kd zx?>ee?v2#IosQg&3ph}?Me_lMu9>dd%Hg@9^ z&9~Ss=fgI(RzI%-j@wQX77UlJp?B{1%fgZwM9}^ zlAY>cE4^RwnOls9@C0=^K64RN-1MN{nc4G4sH^ZlI15wB z@J>cG6Glf?1XO*DF9z257QDdwphg)8H=>Y!4g@>V*VPxRr0}Nj*g&{~m>omBCzaGb z)3<`O_22qsBML6KXf`(b=n2L_bcyN6(pqDbFkFTmkCQEiWh}!1Kc#gIZA)6TiAn6s zndVF58NMw!wf$s?Mo~$RtI65-Z84m<1Z`q!TL2#09XG*+LT2t!oV3ZfJRpZSemib3 zmzA{_l0wmo$5TC$JgYk}2du+gEt{>O?Uc3MJYw}mTh|Mg&@npaYE+sEOh_fcN=I_m z!+D2Cp?1gvXR;2ROI_D!*9=m3w>h7(?+KMd?Cqu2Vqf&*GD@cxw)L9d?Dg z!{K0txs$ms!YME4x`!I?E*;xu=WxeX`6n~kQTzZZ(B+jtDL4RE*aRsON0kcnW?LMY z=`|WVzoED92@A6rs*fD}N;>5!!P^zklQ_DpTJ}?t!XxaZn`}!4Xcqrt+<;o+mh#;H z$M#TIK~GizeQHYX`!?_p>fnE!%>IOmNLL9v=M_GDshM}r!_B!1kK!#@RRT$vC*Y~Q z_h*BT(+}U2tN6w=1Y5Z&q~~nTp}HAt{}z#d*N<*34RhHX_Kf|(^SXoQKVma?k8Flv zIKKbEf$9Sv(Yy-J z?0f^~(In30U1!p>H`-Ym2ZB}X8ZuLxs>ruNgWgcnPq5K!ME$r6J1H-9Zy^lZIaIa> z_`%g?-Wy2&lZ&}MnVcLp`A9Uv<=|V5WXAr(oP3N=i)u*W)IU1Cd7XDAGbiR`or+J=1=3l z$<{gE8p2*+1I|tr*=gQ_y*h~G=~Q?ge?w(A&L8L>Ze5`Ew8urewVs39+@%MS;M+sL zP38HZDewcHXfx>t*!})Uj}U9jlW`UPe0x5ZA%bR$7zelv3|h2Q-U9(Zc+Rgdho zks6*Hwo)Z;4*28u(4a(yVn9IU8sN?ql-*Gu|I6%g@$p4pyQj|30u z11Qr~{FmO47d(MUEdv_1{l1Y}Q5aZlL3JkZlMc`p_)eiTjv>9EEOS%=u<>;CO|yMl z=x*jyBNU}FpIeO_gkCVZD^oA8p)FjaWQDQN1@8JJ+~pc6hv9Jl*4D#1zhVS~tCci| z7~y&wTopzs&6SQy9d?UR%6ojLZo^)X$a5*9mC%Fn+Z$xo{g)y%-AZMZGW$@`wrYFv zRdD(C;fgSbonC-3)LeUsOJ#I(6P&Ga<86snrG&ezyS=-UTL%x{jk+S5NyLF_G>2oXyvZH_ z*0T##zYce6dZ{w3yu!i}wCH*9zC0<65Vukdr?894Nb1u>kdYuzB@d~Y!}#o*_gP_ma|vN(=AUk|*={&Eg-!R_u0Z|0+azbzR~bxyjor<^<8ehH`F z9Uy0e=v(UBd*SA>f_gT>)(!?`N)YUa{w;8rs^JY@-2ax8l{@rFp*WCt18f&mqZ;-GaXHDfmyV6!BinBBjzVC1Z^e1(1fJnvXL7t|K@A{ zz*XLa+1dkyJlY7;cmOa6(yz4@Xs_0SvP#ri0#V27cmI zt!e$+9eK8)DpAPLFEAz3PIN~iJ4G`FFAzII?g0@nrfF! zyMRC3co3&}Usv)a`)hyIMoJ323%+~Sd9EZrOYp_7i0>QUK0YEoTSBG8yq<}khn|7n z=X7JCun%6~{}!*FfxkULdjmgeH!Q2iFb-bfMB*dy_p$m;O;lsyhTCDg*TnUAAzGM6 z$})8zePBQM2k*2Hy{Mi|TLdfXGaU9Y9yM{NCz&!wJ?87DJ!k)h*DtkcxCvp!*rMfP zcaRefMFF@IxL?AmA8qx)wY?|)V&DDkt(QhsG}SWBeSSKsB6=k)mv1p@!;)%aTv=Y? zd^ybw02e92K6)`YbvfA0dEn|ariXB{8>!{E?)>9=LYJ2z;i@q*sou`)A<=`=8Zf3>eKQw4nx$J@?ogAHkWY0$6HB{NU`a z?bMAuj;6R!p0aP2CUV;ygL(M@e##kgpfaLA%MQ0?h;uBtm>$%^Weje8b|?|Alc^ISHNr+e4o9rkq z*Rh|ax*S9`I*0o56+GvFEmk-!_F&Inf~j*Q2>dQ~Q5n#Dya!1hR$56S!ecbH&v4rCQsd6^%&bOjxPqy4uWgyFr%+VzMO~(y+Fp0e3aKM7W^etf*PAYTYp=Tmb<`sS6L~%Br&-c-{OSlwj&p5a}v0Xi?`IW5_cYW*h~zeXl3znc*>)hvPH=CShyN+J5~f zJONGpO`1tNJl!&TMf^n$svmtM=E7u(!clD?&X)mrgj6tWuy*e1K0TjNh5!BnuRN7L zTw9DzKY_jeEBuX8fJZ-8EM+qLdM#cD?C_)LkCJKY*hc1rE8YnIxAW+cqtrLbcI65v)fO=E^;#hR?;K3ZjZ9&u=pCQK z&n%&M!M$+(RX(eJUvF&{)9o`Dqhs|d{H>w-ew@!I;=nRP&BN~Una}H+&PMK%-V@K> zpCIK`P`ri0z@KC0w=!B$<}OlKM(bhh-89*4?Vrnn-r)GWK5(rBY56V8QIM1 z<{vA73IR_*x?^7n2c@hWZQo8OeUK9~0`{>AazY! zgo|w5(RJj2`?#FW=O;V2PxUF%!NP5P)ZINPXTN|ivS?~#m|&aRP0FbcI{HkeYW zne@Wxi+8Z$>qP%q2xikPI;pPwE(7S_DR!2TAmwRsnW>NG(pfYGv+#Hb<98MD2mNFZ zAc3nP+}wIj7fBikRJhwr#LuZ*U%55Y+h0?2=CYG3BCI3RA%Od3v8^~Pl`le9oaRcy z&zQwWK3rtl;BBh#=jq`o;M&3*A5V|j*fz)SgTK_0B$b1>GPOWKQH%{-kXZu1QEHUA z86}GgpNPIN?+>yit!gVxmd<3@|5L4}C@IPsk-EtSzX$r%EbQdNnd3I{YYE7?fVX!# z@RO`s9E{BN?Cta8O4ki;P-V`46*g|Nua~+|(McW{!Gu=EJHXrAdqwg4{<2%&$Ryc^ z8g^R0jx+c$n22}qkPBzG_ZWU-N0fT8xRu1CC>gK3z&&n{w~)7k=P-=$`ibWfDkKz7 zNQvUNxo5MdueT4$pA&G5I|^o=%2&i!z}JRU@pRzzPe8^z;8`VL8MTBNJ{b%=pW1@I zdrJ*g?*@8j+8I*# zVsWpUq%FbS;R2~odC}8tU`}X@_G(3yHLa1PP= z=Yp};RlLFud@t{Z1~vmWNI09-#^nyNH2L&_;1KmV5#4Z^E5~h3 z<_5lG6CLr6yv}qaju&>!MQNTBCfx}-dlj^!J5$9ox{YH}Bk+px-1>d+2O1A2XDyE7 zlhL!Sz$w21T84TcN3qUOm*kFcZ*os{H+QE1S!zUv?{_eAjlRe02tf~*nX1CuD z#p!ojH#A}8@h2$21Tqs3fEdu7gYa&Kh|&1GwPvIJ!fIvZWoABMRq$_y$=m{6O-3GT zKRTEI@i)B7UEBqEsB`IsZ(!ir;d8|C*e6JYs?Lnq0jyW#@63d=lpbfh%+!c$Owo(^ z{==yb3pw2jB^TJtb-b0X;giq~U*4ABIwPrK)nQq9QNYc_+36G&$^|a9o%t{|Jc3DZ zIAU@BEP{i2G;{A?d=-X(F!hD;O?C~O&f8S@<^1|3^`-N+aYrlx5zh{?WM`_s&JOet zIMY=&gsqtzm&31Zg~vcreO&vm%j`_g^BD((RInG;;n`Wr`G88;M(zb_-i6)8E$Y~I z@TFo*=5?g|Y&%=Sv+F>G>JK|UoY!$E{Lcp<`sGpJbcWN}lbhrVJ~pFm)BoLk!+2(* zaO#}~ll(ro-UK?TTKL}ICet9fwS{|O2PqQgj4$YY*Wr;;5*9aab3FxF*){2#zUWb4 zQZ2O8X!b);pWOC6^!d@^OZslTDUQ~UjmgY0Z{auZqfa@4hgxMgQCp1lM$A73=6;;i z2I`}|e0znjDg2vkpahbi}!&v*xno8Wk-#5X($rqe?u zvl>UYvYYuapKmIPy41cE)Rk;>a!r+$RI564J_kU;cB+$5%&o;yd^CvJL%OFKIQ{-d z?)fgzr-fvUuR#C%AASkNVRQANVtL^&b>Y!$>L)U(rs5sYnFOdydMV=**(f&+xBdk; z@q@U^Rr5GJ=RLc;N0eUb3;MUmzAxHioCvzZt9YOdf(M=*O-*m|izo2if1nGzqi*uG zq4F-$(i%NTD7|Esfwh#yxAJ*qa{K zv(de!HlxkERwkH(PsPc+y2VJDU(D;+k;k(xusgBagNlKP-QC^TjUCvns9=lTusgA{J9}=txcq<5If$@3^UeD{ zxk)I6<_&U-IUyTUMppF3>BYKmd&lvt`SY38(1%|#mrUh@#3(X;=doWzaHZ$6>;=1N ziFRO#*~R@F3-+_h`~_7|5AK-CAPnbtCcoq^5x|Zw3+==rT-&!TG1jr1N=cx!0*HD? z)Zy_wVf}HV+=9ak0Hb(KYFRc;kg_yG76<1F#3j*Fx&~XehkGLczeXCd1J|{I8gvEf zy}?3L?#{F5z8A4sedJ0nXc~ZGuMg=Z&F}>J!eG6YDBdQvi9ztzjU# zki-;+yRLw#KN+H34U2Kht9Yy6_F9JzH5*^^vadKhV=0=C=A$iZ!|9(JgejT{trdKP z&9s|Dl~N!mIzF(e@Okf1g?|(7ixF^SVd$_Q!P=kZV+@TY{n_Yxh(B@5PA20e8jfxy zTJTn=6Z*r$S7$R@0K57K=4=H#TmVexVz470EIq^UAP{2kce=FwO zW()eJo?=bjC51gQ7(HiC(rC7#vYLmY{TK7`7@kp?tX=Vj_ae(L2Wb#Cp+4+lE+*Qq zXj*>qUQS1iIhiZY#$;Orh9@Hq13WA6e6PsSsvz}|#-Mfm%ug8w;^^b)8s+~ z(mROcrd-~l-k+Y@OshA%)ePBKiBc^V*19;1>@(C`CXj zO1k5Hd>|5DxdYtwYq{q`xetH2yRgyKgZaBahrtv!!yjN;hunv0gTqgvgn->7p-4PW zXZT=c5)R@Fv`t2XH|0YO6@$Yh5%&Hy=gN8XKqr{f=CY5SMQzy(2V5a7M7={|Ng>x^ zXAS3plr1T-Dc@2qq#Q`8)PeY2nQDma({`YPYYPiBr-S`vkT@W2PIfbR72Gf ziitFX5hx;TsvqisQ8Y_Mpn!O)c2jG>{y$KcYO~w{?1KaO&d1{zoPjF*oa+M$^ph#m zQls>}9e_~hJL?6ad zykHvrz6Z!0>yEBC0gua1_P2-ho^+$(X(#P@!$`gCVZUn+cc_lGe#88N{1P3rVdg41 zR@x)r^nTdJ;sN%@1^n20#rn!R9V~Y{D)OSFtvrFDo^RRC>6NQ;WMU(!!$!NAsi7vy!&{ax_L^FBxh#XJ3$)abj>3R9#>MYtj@&{jeg$^j z{G^9o@J*+ycOo9>(`doYfx{{=a-+FRj^XJ@V(&=8OSg^t*q`sgi5J-QFKKr#cS}{kY)eRqTr9VG%C8+$gL5GVk?9)!vq_wwdIH7{2OY zX97N$4#GO|o^%Zz#$q~tYw&6eCpA3QYPD8IgTIuMWIOMUK@vg;PBu-L0!B0uL?|cS z0rTK5URy3OC5?saH#0Xo!SgetP1?)cWTxAx9sBicI#7n7g6+oFoCBj4#l+(Dr#O!(uNymD zTl7zzdGA}HdU(bYB?^XfCGMHbmRsNe7O_5BxJ~ezdGHoyM!|BPY4;41)N0PT!OTg$ zI79k#UT@_&F_JzSE0g9Cb3FMN+3_a@lSrI8-M?p=@}VZn&(w6xXpRr16CAkUZSPs8 zFXUdFh~sv@{)s1cH8LG7Y#*oj_jUD8`1n7v7s*;%cTw)H_Fyfgb+i5#r^!Y3x@9PW zu7NpM=Cgn6ZD`{h?`cE!c#tO>J$2D|Tj!$74hAcFLGDRQH5FYdtW0qw;?cd2CR}zE zCVy^$d>?JW8~K5Jf-c?qa$k8gjRz0#*S6CZF@LC}v1BKQ=?6-tqx7>>1gYvMzXAoX zAs^vXI)vAEBd$06i#oQE1gNsWv;36HsywT2ra>XAW!wl zZuqNKQa386XnXlgGjRhp%qUkj`t`~vH{kyAvj27GyRU(N?z5f;jX_&niiJI!K;ph= zjnv%A6(xnF-&|UD_dtEDr>A$n_affA5~#Sqyl;%@hAABzdU>AHKbUPM z;q!fo>wB*$jj6G(F?mZnd~wECqct6lRm?Mm0@8NNbE{!nZkq)zkw9k8IB6C7zVEb4 zI>@hUz@&0W=!!G`s3f8By#uB(j;*eXI0zoFj%ge&gXO-QsC`Qc>uDgmYw5{$b{KzY z4QqLtWf#&HJBd4^2+1qI$R}uGb3NwcZkZ5;S2#q-&g55Ch`=>Gi|)Joyhl@+pcHoc&U^>!&F_V({H%4@%PXT8 zQgA;K-cDMZZ&t3hS`8O{=LvxYNvPp6qEKVeuA!i2btg(!bCSlDlSlFw-=h)>Ct-IAEpoL{cBLV8&JCh49%o`*(_mj)Bg}i8p6w7a1#*Ls z=H%%!f%oJn+hZhN<|??$U*MKrh4!PD(TOh20-pP*2O5DRjneC|%T@BsU`MOq-Q-PU zlrwbt>xOu{p&u_uzsh#cXwdQ0&bDw*6kFUIvQ+*<8QvG}Ym}Okk1XVjRKTfwTdksP z!uS7ME6K^wlKVWP`v`N(8>WN?s3UD^E7HP4y_6 z=kh$MnLE{JaPM4982#0fsLuNusXvVi~gSNR4Wzl>Cr3E<Nc=scJqKay8si@P z4Z6Jn4@&}DVT9+qr!VbVUA>+0NvkC8#pqUCytzCd`K;=?jxO~v3JVY}u<>f1JDzy& z9N$%Dq#$~IBS`DckB%^uGw6!>I=rkujCn&ToF}Z8>v$Kbj@i-rxy=hfD%Q~kd0x0r zM%q0(o$rwFwS{&MJL;yIq|Vk6=7F>JB0HlxXvA3hhnjP>kF{o|d!QbuwaMPcwvKDR zEDTID=@LHtiDadGGxrmkpawcbnrtTPSL;x;6*`G1QUEF~vTdewA{lpytpZyv$w*KkydY*?%8NAWkmpAkgyn zI93wT#EirDnJf%IZI~Y%rX@bEAtX7*@zl@5v)zNzxf~ua2h+hsIvt0AevRi;%x7sN zUFN=Nj}LkdxRZz6>3nn>{Ny>khPi1Yn()Ht84sY@{(^%mCud-?Pz8OC2bR7kKkICC z%4gX*%A>LJvHg`c7s2sc4;1MSPWe#Sx(4W*hN52{gA{%W$^7x3p%yi6!x~0IKdBwgqT9exg!b3F7}4 z2EP|~=~NKDPTcusymQfDY$kG4>cKQbq1@aLXE~9!nGH-)E=yjJreJouan=oJU_;12 ziRa(1AcI%u#5hMsS3cUeGFeWcxlCZ1Y056#k;&3dC-g@l1U&lZX^#q4p zKFd;G_4Dk@9&w6P0W2}A^$RmcJ&80&Nw`|fYg!9@^&{DU z1$+aI%^(_k!ET%K?EVN_G?grqHeeqXuxt;yrA*97N6<4DMbW$i=h`B5Hrq~3T(MS^ ziXYtL^{XTkebUG9=Pu$i$pIEM2HYk>n@iWy8G4&qqv<(<*DjOx7j$NgIu!NL1JXQ_HHkg|Z;L<&Yk}2HP)-~I8-t`ewyR%DjZEz+y8@XJrooFtH&`>uJ z-1;0Er;*AI6it8V;9Sg^6iMGxYF2n3bef|;eb(|BKbeVEtMj!ecW;tTp3x2ShHSjb z+Ftm2QGKo)hxyAu)>48hY7fwpXP}E=pcbnusu%p1u2s@7rS@`>*m&NzmZ#8S zwvpaK7Lp7f<37o6E@BGtbuiv~^P^T?1=?Pj)`4lTY9XdG@Ogn`_WTjgNd>IwY&mTm zt#vIXizvMS!}*WgqO-L6Rsj*%BZi_9T8UmJ3Mcz2d<~J{r*lBT9kjGM*yb~Hzm`Ue zzFrK3%UOz2YBJ8!2-MxzX*Cmg&K|&PyUwbSCA80Wi^Se2dmS_am(UM9VO!gQHZ#9{ z6}{xIz?~vMG*ZBTQ_~JwN>|~JMlwA;fxr6172KLTe1#yuN1YM_@YGC(2mA`EQO#0` zwBBao7gUZ0NYs6{fC}XH76ye`OaehDyGdo~IVn{hc<=u7^ag-fJi)VbnrzWs-m@rO z-x|+-!k|x1po;N$0K+C}|1<-DHj||x-Mk}&rE*pU; zrHY^*8-Omb6LXl;a2dbImi=Xf`p)_SIICvSuJRsL&vNr++$lrQ6>TTS=(+hO%8dtn z$C=Uhd?D3XV&W6ni(*K?>SU?H`Ee12x5Ih}*3654q$OC-4Q9csLQ6P~G)!Pa`C78j zkG$|HoH9*GR0$>xu!Xe^+1@*0=q&IT#p%venPgjVN~Oi)cm_mh0mx7>R7m&1nEG&@ zMe%Y3vSqmsdNyXQGJ;$ot$VVc@=wsDynET+_WAXM}67N^H`q&lhy{` zL?<}^+H{5g@l+xAdIuSFt6=i(l63MAzsFDa9&|!Wxzk3&LERxc+=IF@2cDD>cwDNu zMe?|NX{B-1Un1@H0(rNAH0XBzcMcpQqdQP}B=42O=xPd+7s)oX0reGs+EQlVi*eAA z&;_jethSH;jbRTPg`QkMb1)usXd^oyjt}iCedYC)UF>)*Im=EskEAqB2}!A%QYa-l zWvsIYY2I1obnIONNr$=!I(}W=rJPo$Yk9z|B+#EK?rGY3{4C2+My3H{AEBJ0w`C^y zbqg(?S#AxpR63gC2Ef1_Aq8OtKW$6*NbQl*U*3T;=CredbCL6{>z%Sm+X!y7kKTdq zI7ZCI85p|fdJS(gZz)fHI*;GM3D`)(OhjqhoI-Jwl$r3G& zVoX89+7bS6J+oG3&jj>MGf<{YC&h$@CwB2cq#urkJL-hDvI29v$yVGdSU$iaWiSh* zsr5vMJCe<;2EX2b=e9scRoGV)CwHuGlW7OqsJy6t2Ac;84Y-T_$PdV89m=&BYc=ER zDq!DY&*>;aE8R`_mkL%CiL{-JXYyE%i~bB(QA^lfr*K(}CJW`R^?_{;S(c*X1=CMG zJ|>{SyhdW{SNc=Nq692xpJ(?&)s)BKM1LvZqg!upZvTwe?j4`wv*&ZTN%S3ngJqzt z4LscxTT5F5l80(ptWs{06g%Kz`^4S6L70TUzaK6z8<>_0T~#}4b$n;_nbrDQJ6Xq) z8FiC=aujFYDBQ!E}JWk3nt8B}{8uUlpm3&+t4tYh;DW%{_r{a%Dq;5Bp4 zS`xc0{~C&`p(tyFj{7u?mzBhO%uR!tf#X1Ya^Xl@Ddv;bvR74vvGCBx)PmO_5?|d% zv>Ul?<>>eGq-KJ0EI;tjKw^f&|O}=^QxT zO&aSCfEcysG+VPL^{_p{JK5E88V+Nd=qED5u5 z?P2>Hh~qIMn(%ul@8_YI&E%VFBy;NQCjl*vd8wOTSx>7M*0-{qz30OY;~(tK>iz|< zHH^9GH3&>NxdG3~1?b3RpedWx6y}DPxL9?%otB}Ld`PD5dAPB=?!B}br= z=T#0ZwKX>hAAUO}qvDb;adH$^8k0J{3all z9^|@)f470_yK9g3ce#r40lcdy z+WAY$U^N>Ko_)MZ;W+s?$C;DHcy4$KkuWpFo7=mBC&3Xi)o(GW4RhPsJM%DMnLK9N z4nj$P-AHovXjF*D;j1^81M%YD6|aC?egUoAhcYM3WbrK{e`_O3o5Q|ZzJ2r!e)pEf zCwvQj?EuM_+eEjNmwWi3HLY!oH6JX^RXF!}@YI5q%cx=If;9AiF=_#pdJ30$DA!VD zak;P`#wnSU^18Um=9q#}Z|)VM#rd30Ypru^%|Ngx;89s=t7yw>D+Hd~+%_Fe-a=ax zeFg>WAM7I>!yRFcE{>^=3622AYI_j-;y!XrI?-009#0lL6`m0j83YYrXr8la&ZaZ6 ztGN=13N6T&%7t37q&SF_qNgChGjZ6o1%nL(?RLO{CrU5j&&zgVME^^o^!>^eUc}+rAs7Hf*PT*|+jCJxt~PD-K&#mzHiH%=RwfHCxGT zkUSe2D}_xX97MJ=Gg3M-juXf^%VtzFt}!Wv`)1><$Owv55G8mVTJvDDXugB1E;UKG z2-tUJ?zdWiRbWh^X2VYauNI939AHdL_tY!6UvAG6-YOBaE1 z>@3Q!ob1GR*fKYOsK<(iS7cd+I5hX5jgO!@OiQHTy|Br(AnKkKIW=N z>XPAX<7!0b$|+Yf`H>pVthInv-w^kF&baJ)9=(YE0mNqxtX8Ny4^!EGx&R#dVXcqa zLM^5=2Knwrj?(%RJ$YgB!Q`0aQ_1~O8ak`GF1rG85_{y`^g%U8iLis5ak4Glhul82 zmPvg5tf1(+8n0fVz4w=zq@LgeOXNH2>gR zCqMa;>ABI;yPa3Jr}vL%GpODK+`TRm8y4aV-a&fP5BGXzssLQT|M670fR8FwH&!7t-11MfoNZ1uD428h3T}~ zi{y8mCy}i>`ac;QTto$x&mKz$a0&?@e@R~IZL5S*;41p4+H^o&M!8fAf68LV1IIzf zM#nzK9!D$3Et(=TfJV)v@i&@g-$`Iw%jxoLi;t!o{X&v8b;ncD2~|Yf6b&Z*2nEq% z^9G>{s;VB+3{>o^t$u74Bk|rhw*}cU;WN(6v%Ejv_)joZ57F9u;SNZI%Xh+x4MI(M zgA+Rwj<_mhD21RuXhAnX2NVN&*bKk$A)pkzjjky#8tiIxXy?}kC`M=I%eSktOtPUo3e+oGTv%86P5b(4#9IuD#?3R;9yrtV~K zS@_kI6Kn*I-`m1=PTM3-)nc%XGvLdbv#+-JcQS2dzR4yHBWZIGi6N=@@qT8oqCzXST#GxK<`|8u*ju;6a6O6Yb<9 zAqUFGr*skC=1-hALDBIWcVZ*n?bF~*Q|S+n<@!y)OI_KJP+v|%d3g;)J0BYG z(w+mJ>ok&V^jzZO3JKRUz`J{Tx^oxl+;d*g=|ncRS@hKzc+p0vAJr_Rhzy|Dwj*ib zzjOz>g2A4Xp4X^?o_XGoN1Ms}1sAbDTEr=OUVRc-AZfJ@bY?~>`)MKht=uLzps3mq z|J*JV1-jgtRPaAw*CW*l>Rfd+lTElg$jRC_oh3+o!2=nfF}G3<4QR*93dIa5y*%pi8<&VQ`{e`orzMXT~7o5Kf?P zsMQ;~SHlTbCqL$tJBIo03|X7)X_R>9dBL+{mA8zs)_7>t_a*y$CQ|BA7LSuYh&B{# z7hu^gq4ltucXJQ)_N~New9mWRsD$G;4bSbdrfue8DELg=4f|0@&SkE@$fWHgyZI(} zavxN4!L*+Z=bCMV6FsdZ0gf)W)KRQ01et4^*819$?Ca%hJ6D3X*)1gI>%eQdd%+>;|mSe(Q74j~Te)i=y|d%&f8n zpVwEh4T&AC(H4F~qrF&o$h}dN>7@>daFb25%^L-O{1$__(^AtBdyx5<9!%yxw1cxy z9~PAEpcj};+ul%eI@f|%FXCE%z+TXehLoJXlg2^grjg26J~GDo8gP~rr@JI0`&J83 zob+NF9BMnzUL=uO-ISAP8t022CrmMzG6n8)7OuLhxWBUcMj2m7c|Yq-M<)9M*t*v= zR5WK&&BRV3lJ0wh-TMaY`7#o*deMK74;D2E{laVb&Ca+TJ8(|+t(ak0>Ii391Ul4=KB@61@zQPzLpgZCsG)iIYZ9O>;tMY4^ zDOXabV{4W-NH%pZ<^{h`zqmBX=JLwX`chu(gMC2&KBKNOc9z1OUpWa|hf$MX^FH*XplP~?vu!nqkWVYiv{VB0+)MJn7Br2?S_kg`P|^efXrD}Q zKO?ni8tU%uZX3>!qS{z>pCaMYeI+*l@loVc{H~CufiZ=VN|KHFts6UL3}?atREhUV zjl9jw)j*TLe!A$9?f{Uf^lCcFTa$aH1UoM~2jL2SC)>zi z%BB4VH-Cb2&PP(o5K`i{YZYk~KESjz0xY{ZdV*zIq`C|?&&qi?1f^3fE!5L}j&9ZDIicSL zCx6S_l+Q>{pII%o>M_QA{6Bxl?CU~e)^0Ls#_JO~8Dltq6O=pZD*d8ooOgy1f=&-s zjyX3Meu=i^wFjF@;G>A-%HAsOmd4;=Z*SSp`SgWNBrnhG_vRU#G;irc*@`;kjp64V z=Y5Qp_M!JbGzU#V1(ty{#|UjX7o6yXO5wiG3g$jkg11E8o9u$29Yj#k!+|X zICP6M)841qZa$d$AY-%+eK0IoG%BHRvb5i` ziFE_5`obRfmF9+{d{5Ikp{sGy6oDsOhz24Hr*lq{B%b|KmtD73W1C*hOc}>aTpx|W zVDN0abd#@VFmt7*uKz$SRTULwT28`O(lHX^wn;BYtLxAC)Z0=R&vdj@jXmu>8n51B zAPmJSe0?S%fh?28aGOooh4bPdm_=^FE812%pye-PiQ!4M9!{bM*wrzV<#w?n>3Uw% z5;PNo*cM9inqLKxdt;7aN9|0a@=bmpN5(=QPV#&3EYtZp^O5>93w2ahb3bw)db3Hd zAqDvl?Ga)4ge0EQ+3-{>XYSGQfBAd!p~eiQ3+e!B%)R7R9_6l!g}ch{o}>k7dr)=< z(fuo;*=c~^HJIsZ3CZFe(d;zy_ zP$;nJ*!9vx*O9c#Fy%QND{a&$^*Lur01d(8NDC-Pf1Oq7rj)>^wo^NR)@TDNZZE!* zRWxiqMVWL9HNjo^87TzuvI?8Gm}blKBq1d*)un2R3ek(uQqQEvxa+#_qf|;n-4LgZ zV5-Wa+i3coiFROz_LlsCCQ3Qb@Y-rstsE}jreOUim?ba6Ugp<^(}~wqUV^r>GkVeX zWZi|s2Npylan`*XUSJYT!X^~&BT3a%X_jC4z(e9eiOXadAIDi=9-&(3Z-D! zb_i#1o-Ou0$7lb;cbm?m4%}}UaPfb|<5h-D{v@o?W+snKV%C3iQYgCX-Q1OFg>6g^ zr`Y#*f@hQ!RCcvH(m3=*6;ZJGlLy@u_ryG553UO@$txGo0Y<|WdxV;FYV1afmzf0G zSz-vPqldzGIQZQ(95`U#8Zt$_CVQ?u{M=JioH1bGX4C`cZCmKQUMY=5m5>9^f?Mpv z}(Gdz;7R^)j8LEf{S5~3Q9EXne26ti(p5qV6%DO?1+7-}~^uCUC`TmFIcm(}v5iqCG zJhu~QjcCT{*Azc}C-ghdO-|Dv({=W|CnkT?2L)-53c`19^>u-7%}V21Idq#jNQP)E zHbC250o-RPEazR)0Y;)KJH{M18JtKa1$Qml&B|t+*A|IrrT25nuc_+6Vg5Q$YCf85>d6*6GnlOWyc5nnf-JRuhAIP7!_eDCXfX& zQ@9HI7{pw71f9e~^zN7N5#|=B^4#cczQQ|}$2S>P?-f02o$0?WKtN9;*Es)w&3YKPuuTP{Ty7?0TK+hk?c5^w3Sk*p`XBt zMKDhlVRi~2sh~6Zf<$*}Yk-&EsZ2pf)i25bWxHHbmdT9kK}K79+6i8fSJw({r3a^N z2%S?u&~pxDDtk${?m{$1RluzXJmRxjqc`fV?380%&zza*r+bsKC?#!*i5#b;&h)em zTy%Apiz{DHUw#7VeyJ4Tyz{87nd}ad(v()~L6%fqWf(nHacU~|bQB&iFY}pGt*p*h zx{{u^Qr)Y)0{?kV_dpPcbx%D~o2Cqxlj-v8MM8PJ)9D(dY*Qn($68lVaj$-zwuaqa zi!qW6^`j)k2_W1_?hd+JpMrna-*`ZG!7UJ~B_Mm7$(QS(Co*&0!4+ImJB9=Lx#H2X z>bLcxOj`YX;b5{P;F7gf&G(V5BnW0T$~1>W#&mcz?tq*IO6kO8d>Y-j16G-~o5RTG zooJrPEHJ>g41IrVaNwG>6io-0EKb7hdY7|g$~n~0 zS#1`Zj)vhqdcK-yVipL6P|w5&)k&Vq%Z9Q9RJ8%xr3`q*mXjS+0IkC=CWlFAZ@ybE zfODm{rMLc-lDI$Om=YV3cOr3`jYiWx4QJv3wuN)P@-Rbgwy;t(|7lD<4^0_Si2uL? zqq28c*c-#}(Pc!(Q;zSXu{an6ri6JTC*C!-+k)^=D}0}Pwb=F!l4&I~l}$pqG?UZg z0v}gUn4jmKE6a)6k26?d`Z&Tutn|Zja`J|8_?v-kxXz#(P@`6sK+o&=M z;ne-W-@2L|ZaaUj4PW&k`1vc`CiD17PvPweM0pm-e03SrybXB%V5Z2_^z>A8yaXA4 zQ%I+b1^GL|jy;0DPNL zUjiQ~Nrv1|8n=(Q3$yWzLj^uTpUF1XnAu?=sdHz^3;&9rt{&&uSEi~IJw591K(vKp z^&{>=q&XeaI)Oen=8QV8+(S1MOG?vj^i2oIY|>n9$hbTwp8A4qS(^~M~P zj=fT0mfEb9*V>W&ofoB5Js7(#Fmy-w+(TsY)_1?xih)i?fT91^BJh|rBj4Q5oun1i zKBGT>N@i4m+|K2X1}hX_OmTd{^-w$X)4pjH^d{__xwWinIF6VjatGNaXC}M+o1B&8 zU#B|U{Yv-KFXK#E1m5+<-IDV>3D@3EJ()hO7g`xoTE3%TaF9(Lvey|!0 zyF49Dh1q>-TXKL5)Z?njfuFM{PpTxd2qqB+tFjXZ`z^YM&cP|=lzeE4dJFx`gSfL7 zv*(wguWg(8BHYar+JzIzIg2BaU>mGo0j}!Vq%RJo_2Ux%Mzy@KN_Kz8F~&2Ofoi`{EI3>I4rZE-Ws#pP^`bHP$piR*cSm$dj!SS>h@ zri&te(nH+$Y5AutOkB};{vNVnt^zTVK(SK!$7+@((rmH0&<^ImF*w9s6iJEy8W{VL zT`A&%UW$gG0e3)sc8@i<%_6vCCyV=W9)4gieufLq5B1V?8Z^bxD1AOJ2bN-*|ra^PeB6Cc5V(=3S)uo;Tlxxu}L04y6@8VIb#ZcA+|% zzAf46hrmzGgztQ=nYOZAfdB|~Ke)pJpDzk~@VCT+?U$_#d<{V!C2w^;k(k(J-s6f0 zfoqB&=Q05Fy9ankAl!Iw+PJQgFE+s#4u@(rqRAq-gir1g9V-Rc;mUa~(tB_o)xZ~K zo6?{%vFcR(YopYa>Id%kCiGH{WhU~XdnOy#eH9(kOQw~*xZA3u?=HeD;!^Txo7CLk z(X-*|V(B;eim$E~x=n+#r7}s~&1ln{uSSp#9IbZ2=ldJ|C&|3Z5_yYjz4JrLx|A9z zKax!;M^idG&p88JlR4jx%9BuI`jI0XfIH@*+JqduA51y*_!@Mk%YEc1`Hoy2EkjQ7 z@)DF}^)nMtI`?=`u|}MoMbJ!sKoe08W%yh4Pes+Qas;S*339cCyg3M0_CH%3#@RqsiXlaq{%;Up|-!@G!7vPST*`-dwqoiX$ zd&fz2#kA8r8?X0FHk55(PKQwpW&tBy!xnMQ^vHY{y~#Hez#gu{WPA=8L2kN|%8}Yn zw;N1$4QZCM$=Eg7np3%#F5GI%ihAijr4(y zq%ZB|q#O)BvK!5T&qk6XSh~zsxf1-s!1aEUbLRpY_=zARr^o~e1`+9uYG;ULxTOu< zE|th)xkzf~EM~p*cr?19@M&RfZs{oP;CcU=mhNM)WleC42(bN~;Pt=3Y&+O<3$qW- z=Oj)dHKr_{nPI4x3!%u~hjXO_^VS5;z`ue3liyL;jh5j)DVIZ0=bKCp(4$u9!P_&N z_C@!!mC0!!%F1%Q?w3h3$;ejHfbaXWm;0pVmyvl2Y2FY@uXA_ z_4O4dz78nb&wx1fCQoZBm~?9TQZDf!Tw!&zmyOW1^(DEoI@|9-QkF8n{EtFK*&k-F z8a(TN_;g=b%JS!bShI5;<>UQ}r<17%>ToAXmKt->51u#uQD}^0b~;2R%>y>5_oyyk zqCg#kyEYx?=X7wWG;}0%=6gx7UPecD97NqE4n|>r5dG5ysXE`?XilYrJXM~sV`qR* z+zg915iBcMT*ha0LB0BxjqL;5mJW+iiybr@`teB4#T6(+;!MTR-OVw4G-&lCqc7gq z&-9D7z&)JlQ}I>T!V8?8ZEhI+=U>!lBaMR~O_#uK3z0Ig0Bv%9y{!AWb`|%?Rn0CROx~5qAz{4scqgUemHxU;rX4YjU+XD zv33`1{1qjzCCOmE`dN`drO&upxssg6oHbp7oFJonQj0Tv z#B(ZEg3qh1n$ZyibJC@5S8eo@;PJ7vP?aV9z``E&l}5WyxP60g-qlvmD5Xe>+NO{( zMJ81zGKd}edNf|2ao@d=yU9&t#Wm9v=xX9>OK(*Ll=J7|05|DbQLDz_86+i2yGSQ` zA!er0OikP6vY=#zwIG;-i6qD@c4za%GezbCh0D$Jz|T9FWWNb|chc*c!t;IC)`4?v zbeqZdD`>Pc0u9Cc-CN(dZ(Q=Nq0wU$sA4aW)_vsFwj(Wfly8zT*BgK;A=;SCWH1uu zVkw;Y6Vp$UI7*07Xn8WQt5t)guWB7&StrGEzh&l%%fn8PNBY7Q8U(go7EC*VB*d+# z@eGjfitvB!z)PNxeQlW5!UIPE#D8G}-R@3C zY#iO{+ng?XIOlIy`2GjNm_Rfr&Ju`at z`gqvdgLBU}`I~0KkZEMVUNg3$;eLioLNiricUy~6r~~}qSt*?*Gfn3jfBS8e1>x{( z9(F#}^a^}@Dd$>IUktB)T3_jZN>=RP#!pg64}<+hk(QE?M6{y#E{1}aSB0G$hkw{d z{&5w!sKzMNO~NDdJ8<$de0a>WxL1#Z`NYARWs_QUHJg$d1Jor_NY z8d}RMOhonAyJT>^rc79K_**~nHx1*&{Erj4I_J_&GA&=>$qPV<>Bl)IF!^2uatXaNTm(qb+*S5$Shx=uQeN>R_f8@c+7^H>VjUZ7w*M+ zu%in7?(MvHQ0Nr*ykHMo11kHOjM*5PwoA~S+1C5Wn-LVSBMI2I@zDpdNwvV4F^7qw z7O8AQ;k#>~f|gMbjOTnxASv=Aj+IZGUKVn5U%|!~Rr9D;8ZiCwu)R>m(`@-2#r7+3 z>n7y;b|#(D#983)?x&4I<=K|W$Oe|21Eh$-{LQqQ7apQikg|HvzpHEN8u)m@LXtf>BuPKUJGd}XwpL4M)t zh-c-bbG561l9hbAWhlc%&k;{{k{tSwu|A8W%Ngj!%BM1RpltW)OtE^-dir_yp|M}; zO+X+1fK<`;Fbp%j6G;lFfG$4)cj8Idf`e!{5^*tp_5Lt+(e$0FK>h_&nwqd^HJh1R HnhE~{nqONQ literal 0 HcmV?d00001 diff --git a/samples/mitsumi_seek_80_tracks_380ms_48000_16_1_PCM.wav b/samples/mitsumi_seek_80_tracks_380ms_48000_16_1_PCM.wav new file mode 100644 index 0000000000000000000000000000000000000000..a5516cae85937ee59531250ab494afaad7d36ce5 GIT binary patch literal 37754 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 literal 0 HcmV?d00001 diff --git a/samples/mitsumi_spindle_motor_loop_48000_16_1_PCM.wav b/samples/mitsumi_spindle_motor_loop_48000_16_1_PCM.wav new file mode 100644 index 0000000000000000000000000000000000000000..190dfda3e9eb1731d2ce446b085dd28d1c2fdedf GIT binary patch literal 172700 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 J647yy{{aKOSGoWI literal 0 HcmV?d00001 diff --git a/samples/mitsumi_spindle_motor_start_48000_16_1_PCM.wav b/samples/mitsumi_spindle_motor_start_48000_16_1_PCM.wav new file mode 100644 index 0000000000000000000000000000000000000000..2595ed0892860e4926697fe01b02c2f83b2d60a7 GIT binary patch literal 44172 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%0DVBq<}1<6>!q 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