From 89591ae8c9431f07536759442bf7ebb59e1785be Mon Sep 17 00:00:00 2001 From: OBattler Date: Sat, 30 Aug 2025 02:28:18 +0200 Subject: [PATCH] IBM PS/2 Model 50: Add the Model 50Z BIOS as an option. --- src/include/86box/machine.h | 3 ++ src/machine/m_ps2_mca.c | 67 ++++++++++++++++++++++++++++++++----- src/machine/machine_table.c | 2 +- 3 files changed, 62 insertions(+), 10 deletions(-) diff --git a/src/include/86box/machine.h b/src/include/86box/machine.h index 35cdf1a75..ef8803812 100644 --- a/src/include/86box/machine.h +++ b/src/include/86box/machine.h @@ -1247,6 +1247,9 @@ extern const device_t ps1_hdc_device; extern int machine_ps2_m30_286_init(const machine_t *); /* m_ps2_mca.c */ +#ifdef EMU_DEVICE_H +extern const device_t ps2_model_50_device; +#endif extern int machine_ps2_model_50_init(const machine_t *); extern int machine_ps2_model_60_init(const machine_t *); extern int machine_ps2_model_55sx_init(const machine_t *); diff --git a/src/machine/m_ps2_mca.c b/src/machine/m_ps2_mca.c index e8be93038..4a3d94ab3 100644 --- a/src/machine/m_ps2_mca.c +++ b/src/machine/m_ps2_mca.c @@ -1603,21 +1603,70 @@ machine_ps2_common_init(const machine_t *model) ps2.has_e0000_hole = 0; } +static const device_config_t ps2_model_50_config[] = { + // clang-format off + { + .name = "bios", + .description = "BIOS Version", + .type = CONFIG_BIOS, + .default_string = "ibmps2_m50", + .default_int = 0, + .file_filter = "", + .spinner = { 0 }, + .bios = { + { .name = "IBM PS/2 model 50", .internal_name = "ibmps2_m50", .bios_type = BIOS_NORMAL, + .files_no = 4, .local = 0, .size = 131072, .files = { "roms/machines/ibmps2_m50/90x7420.zm13", + "roms/machines/ibmps2_m50/90x7429.zm18", + "roms/machines/ibmps2_m50/90x7423.zm14", + "roms/machines/ibmps2_m50/90x7426.zm16", "" } }, + { .name = "IBM PS/2 model 50Z", .internal_name = "ibmps2_m50z", .bios_type = BIOS_NORMAL, + .files_no = 2, .local = 0, .size = 131072, .files = { "roms/machines/ibmps2_m50/15F8366.BIN", + "roms/machines/ibmps2_m50/15F8365.BIN", "" } }, + { .files_no = 0 } + }, + }, + { .name = "", .description = "", .type = CONFIG_END } + // clang-format on +}; + +const device_t ps2_model_50_device = { + .name = "IBM PS/2 model 50", + .internal_name = "ps2_model_50_device", + .flags = 0, + .local = 0, + .init = NULL, + .close = NULL, + .reset = NULL, + .available = NULL, + .speed_changed = NULL, + .force_redraw = NULL, + .config = ps2_model_50_config +}; + int machine_ps2_model_50_init(const machine_t *model) { - int ret; + int ret = 0; + const char* fn[4]; - ret = bios_load_interleaved("roms/machines/ibmps2_m50/90x7420.zm13", - "roms/machines/ibmps2_m50/90x7429.zm18", - 0x000f0000, 131072, 0); - ret &= bios_load_aux_interleaved("roms/machines/ibmps2_m50/90x7423.zm14", - "roms/machines/ibmps2_m50/90x7426.zm16", - 0x000e0000, 65536, 0); - - if (bios_only || !ret) + /* No ROMs available */ + if (!device_available(model->device)) return ret; + device_context(model->device); + int is_50z = !strcmp(device_get_config_bios("bios"), "ibmps2_m50z"); + if (is_50z) { + for (int i = 0; i < 2; i++) + fn[i] = device_get_bios_file(machine_get_device(machine), device_get_config_bios("bios"), i); + ret = bios_load_interleaved(fn[0], fn[1], 0x000e0000, 131072, 0); + } else { + for (int i = 0; i < 4; i++) + fn[i] = device_get_bios_file(machine_get_device(machine), device_get_config_bios("bios"), i); + ret = bios_load_interleaved(fn[0], fn[1], 0x000f0000, 131072, 0); + ret &= bios_load_aux_interleaved(fn[2], fn[3], 0x000e0000, 65536, 0); + } + device_context_restore(); + machine_ps2_common_init(model); ps2.planar_id = 0xfbff; diff --git a/src/machine/machine_table.c b/src/machine/machine_table.c index 80ac485f0..1498c3b1c 100644 --- a/src/machine/machine_table.c +++ b/src/machine/machine_table.c @@ -4837,7 +4837,7 @@ const machine_t machines[] = { .kbc_p1 = 0x00000cf0, .gpio = 0xffffffff, .gpio_acpi = 0xffffffff, - .device = NULL, + .device = &ps2_model_50_device, .kbd_device = NULL, .fdc_device = NULL, .sio_device = NULL,