From 23a04c3f5530d798fea03d0b8203a9c618f1cd63 Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Mon, 6 Dec 2021 15:55:05 +0600 Subject: [PATCH 01/16] Fix wrong copyright information --- src/rtmidi_midi.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/rtmidi_midi.cpp b/src/rtmidi_midi.cpp index af9fc5439..45e34197a 100644 --- a/src/rtmidi_midi.cpp +++ b/src/rtmidi_midi.cpp @@ -8,9 +8,9 @@ * * MIDI backend implemented using the RtMidi library. * - * Author: jgilje, + * Author: Cacodemon345, * Miran Grca, - * Copyright 2021 jgilje. + * Copyright 2021 Cacodemon345. * Copyright 2021 Miran Grca. */ #if defined __has_include From 00e00fa5c608c57ac1a058071e622b086bc863ab Mon Sep 17 00:00:00 2001 From: OBattler Date: Mon, 6 Dec 2021 22:33:52 +0100 Subject: [PATCH 02/16] Attempted fix for PS/2 Model 55SX. --- src/machine/m_ps2_mca.c | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/src/machine/m_ps2_mca.c b/src/machine/m_ps2_mca.c index ed44b35a7..ef73c2a44 100644 --- a/src/machine/m_ps2_mca.c +++ b/src/machine/m_ps2_mca.c @@ -432,6 +432,8 @@ static void model_50_write(uint16_t port, uint8_t val) static void model_55sx_write(uint16_t port, uint8_t val) { + int remap_size; + switch (port) { case 0x100: @@ -477,26 +479,26 @@ static void model_55sx_write(uint16_t port, uint8_t val) case 0x105: ps2_mca_log("Write POS3 %02x\n", val); ps2.option[3] = val; - shadowbios = !(val & 0x10); - shadowbios_write = val & 0x10; + shadowbios = !(val & 0x10) && !(val & 0x20); + shadowbios_write = (val & 0x10) && !(val & 0x20); if (shadowbios) { mem_set_mem_state(0xe0000, 0x20000, MEM_READ_INTERNAL | MEM_WRITE_DISABLED); - mem_set_mem_state((mem_size+256) * 1024, 128 * 1024, MEM_READ_EXTANY | MEM_WRITE_EXTANY); mem_mapping_disable(&ps2.shadow_mapping); } else { - mem_set_mem_state(0xe0000, 0x20000, MEM_READ_EXTANY | MEM_WRITE_INTERNAL); - mem_set_mem_state((mem_size+256) * 1024, 128 * 1024, MEM_READ_INTERNAL | MEM_WRITE_INTERNAL); + mem_set_mem_state(0xe0000, 0x20000, MEM_READ_EXTANY | MEM_WRITE_DISABLED); mem_mapping_enable(&ps2.shadow_mapping); } - if ((ps2.option[1] & 1) && !(ps2.option[3] & 0x20)) - mem_set_mem_state(mem_size * 1024, 256 * 1024, MEM_READ_INTERNAL | MEM_WRITE_INTERNAL); + remap_size = (val & 0x10) ? 384 : 256; + + if (val & 0x20) + mem_set_mem_state(mem_size * 1024, remap_size * 1024, MEM_READ_EXTANY | MEM_WRITE_EXTANY); else - mem_set_mem_state(mem_size * 1024, 256 * 1024, MEM_READ_EXTANY | MEM_WRITE_EXTANY); + mem_set_mem_state(mem_size * 1024, remap_size * 1024, MEM_READ_INTERNAL | MEM_WRITE_INTERNAL); flushmmucache_nopc(); break; From ba6a27b15afc1a2e6363f8599cd8d5df83edf974 Mon Sep 17 00:00:00 2001 From: OBattler Date: Mon, 6 Dec 2021 22:36:42 +0100 Subject: [PATCH 03/16] And a fix for the fix. --- src/machine/m_ps2_mca.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/machine/m_ps2_mca.c b/src/machine/m_ps2_mca.c index ef73c2a44..a71d0d65e 100644 --- a/src/machine/m_ps2_mca.c +++ b/src/machine/m_ps2_mca.c @@ -494,6 +494,7 @@ static void model_55sx_write(uint16_t port, uint8_t val) } remap_size = (val & 0x10) ? 384 : 256; + mem_set_mem_state(mem_size * 1024, 384 * 1024, MEM_READ_EXTANY | MEM_WRITE_EXTANY); if (val & 0x20) mem_set_mem_state(mem_size * 1024, remap_size * 1024, MEM_READ_EXTANY | MEM_WRITE_EXTANY); 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 04/16] 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 05/16] 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 732399ed429f4704d6c59df2f5003ad9084f01de Mon Sep 17 00:00:00 2001 From: OBattler Date: Tue, 7 Dec 2021 11:24:56 +0100 Subject: [PATCH 06/16] Properly fixed the IBM PS/2 Model 55SX. --- src/machine/m_ps2_mca.c | 167 +++++++++++++++++++++------------------- 1 file changed, 89 insertions(+), 78 deletions(-) diff --git a/src/machine/m_ps2_mca.c b/src/machine/m_ps2_mca.c index a71d0d65e..305005592 100644 --- a/src/machine/m_ps2_mca.c +++ b/src/machine/m_ps2_mca.c @@ -82,9 +82,8 @@ static struct uint8_t memory_bank[8]; uint8_t io_id; - uint16_t planar_id; - - mem_mapping_t shadow_mapping; + uint16_t planar_id; + mem_mapping_t split_mapping; mem_mapping_t expansion_mapping; mem_mapping_t cache_mapping; @@ -212,37 +211,6 @@ void ps2_cache_clean(void) memset(ps2_cache_valid, 0, sizeof(ps2_cache_valid)); } -static uint8_t ps2_read_shadow_ram(uint32_t addr, void *priv) -{ - addr = (addr & 0x1ffff) + 0xe0000; - return mem_read_ram(addr, priv); -} -static uint16_t ps2_read_shadow_ramw(uint32_t addr, void *priv) -{ - addr = (addr & 0x1ffff) + 0xe0000; - return mem_read_ramw(addr, priv); -} -static uint32_t ps2_read_shadow_raml(uint32_t addr, void *priv) -{ - addr = (addr & 0x1ffff) + 0xe0000; - return mem_read_raml(addr, priv); -} -static void ps2_write_shadow_ram(uint32_t addr, uint8_t val, void *priv) -{ - addr = (addr & 0x1ffff) + 0xe0000; - mem_write_ram(addr, val, priv); -} -static void ps2_write_shadow_ramw(uint32_t addr, uint16_t val, void *priv) -{ - addr = (addr & 0x1ffff) + 0xe0000; - mem_write_ramw(addr, val, priv); -} -static void ps2_write_shadow_raml(uint32_t addr, uint32_t val, void *priv) -{ - addr = (addr & 0x1ffff) + 0xe0000; - mem_write_raml(addr, val, priv); -} - static uint8_t ps2_read_split_ram(uint32_t addr, void *priv) { addr = (addr % (ps2.split_size << 10)) + ps2.split_phys; @@ -430,10 +398,83 @@ 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; + + ps2_mca_log("%02X %02X\n", ps2.option[1], ps2.option[3]); + + mem_remap_top(remap_size); + 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++) + { + 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); + mem_set_mem_state(base * 1024, ((base > 0) ? 1024 : 640) * 1024, MEM_READ_INTERNAL | MEM_WRITE_INTERNAL); + enabled_mem += 1024; + bit_mask |= (1 << (j + (i << 2))); + } + base += 1024; + } + } + + ps2_mca_log("Enabled memory: %i kB (%02X)\n", enabled_mem, bit_mask); + + if (ps2.option[3] & 0x11) + { + /* Enable ROM. */ + ps2_mca_log("Enable ROM\n"); + state = MEM_READ_EXTANY; + } + else + { + /* Disable ROM. */ + if ((ps2.option[1] & 1) && !(ps2.option[3] & 0x20) && (bit_mask & 0x01) && (ps2.option[3] & 0x08)) + { + /* Disable RAM between 640 kB and 1 MB. */ + ps2_mca_log("Disable ROM, enable RAM\n"); + state = MEM_READ_INTERNAL; + } + else + { + ps2_mca_log("Disable ROM, disable RAM\n"); + state = MEM_READ_DISABLED; + } + } + + /* Write always disabled. */ + state |= MEM_WRITE_DISABLED; + + mem_set_mem_state(0xe0000, 0x20000, state); + + 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)) { + 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); + } + + flushmmucache_nopc(); +} + + static void model_55sx_write(uint16_t port, uint8_t val) { - int remap_size; - switch (port) { case 0x100: @@ -469,39 +510,20 @@ static void model_55sx_write(uint16_t port, uint8_t val) ps2.option[0] = val; break; case 0x103: + ps2_mca_log("Write POS1: %02X\n", val); ps2.option[1] = val; - break; + model_55sx_mem_recalc(); + break; case 0x104: ps2.memory_bank[ps2.option[3] & 7] &= ~0xf; ps2.memory_bank[ps2.option[3] & 7] |= (val & 0xf); - ps2_mca_log("Write memory bank %i %02x\n", ps2.option[3] & 7, val); + ps2_mca_log("Write memory bank %i: %02X\n", ps2.option[3] & 7, val); + model_55sx_mem_recalc(); break; case 0x105: - ps2_mca_log("Write POS3 %02x\n", val); + ps2_mca_log("Write POS3: %02X\n", val); ps2.option[3] = val; - shadowbios = !(val & 0x10) && !(val & 0x20); - shadowbios_write = (val & 0x10) && !(val & 0x20); - - if (shadowbios) - { - mem_set_mem_state(0xe0000, 0x20000, MEM_READ_INTERNAL | MEM_WRITE_DISABLED); - mem_mapping_disable(&ps2.shadow_mapping); - } - else - { - mem_set_mem_state(0xe0000, 0x20000, MEM_READ_EXTANY | MEM_WRITE_DISABLED); - mem_mapping_enable(&ps2.shadow_mapping); - } - - remap_size = (val & 0x10) ? 384 : 256; - mem_set_mem_state(mem_size * 1024, 384 * 1024, MEM_READ_EXTANY | MEM_WRITE_EXTANY); - - if (val & 0x20) - mem_set_mem_state(mem_size * 1024, remap_size * 1024, MEM_READ_EXTANY | MEM_WRITE_EXTANY); - else - mem_set_mem_state(mem_size * 1024, remap_size * 1024, MEM_READ_INTERNAL | MEM_WRITE_INTERNAL); - - flushmmucache_nopc(); + model_55sx_mem_recalc(); break; case 0x106: ps2.subaddr_lo = val; @@ -917,23 +939,10 @@ static void ps2_mca_board_model_50_init() static void ps2_mca_board_model_55sx_init() { ps2_mca_board_common_init(); - - mem_mapping_add(&ps2.shadow_mapping, - (mem_size+256) * 1024, - 128*1024, - ps2_read_shadow_ram, - ps2_read_shadow_ramw, - ps2_read_shadow_raml, - ps2_write_shadow_ram, - ps2_write_shadow_ramw, - ps2_write_shadow_raml, - &ram[0xe0000], - MEM_MAPPING_INTERNAL, - NULL); - - mem_remap_top(256); - ps2.option[3] = 0x10; + ps2.option[1] = 0x00; + ps2.option[2] = 0x00; + ps2.option[3] = 0x30; memset(ps2.memory_bank, 0xf0, 8); switch (mem_size/1024) @@ -978,6 +987,8 @@ static void ps2_mca_board_model_55sx_init() if (gfxcard == VID_INTERNAL) device_add(&ps1vga_mca_device); + + model_55sx_mem_recalc(); } static void mem_encoding_update() From a1955a7698fde4a38ee8d30e15c0f642fdd62455 Mon Sep 17 00:00:00 2001 From: ts-korhonen Date: Tue, 7 Dec 2021 20:04:56 +0200 Subject: [PATCH 07/16] opengl: more error handling Show message box on fail. Enable debug output only when logfile is defined; performance optimization. Fail if reported opengl version is less than 3.0 or errors are generated after context is created; fixes some crashes on unsupported hardware or faulty drivers. --- src/include/86box/language.h | 4 +++- src/win/languages/cs-CZ.rc | 2 ++ src/win/languages/de-DE.rc | 2 ++ src/win/languages/en-GB.rc | 2 ++ src/win/languages/en-US.rc | 2 ++ src/win/languages/es-ES.rc | 2 ++ src/win/languages/fi-FI.rc | 2 ++ src/win/languages/fr-FR.rc | 2 ++ src/win/languages/hr-HR.rc | 2 ++ src/win/languages/hu-HU.rc | 2 ++ src/win/languages/it-IT.rc | 2 ++ src/win/languages/ja-JP.rc | 2 ++ src/win/languages/ko-KR.rc | 2 ++ src/win/languages/pt-BR.rc | 2 ++ src/win/languages/pt-PT.rc | 2 ++ src/win/languages/ru-RU.rc | 2 ++ src/win/languages/sl-SI.rc | 2 ++ src/win/languages/tr-TR.rc | 2 ++ src/win/languages/zh-CN.rc | 2 ++ src/win/win_opengl.c | 36 +++++++++++++++++++++++++++++++++--- 20 files changed, 72 insertions(+), 4 deletions(-) diff --git a/src/include/86box/language.h b/src/include/86box/language.h index a1f3ce3aa..7b2b55afa 100644 --- a/src/include/86box/language.h +++ b/src/include/86box/language.h @@ -125,6 +125,8 @@ #define IDS_2149 2149 // "Cassette images (*.PCM;*.RAW;*..." #define IDS_2150 2150 // "Cartridge %i: %ls" #define IDS_2151 2151 // "Cartridge images (*.JRC)\0*.JRC\0..." +#define IDS_2152 2152 // "Error initializing OpenGL 3.0 renderer" +#define IDS_2153 2153 // "OpenGL (3.0 Core) renderer could not be initialized." #define IDS_4096 4096 // "Hard disk (%s)" #define IDS_4097 4097 // "%01i:%01i" @@ -233,7 +235,7 @@ #define IDS_LANG_ENUS IDS_7168 -#define STR_NUM_2048 104 +#define STR_NUM_2048 106 #define STR_NUM_3072 11 #define STR_NUM_4096 40 #define STR_NUM_4352 6 diff --git a/src/win/languages/cs-CZ.rc b/src/win/languages/cs-CZ.rc index 200c5c9d4..b63d8a176 100644 --- a/src/win/languages/cs-CZ.rc +++ b/src/win/languages/cs-CZ.rc @@ -530,6 +530,8 @@ BEGIN IDS_2149 "Kazetové nahrávky (*.PCM;*.RAW;*.WAV;*.CAS)\0*.PCM;*.RAW;*.WAV;*.CAS\0Všechny soubory (*.*)\0*.*\0" IDS_2150 "Cartridge %i: %ls" IDS_2151 "Obrazy cartridge (*.A;*.B;*.JRC)\0*.A;*.B;*.JRC\0Všechny soubory (*.*)\0*.*\0" + IDS_2152 "Error initializing renderer" + IDS_2153 "OpenGL (3.0 Core) renderer could not be initialized. Use another renderer." END STRINGTABLE DISCARDABLE diff --git a/src/win/languages/de-DE.rc b/src/win/languages/de-DE.rc index 9f7925854..eaaa28171 100644 --- a/src/win/languages/de-DE.rc +++ b/src/win/languages/de-DE.rc @@ -530,6 +530,8 @@ BEGIN IDS_2149 "Kassettenimages (*.PCM;*.RAW;*.WAV;*.CAS)\0*.PCM;*.RAW;*.WAV;*.CAS\0Alle Dateien (*.*)\0*.*\0" IDS_2150 "Cartridge %i: %ls" IDS_2151 "Cartridgeimages (*.A;*.B;*.JRC)\0*.A;*.B;*.JRC\0Alle Dateien (*.*)\0*.*\0" + IDS_2152 "Error initializing renderer" + IDS_2153 "OpenGL (3.0 Core) renderer could not be initialized. Use another renderer." END STRINGTABLE DISCARDABLE diff --git a/src/win/languages/en-GB.rc b/src/win/languages/en-GB.rc index 7ceeeed2b..61749d954 100644 --- a/src/win/languages/en-GB.rc +++ b/src/win/languages/en-GB.rc @@ -530,6 +530,8 @@ BEGIN IDS_2149 "Cassette images (*.PCM;*.RAW;*.WAV;*.CAS)\0*.PCM;*.RAW;*.WAV;*.CAS\0All files (*.*)\0*.*\0" IDS_2150 "Cartridge %i: %ls" IDS_2151 "Cartridge images (*.A;*.B;*.JRC)\0*.A;*.B;*.JRC\0All files (*.*)\0*.*\0" + IDS_2152 "Error initializing renderer" + IDS_2153 "OpenGL (3.0 Core) renderer could not be initialized. Use another renderer." END STRINGTABLE DISCARDABLE diff --git a/src/win/languages/en-US.rc b/src/win/languages/en-US.rc index 05616379f..3bee70556 100644 --- a/src/win/languages/en-US.rc +++ b/src/win/languages/en-US.rc @@ -530,6 +530,8 @@ BEGIN IDS_2149 "Cassette images (*.PCM;*.RAW;*.WAV;*.CAS)\0*.PCM;*.RAW;*.WAV;*.CAS\0All files (*.*)\0*.*\0" IDS_2150 "Cartridge %i: %ls" IDS_2151 "Cartridge images (*.A;*.B;*.JRC)\0*.A;*.B;*.JRC\0All files (*.*)\0*.*\0" + IDS_2152 "Error initializing renderer" + IDS_2153 "OpenGL (3.0 Core) renderer could not be initialized. Use another renderer." END STRINGTABLE DISCARDABLE diff --git a/src/win/languages/es-ES.rc b/src/win/languages/es-ES.rc index 7f2e2c2e4..2232e69c5 100644 --- a/src/win/languages/es-ES.rc +++ b/src/win/languages/es-ES.rc @@ -530,6 +530,8 @@ BEGIN IDS_2149 "Imágenes de Cassette (*.PCM;*.RAW;*.WAV;*.CAS)\0*.PCM;*.RAW;*.WAV;*.CAS\0All files (*.*)\0*.*\0" IDS_2150 "Cartucho %i: %ls" IDS_2151 "Imágenes de Cartucho (*.A;*.B;*.JRC)\0*.A;*.B;*.JRC\0All files (*.*)\0*.*\0" + IDS_2152 "Error initializing renderer" + IDS_2153 "OpenGL (3.0 Core) renderer could not be initialized. Use another renderer." END STRINGTABLE DISCARDABLE diff --git a/src/win/languages/fi-FI.rc b/src/win/languages/fi-FI.rc index f3e4f10bf..56430464d 100644 --- a/src/win/languages/fi-FI.rc +++ b/src/win/languages/fi-FI.rc @@ -530,6 +530,8 @@ BEGIN IDS_2149 "Kasetti-tiedostot (*.PCM;*.RAW;*.WAV;*.CAS)\0*.PCM;*.RAW;*.WAV;*.CAS\0Kaikki tiedostot (*.*)\0*.*\0" IDS_2150 "ROM-moduuli %i: %ls" IDS_2151 "ROM-moduulikuvat (*.A;*.B;*.JRC)\0*.A;*.B;*.JRC\0Kaikki tiedostot (*.*)\0*.*\0" + IDS_2152 "Virhe renderöijän alustuksessa" + IDS_2153 "OpenGL (3.0 Core) renderöijän alustus epäonnistui. Käytä toista renderöijää." END STRINGTABLE DISCARDABLE diff --git a/src/win/languages/fr-FR.rc b/src/win/languages/fr-FR.rc index 1a212d5cc..997eefec4 100644 --- a/src/win/languages/fr-FR.rc +++ b/src/win/languages/fr-FR.rc @@ -530,6 +530,8 @@ BEGIN IDS_2149 "Images cassette (*.PCM;*.RAW;*.WAV;*.CAS)\0*.PCM;*.RAW;*.WAV;*.CAS\0Tous les fichiers (*.*)\0*.*\0" IDS_2150 "Cartouche %i: %ls" IDS_2151 "Images cartouche (*.A;*.B;*.JRC)\0*.A;*.B;*.JRC\0Tous les fichiers (*.*)\0*.*\0" + IDS_2152 "Error initializing renderer" + IDS_2153 "OpenGL (3.0 Core) renderer could not be initialized. Use another renderer." END STRINGTABLE DISCARDABLE diff --git a/src/win/languages/hr-HR.rc b/src/win/languages/hr-HR.rc index 0c4f4d38c..c6d4c4cc5 100644 --- a/src/win/languages/hr-HR.rc +++ b/src/win/languages/hr-HR.rc @@ -530,6 +530,8 @@ BEGIN IDS_2149 "Slike audio kasete (*.PCM;*.RAW;*.WAV;*.CAS)\0*.PCM;*.RAW;*.WAV;*.CAS\0Sve datoteke (*.*)\0*.*\0" IDS_2150 "Kaseta %i: %ls" IDS_2151 "Slike kasete (*.A;*.B;*.JRC)\0*.A;*.B;*.JRC\0Sve datoteke (*.*)\0*.*\0" + IDS_2152 "Error initializing renderer" + IDS_2153 "OpenGL (3.0 Core) renderer could not be initialized. Use another renderer." END STRINGTABLE DISCARDABLE diff --git a/src/win/languages/hu-HU.rc b/src/win/languages/hu-HU.rc index 4081389b7..3a8dfe756 100644 --- a/src/win/languages/hu-HU.rc +++ b/src/win/languages/hu-HU.rc @@ -532,6 +532,8 @@ BEGIN IDS_2149 "Magnókazetta-képek (*.PCM;*.RAW;*.WAV;*.CAS)\0*.PCM;*.RAW;*.WAV;*.CAS\0Minden fájl (*.*)\0*.*\0" IDS_2150 "ROM-kazetta %i: %ls" IDS_2151 "ROM-kazetta képek (*.A;*.B;*.JRC)\0*.A;*.B;*.JRC\0Minden fájl (*.*)\0*.*\0" + IDS_2152 "Error initializing renderer" + IDS_2153 "OpenGL (3.0 Core) renderer could not be initialized. Use another renderer." END STRINGTABLE DISCARDABLE diff --git a/src/win/languages/it-IT.rc b/src/win/languages/it-IT.rc index 1397da930..461b76e71 100644 --- a/src/win/languages/it-IT.rc +++ b/src/win/languages/it-IT.rc @@ -530,6 +530,8 @@ BEGIN IDS_2149 "Immagini cassetta (*.PCM;*.RAW;*.WAV;*.CAS)\0*.PCM;*.RAW;*.WAV;*.CAS\0Tutti i file (*.*)\0*.*\0" IDS_2150 "Cartuccia %i: %ls" IDS_2151 "Immagini cartuccia (*.A;*.B;*.JRC)\0*.A;*.B;*.JRC\0Tutti i file (*.*)\0*.*\0" + IDS_2152 "Error initializing renderer" + IDS_2153 "OpenGL (3.0 Core) renderer could not be initialized. Use another renderer." END STRINGTABLE DISCARDABLE diff --git a/src/win/languages/ja-JP.rc b/src/win/languages/ja-JP.rc index 044f48c3e..f5fef7e3f 100644 --- a/src/win/languages/ja-JP.rc +++ b/src/win/languages/ja-JP.rc @@ -530,6 +530,8 @@ BEGIN IDS_2149 "カセットイメージ (*.PCM;*.RAW;*.WAV;*.CAS)\0*.PCM;*.RAW;*.WAV;*.CAS\0すべてのファイル (*.*)\0*.*\0" IDS_2150 "カートリッジ %i: %ls" IDS_2151 "カートリッジイメージ (*.A;*.B;*.JRC)\0*.A;*.B;*.JRC\0すべてのファイル (*.*)\0*.*\0" + IDS_2152 "Error initializing renderer" + IDS_2153 "OpenGL (3.0 Core) renderer could not be initialized. Use another renderer." END STRINGTABLE DISCARDABLE diff --git a/src/win/languages/ko-KR.rc b/src/win/languages/ko-KR.rc index 0c0924b84..a46c8f6d7 100644 --- a/src/win/languages/ko-KR.rc +++ b/src/win/languages/ko-KR.rc @@ -530,6 +530,8 @@ BEGIN IDS_2149 "카세트 이미지 (*.PCM;*.RAW;*.WAV;*.CAS)\0*.PCM;*.RAW;*.WAV;*.CAS\0모든 파일 (*.*)\0*.*\0" IDS_2150 "카트리지 %i: %ls" IDS_2151 "카트리지 이미지 (*.A;*.B;*.JRC)\0*.A;*.B;*.JRC\0모든 파일 (*.*)\0*.*\0" + IDS_2152 "Error initializing renderer" + IDS_2153 "OpenGL (3.0 Core) renderer could not be initialized. Use another renderer." END STRINGTABLE DISCARDABLE diff --git a/src/win/languages/pt-BR.rc b/src/win/languages/pt-BR.rc index 16eb2e48f..44968872e 100644 --- a/src/win/languages/pt-BR.rc +++ b/src/win/languages/pt-BR.rc @@ -531,6 +531,8 @@ BEGIN IDS_2149 "Imagens de cassete (*.PCM;*.RAW;*.WAV;*.CAS)\0*.PCM;*.RAW;*.WAV;*.CAS\0Todos os arquivos (*.*)\0*.*\0" IDS_2150 "Cartucho %i: %ls" IDS_2151 "Imagens de cartucho (*.A;*.B;*.JRC)\0*.A;*.B;*.JRC\0Todos os arquivos (*.*)\0*.*\0" + IDS_2152 "Error initializing renderer" + IDS_2153 "OpenGL (3.0 Core) renderer could not be initialized. Use another renderer." END STRINGTABLE DISCARDABLE diff --git a/src/win/languages/pt-PT.rc b/src/win/languages/pt-PT.rc index f983fd24e..a424ad141 100644 --- a/src/win/languages/pt-PT.rc +++ b/src/win/languages/pt-PT.rc @@ -530,6 +530,8 @@ BEGIN IDS_2149 "Imagens de cassete (*.PCM;*.RAW;*.WAV;*.CAS)\0*.PCM;*.RAW;*.WAV;*.CAS\0Todos os ficheiros (*.*)\0*.*\0" IDS_2150 "Cartucho %i: %ls" IDS_2151 "Imagens de cartucho (*.A;*.B;*.JRC)\0*.A;*.B;*.JRC\0Todos os ficheiros (*.*)\0*.*\0" + IDS_2152 "Error initializing renderer" + IDS_2153 "OpenGL (3.0 Core) renderer could not be initialized. Use another renderer." END STRINGTABLE DISCARDABLE diff --git a/src/win/languages/ru-RU.rc b/src/win/languages/ru-RU.rc index 9f78a06b3..36ebf4ee3 100644 --- a/src/win/languages/ru-RU.rc +++ b/src/win/languages/ru-RU.rc @@ -530,6 +530,8 @@ BEGIN IDS_2149 "Образы кассет (*.PCM;*.RAW;*.WAV;*.CAS)\0*.PCM;*.RAW;*.WAV;*.CAS\0Все файлы (*.*)\0*.*\0" IDS_2150 "Картридж %i: %ls" IDS_2151 "Образы картриджей (*.A;*.B;*.JRC)\0*.A;*.B;*.JRC\0Все файлы (*.*)\0*.*\0" + IDS_2152 "Error initializing renderer" + IDS_2153 "OpenGL (3.0 Core) renderer could not be initialized. Use another renderer." END STRINGTABLE DISCARDABLE diff --git a/src/win/languages/sl-SI.rc b/src/win/languages/sl-SI.rc index e2cc77005..fb1c80b8b 100644 --- a/src/win/languages/sl-SI.rc +++ b/src/win/languages/sl-SI.rc @@ -530,6 +530,8 @@ BEGIN IDS_2149 "Slike kaset (*.PCM;*.RAW;*.WAV;*.CAS)\0*.PCM;*.RAW;*.WAV;*.CAS\0Vse datoteke (*.*)\0*.*\0" IDS_2150 "Spominski vložek %i: %ls" IDS_2151 "Slike spominskega vložka (*.A;*.B;*.JRC)\0*.A;*.B;*.JRC\0Vse datoteke (*.*)\0*.*\0" + IDS_2152 "Error initializing renderer" + IDS_2153 "OpenGL (3.0 Core) renderer could not be initialized. Use another renderer." END STRINGTABLE DISCARDABLE diff --git a/src/win/languages/tr-TR.rc b/src/win/languages/tr-TR.rc index 76a14fb1d..5d2ef2c50 100644 --- a/src/win/languages/tr-TR.rc +++ b/src/win/languages/tr-TR.rc @@ -530,6 +530,8 @@ BEGIN IDS_2149 "Kaset imajları (*.PCM;*.RAW;*.WAV;*.CAS)\0*.PCM;*.RAW;*.WAV;*.CAS\0Tüm dosyalar (*.*)\0*.*\0" IDS_2150 "Kartuş %i: %ls" IDS_2151 "Kartuş imajları (*.A;*.B;*.JRC)\0*.A;*.B;*.JRC\0Tüm dosyalar (*.*)\0*.*\0" + IDS_2152 "Error initializing renderer" + IDS_2153 "OpenGL (3.0 Core) renderer could not be initialized. Use another renderer." END STRINGTABLE DISCARDABLE diff --git a/src/win/languages/zh-CN.rc b/src/win/languages/zh-CN.rc index c6bf385e6..793123d80 100644 --- a/src/win/languages/zh-CN.rc +++ b/src/win/languages/zh-CN.rc @@ -530,6 +530,8 @@ BEGIN IDS_2149 "磁带镜像 (*.PCM;*.RAW;*.WAV;*.CAS)\0*.PCM;*.RAW;*.WAV;*.CAS\0所有文件 (*.*)\0*.*\0" IDS_2150 "卡带 %i: %ls" IDS_2151 "卡带镜像 (*.A;*.B;*.JRC)\0*.A;*.B;*.JRC\0所有文件 (*.*)\0*.*\0" + IDS_2152 "Error initializing renderer" + IDS_2153 "OpenGL (3.0 Core) renderer could not be initialized. Use another renderer." END STRINGTABLE DISCARDABLE diff --git a/src/win/win_opengl.c b/src/win/win_opengl.c index 4a2db844f..13b8c4fb7 100644 --- a/src/win/win_opengl.c +++ b/src/win/win_opengl.c @@ -56,6 +56,7 @@ typedef LONG atomic_flag; #include <86box/plat.h> #include <86box/video.h> #include <86box/win.h> +#include <86box/language.h> #include <86box/win_opengl.h> #include <86box/win_opengl_glslp.h> @@ -445,7 +446,9 @@ static void opengl_fail() window = NULL; } - /* TODO: Notify user. */ + wchar_t* message = plat_get_string(IDS_2152); + wchar_t* header = plat_get_string(IDS_2153); + MessageBox(parent, header, message, MB_OK); WaitForSingleObject(sync_objects.closing, INFINITE); @@ -476,7 +479,7 @@ static void opengl_main(void* param) SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 0); SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE); - if (GLAD_GL_ARB_debug_output) + if (GLAD_GL_ARB_debug_output && log_path[0] != '\0') SDL_GL_SetAttribute(SDL_GL_CONTEXT_FLAGS, SDL_GL_CONTEXT_DEBUG_FLAG | SDL_GL_CONTEXT_FORWARD_COMPATIBLE_FLAG); else SDL_GL_SetAttribute(SDL_GL_CONTEXT_FLAGS, SDL_GL_CONTEXT_FORWARD_COMPATIBLE_FLAG); @@ -527,7 +530,7 @@ static void opengl_main(void* param) opengl_fail(); } - if (GLAD_GL_ARB_debug_output) + if (GLAD_GL_ARB_debug_output && log_path[0] != '\0') { glEnable(GL_DEBUG_OUTPUT_SYNCHRONOUS_ARB); glDebugMessageControlARB(GL_DONT_CARE, GL_DEBUG_TYPE_PERFORMANCE_ARB, GL_DONT_CARE, 0, 0, GL_FALSE); @@ -539,6 +542,33 @@ static void opengl_main(void* param) pclog("OpenGL version: %s\n", glGetString(GL_VERSION)); pclog("OpenGL shader language version: %s\n", glGetString(GL_SHADING_LANGUAGE_VERSION)); + /* Check that the driver actually reports version 3.0 or later */ + GLint major = -1; + glGetIntegerv(GL_MAJOR_VERSION, &major); + if (major < 3) + { + pclog("OpenGL: Minimum OpenGL version 3.0 is required.\n"); + SDL_GL_DeleteContext(context); + opengl_fail(); + } + + /* Check if errors have been generated at this point */ + GLenum gl_error = glGetError(); + if (gl_error != GL_NO_ERROR) + { + /* Log up to 10 errors */ + int i = 0; + do + { + pclog("OpenGL: Error %u\n", gl_error); + i++; + } + while((gl_error = glGetError()) != GL_NO_ERROR && i < 10); + + SDL_GL_DeleteContext(context); + opengl_fail(); + } + gl_identifiers gl = { 0 }; if (!initialize_glcontext(&gl)) From 3a5c0383c22136cc65eb958031ddb6a06ae63ff8 Mon Sep 17 00:00:00 2001 From: ts-korhonen Date: Tue, 7 Dec 2021 20:12:14 +0200 Subject: [PATCH 08/16] Fix comment mismatch on language.h --- src/include/86box/language.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/include/86box/language.h b/src/include/86box/language.h index 7b2b55afa..467a5704c 100644 --- a/src/include/86box/language.h +++ b/src/include/86box/language.h @@ -125,8 +125,8 @@ #define IDS_2149 2149 // "Cassette images (*.PCM;*.RAW;*..." #define IDS_2150 2150 // "Cartridge %i: %ls" #define IDS_2151 2151 // "Cartridge images (*.JRC)\0*.JRC\0..." -#define IDS_2152 2152 // "Error initializing OpenGL 3.0 renderer" -#define IDS_2153 2153 // "OpenGL (3.0 Core) renderer could not be initialized." +#define IDS_2152 2152 // "Error initializing renderer" +#define IDS_2153 2153 // "OpenGL (3.0 Core) renderer could not be initialized. Use another renderer." #define IDS_4096 4096 // "Hard disk (%s)" #define IDS_4097 4097 // "%01i:%01i" From 4a906f0138315be483ebbdfbdd5853265faf6c18 Mon Sep 17 00:00:00 2001 From: OBattler Date: Wed, 8 Dec 2021 21:06:56 +0100 Subject: [PATCH 09/16] 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 10/16] 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 11/16] 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 12/16] 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 13/16] 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 14/16] 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 15/16] 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 16/16] 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);