From 1c9494c8d0ed654c2d770dc8c456c6bb9967f009 Mon Sep 17 00:00:00 2001
From: startmenu <3387747+startmenu@users.noreply.github.com>
Date: Tue, 7 Dec 2021 13:28:32 +0800
Subject: [PATCH 01/27] Update zh-CN.rc
---
src/win/languages/zh-CN.rc | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/src/win/languages/zh-CN.rc b/src/win/languages/zh-CN.rc
index c6bf385e6..9fbf5d2f6 100644
--- a/src/win/languages/zh-CN.rc
+++ b/src/win/languages/zh-CN.rc
@@ -29,7 +29,7 @@ BEGIN
MENUITEM SEPARATOR
MENUITEM "退出(&x)...", IDM_ACTION_EXIT
END
- POPUP "视图(&V)"
+ POPUP "显示(&V)"
BEGIN
MENUITEM "隐藏状态栏(&H)", IDM_VID_HIDE_STATUS_BAR
MENUITEM SEPARATOR
@@ -69,7 +69,7 @@ BEGIN
MENUITEM "全屏拉伸(&F)", IDM_VID_FS_FULL
MENUITEM "&4:3", IDM_VID_FS_43
MENUITEM "保持比例(&S)", IDM_VID_FS_KEEPRATIO
- MENUITEM "整数倍放大&I", IDM_VID_FS_INT
+ MENUITEM "整数倍放大(&I)", IDM_VID_FS_INT
END
POPUP "E&GA/(S)VGA 设置"
BEGIN
@@ -382,7 +382,7 @@ END
#define STR_ISAMEM_2 "扩展卡 2:"
#define STR_ISAMEM_3 "扩展卡 3:"
#define STR_ISAMEM_4 "扩展卡 4:"
-#define STR_BUGGER "ISABugger device"
+#define STR_BUGGER "ISABugger 设备"
#define STR_POSTCARD "自检卡(POST)"
#define FONT_SIZE 9
@@ -408,7 +408,7 @@ BEGIN
IDS_2056 "86Box 找不到支持的 ROM 镜像.\n\n请下载ROM包并解压到 ""roms"" 文件夹."
IDS_2057 "(空)"
IDS_2058 "ZIP 镜像 (*.IM?;*.ZDI)\0*.IM?;*.ZDI\0所有文件 (*.*)\0*.*\0"
- IDS_2059 "Turbo"
+ IDS_2059 "加速"
IDS_2060 "开"
IDS_2061 "关"
IDS_2062 "所有镜像 (*.86F;*.DSK;*.FLP;*.IM?;*.*FD?)\0*.86F;*.DSK;*.FLP;*.IM?;*.*FD?\0基本扇区镜像 (*.DSK;*.FLP;*.IM?;*.*FD?)\0*.DSK;*.FLP;*.IM?;*.IMG;*.*FD?\0表面镜像 (*.86F)\0*.86F\0"
From 31daf6c7eb1f7819a7cf41aa4467a21f9e3016ff Mon Sep 17 00:00:00 2001
From: startmenu <3387747+startmenu@users.noreply.github.com>
Date: Tue, 7 Dec 2021 15:55:44 +0800
Subject: [PATCH 02/27] Update zh-CN.rc
---
src/win/languages/zh-CN.rc | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/win/languages/zh-CN.rc b/src/win/languages/zh-CN.rc
index 9fbf5d2f6..652516e66 100644
--- a/src/win/languages/zh-CN.rc
+++ b/src/win/languages/zh-CN.rc
@@ -115,7 +115,7 @@ BEGIN
POPUP "记录日志(&L)"
BEGIN
# ifdef ENABLE_BUSLOGIC_LOG
- MENUITEM "启用 总线Logic 日志\tCtrl+F4", IDM_LOG_BUSLOGIC
+ MENUITEM "启用 BusLogic 日志\tCtrl+F4", IDM_LOG_BUSLOGIC
# endif
# ifdef ENABLE_CDROM_LOG
MENUITEM "启用 CD-ROM 日志\tCtrl+F5", IDM_LOG_CDROM
From 4a906f0138315be483ebbdfbdd5853265faf6c18 Mon Sep 17 00:00:00 2001
From: OBattler
Date: Wed, 8 Dec 2021 21:06:56 +0100
Subject: [PATCH 03/27] Added some sanity check, closes #1896.
---
src/win/win.c | 36 ++++++++++++++++++------------------
src/win/win_ui.c | 4 ++--
2 files changed, 20 insertions(+), 20 deletions(-)
diff --git a/src/win/win.c b/src/win/win.c
index d2a5003ec..650e43ba8 100644
--- a/src/win/win.c
+++ b/src/win/win.c
@@ -249,28 +249,28 @@ has_language_changed(uint32_t id)
void
set_language(uint32_t id)
{
- if (id == 0xFFFF)
- {
- set_language(lang_sys);
- lang_id = id;
- return;
- }
-
+ if (id == 0xFFFF) {
+ set_language(lang_sys);
+ lang_id = id;
+ return;
+ }
+
if (lang_id != id) {
- /* Set our new language ID. */
- lang_id = id;
- SetThreadUILanguage(lang_id);
+ /* Set our new language ID. */
+ lang_id = id;
+ SetThreadUILanguage(lang_id);
- /* Load the strings table for this ID. */
- LoadCommonStrings();
+ /* Load the strings table for this ID. */
+ LoadCommonStrings();
- /* Reload main menu */
- menuMain = LoadMenu(hinstance, L"MainMenu");
+ /* Reload main menu */
+ menuMain = LoadMenu(hinstance, L"MainMenu");
+ if (hwndMain != NULL)
SetMenu(hwndMain, menuMain);
-
- /* Re-init all the menus */
- ResetAllMenus();
- media_menu_init();
+
+ /* Re-init all the menus */
+ ResetAllMenus();
+ media_menu_init();
}
}
diff --git a/src/win/win_ui.c b/src/win/win_ui.c
index b6a22fe50..703e3e414 100644
--- a/src/win/win_ui.c
+++ b/src/win/win_ui.c
@@ -54,8 +54,8 @@
/* Platform Public data, specific. */
-HWND hwndMain, /* application main window */
- hwndRender; /* machine render window */
+HWND hwndMain = NULL, /* application main window */
+ hwndRender = NULL; /* machine render window */
HMENU menuMain; /* application main menu */
RECT oldclip; /* mouse rect */
int sbar_height = 23; /* statusbar height */
From bcf96bd913b4937df1d49144007dbeef743fd859 Mon Sep 17 00:00:00 2001
From: OBattler
Date: Wed, 8 Dec 2021 22:05:55 +0100
Subject: [PATCH 04/27] Properly fixed the IBM PS/2 Model 55SX, required
reverting some keyboard controller changes and changes to the implementation
of the memory control POS registers.
---
src/device/keyboard_at.c | 10 +++++-----
src/machine/m_ps2_mca.c | 36 ++++++++++++++++++++----------------
2 files changed, 25 insertions(+), 21 deletions(-)
diff --git a/src/device/keyboard_at.c b/src/device/keyboard_at.c
index 0b9e85eab..75d0bf73c 100644
--- a/src/device/keyboard_at.c
+++ b/src/device/keyboard_at.c
@@ -1084,13 +1084,10 @@ write_output(atkbd_t *dev, uint8_t val)
flushmmucache();
}
- /* Do this here to avoid an infinite reset loop. */
- dev->output_port = val;
-
/* 0 holds the CPU in the RESET state, 1 releases it. To simplify this,
we just do everything on release. */
- if ((val & 0x01) && !(old & 0x01)) {
- if (val & 0x01) {
+ if ((dev->output_port ^ val) & 0x01) { /*Reset*/
+ if (! (val & 0x01)) { /* Pin 0 selected. */
/* Pin 0 selected. */
kbd_log("write_output(): Pulse reset!\n");
softresetx86(); /*Pulse reset!*/
@@ -1098,6 +1095,9 @@ write_output(atkbd_t *dev, uint8_t val)
flushmmucache();
}
}
+
+ /* Do this here to avoid an infinite reset loop. */
+ dev->output_port = val;
}
diff --git a/src/machine/m_ps2_mca.c b/src/machine/m_ps2_mca.c
index 305005592..e6e659176 100644
--- a/src/machine/m_ps2_mca.c
+++ b/src/machine/m_ps2_mca.c
@@ -202,7 +202,7 @@ static uint32_t ps2_read_cache_raml(uint32_t addr, void *priv)
}
static void ps2_write_cache_ram(uint32_t addr, uint8_t val, void *priv)
{
- ps2_mca_log("ps2_write_cache_ram: addr=%08x val=%02x %04x:%04x %i\n", addr, val, CS,cpu_state.pc, ins);
+ ps2_mca_log("ps2_write_cache_ram: addr=%08x val=%02x %04x:%04x %i\n", addr, val, CS,cpu_state.pc);
ps2_cache[addr] = val;
}
@@ -402,10 +402,9 @@ static void model_50_write(uint16_t port, uint8_t val)
static void model_55sx_mem_recalc(void)
{
int i, j, state, enabled_mem = 0;
- /* WARNING: Undocumented behavior - when bit 3 of POS5 is set (ie. memory has been configured),
- bit 1 of POS5 behaves like bit 4. */
- int base = 0, remap_size = (ps2.option[3] & 0x11) ? 384 : 256;
- int bit_mask = 0x00;
+ int base = 0, remap_size = (ps2.option[3] & 0x10) ? 384 : 256;
+ int bit_mask = 0x00, max_rows = 4;
+ int bank_to_rows[16] = { 4, 2, 1, 0, 0, 2, 1, 0, 0, 0, 0, 0, 0, 2, 1, 0 };
ps2_mca_log("%02X %02X\n", ps2.option[1], ps2.option[3]);
@@ -413,15 +412,14 @@ static void model_55sx_mem_recalc(void)
mem_set_mem_state(0x00000000, (mem_size + 384) * 1024, MEM_READ_EXTERNAL | MEM_WRITE_EXTERNAL);
mem_set_mem_state(0x000e0000, 0x00020000, MEM_READ_EXTANY | MEM_WRITE_DISABLED);
- if (!(ps2.option[3] & 0x08))
- {
- ps2_mca_log("Memory not yet configured\n");
- return;
- }
-
for (i = 0; i < 2; i++)
{
- for (j = 0; j < 4; j++)
+ max_rows = bank_to_rows[(ps2.memory_bank[i] >> 4) & 0x0f];
+
+ if (max_rows == 0)
+ continue;
+
+ for (j = 0; j < max_rows; j++)
{
if (ps2.memory_bank[i] & (1 << j)) {
ps2_mca_log("Set memory at %06X-%06X to internal\n", (base * 1024), (base * 1024) + (((base > 0) ? 1024 : 640) * 1024) - 1);
@@ -435,7 +433,7 @@ static void model_55sx_mem_recalc(void)
ps2_mca_log("Enabled memory: %i kB (%02X)\n", enabled_mem, bit_mask);
- if (ps2.option[3] & 0x11)
+ if (ps2.option[3] & 0x10)
{
/* Enable ROM. */
ps2_mca_log("Enable ROM\n");
@@ -444,7 +442,7 @@ static void model_55sx_mem_recalc(void)
else
{
/* Disable ROM. */
- if ((ps2.option[1] & 1) && !(ps2.option[3] & 0x20) && (bit_mask & 0x01) && (ps2.option[3] & 0x08))
+ if ((ps2.option[1] & 1) && !(ps2.option[3] & 0x20) && (bit_mask & 0x01))
{
/* Disable RAM between 640 kB and 1 MB. */
ps2_mca_log("Disable ROM, enable RAM\n");
@@ -462,9 +460,15 @@ static void model_55sx_mem_recalc(void)
mem_set_mem_state(0xe0000, 0x20000, state);
+ /* if (!(ps2.option[3] & 0x08))
+ {
+ ps2_mca_log("Memory not yet configured\n");
+ return;
+ } */
+
ps2_mca_log("Enable shadow mapping at %06X-%06X\n", (mem_size * 1024), (mem_size * 1024) + (remap_size * 1024) - 1);
- if ((ps2.option[1] & 1) && !(ps2.option[3] & 0x20)) {
+ if ((ps2.option[1] & 1) && !(ps2.option[3] & 0x20) && (bit_mask & 0x01)) {
ps2_mca_log("Set memory at %06X-%06X to internal\n", (mem_size * 1024), (mem_size * 1024) + (remap_size * 1024) - 1);
mem_set_mem_state(mem_size * 1024, remap_size * 1024, MEM_READ_INTERNAL | MEM_WRITE_INTERNAL);
}
@@ -942,7 +946,7 @@ static void ps2_mca_board_model_55sx_init()
ps2.option[1] = 0x00;
ps2.option[2] = 0x00;
- ps2.option[3] = 0x30;
+ ps2.option[3] = 0x10;
memset(ps2.memory_bank, 0xf0, 8);
switch (mem_size/1024)
From 2c599321de70d4810790f181b5844a5f4b0024be Mon Sep 17 00:00:00 2001
From: OBattler
Date: Wed, 8 Dec 2021 22:43:23 +0100
Subject: [PATCH 05/27] Some small EGA fixes.
---
src/video/vid_ega.c | 17 +++++++++++++++--
1 file changed, 15 insertions(+), 2 deletions(-)
diff --git a/src/video/vid_ega.c b/src/video/vid_ega.c
index 1e66743ec..43f157f29 100644
--- a/src/video/vid_ega.c
+++ b/src/video/vid_ega.c
@@ -69,6 +69,9 @@ int egaswitchread, egaswitches=9;
int update_overscan = 0;
+uint8_t ega_in(uint16_t addr, void *p);
+
+
void
ega_out(uint16_t addr, uint8_t val, void *p)
{
@@ -145,6 +148,9 @@ ega_out(uint16_t addr, uint8_t val, void *p)
ega->vidclock = val & 4;
ega->miscout = val;
ega->overscan_color = ega->vres ? pallook16[ega->attrregs[0x11] & 0x0f] : pallook64[ega->attrregs[0x11] & 0x3f];
+ io_removehandler(0x03a0, 0x0020, ega_in, NULL, NULL, ega_out, NULL, NULL, ega);
+ if (!(val & 1))
+ io_sethandler(0x03a0, 0x0020, ega_in, NULL, NULL, ega_out, NULL, NULL, ega);
if ((o ^ val) & 0x80)
ega_recalctimings(ega);
break;
@@ -237,10 +243,13 @@ ega_out(uint16_t addr, uint8_t val, void *p)
}
}
-uint8_t ega_in(uint16_t addr, void *p)
+
+uint8_t
+ega_in(uint16_t addr, void *p)
{
ega_t *ega = (ega_t *)p;
uint8_t ret = 0xff;
+ uint16_t port = addr;
if (((addr & 0xfff0) == 0x3d0 || (addr & 0xfff0) == 0x3b0) && !(ega->miscout & 1))
addr ^= 0x60;
@@ -979,6 +988,8 @@ ega_init(ega_t *ega, int monitor_type, int is_mono)
break;
}
}
+
+ io_sethandler(0x03a0, 0x0020, ega_in, NULL, NULL, ega_out, NULL, NULL, ega);
} else {
for (c = 0; c < 256; c++) {
pallook64[c] = makecol32(((c >> 2) & 1) * 0xaa, ((c >> 1) & 1) * 0xaa, (c & 1) * 0xaa);
@@ -988,6 +999,8 @@ ega_init(ega_t *ega, int monitor_type, int is_mono)
if ((c & 0x17) == 6)
pallook16[c] = makecol32(0xaa, 0x55, 0);
}
+
+ ega->miscout |= 1;
}
ega->pallook = pallook16;
@@ -1078,7 +1091,7 @@ ega_standalone_init(const device_t *info)
ega->vrammask = ega->vram_limit - 1;
mem_mapping_add(&ega->mapping, 0xa0000, 0x20000, ega_read, NULL, NULL, ega_write, NULL, NULL, NULL, MEM_MAPPING_EXTERNAL, ega);
- io_sethandler(0x03a0, 0x0040, ega_in, NULL, NULL, ega_out, NULL, NULL, ega);
+ io_sethandler(0x03c0, 0x0020, ega_in, NULL, NULL, ega_out, NULL, NULL, ega);
if (info->local == EGA_ATI) {
io_sethandler(0x01ce, 0x0002, ega_in, NULL, NULL, ega_out, NULL, NULL, ega);
From 6fd2cfaf90765819345ba1e0274f8d4236afee81 Mon Sep 17 00:00:00 2001
From: OBattler
Date: Thu, 9 Dec 2021 23:59:45 +0100
Subject: [PATCH 06/27] Fixed a PIT bug.
---
src/pit.c | 2 ++
1 file changed, 2 insertions(+)
diff --git a/src/pit.c b/src/pit.c
index 582c748a7..fe256f53d 100644
--- a/src/pit.c
+++ b/src/pit.c
@@ -154,6 +154,8 @@ ctr_tick(ctr_t *ctr)
/* This is true for all modes */
ctr_load_count(ctr);
ctr->state = 2;
+ if ((ctr->m & 0x07) == 0x01)
+ ctr_set_out(ctr, 0);
return;
}
From 4617d11ffac6f44a5b8e1a4a7c0a82fb0fc3152f Mon Sep 17 00:00:00 2001
From: mlow <77110434+notmlow@users.noreply.github.com>
Date: Sat, 11 Dec 2021 11:53:06 -0500
Subject: [PATCH 07/27] Made the translation more accurate
The words Sauver has been replaced by the word Sauvegarder for a more accurate french translation.
---
src/win/languages/fr-FR.rc | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/src/win/languages/fr-FR.rc b/src/win/languages/fr-FR.rc
index 997eefec4..6b58bd593 100644
--- a/src/win/languages/fr-FR.rc
+++ b/src/win/languages/fr-FR.rc
@@ -274,7 +274,7 @@ END
#define STR_OK "OK"
#define STR_CANCEL "Annuler"
-#define STR_GLOBAL "Sauver ces paramètres comme valeurs par défaut &globales"
+#define STR_GLOBAL "Sauvegarder ces paramètres comme valeurs par défaut &globales"
#define STR_DEFAULT "&Défaut"
#define STR_LANGUAGE "Langue:"
#define STR_ICONSET "Ensemble d'icônes:"
@@ -478,9 +478,9 @@ BEGIN
IDS_2118 "Côntrolleur interne"
IDS_2119 "Sortir"
IDS_2120 "Pas de ROMs trouvées"
- IDS_2121 "Voulez-vous sauver les paramètres ?"
+ IDS_2121 "Voulez-vous sauvegarder les paramètres ?"
IDS_2122 "Cela entraînera la réinitialisation complète de la machine émulée."
- IDS_2123 "Sauver"
+ IDS_2123 "Sauvegarder"
IDS_2124 "À propos de 86Box"
IDS_2125 "86Box v" EMU_VERSION
From 6661ff5dcc33bc0cdb199d0b167087e6575e5cee Mon Sep 17 00:00:00 2001
From: OBattler
Date: Mon, 13 Dec 2021 01:23:06 +0100
Subject: [PATCH 08/27] Abstracted away the machine bus'es and flags in order
to make the rest of the emulator agnostic as to how they're stored.
---
src/config.c | 12 +++++------
src/device.c | 22 +++++++++----------
src/device/cartridge.c | 2 +-
src/device/keyboard_at.c | 8 +++----
src/device/postcard.c | 6 +++---
src/game/gameport.c | 2 +-
src/include/86box/device.h | 2 +-
src/include/86box/machine.h | 4 ++++
src/machine/machine_table.c | 21 +++++++++++++++++++
src/mem/spd.c | 2 +-
src/scsi/scsi.c | 2 +-
src/sound/snd_mpu401.c | 2 +-
src/video/vid_table.c | 6 +++---
src/win/win_media_menu.c | 6 +++---
src/win/win_settings.c | 42 ++++++++++++++++++-------------------
15 files changed, 82 insertions(+), 57 deletions(-)
diff --git a/src/config.c b/src/config.c
index 6c494a312..d41da7a4e 100644
--- a/src/config.c
+++ b/src/config.c
@@ -831,9 +831,9 @@ load_machine(void)
mem_size = config_get_int(cat, "mem_size", 64);
#if 0
- if (mem_size < (((machines[machine].flags & MACHINE_AT) &&
+ if (mem_size < ((machine_has_bus(machine, MACHINE_AT) &&
(machines[machine].ram_granularity < 128)) ? machines[machine].min_ram*1024 : machines[machine].min_ram))
- mem_size = (((machines[machine].flags & MACHINE_AT) && (machines[machine].ram_granularity < 128)) ? machines[machine].min_ram*1024 : machines[machine].min_ram);
+ mem_size = (((machine_has_bus(machine, MACHINE_AT) && (machines[machine].ram_granularity < 128)) ? machines[machine].min_ram*1024 : machines[machine].min_ram);
#endif
if (mem_size > 2097152)
@@ -874,13 +874,13 @@ load_video(void)
char *p;
int free_p = 0;
- if (machines[machine].flags & MACHINE_VIDEO_ONLY) {
+ if (machine_has_flags(machine, MACHINE_VIDEO_ONLY)) {
config_delete_var(cat, "gfxcard");
gfxcard = VID_INTERNAL;
} else {
p = config_get_string(cat, "gfxcard", NULL);
if (p == NULL) {
- if (machines[machine].flags & MACHINE_VIDEO) {
+ if (machine_has_flags(machine, MACHINE_VIDEO)) {
p = (char *)malloc((strlen("internal")+1)*sizeof(char));
strcpy(p, "internal");
} else {
@@ -1120,7 +1120,7 @@ load_storage_controllers(void)
p = config_get_string(cat, "hdc", NULL);
if (p == NULL) {
- if (machines[machine].flags & MACHINE_HDC) {
+ if (machine_has_flags(machine, MACHINE_HDC)) {
p = (char *)malloc((strlen("internal")+1)*sizeof(char));
strcpy(p, "internal");
} else {
@@ -1948,7 +1948,7 @@ load_other_peripherals(void)
p = config_get_string(cat, "hdc", NULL);
if (p == NULL) {
- if (machines[machine].flags & MACHINE_HDC) {
+ if (machine_has_flags(machine, MACHINE_HDC)) {
p = (char *)malloc((strlen("internal")+1)*sizeof(char));
strcpy(p, "internal");
} else {
diff --git a/src/device.c b/src/device.c
index 265fdf215..7b9d4c167 100644
--- a/src/device.c
+++ b/src/device.c
@@ -646,29 +646,29 @@ device_set_config_mac(const char *s, int val)
int
-device_is_valid(const device_t *device, int mflags)
+device_is_valid(const device_t *device, int m)
{
if (device == NULL) return(1);
- if ((device->flags & DEVICE_AT) && !(mflags & MACHINE_BUS_ISA16)) return(0);
+ if ((device->flags & DEVICE_AT) && !machine_has_bus(m, MACHINE_BUS_ISA16)) return(0);
- if ((device->flags & DEVICE_CBUS) && !(mflags & MACHINE_BUS_CBUS)) return(0);
+ if ((device->flags & DEVICE_CBUS) && !machine_has_bus(m, MACHINE_BUS_CBUS)) return(0);
- if ((device->flags & DEVICE_ISA) && !(mflags & MACHINE_BUS_ISA)) return(0);
+ if ((device->flags & DEVICE_ISA) && !machine_has_bus(m, MACHINE_BUS_ISA)) return(0);
- if ((device->flags & DEVICE_MCA) && !(mflags & MACHINE_BUS_MCA)) return(0);
+ if ((device->flags & DEVICE_MCA) && !machine_has_bus(m, MACHINE_BUS_MCA)) return(0);
- if ((device->flags & DEVICE_EISA) && !(mflags & MACHINE_BUS_EISA)) return(0);
+ if ((device->flags & DEVICE_EISA) && !machine_has_bus(m, MACHINE_BUS_EISA)) return(0);
- if ((device->flags & DEVICE_VLB) && !(mflags & MACHINE_BUS_VLB)) return(0);
+ if ((device->flags & DEVICE_VLB) && !machine_has_bus(m, MACHINE_BUS_VLB)) return(0);
- if ((device->flags & DEVICE_PCI) && !(mflags & MACHINE_BUS_PCI)) return(0);
+ if ((device->flags & DEVICE_PCI) && !machine_has_bus(m, MACHINE_BUS_PCI)) return(0);
- if ((device->flags & DEVICE_AGP) && !(mflags & MACHINE_BUS_AGP)) return(0);
+ if ((device->flags & DEVICE_AGP) && !machine_has_bus(m, MACHINE_BUS_AGP)) return(0);
- if ((device->flags & DEVICE_PS2) && !(mflags & MACHINE_BUS_PS2)) return(0);
+ if ((device->flags & DEVICE_PS2) && !machine_has_bus(m, MACHINE_BUS_PS2)) return(0);
- if ((device->flags & DEVICE_AC97) && !(mflags & MACHINE_BUS_AC97)) return(0);
+ if ((device->flags & DEVICE_AC97) && !machine_has_bus(m, MACHINE_BUS_AC97)) return(0);
return(1);
}
diff --git a/src/device/cartridge.c b/src/device/cartridge.c
index 25e8beac7..9743c2e87 100644
--- a/src/device/cartridge.c
+++ b/src/device/cartridge.c
@@ -194,7 +194,7 @@ cart_reset(void)
cart_image_close(1);
cart_image_close(0);
- if (!(machines[machine].flags & MACHINE_CARTRIDGE))
+ if (!machine_has_cartridge(machine))
return;
for (i = 0; i < 2; i++) {
diff --git a/src/device/keyboard_at.c b/src/device/keyboard_at.c
index 75d0bf73c..8ddf0b974 100644
--- a/src/device/keyboard_at.c
+++ b/src/device/keyboard_at.c
@@ -1063,7 +1063,7 @@ write_output(atkbd_t *dev, uint8_t val)
val |= ((dev->mem[0] << 4) & 0x10);
/*IRQ 12*/
- if ((dev->output_port ^ val) & 0x20) {
+ if ((old ^ val) & 0x20) {
if (val & 0x20)
picint(1 << 12);
else
@@ -1071,14 +1071,14 @@ write_output(atkbd_t *dev, uint8_t val)
}
/*IRQ 1*/
- if ((dev->output_port ^ val) & 0x10) {
+ if ((old ^ val) & 0x10) {
if (val & 0x10)
picint(1 << 1);
else
picintc(1 << 1);
}
- if ((dev->output_port ^ val) & 0x02) { /*A20 enable change*/
+ if ((old ^ val) & 0x02) { /*A20 enable change*/
mem_a20_key = val & 0x02;
mem_a20_recalc();
flushmmucache();
@@ -1086,7 +1086,7 @@ write_output(atkbd_t *dev, uint8_t val)
/* 0 holds the CPU in the RESET state, 1 releases it. To simplify this,
we just do everything on release. */
- if ((dev->output_port ^ val) & 0x01) { /*Reset*/
+ if ((old ^ val) & 0x01) { /*Reset*/
if (! (val & 0x01)) { /* Pin 0 selected. */
/* Pin 0 selected. */
kbd_log("write_output(): Pulse reset!\n");
diff --git a/src/device/postcard.c b/src/device/postcard.c
index b9f409589..b769cbbd4 100644
--- a/src/device/postcard.c
+++ b/src/device/postcard.c
@@ -111,15 +111,15 @@ postcard_init(const device_t *info)
{
postcard_reset();
- if (machines[machine].flags & MACHINE_MCA)
+ if (machine_has_bus(machine, MACHINE_BUS_MCA))
postcard_port = 0x680; /* MCA machines */
- else if (strstr(machines[machine].name, " PS/2 ") || strstr(machines[machine].name, " PS/1 "))
+ else if (strstr(machines[machine].name, " PS/2 ") || strstr(machine_getname_ex(machine), " PS/1 "))
postcard_port = 0x190; /* ISA PS/2 machines */
else if (strstr(machines[machine].name, " IBM XT "))
postcard_port = 0x60; /* IBM XT */
else if (strstr(machines[machine].name, " IBM PCjr"))
postcard_port = 0x10; /* IBM PCjr */
- else if (strstr(machines[machine].name, " Compaq ") && !(machines[machine].flags & MACHINE_PCI))
+ else if (strstr(machines[machine].name, " Compaq ") && !machine_has_bus(machine, MACHINE_BUS_PCI))
postcard_port = 0x84; /* ISA Compaq machines */
else
postcard_port = 0x80; /* AT and clone machines */
diff --git a/src/game/gameport.c b/src/game/gameport.c
index 80c686ec2..a8a2e685b 100644
--- a/src/game/gameport.c
+++ b/src/game/gameport.c
@@ -360,7 +360,7 @@ gameport_add(const device_t *gameport_type)
{
/* Prevent a standalone game port from being added later on, unless this
is an unused Super I/O game port (no MACHINE_GAMEPORT machine flag). */
- if (!(gameport_type->local & GAMEPORT_SIO) || (machines[machine].flags & MACHINE_GAMEPORT))
+ if (!(gameport_type->local & GAMEPORT_SIO) || machine_has_flags(machine, MACHINE_GAMEPORT))
standalone_gameport_type = NULL;
/* Add game port device. */
diff --git a/src/include/86box/device.h b/src/include/86box/device.h
index ec567bf57..040dc3830 100644
--- a/src/include/86box/device.h
+++ b/src/include/86box/device.h
@@ -145,7 +145,7 @@ extern void device_speed_changed(void);
extern void device_force_redraw(void);
extern void device_get_name(const device_t *d, int bus, char *name);
-extern int device_is_valid(const device_t *, int machine_flags);
+extern int device_is_valid(const device_t *, int m);
extern int device_get_config_int(const char *name);
extern int device_get_config_int_ex(const char *s, int dflt_int);
diff --git a/src/include/86box/machine.h b/src/include/86box/machine.h
index 161db2ec3..7e610be91 100644
--- a/src/include/86box/machine.h
+++ b/src/include/86box/machine.h
@@ -189,6 +189,7 @@ extern int AT, PCI;
extern int machine_count(void);
extern int machine_available(int m);
extern char *machine_getname(void);
+extern char *machine_getname_ex(int m);
extern char *machine_get_internal_name(void);
extern int machine_get_machine_from_internal_name(char *s);
extern void machine_init(void);
@@ -197,6 +198,9 @@ extern const device_t *machine_getdevice(int m);
#endif
extern char *machine_get_internal_name_ex(int m);
extern int machine_get_nvrmask(int m);
+extern int machine_has_flags(int m, int flags);
+extern int machine_has_bus(int m, int bus_flags);
+extern int machine_has_cartridge(int m);
extern void machine_close(void);
diff --git a/src/machine/machine_table.c b/src/machine/machine_table.c
index 9e73c7079..eab1ec0b3 100644
--- a/src/machine/machine_table.c
+++ b/src/machine/machine_table.c
@@ -979,6 +979,27 @@ machine_get_nvrmask(int m)
}
+int
+machine_has_flags(int m, int flags)
+{
+ return(machines[m].flags & flags);
+}
+
+
+int
+machine_has_bus(int m, int bus_flags)
+{
+ return(machines[m].flags & bus_flags);
+}
+
+
+int
+machine_has_cartridge(int m)
+{
+ return(machine_has_flags(m, MACHINE_CARTRIDGE) ? 1 : 0);
+}
+
+
int
machine_get_machine_from_internal_name(char *s)
{
diff --git a/src/mem/spd.c b/src/mem/spd.c
index 9e5ec9706..547b0c722 100644
--- a/src/mem/spd.c
+++ b/src/mem/spd.c
@@ -406,7 +406,7 @@ spd_write_drbs_interleaved(uint8_t *regs, uint8_t reg_min, uint8_t reg_max, uint
{
uint8_t row, dimm;
uint8_t drb;
- uint16_t size, size_acc;
+ uint16_t size, size_acc = 0;
uint16_t rows[SPD_MAX_SLOTS];
/* No SPD: split SIMMs into pairs as if they were "DIMM"s. */
diff --git a/src/scsi/scsi.c b/src/scsi/scsi.c
index 0839d63e9..3e6b66c8c 100644
--- a/src/scsi/scsi.c
+++ b/src/scsi/scsi.c
@@ -167,7 +167,7 @@ scsi_card_init(void)
/* On-board SCSI controllers get the first bus, so if one is present,
increase our instance number here. */
- if (machines[machine].flags & MACHINE_SCSI)
+ if (machine_has_flags(machine, MACHINE_SCSI))
max--;
/* Do not initialize any controllers if we have do not have any SCSI
diff --git a/src/sound/snd_mpu401.c b/src/sound/snd_mpu401.c
index 95cdb1a52..d79776fb8 100644
--- a/src/sound/snd_mpu401.c
+++ b/src/sound/snd_mpu401.c
@@ -1703,7 +1703,7 @@ mpu401_device_add(void)
if (!mpu401_standalone_enable)
return;
- if (machines[machine].flags & MACHINE_MCA)
+ if (machine_has_bus(machine, MACHINE_BUS_MCA))
device_add(&mpu401_mca_device);
else
device_add(&mpu401_device);
diff --git a/src/video/vid_table.c b/src/video/vid_table.c
index cd9f0a785..d89365255 100644
--- a/src/video/vid_table.c
+++ b/src/video/vid_table.c
@@ -274,7 +274,7 @@ void
video_pre_reset(int card)
{
if ((card == VID_NONE) || \
- (card == VID_INTERNAL) || (machines[machine].flags & MACHINE_VIDEO_ONLY))
+ (card == VID_INTERNAL) || machine_has_flags(machine, MACHINE_VIDEO_ONLY))
video_prepare();
}
@@ -287,13 +287,13 @@ video_reset(int card)
return;
vid_table_log("VIDEO: reset (gfxcard=%d, internal=%d)\n",
- card, (machines[machine].flags & MACHINE_VIDEO)?1:0);
+ card, machine_has_flags(machine, MACHINE_VIDEO) ? 1 : 0);
loadfont("roms/video/mda/mda.rom", 0);
/* Do not initialize internal cards here. */
if (!(card == VID_NONE) && \
- !(card == VID_INTERNAL) && !(machines[machine].flags & MACHINE_VIDEO_ONLY)) {
+ !(card == VID_INTERNAL) && !machine_has_flags(machine, MACHINE_VIDEO_ONLY)) {
vid_table_log("VIDEO: initializing '%s'\n", video_cards[card].name);
video_prepare();
diff --git a/src/win/win_media_menu.c b/src/win/win_media_menu.c
index cb50a418f..cd2a5f33c 100644
--- a/src/win/win_media_menu.c
+++ b/src/win/win_media_menu.c
@@ -24,8 +24,8 @@
#include <86box/zip.h>
#include <86box/win.h>
-#define MACHINE_HAS_IDE (machines[machine].flags & MACHINE_IDE_QUAD)
-#define MACHINE_HAS_SCSI (machines[machine].flags & MACHINE_SCSI_DUAL)
+#define MACHINE_HAS_IDE (machine_has_flags(machine, MACHINE_IDE_QUAD))
+#define MACHINE_HAS_SCSI (machine_has_flags(machine, MACHINE_SCSI_DUAL))
#define CASSETTE_FIRST 0
#define CARTRIDGE_FIRST CASSETTE_FIRST + 1
@@ -403,7 +403,7 @@ media_menu_load_submenus()
static inline int
is_valid_cartridge(void)
{
- return ((machines[machine].flags & MACHINE_CARTRIDGE) ? 1 : 0);
+ return (machine_has_cartridge(machine));
}
diff --git a/src/win/win_settings.c b/src/win/win_settings.c
index 4d253d8f7..a4a21e86c 100644
--- a/src/win/win_settings.c
+++ b/src/win/win_settings.c
@@ -1080,7 +1080,7 @@ win_settings_video_proc(HWND hdlg, UINT message, WPARAM wParam, LPARAM lParam)
while (1) {
/* Skip "internal" if machine doesn't have it. */
- if ((c == 1) && !(machines[temp_machine].flags & MACHINE_VIDEO)) {
+ if ((c == 1) && !machine_has_flags(temp_machine, MACHINE_VIDEO)) {
c++;
continue;
}
@@ -1091,7 +1091,7 @@ win_settings_video_proc(HWND hdlg, UINT message, WPARAM wParam, LPARAM lParam)
break;
if (video_card_available(c) &&
- device_is_valid(video_card_getdevice(c), machines[temp_machine].flags)) {
+ device_is_valid(video_card_getdevice(c), temp_machine)) {
if (c == 0)
settings_add_string(hdlg, IDC_COMBO_VIDEO, win_get_string(IDS_2103));
else if (c == 1)
@@ -1109,12 +1109,12 @@ win_settings_video_proc(HWND hdlg, UINT message, WPARAM wParam, LPARAM lParam)
settings_process_messages();
}
- settings_enable_window(hdlg, IDC_COMBO_VIDEO, !(machines[temp_machine].flags & MACHINE_VIDEO_ONLY));
+ settings_enable_window(hdlg, IDC_COMBO_VIDEO, !machine_has_flags(temp_machine, MACHINE_VIDEO_ONLY));
e = settings_list_to_device[0][settings_get_cur_sel(hdlg, IDC_COMBO_VIDEO)];
settings_enable_window(hdlg, IDC_CONFIGURE_VID, video_card_has_config(e));
- settings_enable_window(hdlg, IDC_CHECK_VOODOO, (machines[temp_machine].flags & MACHINE_BUS_PCI));
+ settings_enable_window(hdlg, IDC_CHECK_VOODOO, machine_has_bus(temp_machine, MACHINE_BUS_PCI));
settings_set_check(hdlg, IDC_CHECK_VOODOO, temp_voodoo);
- settings_enable_window(hdlg, IDC_BUTTON_VOODOO, (machines[temp_machine].flags & MACHINE_BUS_PCI) && temp_voodoo);
+ settings_enable_window(hdlg, IDC_BUTTON_VOODOO, machine_has_bus(temp_machine, MACHINE_BUS_PCI) && temp_voodoo);
return TRUE;
case WM_COMMAND:
@@ -1157,10 +1157,10 @@ mouse_valid(int num, int m)
const device_t *dev;
if ((num == MOUSE_TYPE_INTERNAL) &&
- !(machines[m].flags & MACHINE_MOUSE)) return(0);
+ !machine_has_flags(m, MACHINE_MOUSE)) return(0);
dev = mouse_get_device(num);
- return(device_is_valid(dev, machines[m].flags));
+ return(device_is_valid(dev, m));
}
@@ -1294,7 +1294,7 @@ win_settings_sound_proc(HWND hdlg, UINT message, WPARAM wParam, LPARAM lParam)
settings_reset_content(hdlg, IDC_COMBO_SOUND);
while (1) {
/* Skip "internal" if machine doesn't have it. */
- if ((c == 1) && !(machines[temp_machine].flags & MACHINE_SOUND)) {
+ if ((c == 1) && !machine_has_flags(temp_machine, MACHINE_SOUND)) {
c++;
continue;
}
@@ -1307,7 +1307,7 @@ win_settings_sound_proc(HWND hdlg, UINT message, WPARAM wParam, LPARAM lParam)
if (sound_card_available(c)) {
sound_dev = sound_card_getdevice(c);
- if (device_is_valid(sound_dev, machines[temp_machine].flags)) {
+ if (device_is_valid(sound_dev, temp_machine)) {
if (c == 0)
settings_add_string(hdlg, IDC_COMBO_SOUND, win_get_string(IDS_2103));
else if (c == 1)
@@ -1377,15 +1377,15 @@ win_settings_sound_proc(HWND hdlg, UINT message, WPARAM wParam, LPARAM lParam)
settings_set_check(hdlg, IDC_CHECK_MPU401, temp_mpu401);
settings_enable_window(hdlg, IDC_CHECK_MPU401, mpu401_standalone_allow());
settings_enable_window(hdlg, IDC_CONFIGURE_MPU401, mpu401_standalone_allow() && temp_mpu401);
- settings_enable_window(hdlg, IDC_CHECK_CMS, (machines[temp_machine].flags & MACHINE_BUS_ISA));
+ settings_enable_window(hdlg, IDC_CHECK_CMS, machine_has_bus(temp_machine, MACHINE_BUS_ISA));
settings_set_check(hdlg, IDC_CHECK_CMS, temp_GAMEBLASTER);
- settings_enable_window(hdlg, IDC_CONFIGURE_CMS, (machines[temp_machine].flags & MACHINE_BUS_ISA) && temp_GAMEBLASTER);
- settings_enable_window(hdlg, IDC_CHECK_GUS, (machines[temp_machine].flags & MACHINE_BUS_ISA16));
+ settings_enable_window(hdlg, IDC_CONFIGURE_CMS, machine_has_bus(temp_machine, MACHINE_BUS_ISA) && temp_GAMEBLASTER);
+ settings_enable_window(hdlg, IDC_CHECK_GUS, machine_has_bus(temp_machine, MACHINE_BUS_ISA16));
settings_set_check(hdlg, IDC_CHECK_GUS, temp_GUS);
- settings_enable_window(hdlg, IDC_CONFIGURE_GUS, (machines[temp_machine].flags & MACHINE_BUS_ISA16) && temp_GUS);
- settings_enable_window(hdlg, IDC_CHECK_SSI, (machines[temp_machine].flags & MACHINE_BUS_ISA));
+ settings_enable_window(hdlg, IDC_CONFIGURE_GUS, machine_has_bus(temp_machine, MACHINE_BUS_ISA16) && temp_GUS);
+ settings_enable_window(hdlg, IDC_CHECK_SSI, machine_has_bus(temp_machine, MACHINE_BUS_ISA));
settings_set_check(hdlg, IDC_CHECK_SSI, temp_SSI2001);
- settings_enable_window(hdlg, IDC_CONFIGURE_SSI, (machines[temp_machine].flags & MACHINE_BUS_ISA) && temp_SSI2001);
+ settings_enable_window(hdlg, IDC_CONFIGURE_SSI, machine_has_bus(temp_machine, MACHINE_BUS_ISA) && temp_SSI2001);
settings_set_check(hdlg, IDC_CHECK_FLOAT, temp_float);
free(lptsTemp);
@@ -1440,7 +1440,7 @@ win_settings_sound_proc(HWND hdlg, UINT message, WPARAM wParam, LPARAM lParam)
break;
case IDC_CONFIGURE_MPU401:
- temp_deviceconfig |= deviceconfig_open(hdlg, (machines[temp_machine].flags & MACHINE_MCA) ?
+ temp_deviceconfig |= deviceconfig_open(hdlg, machine_has_bus(temp_machine, MACHINE_BUS_MCA) ?
(void *)&mpu401_mca_device : (void *)&mpu401_device);
break;
@@ -1589,7 +1589,7 @@ win_settings_storage_proc(HWND hdlg, UINT message, WPARAM wParam, LPARAM lParam)
settings_reset_content(hdlg, IDC_COMBO_HDC);
while (1) {
/* Skip "internal" if machine doesn't have it. */
- if ((c == 1) && !(machines[temp_machine].flags & MACHINE_HDC)) {
+ if ((c == 1) && !machine_has_flags(temp_machine, MACHINE_HDC)) {
c++;
continue;
}
@@ -1602,7 +1602,7 @@ win_settings_storage_proc(HWND hdlg, UINT message, WPARAM wParam, LPARAM lParam)
if (hdc_available(c)) {
hdc_dev = hdc_get_device(c);
- if (device_is_valid(hdc_dev, machines[temp_machine].flags)) {
+ if (device_is_valid(hdc_dev, temp_machine)) {
if (c == 0)
settings_add_string(hdlg, IDC_COMBO_HDC, win_get_string(IDS_2103));
else if (c == 1)
@@ -1634,7 +1634,7 @@ win_settings_storage_proc(HWND hdlg, UINT message, WPARAM wParam, LPARAM lParam)
if (fdc_card_available(c)) {
fdc_dev = fdc_card_getdevice(c);
- if (device_is_valid(fdc_dev, machines[temp_machine].flags)) {
+ if (device_is_valid(fdc_dev, temp_machine)) {
if (c == 0)
settings_add_string(hdlg, IDC_COMBO_FDC, win_get_string(IDS_2118));
else
@@ -1665,7 +1665,7 @@ win_settings_storage_proc(HWND hdlg, UINT message, WPARAM wParam, LPARAM lParam)
if (scsi_card_available(c)) {
scsi_dev = scsi_card_getdevice(c);
- if (device_is_valid(scsi_dev, machines[temp_machine].flags)) {
+ if (device_is_valid(scsi_dev, temp_machine)) {
for (e = 0; e < SCSI_BUS_MAX; e++) {
if (c == 0)
settings_add_string(hdlg, IDC_COMBO_SCSI_1 + e, win_get_string(IDS_2103));
@@ -1823,7 +1823,7 @@ win_settings_network_proc(HWND hdlg, UINT message, WPARAM wParam, LPARAM lParam)
if (device_name[0] == L'\0')
break;
- if (network_card_available(c) && device_is_valid(network_card_getdevice(c), machines[temp_machine].flags)) {
+ if (network_card_available(c) && device_is_valid(network_card_getdevice(c), temp_machine)) {
if (c == 0)
settings_add_string(hdlg, IDC_COMBO_NET, win_get_string(IDS_2103));
else
From b9c564c5c01f10ee88342487286e64b3f427caa8 Mon Sep 17 00:00:00 2001
From: OBattler
Date: Mon, 13 Dec 2021 01:34:01 +0100
Subject: [PATCH 09/27] And win/win_stbar.c.
---
src/win/win_stbar.c | 12 ++++++------
1 file changed, 6 insertions(+), 6 deletions(-)
diff --git a/src/win/win_stbar.c b/src/win/win_stbar.c
index 4eb4b98a1..f8107adb2 100644
--- a/src/win/win_stbar.c
+++ b/src/win/win_stbar.c
@@ -522,12 +522,12 @@ ui_sb_update_panes(void)
sb_ready = 0;
}
- cart_int = (machines[machine].flags & MACHINE_CARTRIDGE) ? 1 : 0;
- mfm_int = (machines[machine].flags & MACHINE_MFM) ? 1 : 0;
- xta_int = (machines[machine].flags & MACHINE_XTA) ? 1 : 0;
- esdi_int = (machines[machine].flags & MACHINE_ESDI) ? 1 : 0;
- ide_int = (machines[machine].flags & MACHINE_IDE_QUAD) ? 1 : 0;
- scsi_int = (machines[machine].flags & MACHINE_SCSI_DUAL) ? 1 : 0;
+ cart_int = machine_has_cartridge(machine) ? 1 : 0;
+ mfm_int = machine_has_flags(machine, MACHINE_MFM) ? 1 : 0;
+ xta_int = machine_has_flags(machine, MACHINE_XTA) ? 1 : 0;
+ esdi_int = machine_has_flags(machine, MACHINE_ESDI) ? 1 : 0;
+ ide_int = machine_has_flags(machine, MACHINE_IDE_QUAD) ? 1 : 0;
+ scsi_int = machine_has_flags(machine, MACHINE_SCSI_DUAL) ? 1 : 0;
c_mfm = hdd_count(HDD_BUS_MFM);
c_esdi = hdd_count(HDD_BUS_ESDI);
From 8d7f42d4aa08fdd38555a9055610fa834f9fd3fe Mon Sep 17 00:00:00 2001
From: OBattler
Date: Mon, 13 Dec 2021 14:17:49 +0100
Subject: [PATCH 10/27] More machine abstractions.
---
src/include/86box/machine.h | 4 ++++
src/machine/machine_table.c | 28 +++++++++++++++++++++++++
src/win/win_settings.c | 42 ++++++++++++++++++-------------------
3 files changed, 53 insertions(+), 21 deletions(-)
diff --git a/src/include/86box/machine.h b/src/include/86box/machine.h
index 7e610be91..25ea756c7 100644
--- a/src/include/86box/machine.h
+++ b/src/include/86box/machine.h
@@ -201,6 +201,10 @@ extern int machine_get_nvrmask(int m);
extern int machine_has_flags(int m, int flags);
extern int machine_has_bus(int m, int bus_flags);
extern int machine_has_cartridge(int m);
+extern int machine_get_min_ram(int m);
+extern int machine_get_max_ram(int m);
+extern int machine_get_ram_granularity(int m);
+extern int machine_get_type(int m);
extern void machine_close(void);
diff --git a/src/machine/machine_table.c b/src/machine/machine_table.c
index eab1ec0b3..791394392 100644
--- a/src/machine/machine_table.c
+++ b/src/machine/machine_table.c
@@ -1000,6 +1000,34 @@ machine_has_cartridge(int m)
}
+int
+machine_get_min_ram(int m)
+{
+ return(machines[m].min_ram);
+}
+
+
+int
+machine_get_max_ram(int m)
+{
+ return(machines[m].max_ram);
+}
+
+
+int
+machine_get_ram_granularity(int m)
+{
+ return(machines[m].ram_granularity);
+}
+
+
+int
+machine_get_type(int m)
+{
+ return(machines[m].type);
+}
+
+
int
machine_get_machine_from_internal_name(char *s)
{
diff --git a/src/win/win_settings.c b/src/win/win_settings.c
index a4a21e86c..1221e0a34 100644
--- a/src/win/win_settings.c
+++ b/src/win/win_settings.c
@@ -318,7 +318,7 @@ win_settings_init(void)
int i = 0;
/* Machine category */
- temp_machine_type = machines[machine].type;
+ temp_machine_type = machine_get_type(machine);
temp_machine = machine;
temp_cpu_f = cpu_f;
temp_wait_states = cpu_waitstates;
@@ -786,13 +786,13 @@ win_settings_machine_recalc_machine(HWND hdlg)
win_settings_machine_recalc_cpu_m(hdlg);
- if ((machines[temp_machine].ram_granularity & 1023)) {
+ if (machine_get_ram_granularity(temp_machine) & 1023) {
/* KB granularity */
h = GetDlgItem(hdlg, IDC_MEMSPIN);
- SendMessage(h, UDM_SETRANGE, 0, (machines[temp_machine].min_ram << 16) | machines[temp_machine].max_ram);
+ SendMessage(h, UDM_SETRANGE, 0, (machine_get_min_ram(temp_machine) << 16) | machine_get_max_ram(temp_machine));
accel.nSec = 0;
- accel.nInc = machines[temp_machine].ram_granularity;
+ accel.nInc = machine_get_ram_granularity(temp_machine);
SendMessage(h, UDM_SETACCEL, 1, (LPARAM)&accel);
SendMessage(h, UDM_SETPOS, 0, temp_mem_size);
@@ -803,14 +803,14 @@ win_settings_machine_recalc_machine(HWND hdlg)
/* MB granularity */
h = GetDlgItem(hdlg, IDC_MEMSPIN);
#if (!(defined __amd64__ || defined _M_X64 || defined __aarch64__ || defined _M_ARM64))
- i = MIN(machines[temp_machine].max_ram, 2097152);
+ i = MIN(machine_get_max_ram(temp_machine), 2097152);
#else
- i = MIN(machines[temp_machine].max_ram, 3145728);
+ i = MIN(machine_get_max_ram(temp_machine), 3145728);
#endif
- SendMessage(h, UDM_SETRANGE, 0, (machines[temp_machine].min_ram << 6) | (i >> 10));
+ SendMessage(h, UDM_SETRANGE, 0, (machine_get_min_ram(temp_machine) << 6) | (i >> 10));
accel.nSec = 0;
- accel.nInc = machines[temp_machine].ram_granularity >> 10;
+ accel.nInc = machine_get_ram_granularity(temp_machine) >> 10;
SendMessage(h, UDM_SETACCEL, 1, (LPARAM)&accel);
@@ -820,8 +820,8 @@ win_settings_machine_recalc_machine(HWND hdlg)
SendMessage(h, WM_SETTEXT, 0, win_get_string(IDS_2086));
}
- settings_enable_window(hdlg, IDC_MEMSPIN, machines[temp_machine].min_ram != machines[temp_machine].max_ram);
- settings_enable_window(hdlg, IDC_MEMTEXT, machines[temp_machine].min_ram != machines[temp_machine].max_ram);
+ settings_enable_window(hdlg, IDC_MEMSPIN, machine_get_min_ram(temp_machine) != machine_get_max_ram(temp_machine));
+ settings_enable_window(hdlg, IDC_MEMTEXT, machine_get_min_ram(temp_machine) != machine_get_max_ram(temp_machine));
free(lptsTemp);
}
@@ -844,7 +844,7 @@ machine_type_available(int id)
if ((id > 0) && (id < MACHINE_TYPE_MAX)) {
while (machine_get_internal_name_ex(c) != NULL) {
- if (machine_available(c) && (machines[c].type == id))
+ if (machine_available(c) && (machine_get_type(c) == id))
return 1;
c++;
}
@@ -891,8 +891,8 @@ win_settings_machine_proc(HWND hdlg, UINT message, WPARAM wParam, LPARAM lParam)
settings_reset_content(hdlg, IDC_COMBO_MACHINE);
memset(listtomachine, 0x00, sizeof(listtomachine));
while (machine_get_internal_name_ex(c) != NULL) {
- if (machine_available(c) && (machines[c].type == temp_machine_type)) {
- stransi = (char *)machines[c].name;
+ if (machine_available(c) && (machine_get_type(c) == temp_machine_type)) {
+ stransi = machine_getname_ex(c);
mbstowcs(lptsTemp, stransi, strlen(stransi) + 1);
settings_add_string(hdlg, IDC_COMBO_MACHINE, (LPARAM) lptsTemp);
listtomachine[d] = c;
@@ -946,8 +946,8 @@ win_settings_machine_proc(HWND hdlg, UINT message, WPARAM wParam, LPARAM lParam)
c = d = 0;
memset(listtomachine, 0x00, sizeof(listtomachine));
while (machine_get_internal_name_ex(c) != NULL) {
- if (machine_available(c) && (machines[c].type == temp_machine_type)) {
- stransi = (char *)machines[c].name;
+ if (machine_available(c) && (machine_get_type(c) == temp_machine_type)) {
+ stransi = machine_getname_ex(c);
mbstowcs(lptsTemp, stransi, strlen(stransi) + 1);
settings_add_string(hdlg, IDC_COMBO_MACHINE, (LPARAM) lptsTemp);
listtomachine[d] = c;
@@ -1023,13 +1023,13 @@ win_settings_machine_proc(HWND hdlg, UINT message, WPARAM wParam, LPARAM lParam)
SendMessage(h, WM_GETTEXT, 255, (LPARAM) lptsTemp);
wcstombs(stransi, lptsTemp, 512);
sscanf(stransi, "%u", &temp_mem_size);
- if (!(machines[temp_machine].ram_granularity & 1023))
+ if (!(machine_get_ram_granularity(temp_machine) & 1023))
temp_mem_size = temp_mem_size << 10;
- temp_mem_size &= ~(machines[temp_machine].ram_granularity - 1);
- if (temp_mem_size < machines[temp_machine].min_ram)
- temp_mem_size = machines[temp_machine].min_ram;
- else if (temp_mem_size > machines[temp_machine].max_ram)
- temp_mem_size = machines[temp_machine].max_ram;
+ temp_mem_size &= ~(machine_get_ram_granularity(temp_machine) - 1);
+ if (temp_mem_size < machine_get_min_ram(temp_machine))
+ temp_mem_size = machine_get_min_ram(temp_machine);
+ else if (temp_mem_size > machine_get_max_ram(temp_machine))
+ temp_mem_size = machine_get_max_ram(temp_machine);
free(stransi);
free(lptsTemp);
From 1d5d304aaa579256ccdc03a12ddbab992a1f0f41 Mon Sep 17 00:00:00 2001
From: OBattler
Date: Thu, 16 Dec 2021 13:15:09 +0100
Subject: [PATCH 11/27] Updated the name and the comment of the Kaimei 486.
---
src/machine/machine_table.c | 5 ++---
1 file changed, 2 insertions(+), 3 deletions(-)
diff --git a/src/machine/machine_table.c b/src/machine/machine_table.c
index 791394392..4acb61614 100644
--- a/src/machine/machine_table.c
+++ b/src/machine/machine_table.c
@@ -366,9 +366,8 @@ const machine_t machines[] = {
{ "[ACC 2168] Packard Bell PB410A", "pb410a", MACHINE_TYPE_486_S2, CPU_PKG_SOCKET3, 0, 0, 0, 0, 0, 0, 0, MACHINE_AT | MACHINE_BUS_PS2 | MACHINE_IDE | MACHINE_VIDEO, 4096, 36864, 1024, 127, machine_at_pb410a_init, NULL },
/* Uses an ACER/NEC 90M002A (UPD82C42C, 8042 clone) with unknown firmware (V4.01H). */
{ "[ALi M1429G] Acer A1G", "acera1g", MACHINE_TYPE_486_S2, CPU_PKG_SOCKET3, 0, 0, 0, 0, 0, 0, 0, MACHINE_AT | MACHINE_BUS_PS2 | MACHINE_IDE_DUAL | MACHINE_VIDEO, 4096, 36864, 1024, 127, machine_at_acera1g_init, at_acera1g_get_device },
- /* There are two similar BIOS strings with -H, and one with -U, so I'm going to
- give it an AMIKey H KBC firmware. */
- { "[ALi M1429G] Kaimei 486", "win486", MACHINE_TYPE_486_S2, CPU_PKG_SOCKET3, 0, 0, 0, 0, 0, 0, 0, MACHINE_VLB | MACHINE_IDE, 1024, 32768, 1024, 127, machine_at_winbios1429_init, NULL },
+ /* This has an AMIKey-2, which is an updated version of type 'H'. */
+ { "[ALi M1429G] Kaimei SA-486 VL-BUS M.B.", "win486", MACHINE_TYPE_486_S2, CPU_PKG_SOCKET3, 0, 0, 0, 0, 0, 0, 0, MACHINE_VLB | MACHINE_IDE, 1024, 32768, 1024, 127, machine_at_winbios1429_init, NULL },
/* Uses an Intel KBC with Phoenix MultiKey KBC firmware. */
{ "[SiS 461] DEC DECpc LPV", "decpclpv", MACHINE_TYPE_486_S2, CPU_PKG_SOCKET3, 0, 0, 0, 0, 0, 0, 0, MACHINE_AT | MACHINE_BUS_PS2 | MACHINE_IDE_DUAL | MACHINE_VIDEO, 1024, 32768, 1024, 127, machine_at_decpclpv_init, NULL },
/* Uses an NEC 90M002A (UPD82C42C, 8042 clone) with unknown firmware. */
From ff020730502437bbaba59d7120e250621ede552f Mon Sep 17 00:00:00 2001
From: OBattler
Date: Thu, 16 Dec 2021 13:18:09 +0100
Subject: [PATCH 12/27] Moved the machine RAM sanity check to
machine_get_max_ram().
---
src/machine/machine_table.c | 6 +++++-
src/win/win_settings.c | 7 +------
2 files changed, 6 insertions(+), 7 deletions(-)
diff --git a/src/machine/machine_table.c b/src/machine/machine_table.c
index 4acb61614..842f543ee 100644
--- a/src/machine/machine_table.c
+++ b/src/machine/machine_table.c
@@ -1009,7 +1009,11 @@ machine_get_min_ram(int m)
int
machine_get_max_ram(int m)
{
- return(machines[m].max_ram);
+#if (!(defined __amd64__ || defined _M_X64 || defined __aarch64__ || defined _M_ARM64))
+ return MIN(((int) machines[m].max_ram), 2097152);
+#else
+ return MIN(((int) machines[m].max_ram), 3145728);
+#endif
}
diff --git a/src/win/win_settings.c b/src/win/win_settings.c
index 1221e0a34..5d977ba1d 100644
--- a/src/win/win_settings.c
+++ b/src/win/win_settings.c
@@ -802,12 +802,7 @@ win_settings_machine_recalc_machine(HWND hdlg)
} else {
/* MB granularity */
h = GetDlgItem(hdlg, IDC_MEMSPIN);
-#if (!(defined __amd64__ || defined _M_X64 || defined __aarch64__ || defined _M_ARM64))
- i = MIN(machine_get_max_ram(temp_machine), 2097152);
-#else
- i = MIN(machine_get_max_ram(temp_machine), 3145728);
-#endif
- SendMessage(h, UDM_SETRANGE, 0, (machine_get_min_ram(temp_machine) << 6) | (i >> 10));
+ SendMessage(h, UDM_SETRANGE, 0, (machine_get_min_ram(temp_machine) << 6) | (machine_get_max_ram(temp_machine) >> 10));
accel.nSec = 0;
accel.nInc = machine_get_ram_granularity(temp_machine) >> 10;
From ce8f66bc071f153e2a55d696a0cafa6f2b5787f6 Mon Sep 17 00:00:00 2001
From: OBattler
Date: Fri, 17 Dec 2021 03:30:13 +0100
Subject: [PATCH 13/27] Reduced the texture size back 2048x2048.
---
src/unix/unix_sdl.c | 6 +++---
src/video/video.c | 2 +-
src/win/win_sdl.c | 6 +++---
3 files changed, 7 insertions(+), 7 deletions(-)
diff --git a/src/unix/unix_sdl.c b/src/unix/unix_sdl.c
index 4c309144f..356305d1c 100644
--- a/src/unix/unix_sdl.c
+++ b/src/unix/unix_sdl.c
@@ -134,9 +134,9 @@ sdl_blit_shim(int x, int y, int w, int h)
params.w = w;
params.h = h;
if (!(!sdl_enabled || (x < 0) || (y < 0) || (w <= 0) || (h <= 0) || (w > 2048) || (h > 2048) || (buffer32 == NULL) || (sdl_render == NULL) || (sdl_tex == NULL)))
- video_copy(interpixels, &(buffer32->line[y][x]), h * (2048 + 64) * sizeof(uint32_t));
+ video_copy(interpixels, &(buffer32->line[y][x]), h * 2048 * sizeof(uint32_t));
if (screenshots)
- video_screenshot(interpixels, 0, 0, (2048 + 64));
+ video_screenshot(interpixels, 0, 0, 2048);
blitreq = 1;
video_blit_complete();
}
@@ -198,7 +198,7 @@ sdl_blit(int x, int y, int w, int h)
r_src.y = y;
r_src.w = w;
r_src.h = h;
- SDL_UpdateTexture(sdl_tex, &r_src, interpixels, (2048 + 64) * 4);
+ SDL_UpdateTexture(sdl_tex, &r_src, interpixels, 2048 * 4);
blitreq = 0;
sdl_real_blit(&r_src);
diff --git a/src/video/video.c b/src/video/video.c
index 5118b886f..e3ff2200c 100644
--- a/src/video/video.c
+++ b/src/video/video.c
@@ -831,7 +831,7 @@ video_init(void)
}
/* Account for overscan. */
- buffer32 = create_bitmap(2048 + 64, 2048 + 64);
+ buffer32 = create_bitmap(2048, 2048);
for (c = 0; c < 64; c++) {
cgapal[c + 64].r = (((c & 4) ? 2 : 0) | ((c & 0x10) ? 1 : 0)) * 21;
diff --git a/src/win/win_sdl.c b/src/win/win_sdl.c
index af876540d..3a898f43c 100644
--- a/src/win/win_sdl.c
+++ b/src/win/win_sdl.c
@@ -244,10 +244,10 @@ sdl_blit(int x, int y, int w, int h)
SDL_LockTexture(sdl_tex, 0, &pixeldata, &pitch);
- video_copy(pixeldata, &(buffer32->line[y][x]), h * (2048 + 64) * sizeof(uint32_t));
+ video_copy(pixeldata, &(buffer32->line[y][x]), h * 2048 * sizeof(uint32_t));
if (screenshots)
- video_screenshot((uint32_t *) pixeldata, 0, 0, (2048 + 64));
+ video_screenshot((uint32_t *) pixeldata, 0, 0, 2048);
SDL_UnlockTexture(sdl_tex);
@@ -358,7 +358,7 @@ sdl_init_texture(void)
sdl_render = SDL_CreateRenderer(sdl_win, -1, SDL_RENDERER_SOFTWARE);
sdl_tex = SDL_CreateTexture(sdl_render, SDL_PIXELFORMAT_ARGB8888,
- SDL_TEXTUREACCESS_STREAMING, (2048 + 64), (2048 + 64));
+ SDL_TEXTUREACCESS_STREAMING, 2048, 2048);
}
From 84ff7ab6ffb3b9473232312da9a68b3d95d42f9e Mon Sep 17 00:00:00 2001
From: OBattler
Date: Fri, 17 Dec 2021 03:44:22 +0100
Subject: [PATCH 14/27] Fixed OpenGL 3.0 core.
---
src/win/win_opengl.c | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/src/win/win_opengl.c b/src/win/win_opengl.c
index 13b8c4fb7..bb9afd7be 100644
--- a/src/win/win_opengl.c
+++ b/src/win/win_opengl.c
@@ -62,10 +62,10 @@ typedef LONG atomic_flag;
static const int INIT_WIDTH = 640;
static const int INIT_HEIGHT = 400;
-static const int BUFFERPIXELS = 4460544; /* Same size as render_buffer, pow(2048+64,2). */
-static const int BUFFERBYTES = 17842176; /* Pixel is 4 bytes. */
+static const int BUFFERPIXELS = 4194304; /* Same size as render_buffer, pow(2048+64,2). */
+static const int BUFFERBYTES = 16777216; /* Pixel is 4 bytes. */
static const int BUFFERCOUNT = 3; /* How many buffers to use for pixel transfer (2-3 is commonly recommended). */
-static const int ROW_LENGTH = 2112; /* Source buffer row lenght (including padding) */
+static const int ROW_LENGTH = 2048; /* Source buffer row lenght (including padding) */
/**
* @brief A dedicated OpenGL thread.
From 707acadd364eedaaba5bf28c597a0ef89cf1dd63 Mon Sep 17 00:00:00 2001
From: OBattler
Date: Fri, 17 Dec 2021 03:49:54 +0100
Subject: [PATCH 15/27] Replaced the Win32 threads with the proven to be better
performing C++11 threads.
---
src/CMakeLists.txt | 2 +-
src/cpp11_thread.cpp | 133 ++++++++++++++++++++++++++++++
src/win/CMakeLists.txt | 4 +-
src/win/Makefile.mingw | 4 +-
src/win/win_thread.c | 183 -----------------------------------------
5 files changed, 138 insertions(+), 188 deletions(-)
create mode 100644 src/cpp11_thread.cpp
delete mode 100644 src/win/win_thread.c
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 7e815c5e9..f2d638c2c 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -34,7 +34,7 @@ endif()
# WIN32 marks us as a GUI app on Windows
# MACOSX_BUNDLE prepares a macOS application bundle including with the app icon
-add_executable(86Box WIN32 MACOSX_BUNDLE 86box.c config.c log.c random.c timer.c io.c acpi.c apm.c
+add_executable(86Box WIN32 MACOSX_BUNDLE 86box.c config.c cpp11_thread.cpp log.c random.c timer.c io.c acpi.c apm.c
dma.c ddma.c nmi.c pic.c pit.c port_6x.c port_92.c ppi.c pci.c mca.c usb.c
device.c nvr.c nvr_at.c nvr_ps2.c rtmidi_midi.cpp ${APP_ICON_MACOSX})
diff --git a/src/cpp11_thread.cpp b/src/cpp11_thread.cpp
new file mode 100644
index 000000000..96eb4a2e1
--- /dev/null
+++ b/src/cpp11_thread.cpp
@@ -0,0 +1,133 @@
+#include
+#include
+#include
+
+#include <86box/plat.h>
+
+struct event_cpp11_t
+{
+ std::condition_variable cond;
+ std::mutex mutex;
+ bool state = false;
+};
+
+extern "C" {
+
+thread_t *
+thread_create(void (*thread_rout)(void *param), void *param)
+{
+ auto thread = new std::thread([thread_rout, param] {
+ thread_rout(param);
+ });
+ return thread;
+}
+
+mutex_t *
+thread_create_mutex_with_spin_count(unsigned int spin_count)
+{
+ /* Setting spin count of a mutex is not possible with pthreads. */
+ return thread_create_mutex();
+}
+
+int
+thread_wait(thread_t *arg, int timeout)
+{
+ (void) timeout;
+ auto thread = reinterpret_cast(arg);
+ thread->join();
+ return 0;
+}
+
+mutex_t *
+thread_create_mutex(void)
+{
+ auto mutex = new std::mutex;
+ return mutex;
+}
+
+int
+thread_wait_mutex(mutex_t *_mutex)
+{
+ if (_mutex == nullptr)
+ return(0);
+ auto mutex = reinterpret_cast(_mutex);
+ mutex->lock();
+ return 1;
+}
+
+
+int
+thread_release_mutex(mutex_t *_mutex)
+{
+ if (_mutex == nullptr)
+ return(0);
+ auto mutex = reinterpret_cast(_mutex);
+ mutex->unlock();
+ return 1;
+}
+
+
+void
+thread_close_mutex(mutex_t *_mutex)
+{
+ auto mutex = reinterpret_cast(_mutex);
+ delete mutex;
+}
+
+event_t *
+thread_create_event()
+{
+ auto ev = new event_cpp11_t;
+ return ev;
+}
+
+int
+thread_wait_event(event_t *handle, int timeout)
+{
+ auto event = reinterpret_cast(handle);
+ auto lock = std::unique_lock(event->mutex);
+
+ if (timeout < 0) {
+ event->cond.wait(lock, [event] { return event->state; });
+ } else {
+ auto to = std::chrono::system_clock::now() + std::chrono::milliseconds(timeout);
+ std::cv_status status;
+
+ do {
+ status = event->cond.wait_until(lock, to);
+ } while ((status != std::cv_status::timeout) && !event->state);
+
+ if (status == std::cv_status::timeout) {
+ return 1;
+ }
+ }
+ return 0;
+}
+
+void
+thread_set_event(event_t *handle)
+{
+ auto event = reinterpret_cast(handle);
+ {
+ auto lock = std::unique_lock(event->mutex);
+ event->state = true;
+ }
+ event->cond.notify_all();
+}
+
+void
+thread_reset_event(event_t *handle)
+{
+ auto event = reinterpret_cast(handle);
+ auto lock = std::unique_lock(event->mutex);
+ event->state = false;
+}
+
+void
+thread_destroy_event(event_t *handle)
+{
+ auto event = reinterpret_cast(handle);
+ delete event;
+}
+
+}
diff --git a/src/win/CMakeLists.txt b/src/win/CMakeLists.txt
index 301544798..304ff8d68 100644
--- a/src/win/CMakeLists.txt
+++ b/src/win/CMakeLists.txt
@@ -15,8 +15,8 @@
enable_language(RC)
-add_library(plat OBJECT win.c win_dynld.c win_cdrom.c win_thread.c
- win_keyboard.c win_crashdump.c win_mouse.c)
+add_library(plat OBJECT win.c win_dynld.c win_cdrom.c win_keyboard.c
+ win_crashdump.c win_mouse.c)
add_library(ui OBJECT win_ui.c win_icon.c win_stbar.c win_sdl.c win_dialog.c win_about.c
win_settings.c win_devconf.c win_snd_gain.c win_specify_dim.c win_new_floppy.c
diff --git a/src/win/Makefile.mingw b/src/win/Makefile.mingw
index e3199b319..4ef41f2e6 100644
--- a/src/win/Makefile.mingw
+++ b/src/win/Makefile.mingw
@@ -464,7 +464,7 @@ CXXFLAGS := $(CFLAGS)
#########################################################################
# Create the (final) list of objects to build. #
#########################################################################
-MAINOBJ := 86box.o config.o log.o random.o timer.o io.o acpi.o apm.o dma.o ddma.o \
+MAINOBJ := 86box.o config.o cpp11_thread.o log.o random.o timer.o io.o acpi.o apm.o dma.o ddma.o \
nmi.o pic.o pit.o port_6x.o port_92.o ppi.o pci.o mca.o \
usb.o device.o nvr.o nvr_at.o nvr_ps2.o rtmidi_midi.o \
$(VNCOBJ)
@@ -672,7 +672,7 @@ VOODOOOBJ := vid_voodoo.o vid_voodoo_banshee.o \
vid_voodoo_texture.o
PLATOBJ := win.o \
- win_dynld.o win_thread.o \
+ win_dynld.o \
win_cdrom.o win_keyboard.o \
win_crashdump.o \
win_mouse.o
diff --git a/src/win/win_thread.c b/src/win/win_thread.c
deleted file mode 100644
index f8d81fa86..000000000
--- a/src/win/win_thread.c
+++ /dev/null
@@ -1,183 +0,0 @@
-/*
- * 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.
- *
- * Implement threads and mutexes for the Win32 platform.
- *
- *
- *
- * Authors: Sarah Walker,
- * Fred N. van Kempen,
- *
- * Copyright 2008-2018 Sarah Walker.
- * Copyright 2017,2018 Fred N. van Kempen.
- */
-#define UNICODE
-#define BITMAP WINDOWS_BITMAP
-#include
-#include
-#include
-#undef BITMAP
-#include
-#include
-#include
-#include
-#include
-#include <86box/86box.h>
-#include <86box/plat.h>
-
-
-typedef struct {
- HANDLE handle;
-} win_event_t;
-
-
-thread_t *
-thread_create(void (*func)(void *param), void *param)
-{
- uintptr_t bt = _beginthread(func, 0, param);
- return((thread_t *)bt);
-}
-
-
-int
-thread_wait(thread_t *arg, int timeout)
-{
- if (arg == NULL) return(0);
-
- if (timeout == -1)
- timeout = INFINITE;
-
- if (WaitForSingleObject(arg, timeout)) return(1);
-
- return(0);
-}
-
-
-event_t *
-thread_create_event(void)
-{
- win_event_t *ev = malloc(sizeof(win_event_t));
-
- ev->handle = CreateEvent(NULL, FALSE, FALSE, NULL);
-
- return((event_t *)ev);
-}
-
-
-void
-thread_set_event(event_t *arg)
-{
- win_event_t *ev = (win_event_t *)arg;
-
- if (arg == NULL) return;
-
- SetEvent(ev->handle);
-}
-
-
-void
-thread_reset_event(event_t *arg)
-{
- win_event_t *ev = (win_event_t *)arg;
-
- if (arg == NULL) return;
-
- ResetEvent(ev->handle);
-}
-
-
-int
-thread_wait_event(event_t *arg, int timeout)
-{
- win_event_t *ev = (win_event_t *)arg;
-
- if (arg == NULL) return(0);
-
- if (ev->handle == NULL) return(0);
-
- if (timeout == -1)
- timeout = INFINITE;
-
- if (WaitForSingleObject(ev->handle, timeout)) return(1);
-
- return(0);
-}
-
-
-void
-thread_destroy_event(event_t *arg)
-{
- win_event_t *ev = (win_event_t *)arg;
-
- if (arg == NULL) return;
-
- CloseHandle(ev->handle);
-
- free(ev);
-}
-
-
-mutex_t *
-thread_create_mutex(void)
-{
- mutex_t *mutex = malloc(sizeof(CRITICAL_SECTION));
-
- InitializeCriticalSection(mutex);
-
- return mutex;
-}
-
-
-mutex_t *
-thread_create_mutex_with_spin_count(unsigned int spin_count)
-{
- mutex_t *mutex = malloc(sizeof(CRITICAL_SECTION));
-
- InitializeCriticalSectionAndSpinCount(mutex, spin_count);
-
- return mutex;
-}
-
-
-int
-thread_wait_mutex(mutex_t *mutex)
-{
- if (mutex == NULL) return(0);
-
- LPCRITICAL_SECTION critsec = (LPCRITICAL_SECTION)mutex;
-
- EnterCriticalSection(critsec);
-
- return 1;
-}
-
-
-int
-thread_release_mutex(mutex_t *mutex)
-{
- if (mutex == NULL) return(0);
-
- LPCRITICAL_SECTION critsec = (LPCRITICAL_SECTION)mutex;
-
- LeaveCriticalSection(critsec);
-
- return 1;
-}
-
-
-void
-thread_close_mutex(mutex_t *mutex)
-{
- if (mutex == NULL) return;
-
- LPCRITICAL_SECTION critsec = (LPCRITICAL_SECTION)mutex;
-
- DeleteCriticalSection(critsec);
-
- free(critsec);
-}
From 7df9e2a45437e1383fc03241ebbc5ad269a19bc8 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?David=20Hrdli=C4=8Dka?=
Date: Fri, 17 Dec 2021 06:59:53 +0100
Subject: [PATCH 16/27] Add a compile option to choose between thread
implementations
---
CMakeLists.txt | 1 +
src/CMakeLists.txt | 6 +-
src/unix/CMakeLists.txt | 12 ++-
src/win/CMakeLists.txt | 4 +
src/win/Makefile.mingw | 13 ++-
src/win/win_thread.c | 183 ++++++++++++++++++++++++++++++++++++++++
6 files changed, 212 insertions(+), 7 deletions(-)
create mode 100644 src/win/win_thread.c
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 5299448f3..5db0f0108 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -64,6 +64,7 @@ option(MUNT "MUNT" ON)
option(VRAMDUMP "Video RAM dumping" OFF)
option(DINPUT "DirectInput" OFF)
option(DISCORD "Discord integration" ON)
+option(CPPTHRAD "C++11 threads" ON)
option(NEW_DYNAREC "Use the PCem v15 (\"new\") dynamic recompiler" OFF)
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index f2d638c2c..142fdfabd 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -34,10 +34,14 @@ endif()
# WIN32 marks us as a GUI app on Windows
# MACOSX_BUNDLE prepares a macOS application bundle including with the app icon
-add_executable(86Box WIN32 MACOSX_BUNDLE 86box.c config.c cpp11_thread.cpp log.c random.c timer.c io.c acpi.c apm.c
+add_executable(86Box WIN32 MACOSX_BUNDLE 86box.c config.c log.c random.c timer.c io.c acpi.c apm.c
dma.c ddma.c nmi.c pic.c pit.c port_6x.c port_92.c ppi.c pci.c mca.c usb.c
device.c nvr.c nvr_at.c nvr_ps2.c rtmidi_midi.cpp ${APP_ICON_MACOSX})
+if(CPPTHREADS)
+ target_sources(plat PRIVATE cpp11_thread.cpp)
+endif()
+
if(APPLE)
target_link_libraries(86Box "-framework AppKit")
endif()
diff --git a/src/unix/CMakeLists.txt b/src/unix/CMakeLists.txt
index e21265370..7cd52879b 100644
--- a/src/unix/CMakeLists.txt
+++ b/src/unix/CMakeLists.txt
@@ -8,7 +8,7 @@ if (${CMAKE_SYSTEM_NAME} MATCHES "Linux")
else()
set(PLAT_SOURCES unix_midi.c)
endif()
-add_library(plat STATIC ${PLAT_SOURCES} unix_thread.c)
+add_library(plat STATIC ${PLAT_SOURCES})
add_library(ui STATIC unix.c unix_sdl.c unix_cdrom.c)
target_compile_definitions(ui PUBLIC _FILE_OFFSET_BITS=64)
target_link_libraries(ui dl)
@@ -28,6 +28,10 @@ if (ALSA_FOUND)
target_link_libraries(plat ALSA::ALSA)
endif()
-set(THREADS_PREFER_PTHREAD_FLAG TRUE)
-find_package(Threads REQUIRED)
-target_link_libraries(86Box Threads::Threads)
+if (NOT CPPTHREADS)
+ target_sources(plat PRIVATE unix_thread.c)
+
+ set(THREADS_PREFER_PTHREAD_FLAG TRUE)
+ find_package(Threads REQUIRED)
+ target_link_libraries(86Box Threads::Threads)
+endif()
diff --git a/src/win/CMakeLists.txt b/src/win/CMakeLists.txt
index 304ff8d68..9b0016e6f 100644
--- a/src/win/CMakeLists.txt
+++ b/src/win/CMakeLists.txt
@@ -23,6 +23,10 @@ add_library(ui OBJECT win_ui.c win_icon.c win_stbar.c win_sdl.c win_dialog.c win
win_jsconf.c win_media_menu.c win_preferences.c win_discord.c glad.c win_opengl.c
win_opengl_glslp.c 86Box.rc)
+if(NOT CPPTHREADS)
+ target_sources(plat PRIVATE win_thread.c)
+endif()
+
if(MSVC)
# MSVC complains when we include the manifest from 86Box.rc...
# On the bright side, CMake supports passing the manifest as a source
diff --git a/src/win/Makefile.mingw b/src/win/Makefile.mingw
index 4ef41f2e6..d7bf837da 100644
--- a/src/win/Makefile.mingw
+++ b/src/win/Makefile.mingw
@@ -163,6 +163,9 @@ endif
ifndef DYNAREC
DYNAREC := y
endif
+ifndef CPPTHREADS
+ CPPTHREADS := cpp11
+endif
ifeq ($(DYNAREC), y)
ifeq ($(ARM), y)
ifeq ($(NEW_DYNAREC), n)
@@ -370,6 +373,12 @@ MUNTOBJ := midi_mt32.o \
Synth.o Tables.o TVA.o TVF.o TVP.o sha1.o c_interface.o
endif
+ifeq ($(CPPTHREADS), y)
+THREADOBJ := cpp11_thread.o
+else
+THREADOBJ := win_thread.o
+endif
+
ifeq ($(VNC), y)
OPTS += -DUSE_VNC
RFLAGS += -DUSE_VNC
@@ -464,7 +473,7 @@ CXXFLAGS := $(CFLAGS)
#########################################################################
# Create the (final) list of objects to build. #
#########################################################################
-MAINOBJ := 86box.o config.o cpp11_thread.o log.o random.o timer.o io.o acpi.o apm.o dma.o ddma.o \
+MAINOBJ := 86box.o config.o log.o random.o timer.o io.o acpi.o apm.o dma.o ddma.o \
nmi.o pic.o pit.o port_6x.o port_92.o ppi.o pci.o mca.o \
usb.o device.o nvr.o nvr_at.o nvr_ps2.o rtmidi_midi.o \
$(VNCOBJ)
@@ -693,7 +702,7 @@ endif
OBJ := $(MAINOBJ) $(CPUOBJ) $(CHIPSETOBJ) $(MCHOBJ) $(DEVOBJ) $(MEMOBJ) \
$(FDDOBJ) $(GAMEOBJ) $(CDROMOBJ) $(ZIPOBJ) $(MOOBJ) $(HDDOBJ) $(MINIVHDOBJ) \
$(NETOBJ) $(PRINTOBJ) $(SCSIOBJ) $(SIOOBJ) $(SNDOBJ) $(VIDOBJ) $(VOODOOOBJ) \
- $(PLATOBJ) $(UIOBJ) $(FSYNTHOBJ) $(MUNTOBJ) $(DEVBROBJ) $(MINITRACEOBJ)
+ $(PLATOBJ) $(UIOBJ) $(FSYNTHOBJ) $(MUNTOBJ) $(DEVBROBJ) $(MINITRACEOBJ) $(THREADOBJ)
ifdef EXOBJ
OBJ += $(EXOBJ)
endif
diff --git a/src/win/win_thread.c b/src/win/win_thread.c
new file mode 100644
index 000000000..f8d81fa86
--- /dev/null
+++ b/src/win/win_thread.c
@@ -0,0 +1,183 @@
+/*
+ * 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.
+ *
+ * Implement threads and mutexes for the Win32 platform.
+ *
+ *
+ *
+ * Authors: Sarah Walker,
+ * Fred N. van Kempen,
+ *
+ * Copyright 2008-2018 Sarah Walker.
+ * Copyright 2017,2018 Fred N. van Kempen.
+ */
+#define UNICODE
+#define BITMAP WINDOWS_BITMAP
+#include
+#include
+#include
+#undef BITMAP
+#include
+#include
+#include
+#include
+#include
+#include <86box/86box.h>
+#include <86box/plat.h>
+
+
+typedef struct {
+ HANDLE handle;
+} win_event_t;
+
+
+thread_t *
+thread_create(void (*func)(void *param), void *param)
+{
+ uintptr_t bt = _beginthread(func, 0, param);
+ return((thread_t *)bt);
+}
+
+
+int
+thread_wait(thread_t *arg, int timeout)
+{
+ if (arg == NULL) return(0);
+
+ if (timeout == -1)
+ timeout = INFINITE;
+
+ if (WaitForSingleObject(arg, timeout)) return(1);
+
+ return(0);
+}
+
+
+event_t *
+thread_create_event(void)
+{
+ win_event_t *ev = malloc(sizeof(win_event_t));
+
+ ev->handle = CreateEvent(NULL, FALSE, FALSE, NULL);
+
+ return((event_t *)ev);
+}
+
+
+void
+thread_set_event(event_t *arg)
+{
+ win_event_t *ev = (win_event_t *)arg;
+
+ if (arg == NULL) return;
+
+ SetEvent(ev->handle);
+}
+
+
+void
+thread_reset_event(event_t *arg)
+{
+ win_event_t *ev = (win_event_t *)arg;
+
+ if (arg == NULL) return;
+
+ ResetEvent(ev->handle);
+}
+
+
+int
+thread_wait_event(event_t *arg, int timeout)
+{
+ win_event_t *ev = (win_event_t *)arg;
+
+ if (arg == NULL) return(0);
+
+ if (ev->handle == NULL) return(0);
+
+ if (timeout == -1)
+ timeout = INFINITE;
+
+ if (WaitForSingleObject(ev->handle, timeout)) return(1);
+
+ return(0);
+}
+
+
+void
+thread_destroy_event(event_t *arg)
+{
+ win_event_t *ev = (win_event_t *)arg;
+
+ if (arg == NULL) return;
+
+ CloseHandle(ev->handle);
+
+ free(ev);
+}
+
+
+mutex_t *
+thread_create_mutex(void)
+{
+ mutex_t *mutex = malloc(sizeof(CRITICAL_SECTION));
+
+ InitializeCriticalSection(mutex);
+
+ return mutex;
+}
+
+
+mutex_t *
+thread_create_mutex_with_spin_count(unsigned int spin_count)
+{
+ mutex_t *mutex = malloc(sizeof(CRITICAL_SECTION));
+
+ InitializeCriticalSectionAndSpinCount(mutex, spin_count);
+
+ return mutex;
+}
+
+
+int
+thread_wait_mutex(mutex_t *mutex)
+{
+ if (mutex == NULL) return(0);
+
+ LPCRITICAL_SECTION critsec = (LPCRITICAL_SECTION)mutex;
+
+ EnterCriticalSection(critsec);
+
+ return 1;
+}
+
+
+int
+thread_release_mutex(mutex_t *mutex)
+{
+ if (mutex == NULL) return(0);
+
+ LPCRITICAL_SECTION critsec = (LPCRITICAL_SECTION)mutex;
+
+ LeaveCriticalSection(critsec);
+
+ return 1;
+}
+
+
+void
+thread_close_mutex(mutex_t *mutex)
+{
+ if (mutex == NULL) return;
+
+ LPCRITICAL_SECTION critsec = (LPCRITICAL_SECTION)mutex;
+
+ DeleteCriticalSection(critsec);
+
+ free(critsec);
+}
From 275919859ace287af2189da319bfe95cbb2fd9e4 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?David=20Hrdli=C4=8Dka?=
Date: Fri, 17 Dec 2021 07:41:07 +0100
Subject: [PATCH 17/27] Fix typos
---
CMakeLists.txt | 2 +-
src/CMakeLists.txt | 2 +-
src/unix/CMakeLists.txt | 8 ++++----
src/win/Makefile.mingw | 2 +-
4 files changed, 7 insertions(+), 7 deletions(-)
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 5db0f0108..2070e3a50 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -64,7 +64,7 @@ option(MUNT "MUNT" ON)
option(VRAMDUMP "Video RAM dumping" OFF)
option(DINPUT "DirectInput" OFF)
option(DISCORD "Discord integration" ON)
-option(CPPTHRAD "C++11 threads" ON)
+option(CPPTHREADS "C++11 threads" ON)
option(NEW_DYNAREC "Use the PCem v15 (\"new\") dynamic recompiler" OFF)
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 142fdfabd..742e8a1af 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -39,7 +39,7 @@ add_executable(86Box WIN32 MACOSX_BUNDLE 86box.c config.c log.c random.c timer.c
device.c nvr.c nvr_at.c nvr_ps2.c rtmidi_midi.cpp ${APP_ICON_MACOSX})
if(CPPTHREADS)
- target_sources(plat PRIVATE cpp11_thread.cpp)
+ target_sources(86Box PRIVATE cpp11_thread.cpp)
endif()
if(APPLE)
diff --git a/src/unix/CMakeLists.txt b/src/unix/CMakeLists.txt
index 7cd52879b..22a424a3a 100644
--- a/src/unix/CMakeLists.txt
+++ b/src/unix/CMakeLists.txt
@@ -30,8 +30,8 @@ endif()
if (NOT CPPTHREADS)
target_sources(plat PRIVATE unix_thread.c)
-
- set(THREADS_PREFER_PTHREAD_FLAG TRUE)
- find_package(Threads REQUIRED)
- target_link_libraries(86Box Threads::Threads)
endif()
+
+set(THREADS_PREFER_PTHREAD_FLAG TRUE)
+find_package(Threads REQUIRED)
+target_link_libraries(86Box Threads::Threads)
diff --git a/src/win/Makefile.mingw b/src/win/Makefile.mingw
index d7bf837da..d7a676713 100644
--- a/src/win/Makefile.mingw
+++ b/src/win/Makefile.mingw
@@ -164,7 +164,7 @@ ifndef DYNAREC
DYNAREC := y
endif
ifndef CPPTHREADS
- CPPTHREADS := cpp11
+ CPPTHREADS := y
endif
ifeq ($(DYNAREC), y)
ifeq ($(ARM), y)
From e0a73a99ec29faafdd5149839093f5a27265fc64 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?David=20Hrdli=C4=8Dka?=
Date: Fri, 17 Dec 2021 08:57:00 +0100
Subject: [PATCH 18/27] Turn the RtMidi module into a full standalone MIDI
module
Removes the now-redundant platform MIDI infrastructure
---
src/86box.c | 1 -
src/CMakeLists.txt | 2 +-
src/config.c | 1 -
src/include/86box/midi.h | 3 +-
src/include/86box/midi_input.h | 1 -
src/include/86box/midi_rtmidi.h | 13 +
src/include/86box/midi_system.h | 1 -
src/include/86box/plat_midi.h | 15 -
src/sound/CMakeLists.txt | 2 +-
src/sound/midi.c | 6 +-
.../midi_rtmidi.cpp} | 152 ++++++--
src/sound/midi_system.c | 139 --------
src/unix/CMakeLists.txt | 34 +-
src/unix/linux_midi_alsa.c | 326 ------------------
src/unix/unix_midi.c | 57 ---
src/win/Makefile.mingw | 4 +-
src/win/win.c | 1 -
src/win/win_devconf.c | 10 +-
src/win/win_settings.c | 1 -
src/win/win_ui.c | 1 -
20 files changed, 148 insertions(+), 622 deletions(-)
delete mode 100644 src/include/86box/midi_input.h
create mode 100644 src/include/86box/midi_rtmidi.h
delete mode 100644 src/include/86box/midi_system.h
delete mode 100644 src/include/86box/plat_midi.h
rename src/{rtmidi_midi.cpp => sound/midi_rtmidi.cpp} (59%)
delete mode 100644 src/sound/midi_system.c
delete mode 100644 src/unix/linux_midi_alsa.c
delete mode 100644 src/unix/unix_midi.c
diff --git a/src/86box.c b/src/86box.c
index 045b3bd0a..132551e79 100644
--- a/src/86box.c
+++ b/src/86box.c
@@ -90,7 +90,6 @@
#include <86box/video.h>
#include <86box/ui.h>
#include <86box/plat.h>
-#include <86box/plat_midi.h>
#include <86box/version.h>
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 742e8a1af..1d508b248 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -36,7 +36,7 @@ endif()
# MACOSX_BUNDLE prepares a macOS application bundle including with the app icon
add_executable(86Box WIN32 MACOSX_BUNDLE 86box.c config.c log.c random.c timer.c io.c acpi.c apm.c
dma.c ddma.c nmi.c pic.c pit.c port_6x.c port_92.c ppi.c pci.c mca.c usb.c
- device.c nvr.c nvr_at.c nvr_ps2.c rtmidi_midi.cpp ${APP_ICON_MACOSX})
+ device.c nvr.c nvr_at.c nvr_ps2.c ${APP_ICON_MACOSX})
if(CPPTHREADS)
target_sources(86Box PRIVATE cpp11_thread.cpp)
diff --git a/src/config.c b/src/config.c
index d41da7a4e..06eda4ff3 100644
--- a/src/config.c
+++ b/src/config.c
@@ -64,7 +64,6 @@
#include <86box/snd_mpu401.h>
#include <86box/video.h>
#include <86box/plat.h>
-#include <86box/plat_midi.h>
#include <86box/plat_dir.h>
#include <86box/ui.h>
diff --git a/src/include/86box/midi.h b/src/include/86box/midi.h
index 5ff8b505e..e80fe79d6 100644
--- a/src/include/86box/midi.h
+++ b/src/include/86box/midi.h
@@ -95,7 +95,8 @@ extern void midi_in_sysex(uint8_t *buffer, uint32_t len);
#define MIDI_INPUT_INTERNAL_NAME "midi_in"
#ifdef EMU_DEVICE_H
-extern const device_t system_midi_device;
+extern const device_t rtmidi_device;
+extern const device_t rtmidi_input_device;
#ifdef USE_FLUIDSYNTH
extern const device_t fluidsynth_device;
#endif
diff --git a/src/include/86box/midi_input.h b/src/include/86box/midi_input.h
deleted file mode 100644
index 163d6fa91..000000000
--- a/src/include/86box/midi_input.h
+++ /dev/null
@@ -1 +0,0 @@
-extern const device_t midi_input_device;
diff --git a/src/include/86box/midi_rtmidi.h b/src/include/86box/midi_rtmidi.h
new file mode 100644
index 000000000..beaccdf54
--- /dev/null
+++ b/src/include/86box/midi_rtmidi.h
@@ -0,0 +1,13 @@
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+extern int rtmidi_get_num_devs(void);
+extern void rtmidi_get_dev_name(int num, char *s);
+extern int rtmidi_in_get_num_devs(void);
+extern void rtmidi_in_get_dev_name(int num, char *s);
+
+#ifdef __cplusplus
+}
+#endif
\ No newline at end of file
diff --git a/src/include/86box/midi_system.h b/src/include/86box/midi_system.h
deleted file mode 100644
index b79bbf96f..000000000
--- a/src/include/86box/midi_system.h
+++ /dev/null
@@ -1 +0,0 @@
-extern const device_t system_midi_device;
diff --git a/src/include/86box/plat_midi.h b/src/include/86box/plat_midi.h
deleted file mode 100644
index 933e49ee6..000000000
--- a/src/include/86box/plat_midi.h
+++ /dev/null
@@ -1,15 +0,0 @@
-extern void plat_midi_init(void);
-extern void plat_midi_close(void);
-
-extern void plat_midi_play_msg(uint8_t *msg);
-extern void plat_midi_play_sysex(uint8_t *sysex, unsigned int len);
-extern int plat_midi_write(uint8_t val);
-
-extern int plat_midi_get_num_devs(void);
-extern void plat_midi_get_dev_name(int num, char *s);
-
-extern void plat_midi_input_init(void);
-extern void plat_midi_input_close(void);
-
-extern int plat_midi_in_get_num_devs(void);
-extern void plat_midi_in_get_dev_name(int num, char *s);
diff --git a/src/sound/CMakeLists.txt b/src/sound/CMakeLists.txt
index f5a6435c4..553f3d4f2 100644
--- a/src/sound/CMakeLists.txt
+++ b/src/sound/CMakeLists.txt
@@ -14,7 +14,7 @@
#
add_library(snd OBJECT sound.c openal.c snd_opl.c snd_opl_nuked.c snd_resid.cc
- midi.c midi_system.c snd_speaker.c snd_pssj.c snd_lpt_dac.c snd_ac97_codec.c snd_ac97_via.c
+ midi.c midi_rtmidi.cpp snd_speaker.c snd_pssj.c snd_lpt_dac.c snd_ac97_codec.c snd_ac97_via.c
snd_lpt_dss.c snd_adlib.c snd_adlibgold.c snd_ad1848.c snd_audiopci.c
snd_azt2316a.c snd_cms.c snd_cs423x.c snd_gus.c snd_sb.c snd_sb_dsp.c
snd_emu8k.c snd_mpu401.c snd_sn76489.c snd_ssi2001.c snd_wss.c snd_ym7128.c)
diff --git a/src/sound/midi.c b/src/sound/midi.c
index e985f277f..8a195e2f9 100644
--- a/src/sound/midi.c
+++ b/src/sound/midi.c
@@ -28,9 +28,7 @@
#include <86box/86box.h>
#include <86box/device.h>
#include <86box/plat.h>
-#include <86box/plat_midi.h>
#include <86box/midi.h>
-#include <86box/midi_input.h>
int midi_device_current = 0;
@@ -84,14 +82,14 @@ static const MIDI_DEVICE devices[] =
{ "mt32", &mt32_device },
{ "cm32l", &cm32l_device },
#endif
- { SYSTEM_MIDI_INTERNAL_NAME, &system_midi_device },
+ { SYSTEM_MIDI_INTERNAL_NAME, &rtmidi_device },
{ "", NULL }
};
static const MIDI_IN_DEVICE midi_in_devices[] =
{
{ "none", NULL },
- { MIDI_INPUT_INTERNAL_NAME, &midi_input_device },
+ { MIDI_INPUT_INTERNAL_NAME, &rtmidi_input_device },
{ "", NULL }
};
diff --git a/src/rtmidi_midi.cpp b/src/sound/midi_rtmidi.cpp
similarity index 59%
rename from src/rtmidi_midi.cpp
rename to src/sound/midi_rtmidi.cpp
index 45e34197a..e150159e4 100644
--- a/src/rtmidi_midi.cpp
+++ b/src/sound/midi_rtmidi.cpp
@@ -30,8 +30,9 @@
extern "C"
{
#include <86box/86box.h>
+#include <86box/device.h>
#include <86box/midi.h>
-#include <86box/plat_midi.h>
+#include <86box/midi_rtmidi.h>
#include <86box/config.h>
@@ -42,19 +43,43 @@ static const int midi_lengths[8] = {3, 3, 3, 3, 2, 2, 3, 1};
int
-plat_midi_write(uint8_t val)
+rtmidi_write(uint8_t val)
{
return 0;
}
-void plat_midi_init(void)
+void
+rtmidi_play_msg(uint8_t *msg)
{
+ if (midiout)
+ midiout->sendMessage(msg, midi_lengths[(msg[0] >> 4) & 7]);
+}
+
+
+void
+rtmidi_play_sysex(uint8_t *sysex, unsigned int len)
+{
+ if (midiout)
+ midiout->sendMessage(sysex, len);
+}
+
+
+void*
+rtmidi_init(const device_t *info)
+{
+ midi_device_t* dev = (midi_device_t*)malloc(sizeof(midi_device_t));
+ memset(dev, 0, sizeof(midi_device_t));
+
+ dev->play_msg = rtmidi_play_msg;
+ dev->play_sysex = rtmidi_play_sysex;
+ dev->write = rtmidi_write;
+
try {
if (!midiout) midiout = new RtMidiOut;
} catch (RtMidiError& error) {
- pclog("Failed to initialize MIDI output: %s\n", error.getMessage().c_str());
- return;
+ pclog("Failed to initialize MIDI output: %s\n", error.getMessage().c_str());
+ return nullptr;
}
midi_out_id = config_get_int((char*)SYSTEM_MIDI_NAME, (char*)"midi", 0);
@@ -70,14 +95,18 @@ void plat_midi_init(void)
pclog("Failed to initialize MIDI output: %s\n", error.getMessage().c_str());
delete midiout;
midiout = nullptr;
- return;
+ return nullptr;
}
}
+
+ midi_init(dev);
+
+ return dev;
}
void
-plat_midi_close(void)
+rtmidi_close(void *p)
{
if (!midiout)
return;
@@ -86,11 +115,13 @@ plat_midi_close(void)
delete midiout;
midiout = nullptr;
+
+ midi_close();
}
int
-plat_midi_get_num_devs(void)
+rtmidi_get_num_devs(void)
{
if (!midiout) {
try {
@@ -105,30 +136,14 @@ plat_midi_get_num_devs(void)
void
-plat_midi_play_msg(uint8_t *msg)
-{
- if (midiout)
- midiout->sendMessage(msg, midi_lengths[(msg[0] >> 4) & 7]);
-}
-
-
-void
-plat_midi_get_dev_name(int num, char *s)
+rtmidi_get_dev_name(int num, char *s)
{
strcpy(s, midiout->getPortName(num).c_str());
}
void
-plat_midi_play_sysex(uint8_t *sysex, unsigned int len)
-{
- if (midiout)
- midiout->sendMessage(sysex, len);
-}
-
-
-static void
-plat_midi_callback(double timeStamp, std::vector *message, void *userData)
+rtmidi_input_callback(double timeStamp, std::vector *message, void *userData)
{
if (message->size() <= 3)
midi_in_msg(message->data());
@@ -137,15 +152,18 @@ plat_midi_callback(double timeStamp, std::vector *message, void *
}
-void
-plat_midi_input_init(void)
+void*
+rtmidi_input_init(const device_t *info)
{
+ midi_device_t* dev = (midi_device_t*)malloc(sizeof(midi_device_t));
+ memset(dev, 0, sizeof(midi_device_t));
+
try {
if (!midiin)
midiin = new RtMidiIn;
} catch (RtMidiError& error) {
pclog("Failed to initialize MIDI input: %s\n", error.getMessage().c_str());
- return;
+ return nullptr;
}
midi_in_id = config_get_int((char*)SYSTEM_MIDI_NAME, (char*)"midi_input", 0);
@@ -161,16 +179,24 @@ plat_midi_input_init(void)
pclog("Failed to initialize MIDI input: %s\n", error.getMessage().c_str());
delete midiin;
midiin = nullptr;
- return;
+ return nullptr;
}
}
- midiin->setCallback(plat_midi_callback);
+ midiin->setCallback(rtmidi_input_callback);
+
+ midi_in_init(dev, &midi_in);
+
+ midi_in->midi_realtime = device_get_config_int("realtime");
+ midi_in->thruchan = device_get_config_int("thruchan");
+ midi_in->midi_clockout = device_get_config_int("clockout");
+
+ return dev;
}
void
-plat_midi_input_close(void)
+rtmidi_input_close(void* p)
{
midiin->cancelCallback();
midiin->closePort();
@@ -178,12 +204,12 @@ plat_midi_input_close(void)
delete midiin;
midiin = nullptr;
- return;
+ midi_close();
}
int
-plat_midi_in_get_num_devs(void)
+rtmidi_in_get_num_devs(void)
{
if (!midiin) {
try {
@@ -198,9 +224,65 @@ plat_midi_in_get_num_devs(void)
void
-plat_midi_in_get_dev_name(int num, char *s)
+rtmidi_in_get_dev_name(int num, char *s)
{
strcpy(s, midiin->getPortName(num).c_str());
}
+static const device_config_t system_midi_config[] =
+{
+ {
+ "midi", "MIDI out device", CONFIG_MIDI, "", 0
+ },
+ {
+ "", "", -1
+ }
+};
+
+static const device_config_t midi_input_config[] =
+{
+ {
+ "midi_input", "MIDI in device", CONFIG_MIDI_IN, "", 0
+ },
+ {
+ "realtime", "MIDI Real time", CONFIG_BINARY, "", 0
+ },
+ {
+ "thruchan", "MIDI Thru", CONFIG_BINARY, "", 1
+ },
+ {
+ "clockout", "MIDI Clockout", CONFIG_BINARY, "", 1
+ },
+ {
+ "", "", -1
+ }
+};
+
+const device_t rtmidi_device =
+{
+ SYSTEM_MIDI_NAME,
+ 0, 0,
+ rtmidi_init,
+ rtmidi_close,
+ NULL,
+ { rtmidi_get_num_devs },
+ NULL,
+ NULL,
+ system_midi_config
+};
+
+
+const device_t rtmidi_input_device =
+{
+ MIDI_INPUT_NAME,
+ 0, 0,
+ rtmidi_input_init,
+ rtmidi_input_close,
+ NULL,
+ { rtmidi_in_get_num_devs },
+ NULL,
+ NULL,
+ midi_input_config
+};
+
}
diff --git a/src/sound/midi_system.c b/src/sound/midi_system.c
deleted file mode 100644
index 1a577d932..000000000
--- a/src/sound/midi_system.c
+++ /dev/null
@@ -1,139 +0,0 @@
-#include
-#include
-#include
-#include
-#include
-#include <86box/86box.h>
-#include <86box/device.h>
-#include <86box/plat.h>
-#include <86box/plat_midi.h>
-#include <86box/midi.h>
-#include <86box/midi_input.h>
-
-
-void* system_midi_init(const device_t *info)
-{
- midi_device_t* dev = malloc(sizeof(midi_device_t));
- memset(dev, 0, sizeof(midi_device_t));
-
- dev->play_msg = plat_midi_play_msg;
- dev->play_sysex = plat_midi_play_sysex;
- dev->write = plat_midi_write;
-
- plat_midi_init();
-
- midi_init(dev);
-
- return dev;
-}
-
-void* midi_input_init(const device_t *info)
-{
- midi_device_t* dev = malloc(sizeof(midi_device_t));
- memset(dev, 0, sizeof(midi_device_t));
-
- plat_midi_input_init();
-
- midi_in_init(dev, &midi_in);
-
- midi_in->midi_realtime = device_get_config_int("realtime");
- midi_in->thruchan = device_get_config_int("thruchan");
- midi_in->midi_clockout = device_get_config_int("clockout");
-
- return dev;
-}
-
-void system_midi_close(void* p)
-{
- plat_midi_close();
-
- midi_close();
-}
-
-void midi_input_close(void* p)
-{
- plat_midi_input_close();
-
- midi_close();
-}
-
-int system_midi_available(void)
-{
- return plat_midi_get_num_devs();
-}
-
-int midi_input_available(void)
-{
- return plat_midi_in_get_num_devs();
-}
-
-static const device_config_t system_midi_config[] =
-{
- {
- .name = "midi",
- .description = "MIDI out device",
- .type = CONFIG_MIDI,
- .default_int = 0
- },
- {
- .type = -1
- }
-};
-
-static const device_config_t midi_input_config[] =
-{
- {
- .name = "midi_input",
- .description = "MIDI in device",
- .type = CONFIG_MIDI_IN,
- .default_int = 0
- },
- {
- .name = "realtime",
- .description = "MIDI Real time",
- .type = CONFIG_BINARY,
- .default_int = 0
- },
- {
- .name = "thruchan",
- .description = "MIDI Thru",
- .type = CONFIG_BINARY,
- .default_int = 1
- },
- {
- .name = "clockout",
- .description = "MIDI Clockout",
- .type = CONFIG_BINARY,
- .default_int = 1
- },
- {
- .type = -1
- }
-};
-
-const device_t system_midi_device =
-{
- SYSTEM_MIDI_NAME,
- 0, 0,
- system_midi_init,
- system_midi_close,
- NULL,
- { system_midi_available },
- NULL,
- NULL,
- system_midi_config
-};
-
-
-const device_t midi_input_device =
-{
- MIDI_INPUT_NAME,
- 0, 0,
- midi_input_init,
- midi_input_close,
- NULL,
- { midi_input_available },
- NULL,
- NULL,
- midi_input_config
-};
\ No newline at end of file
diff --git a/src/unix/CMakeLists.txt b/src/unix/CMakeLists.txt
index 22a424a3a..85961f920 100644
--- a/src/unix/CMakeLists.txt
+++ b/src/unix/CMakeLists.txt
@@ -1,32 +1,4 @@
-if (${CMAKE_SYSTEM_NAME} MATCHES "Linux")
- find_package(ALSA)
- if (ALSA_FOUND)
- set(PLAT_SOURCES linux_midi_alsa.c)
- else()
- set(PLAT_SOURCES unix_midi.c)
- endif()
-else()
- set(PLAT_SOURCES unix_midi.c)
-endif()
-add_library(plat STATIC ${PLAT_SOURCES})
-add_library(ui STATIC unix.c unix_sdl.c unix_cdrom.c)
-target_compile_definitions(ui PUBLIC _FILE_OFFSET_BITS=64)
-target_link_libraries(ui dl)
-
-find_package(SDL2 REQUIRED)
-include_directories(${SDL2_INCLUDE_DIRS})
-if(MINGW)
- target_link_libraries(ui SDL2::SDL2-static)
-else()
- if (TARGET SDL2::SDL2)
- target_link_libraries(ui SDL2::SDL2)
- else()
- target_link_libraries(ui ${SDL2_LIBRARIES})
- endif()
-endif()
-if (ALSA_FOUND)
- target_link_libraries(plat ALSA::ALSA)
-endif()
+add_library(plat OBJECT unix.c)
if (NOT CPPTHREADS)
target_sources(plat PRIVATE unix_thread.c)
@@ -35,3 +7,7 @@ endif()
set(THREADS_PREFER_PTHREAD_FLAG TRUE)
find_package(Threads REQUIRED)
target_link_libraries(86Box Threads::Threads)
+
+add_library(ui OBJECT unix_sdl.c unix_cdrom.c)
+target_compile_definitions(ui PUBLIC _FILE_OFFSET_BITS=64)
+target_link_libraries(ui dl)
diff --git a/src/unix/linux_midi_alsa.c b/src/unix/linux_midi_alsa.c
deleted file mode 100644
index e3b009d6d..000000000
--- a/src/unix/linux_midi_alsa.c
+++ /dev/null
@@ -1,326 +0,0 @@
-#include
-#include <86box/86box.h>
-#include <86box/config.h>
-#include <86box/midi.h>
-#include <86box/plat.h>
-#include <86box/plat_midi.h>
-
-#define MAX_MIDI_DEVICES 128
-
-static struct
-{
- int card;
- int device;
- int sub;
- char name[50];
-} midi_devices[MAX_MIDI_DEVICES], midi_in_devices[MAX_MIDI_DEVICES];
-
-static int midi_device_count = 0, midi_in_device_count = 0;
-
-static int midi_queried = 0, midi_in_queried = 0;
-
-static snd_rawmidi_t *midiout = NULL, *midiin = NULL;
-
-static void plat_midi_query()
-{
- int status;
- int card = -1;
-
- midi_queried = 1;
-
- if ((status = snd_card_next(&card)) < 0)
- return;
-
- if (card < 0)
- return; /*No cards*/
-
- while (card >= 0)
- {
- char *shortname;
-
- if ((status = snd_card_get_name(card, &shortname)) >= 0)
- {
- snd_ctl_t *ctl;
- char name[32];
-
- sprintf(name, "hw:%i", card);
-
- if ((status = snd_ctl_open(&ctl, name, 0)) >= 0)
- {
- int device = -1;
-
- do
- {
- status = snd_ctl_rawmidi_next_device(ctl, &device);
- if (status >= 0 && device != -1)
- {
- snd_rawmidi_info_t *info;
- int sub_nr, sub;
-
- snd_rawmidi_info_alloca(&info);
- snd_rawmidi_info_set_device(info, device);
- snd_rawmidi_info_set_stream(info, SND_RAWMIDI_STREAM_OUTPUT);
- snd_ctl_rawmidi_info(ctl, info);
- sub_nr = snd_rawmidi_info_get_subdevices_count(info);
- //pclog("sub_nr=%i\n",sub_nr);
-
- for (sub = 0; sub < sub_nr; sub++)
- {
- snd_rawmidi_info_set_subdevice(info, sub);
-
- if (snd_ctl_rawmidi_info(ctl, info) == 0)
- {
- //pclog("%s: MIDI device=%i:%i:%i\n", shortname, card, device,sub);
-
- midi_devices[midi_device_count].card = card;
- midi_devices[midi_device_count].device = device;
- midi_devices[midi_device_count].sub = sub;
- snprintf(midi_devices[midi_device_count].name, 50, "%s (%i:%i:%i)", shortname, card, device, sub);
- midi_device_count++;
- if (midi_device_count >= MAX_MIDI_DEVICES)
- return;
- }
- }
- }
- } while (device >= 0);
- }
- }
-
- if (snd_card_next(&card) < 0)
- break;
- }
-}
-
-void plat_midi_init()
-{
- char portname[32];
- int midi_id;
-
- if (!midi_queried)
- plat_midi_query();
-
- midi_id = config_get_int(SYSTEM_MIDI_NAME, "midi", 0);
-
- sprintf(portname, "hw:%i,%i,%i", midi_devices[midi_id].card,
- midi_devices[midi_id].device,
- midi_devices[midi_id].sub);
- //pclog("Opening MIDI port %s\n", portname);
-
- if (snd_rawmidi_open(NULL, &midiout, portname, SND_RAWMIDI_SYNC) < 0)
- {
- //pclog("Failed to open MIDI\n");
- return;
- }
-}
-
-void plat_midi_close()
-{
- if (midiout != NULL)
- {
- snd_rawmidi_close(midiout);
- midiout = NULL;
- }
-}
-
-static int midi_pos, midi_len;
-static uint8_t midi_command[4];
-static int midi_lengths[8] = {3, 3, 3, 3, 2, 2, 3, 1};
-static int midi_insysex;
-static uint8_t midi_sysex_data[65536];
-
-int plat_midi_write(uint8_t val)
-{
- return 0;
-}
-
-void plat_midi_play_sysex(uint8_t *sysex, unsigned int len)
-{
- if (midiout)
- {
- snd_rawmidi_write(midiout, (const void*)sysex, (size_t)len);
- }
-}
-
-void plat_midi_play_msg(uint8_t *msg)
-{
- plat_midi_play_sysex(msg, midi_lengths[(msg[0] >> 4) & 7]);
-}
-
-int plat_midi_get_num_devs()
-{
- if (!midi_queried)
- plat_midi_query();
-
- return midi_device_count;
-}
-
-void plat_midi_get_dev_name(int num, char *s)
-{
- strcpy(s, midi_devices[num].name);
-}
-
-static void plat_midi_query_in()
-{
- int status;
- int card = -1;
-
- midi_in_queried = 1;
-
- if ((status = snd_card_next(&card)) < 0)
- return;
-
- if (card < 0)
- return; /*No cards*/
-
- while (card >= 0)
- {
- char *shortname;
-
- if ((status = snd_card_get_name(card, &shortname)) >= 0)
- {
- snd_ctl_t *ctl;
- char name[32];
-
- sprintf(name, "hw:%i", card);
-
- if ((status = snd_ctl_open(&ctl, name, 0)) >= 0)
- {
- int device = -1;
-
- do
- {
- status = snd_ctl_rawmidi_next_device(ctl, &device);
- if (status >= 0 && device != -1)
- {
- snd_rawmidi_info_t *info;
- int sub_nr, sub;
-
- snd_rawmidi_info_alloca(&info);
- snd_rawmidi_info_set_device(info, device);
- snd_rawmidi_info_set_stream(info, SND_RAWMIDI_STREAM_INPUT);
- snd_ctl_rawmidi_info(ctl, info);
- sub_nr = snd_rawmidi_info_get_subdevices_count(info);
- //pclog("sub_nr=%i\n",sub_nr);
-
- for (sub = 0; sub < sub_nr; sub++)
- {
- snd_rawmidi_info_set_subdevice(info, sub);
-
- if (snd_ctl_rawmidi_info(ctl, info) == 0)
- {
- //pclog("%s: MIDI device=%i:%i:%i\n", shortname, card, device,sub);
-
- midi_in_devices[midi_device_count].card = card;
- midi_in_devices[midi_device_count].device = device;
- midi_in_devices[midi_device_count].sub = sub;
- snprintf(midi_in_devices[midi_device_count].name, 50, "%s (%i:%i:%i)", shortname, card, device, sub);
- midi_in_device_count++;
- if (midi_in_device_count >= MAX_MIDI_DEVICES)
- return;
- }
- }
- }
- } while (device >= 0);
- }
- }
-
- if (snd_card_next(&card) < 0)
- break;
- }
-}
-mutex_t* midiinmtx = NULL;
-
-static void plat_midi_in_thread(void* param)
-{
- int sysexpos = 0;
- uint8_t midimsg[3];
- while(1)
- {
- thread_wait_mutex(midiinmtx);
- if (midiin == NULL)
- {
- thread_release_mutex(midiinmtx);
- break;
- }
- if (snd_rawmidi_read(midiin, midimsg, 1) > 0)
- {
- if (midimsg[0] == 0xF0)
- {
- MIDI_InSysexBuf[sysexpos++] = 0xF0;
- while(1)
- {
- snd_rawmidi_read(midiin, &MIDI_InSysexBuf[sysexpos++], 1);
- if (MIDI_InSysexBuf[sysexpos - 1] == 0xF7)
- {
- midi_in_sysex(MIDI_InSysexBuf, sysexpos);
- }
- }
- }
- else if (midimsg[0] & 0x80)
- {
- int lengthofmsg = midi_lengths[(midimsg[0] >> 4) & 7] - 1;
- snd_rawmidi_read(midiin, midimsg + 1, lengthofmsg);
- midi_in_msg(midimsg);
- }
- }
- thread_release_mutex(midiinmtx);
- }
-}
-
-void plat_midi_input_init(void)
-{
- char portname[32];
- int midi_id;
- snd_rawmidi_params_t* params;
- int err;
-
- snd_rawmidi_params_malloc(¶ms);
- if (!params) return;
- if (!midi_in_queried)
- plat_midi_query_in();
-
-
- midi_id = config_get_int(MIDI_INPUT_NAME, "midi_input", 0);
-
- sprintf(portname, "hw:%i,%i,%i", midi_in_devices[midi_id].card,
- midi_in_devices[midi_id].device,
- midi_in_devices[midi_id].sub);
- //pclog("Opening MIDI port %s\n", portname);
-
- if (snd_rawmidi_open(NULL, &midiin, portname, SND_RAWMIDI_NONBLOCK) < 0)
- {
- //pclog("Failed to open MIDI\n");
- return;
- }
- midiin = thread_create_mutex();
- thread_create(plat_midi_in_thread, NULL);
-}
-
-void plat_midi_input_close(void)
-{
- if (midiinmtx) thread_wait_mutex(midiinmtx);
- if (midiin != NULL)
- {
- snd_rawmidi_close(midiin);
- midiin = NULL;
- }
- if (midiinmtx)
- {
- thread_release_mutex(midiinmtx);
- thread_close_mutex(midiinmtx);
- }
- midiinmtx = NULL;
-}
-
-int plat_midi_in_get_num_devs(void)
-{
- if (!midi_queried)
- plat_midi_query_in();
-
- return midi_in_device_count;
-}
-
-void plat_midi_in_get_dev_name(int num, char *s)
-{
- strcpy(s, midi_in_devices[num].name);
-}
diff --git a/src/unix/unix_midi.c b/src/unix/unix_midi.c
deleted file mode 100644
index c92820bef..000000000
--- a/src/unix/unix_midi.c
+++ /dev/null
@@ -1,57 +0,0 @@
-#include
-void plat_midi_init(void)
-{
-
-}
-
-void plat_midi_close(void)
-{
-
-}
-
-void plat_midi_play_msg(uint8_t *msg)
-{
-
-}
-
-void plat_midi_play_sysex(uint8_t *sysex, unsigned int len)
-{
-
-}
-
-int plat_midi_write(uint8_t val)
-{
- return 0;
-}
-
-int plat_midi_get_num_devs(void)
-{
- return 0;
-}
-
-void plat_midi_get_dev_name(int num, char *s)
-{
- s[0] = ' ';
- s[1] = 0;
-}
-
-void plat_midi_input_init(void)
-{
-
-}
-
-void plat_midi_input_close(void)
-{
-
-}
-
-int plat_midi_in_get_num_devs(void)
-{
- return 0;
-}
-
-void plat_midi_in_get_dev_name(int num, char *s)
-{
- s[0] = ' ';
- s[1] = 0;
-}
\ No newline at end of file
diff --git a/src/win/Makefile.mingw b/src/win/Makefile.mingw
index d7a676713..6a596beae 100644
--- a/src/win/Makefile.mingw
+++ b/src/win/Makefile.mingw
@@ -475,7 +475,7 @@ CXXFLAGS := $(CFLAGS)
#########################################################################
MAINOBJ := 86box.o config.o log.o random.o timer.o io.o acpi.o apm.o dma.o ddma.o \
nmi.o pic.o pit.o port_6x.o port_92.o ppi.o pci.o mca.o \
- usb.o device.o nvr.o nvr_at.o nvr_ps2.o rtmidi_midi.o \
+ usb.o device.o nvr.o nvr_at.o nvr_ps2.o \
$(VNCOBJ)
MEMOBJ := catalyst_flash.o i2c_eeprom.o intel_flash.o mem.o rom.o smram.o spd.o sst_flash.o
@@ -617,7 +617,7 @@ SNDOBJ := sound.o \
wave6581_P_T.o wave6581_PS_.o wave6581_PST.o \
wave8580__ST.o wave8580_P_T.o wave8580_PS_.o \
wave8580_PST.o wave.o \
- midi.o midi_system.o \
+ midi.o midi_rtmidi.o \
snd_speaker.o \
snd_pssj.o \
snd_lpt_dac.o snd_lpt_dss.o \
diff --git a/src/win/win.c b/src/win/win.c
index 650e43ba8..9298aa7fd 100644
--- a/src/win/win.c
+++ b/src/win/win.c
@@ -46,7 +46,6 @@
#include <86box/video.h>
#define GLOBAL
#include <86box/plat.h>
-#include <86box/plat_midi.h>
#include <86box/ui.h>
#ifdef USE_VNC
# include <86box/vnc.h>
diff --git a/src/win/win_devconf.c b/src/win/win_devconf.c
index 0ca76c8d8..4f4ddc639 100644
--- a/src/win/win_devconf.c
+++ b/src/win/win_devconf.c
@@ -25,7 +25,7 @@
#include <86box/config.h>
#include <86box/device.h>
#include <86box/plat.h>
-#include <86box/plat_midi.h>
+#include <86box/midi_rtmidi.h>
#include <86box/ui.h>
#include <86box/win.h>
#include
@@ -97,9 +97,9 @@ deviceconfig_dlgproc(HWND hdlg, UINT message, WPARAM wParam, LPARAM lParam)
val_int = config_get_int((char *) config_device.name,
(char *) config->name, config->default_int);
- num = plat_midi_get_num_devs();
+ num = rtmidi_get_num_devs();
for (c = 0; c < num; c++) {
- plat_midi_get_dev_name(c, s);
+ rtmidi_get_dev_name(c, s);
mbstowcs(lptsTemp, s, strlen(s) + 1);
SendMessage(h, CB_ADDSTRING, 0, (LPARAM)(LPCSTR)lptsTemp);
if (val_int == c)
@@ -112,9 +112,9 @@ deviceconfig_dlgproc(HWND hdlg, UINT message, WPARAM wParam, LPARAM lParam)
val_int = config_get_int((char *) config_device.name,
(char *) config->name, config->default_int);
- num = plat_midi_in_get_num_devs();
+ num = rtmidi_in_get_num_devs();
for (c = 0; c < num; c++) {
- plat_midi_in_get_dev_name(c, s);
+ rtmidi_in_get_dev_name(c, s);
mbstowcs(lptsTemp, s, strlen(s) + 1);
SendMessage(h, CB_ADDSTRING, 0, (LPARAM)(LPCSTR)lptsTemp);
if (val_int == c)
diff --git a/src/win/win_settings.c b/src/win/win_settings.c
index 5d977ba1d..da91c271d 100644
--- a/src/win/win_settings.c
+++ b/src/win/win_settings.c
@@ -64,7 +64,6 @@
#include <86box/snd_mpu401.h>
#include <86box/video.h>
#include <86box/plat.h>
-#include <86box/plat_midi.h>
#include <86box/ui.h>
#include <86box/win.h>
#include "../disk/minivhd/minivhd.h"
diff --git a/src/win/win_ui.c b/src/win/win_ui.c
index 703e3e414..5b1e8b809 100644
--- a/src/win/win_ui.c
+++ b/src/win/win_ui.c
@@ -39,7 +39,6 @@
#include <86box/nvr.h>
#include <86box/video.h>
#include <86box/vid_ega.h> // for update_overscan
-#include <86box/plat_midi.h>
#include <86box/plat_dynld.h>
#include <86box/ui.h>
#include <86box/win.h>
From 153ac6df9a7731fcbe5ba1389e8380f64d58f921 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?David=20Hrdli=C4=8Dka?=
Date: Fri, 17 Dec 2021 18:32:11 +0100
Subject: [PATCH 19/27] Use recursive mutexes in the C++ thread implementation
---
src/cpp11_thread.cpp | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/src/cpp11_thread.cpp b/src/cpp11_thread.cpp
index 96eb4a2e1..02bd87143 100644
--- a/src/cpp11_thread.cpp
+++ b/src/cpp11_thread.cpp
@@ -41,7 +41,7 @@ thread_wait(thread_t *arg, int timeout)
mutex_t *
thread_create_mutex(void)
{
- auto mutex = new std::mutex;
+ auto mutex = new std::recursive_mutex;
return mutex;
}
@@ -50,7 +50,7 @@ thread_wait_mutex(mutex_t *_mutex)
{
if (_mutex == nullptr)
return(0);
- auto mutex = reinterpret_cast(_mutex);
+ auto mutex = reinterpret_cast(_mutex);
mutex->lock();
return 1;
}
@@ -61,7 +61,7 @@ thread_release_mutex(mutex_t *_mutex)
{
if (_mutex == nullptr)
return(0);
- auto mutex = reinterpret_cast(_mutex);
+ auto mutex = reinterpret_cast(_mutex);
mutex->unlock();
return 1;
}
@@ -70,7 +70,7 @@ thread_release_mutex(mutex_t *_mutex)
void
thread_close_mutex(mutex_t *_mutex)
{
- auto mutex = reinterpret_cast(_mutex);
+ auto mutex = reinterpret_cast(_mutex);
delete mutex;
}
From 9c7a3477aa9ffec2d10ee0b89e11dcee87c9d642 Mon Sep 17 00:00:00 2001
From: OBattler
Date: Fri, 17 Dec 2021 18:48:13 +0100
Subject: [PATCH 20/27] Proper reimplementation of C++11 thread event signaling
and the network code now uses an atomic instead of mutexes for wait.
---
src/cpp11_thread.cpp | 22 ++++++++++++----------
src/network/net_pcap.c | 8 +++++---
src/network/network.c | 9 +++------
3 files changed, 20 insertions(+), 19 deletions(-)
diff --git a/src/cpp11_thread.cpp b/src/cpp11_thread.cpp
index 02bd87143..1f5dd4d2b 100644
--- a/src/cpp11_thread.cpp
+++ b/src/cpp11_thread.cpp
@@ -1,6 +1,7 @@
#include
#include
#include
+#include
#include <86box/plat.h>
@@ -77,25 +78,25 @@ thread_close_mutex(mutex_t *_mutex)
event_t *
thread_create_event()
{
- auto ev = new event_cpp11_t;
- return ev;
+ auto event = new event_cpp11_t;
+ return event;
}
int
thread_wait_event(event_t *handle, int timeout)
{
auto event = reinterpret_cast(handle);
- auto lock = std::unique_lock(event->mutex);
+ std::unique_lock lock(event->mutex);
if (timeout < 0) {
- event->cond.wait(lock, [event] { return event->state; });
+ event->cond.wait(lock, [event] { return (event->state == true); });
} else {
auto to = std::chrono::system_clock::now() + std::chrono::milliseconds(timeout);
std::cv_status status;
do {
status = event->cond.wait_until(lock, to);
- } while ((status != std::cv_status::timeout) && !event->state);
+ } while ((status != std::cv_status::timeout) && (event->state == false));
if (status == std::cv_status::timeout) {
return 1;
@@ -108,10 +109,9 @@ void
thread_set_event(event_t *handle)
{
auto event = reinterpret_cast(handle);
- {
- auto lock = std::unique_lock(event->mutex);
- event->state = true;
- }
+ std::lock_guard lock(event->mutex);
+
+ event->state = true;
event->cond.notify_all();
}
@@ -119,8 +119,10 @@ void
thread_reset_event(event_t *handle)
{
auto event = reinterpret_cast(handle);
- auto lock = std::unique_lock(event->mutex);
+ std::lock_guard lock(event->mutex);
+
event->state = false;
+ // event->cond.notify_all();
}
void
diff --git a/src/network/net_pcap.c b/src/network/net_pcap.c
index ba56cebfb..ccdbb3c10 100644
--- a/src/network/net_pcap.c
+++ b/src/network/net_pcap.c
@@ -172,6 +172,7 @@ poll_thread(void *arg)
thread_set_event(poll_state);
/* Create a waitable event. */
+ pcap_log("PCAP: Creating event...\n");
evt = thread_create_event();
/* As long as the channel is open.. */
@@ -185,8 +186,6 @@ poll_thread(void *arg)
if (pcap == NULL)
break;
- /* Wait for the next packet to arrive. */
- tx = network_tx_queue_check();
if (network_get_wait() || (poll_card->set_link_state && poll_card->set_link_state(poll_card->priv)) || (poll_card->wait && poll_card->wait(poll_card->priv)))
data = NULL;
else
@@ -208,11 +207,14 @@ poll_thread(void *arg)
}
}
+ /* Wait for the next packet to arrive. */
+ tx = network_tx_queue_check();
+
if (tx)
network_do_tx();
/* If we did not get anything, wait a while. */
- if ((data == NULL) && !tx)
+ if (!tx)
thread_wait_event(evt, 10);
/* Release ownership of the device. */
diff --git a/src/network/network.c b/src/network/network.c
index b545b08ca..0e7f16bac 100644
--- a/src/network/network.c
+++ b/src/network/network.c
@@ -49,6 +49,7 @@
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include
+#include
#include
#include
#include
@@ -107,7 +108,7 @@ int nic_do_log = ENABLE_NIC_LOG;
/* Local variables. */
-static volatile int net_wait = 0;
+static volatile atomic_int net_wait = 0;
static mutex_t *network_mutex;
static uint8_t *network_mac;
static uint8_t network_timer_active = 0;
@@ -388,8 +389,8 @@ network_attach(void *dev, uint8_t *mac, NETRXCB rx, NETWAITCB wait, NETSETLINKST
network_set_wait(0);
/* Create the network events. */
- poll_data.wake_poll_thread = thread_create_event();
poll_data.poll_complete = thread_create_event();
+ poll_data.wake_poll_thread = thread_create_event();
/* Activate the platform module. */
switch(network_type) {
@@ -671,9 +672,7 @@ network_card_get_from_internal_name(char *s)
void
network_set_wait(int wait)
{
- network_wait(1);
net_wait = wait;
- network_wait(0);
}
@@ -682,8 +681,6 @@ network_get_wait(void)
{
int ret;
- network_wait(1);
ret = net_wait;
- network_wait(0);
return ret;
}
From 0131550432f7b3f8e4e59efaf397be70f736f893 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?David=20Hrdli=C4=8Dka?=
Date: Fri, 17 Dec 2021 18:51:16 +0100
Subject: [PATCH 21/27] Revert "Use recursive mutexes in the C++ thread
implementation"
This reverts commit 153ac6df9a7731fcbe5ba1389e8380f64d58f921.
---
src/cpp11_thread.cpp | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/src/cpp11_thread.cpp b/src/cpp11_thread.cpp
index 1f5dd4d2b..071c013a1 100644
--- a/src/cpp11_thread.cpp
+++ b/src/cpp11_thread.cpp
@@ -42,7 +42,7 @@ thread_wait(thread_t *arg, int timeout)
mutex_t *
thread_create_mutex(void)
{
- auto mutex = new std::recursive_mutex;
+ auto mutex = new std::mutex;
return mutex;
}
@@ -51,7 +51,7 @@ thread_wait_mutex(mutex_t *_mutex)
{
if (_mutex == nullptr)
return(0);
- auto mutex = reinterpret_cast(_mutex);
+ auto mutex = reinterpret_cast(_mutex);
mutex->lock();
return 1;
}
@@ -62,7 +62,7 @@ thread_release_mutex(mutex_t *_mutex)
{
if (_mutex == nullptr)
return(0);
- auto mutex = reinterpret_cast(_mutex);
+ auto mutex = reinterpret_cast(_mutex);
mutex->unlock();
return 1;
}
@@ -71,7 +71,7 @@ thread_release_mutex(mutex_t *_mutex)
void
thread_close_mutex(mutex_t *_mutex)
{
- auto mutex = reinterpret_cast(_mutex);
+ auto mutex = reinterpret_cast(_mutex);
delete mutex;
}
From 8996a61ba45825638764576fe524a4d420e9455e Mon Sep 17 00:00:00 2001
From: OBattler
Date: Fri, 17 Dec 2021 18:57:22 +0100
Subject: [PATCH 22/27] And one last fix.
---
src/cpp11_thread.cpp | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/cpp11_thread.cpp b/src/cpp11_thread.cpp
index 071c013a1..914ee1728 100644
--- a/src/cpp11_thread.cpp
+++ b/src/cpp11_thread.cpp
@@ -122,7 +122,7 @@ thread_reset_event(event_t *handle)
std::lock_guard lock(event->mutex);
event->state = false;
- // event->cond.notify_all();
+ event->cond.notify_all();
}
void
From 57f879ba0b2b964844b02efe37c65fe8d4fb12f0 Mon Sep 17 00:00:00 2001
From: OBattler
Date: Fri, 17 Dec 2021 19:11:02 +0100
Subject: [PATCH 23/27] No notify on reset event.
---
src/cpp11_thread.cpp | 1 -
1 file changed, 1 deletion(-)
diff --git a/src/cpp11_thread.cpp b/src/cpp11_thread.cpp
index 914ee1728..2b56ae2f6 100644
--- a/src/cpp11_thread.cpp
+++ b/src/cpp11_thread.cpp
@@ -122,7 +122,6 @@ thread_reset_event(event_t *handle)
std::lock_guard lock(event->mutex);
event->state = false;
- event->cond.notify_all();
}
void
From ea88934c214364b7dd09508201b69840aec18d4e Mon Sep 17 00:00:00 2001
From: OBattler
Date: Fri, 17 Dec 2021 19:14:28 +0100
Subject: [PATCH 24/27] Unique lock on event set and reset.
---
src/cpp11_thread.cpp | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/src/cpp11_thread.cpp b/src/cpp11_thread.cpp
index 2b56ae2f6..3185e574d 100644
--- a/src/cpp11_thread.cpp
+++ b/src/cpp11_thread.cpp
@@ -109,7 +109,7 @@ void
thread_set_event(event_t *handle)
{
auto event = reinterpret_cast(handle);
- std::lock_guard lock(event->mutex);
+ std::unique_lock lock(event->mutex);
event->state = true;
event->cond.notify_all();
@@ -119,7 +119,7 @@ void
thread_reset_event(event_t *handle)
{
auto event = reinterpret_cast(handle);
- std::lock_guard lock(event->mutex);
+ std::unique_lock lock(event->mutex);
event->state = false;
}
From 64c38701c6d6088c80395c197949aa07b4842078 Mon Sep 17 00:00:00 2001
From: OBattler
Date: Fri, 17 Dec 2021 19:15:40 +0100
Subject: [PATCH 25/27] Might as well revert it completely.
---
src/cpp11_thread.cpp | 21 ++++++++++-----------
1 file changed, 10 insertions(+), 11 deletions(-)
diff --git a/src/cpp11_thread.cpp b/src/cpp11_thread.cpp
index 3185e574d..96eb4a2e1 100644
--- a/src/cpp11_thread.cpp
+++ b/src/cpp11_thread.cpp
@@ -1,7 +1,6 @@
#include
#include
#include
-#include
#include <86box/plat.h>
@@ -78,25 +77,25 @@ thread_close_mutex(mutex_t *_mutex)
event_t *
thread_create_event()
{
- auto event = new event_cpp11_t;
- return event;
+ auto ev = new event_cpp11_t;
+ return ev;
}
int
thread_wait_event(event_t *handle, int timeout)
{
auto event = reinterpret_cast(handle);
- std::unique_lock lock(event->mutex);
+ auto lock = std::unique_lock(event->mutex);
if (timeout < 0) {
- event->cond.wait(lock, [event] { return (event->state == true); });
+ event->cond.wait(lock, [event] { return event->state; });
} else {
auto to = std::chrono::system_clock::now() + std::chrono::milliseconds(timeout);
std::cv_status status;
do {
status = event->cond.wait_until(lock, to);
- } while ((status != std::cv_status::timeout) && (event->state == false));
+ } while ((status != std::cv_status::timeout) && !event->state);
if (status == std::cv_status::timeout) {
return 1;
@@ -109,9 +108,10 @@ void
thread_set_event(event_t *handle)
{
auto event = reinterpret_cast(handle);
- std::unique_lock lock(event->mutex);
-
- event->state = true;
+ {
+ auto lock = std::unique_lock(event->mutex);
+ event->state = true;
+ }
event->cond.notify_all();
}
@@ -119,8 +119,7 @@ void
thread_reset_event(event_t *handle)
{
auto event = reinterpret_cast(handle);
- std::unique_lock lock(event->mutex);
-
+ auto lock = std::unique_lock(event->mutex);
event->state = false;
}
From 149c67335a6a702c07623075634262e150954edd Mon Sep 17 00:00:00 2001
From: OBattler
Date: Fri, 17 Dec 2021 19:23:46 +0100
Subject: [PATCH 26/27] Added a sanity check to the PCap code.
---
src/network/net_pcap.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/src/network/net_pcap.c b/src/network/net_pcap.c
index ccdbb3c10..7008d1442 100644
--- a/src/network/net_pcap.c
+++ b/src/network/net_pcap.c
@@ -226,7 +226,8 @@ poll_thread(void *arg)
thread_destroy_event(evt);
pcap_log("PCAP: polling stopped.\n");
- thread_set_event(poll_state);
+ if (poll_state != NULL)
+ thread_set_event(poll_state);
}
From 7381ab69282f0b8158c39ae86aca379901d26f71 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?David=20Hrdli=C4=8Dka?=
Date: Fri, 17 Dec 2021 19:59:25 +0100
Subject: [PATCH 27/27] Minor changes to threading
- Renamed `cpp11_thread.cpp` to `thread.cpp`
- Removed features that are only supported by Win32 threads (`thread_wait` with timeout and mutex with spinlock)
- Fixed formatting in `thread.cpp`
---
src/CMakeLists.txt | 2 +-
src/include/86box/plat.h | 3 +--
src/sound/midi_fluidsynth.c | 2 +-
src/sound/midi_mt32.c | 2 +-
src/sound/sound.c | 2 +-
src/{cpp11_thread.cpp => thread.cpp} | 18 ++++++------------
src/unix/unix_thread.c | 12 ++----------
src/video/vid_ati_mach64.c | 2 +-
src/video/vid_mga.c | 2 +-
src/video/vid_pgc.c | 2 +-
src/video/vid_s3_virge.c | 2 +-
src/video/vid_voodoo.c | 14 +++++++-------
src/video/video.c | 2 +-
src/win/Makefile.mingw | 2 +-
src/win/win_opengl.c | 2 +-
src/win/win_thread.c | 18 ++----------------
16 files changed, 29 insertions(+), 58 deletions(-)
rename src/{cpp11_thread.cpp => thread.cpp} (88%)
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 1d508b248..a901fce06 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -39,7 +39,7 @@ add_executable(86Box WIN32 MACOSX_BUNDLE 86box.c config.c log.c random.c timer.c
device.c nvr.c nvr_at.c nvr_ps2.c ${APP_ICON_MACOSX})
if(CPPTHREADS)
- target_sources(86Box PRIVATE cpp11_thread.cpp)
+ target_sources(86Box PRIVATE thread.cpp)
endif()
if(APPLE)
diff --git a/src/include/86box/plat.h b/src/include/86box/plat.h
index ca116a684..2fd4574ce 100644
--- a/src/include/86box/plat.h
+++ b/src/include/86box/plat.h
@@ -165,7 +165,7 @@ typedef void event_t;
typedef void mutex_t;
extern thread_t *thread_create(void (*thread_func)(void *param), void *param);
-extern int thread_wait(thread_t *arg, int timeout);
+extern int thread_wait(thread_t *arg);
extern event_t *thread_create_event(void);
extern void thread_set_event(event_t *arg);
extern void thread_reset_event(event_t *arg);
@@ -175,7 +175,6 @@ extern void thread_destroy_event(event_t *arg);
#define MUTEX_DEFAULT_SPIN_COUNT 1024
extern mutex_t *thread_create_mutex(void);
-extern mutex_t *thread_create_mutex_with_spin_count(unsigned int spin_count);
extern void thread_close_mutex(mutex_t *arg);
extern int thread_wait_mutex(mutex_t *arg);
extern int thread_release_mutex(mutex_t *mutex);
diff --git a/src/sound/midi_fluidsynth.c b/src/sound/midi_fluidsynth.c
index 283188fef..a93618cd4 100644
--- a/src/sound/midi_fluidsynth.c
+++ b/src/sound/midi_fluidsynth.c
@@ -346,7 +346,7 @@ void fluidsynth_close(void* p)
data->on = 0;
thread_set_event(data->event);
- thread_wait(data->thread_h, -1);
+ thread_wait(data->thread_h);
if (data->synth) {
f_delete_fluid_synth(data->synth);
diff --git a/src/sound/midi_mt32.c b/src/sound/midi_mt32.c
index c41942574..8ade99b51 100644
--- a/src/sound/midi_mt32.c
+++ b/src/sound/midi_mt32.c
@@ -240,7 +240,7 @@ void mt32_close(void* p)
mt32_on = 0;
thread_set_event(event);
- thread_wait(thread_h, -1);
+ thread_wait(thread_h);
event = NULL;
start_event = NULL;
diff --git a/src/sound/sound.c b/src/sound/sound.c
index b223e706a..4ab9cf58e 100644
--- a/src/sound/sound.c
+++ b/src/sound/sound.c
@@ -506,7 +506,7 @@ sound_cd_thread_end(void)
sound_log("Waiting for CD Audio thread to terminate...\n");
thread_set_event(sound_cd_event);
- thread_wait(sound_cd_thread_h, -1);
+ thread_wait(sound_cd_thread_h);
sound_log("CD Audio thread terminated...\n");
if (sound_cd_event) {
diff --git a/src/cpp11_thread.cpp b/src/thread.cpp
similarity index 88%
rename from src/cpp11_thread.cpp
rename to src/thread.cpp
index 96eb4a2e1..4134befba 100644
--- a/src/cpp11_thread.cpp
+++ b/src/thread.cpp
@@ -17,22 +17,14 @@ thread_t *
thread_create(void (*thread_rout)(void *param), void *param)
{
auto thread = new std::thread([thread_rout, param] {
- thread_rout(param);
+ thread_rout(param);
});
return thread;
}
-mutex_t *
-thread_create_mutex_with_spin_count(unsigned int spin_count)
-{
- /* Setting spin count of a mutex is not possible with pthreads. */
- return thread_create_mutex();
-}
-
int
-thread_wait(thread_t *arg, int timeout)
+thread_wait(thread_t *arg)
{
- (void) timeout;
auto thread = reinterpret_cast(arg);
thread->join();
return 0;
@@ -49,7 +41,8 @@ int
thread_wait_mutex(mutex_t *_mutex)
{
if (_mutex == nullptr)
- return(0);
+ return 0;
+
auto mutex = reinterpret_cast(_mutex);
mutex->lock();
return 1;
@@ -60,7 +53,8 @@ int
thread_release_mutex(mutex_t *_mutex)
{
if (_mutex == nullptr)
- return(0);
+ return 0;
+
auto mutex = reinterpret_cast(_mutex);
mutex->unlock();
return 1;
diff --git a/src/unix/unix_thread.c b/src/unix/unix_thread.c
index f045d2820..564b1943b 100644
--- a/src/unix/unix_thread.c
+++ b/src/unix/unix_thread.c
@@ -53,9 +53,9 @@ thread_create(void (*thread_rout)(void *param), void *param)
int
-thread_wait(thread_t *arg, int timeout)
+thread_wait(thread_t *arg)
{
- return pthread_join(*(pthread_t*)(arg), NULL) != 0;
+ return pthread_join(*(pthread_t*)(arg), NULL);
}
@@ -144,14 +144,6 @@ thread_create_mutex(void)
}
-mutex_t *
-thread_create_mutex_with_spin_count(unsigned int spin_count)
-{
- /* Setting spin count of a mutex is not possible with pthreads. */
- return thread_create_mutex();
-}
-
-
int
thread_wait_mutex(mutex_t *_mutex)
{
diff --git a/src/video/vid_ati_mach64.c b/src/video/vid_ati_mach64.c
index 0701df498..1e19adf84 100644
--- a/src/video/vid_ati_mach64.c
+++ b/src/video/vid_ati_mach64.c
@@ -3459,7 +3459,7 @@ void mach64_close(void *p)
mach64->thread_run = 0;
thread_set_event(mach64->wake_fifo_thread);
- thread_wait(mach64->fifo_thread, -1);
+ thread_wait(mach64->fifo_thread);
thread_destroy_event(mach64->wake_fifo_thread);
thread_destroy_event(mach64->fifo_not_full_event);
diff --git a/src/video/vid_mga.c b/src/video/vid_mga.c
index 3d9102b7c..c3f1f3593 100644
--- a/src/video/vid_mga.c
+++ b/src/video/vid_mga.c
@@ -5036,7 +5036,7 @@ mystique_close(void *p)
mystique->thread_run = 0;
thread_set_event(mystique->wake_fifo_thread);
- thread_wait(mystique->fifo_thread, -1);
+ thread_wait(mystique->fifo_thread);
thread_destroy_event(mystique->wake_fifo_thread);
thread_destroy_event(mystique->fifo_not_full_event);
thread_close_mutex(mystique->dma.lock);
diff --git a/src/video/vid_pgc.c b/src/video/vid_pgc.c
index 34e5c2d99..32e8b31ac 100644
--- a/src/video/vid_pgc.c
+++ b/src/video/vid_pgc.c
@@ -2624,7 +2624,7 @@ pgc_close(void *priv)
pgc_log("PGC: waiting for thread to stop...\n");
#endif
// while (dev->stopped);
- thread_wait(dev->pgc_thread, -1);
+ thread_wait(dev->pgc_thread);
#ifdef ENABLE_PGC_LOG
pgc_log("PGC: thread stopped, closing up.\n");
#endif
diff --git a/src/video/vid_s3_virge.c b/src/video/vid_s3_virge.c
index 23033b5b3..7119e36b3 100644
--- a/src/video/vid_s3_virge.c
+++ b/src/video/vid_s3_virge.c
@@ -4097,7 +4097,7 @@ static void s3_virge_close(void *p)
virge->render_thread_run = 0;
thread_set_event(virge->wake_render_thread);
- thread_wait(virge->render_thread, -1);
+ thread_wait(virge->render_thread);
thread_destroy_event(virge->not_full_event);
thread_destroy_event(virge->wake_main_thread);
thread_destroy_event(virge->wake_render_thread);
diff --git a/src/video/vid_voodoo.c b/src/video/vid_voodoo.c
index a9b0e52c9..a8697f0e8 100644
--- a/src/video/vid_voodoo.c
+++ b/src/video/vid_voodoo.c
@@ -1048,7 +1048,7 @@ void *voodoo_card_init()
voodoo->force_blit_count = 0;
voodoo->can_blit = 0;
- voodoo->force_blit_mutex = thread_create_mutex_with_spin_count(MUTEX_DEFAULT_SPIN_COUNT);
+ voodoo->force_blit_mutex = thread_create_mutex();
return voodoo;
}
@@ -1172,7 +1172,7 @@ void *voodoo_2d3d_card_init(int type)
voodoo->force_blit_count = 0;
voodoo->can_blit = 0;
- voodoo->force_blit_mutex = thread_create_mutex_with_spin_count(MUTEX_DEFAULT_SPIN_COUNT);
+ voodoo->force_blit_mutex = thread_create_mutex();
return voodoo;
}
@@ -1241,22 +1241,22 @@ void voodoo_card_close(voodoo_t *voodoo)
voodoo->fifo_thread_run = 0;
thread_set_event(voodoo->wake_fifo_thread);
- thread_wait(voodoo->fifo_thread, -1);
+ thread_wait(voodoo->fifo_thread);
voodoo->render_thread_run[0] = 0;
thread_set_event(voodoo->wake_render_thread[0]);
- thread_wait(voodoo->render_thread[0], -1);
+ thread_wait(voodoo->render_thread[0]);
if (voodoo->render_threads >= 2) {
voodoo->render_thread_run[1] = 0;
thread_set_event(voodoo->wake_render_thread[1]);
- thread_wait(voodoo->render_thread[1], -1);
+ thread_wait(voodoo->render_thread[1]);
}
if (voodoo->render_threads == 4) {
voodoo->render_thread_run[2] = 0;
thread_set_event(voodoo->wake_render_thread[2]);
- thread_wait(voodoo->render_thread[2], -1);
+ thread_wait(voodoo->render_thread[2]);
voodoo->render_thread_run[3] = 0;
thread_set_event(voodoo->wake_render_thread[3]);
- thread_wait(voodoo->render_thread[3], -1);
+ thread_wait(voodoo->render_thread[3]);
}
thread_destroy_event(voodoo->fifo_not_full_event);
thread_destroy_event(voodoo->wake_main_thread);
diff --git a/src/video/video.c b/src/video/video.c
index e3ff2200c..532995cb3 100644
--- a/src/video/video.c
+++ b/src/video/video.c
@@ -889,7 +889,7 @@ video_close(void)
{
thread_run = 0;
thread_set_event(blit_data.wake_blit_thread);
- thread_wait(blit_data.blit_thread, -1);
+ thread_wait(blit_data.blit_thread);
thread_destroy_event(blit_data.buffer_not_in_use);
thread_destroy_event(blit_data.blit_complete);
thread_destroy_event(blit_data.wake_blit_thread);
diff --git a/src/win/Makefile.mingw b/src/win/Makefile.mingw
index 6a596beae..c3d7bb834 100644
--- a/src/win/Makefile.mingw
+++ b/src/win/Makefile.mingw
@@ -374,7 +374,7 @@ MUNTOBJ := midi_mt32.o \
endif
ifeq ($(CPPTHREADS), y)
-THREADOBJ := cpp11_thread.o
+THREADOBJ := thread.o
else
THREADOBJ := win_thread.o
endif
diff --git a/src/win/win_opengl.c b/src/win/win_opengl.c
index bb9afd7be..4f328c097 100644
--- a/src/win/win_opengl.c
+++ b/src/win/win_opengl.c
@@ -947,7 +947,7 @@ void opengl_close(void)
SetEvent(sync_objects.closing);
- thread_wait(thread, -1);
+ thread_wait(thread);
thread_close_mutex(resize_info.mutex);
thread_close_mutex(options.mutex);
diff --git a/src/win/win_thread.c b/src/win/win_thread.c
index f8d81fa86..5a0fc4be8 100644
--- a/src/win/win_thread.c
+++ b/src/win/win_thread.c
@@ -45,14 +45,11 @@ thread_create(void (*func)(void *param), void *param)
int
-thread_wait(thread_t *arg, int timeout)
+thread_wait(thread_t *arg)
{
if (arg == NULL) return(0);
- if (timeout == -1)
- timeout = INFINITE;
-
- if (WaitForSingleObject(arg, timeout)) return(1);
+ if (WaitForSingleObject(arg, INFINITE)) return(1);
return(0);
}
@@ -133,17 +130,6 @@ thread_create_mutex(void)
}
-mutex_t *
-thread_create_mutex_with_spin_count(unsigned int spin_count)
-{
- mutex_t *mutex = malloc(sizeof(CRITICAL_SECTION));
-
- InitializeCriticalSectionAndSpinCount(mutex, spin_count);
-
- return mutex;
-}
-
-
int
thread_wait_mutex(mutex_t *mutex)
{