From 1503979345d46aea54caf388f43ddeb4027cc79e Mon Sep 17 00:00:00 2001 From: AJR Date: Thu, 6 Jan 2022 20:59:49 -0500 Subject: dislot: Add option_replace, option_replace_internal and option_remove to make it easier to derive option configurations * mac.cpp et al.: Expand SCSI device selection --- src/devices/bus/nscsi/devices.cpp | 4 ++-- src/emu/dislot.cpp | 36 ++++++++++++++++++++++++++++++++++++ src/emu/dislot.h | 4 ++++ 3 files changed, 42 insertions(+), 2 deletions(-) diff --git a/src/devices/bus/nscsi/devices.cpp b/src/devices/bus/nscsi/devices.cpp index 1ea66e12c7e..fad25440e3b 100644 --- a/src/devices/bus/nscsi/devices.cpp +++ b/src/devices/bus/nscsi/devices.cpp @@ -38,6 +38,6 @@ void default_scsi_devices(device_slot_interface &device) void mac_scsi_devices(device_slot_interface &device) { - device.option_add("harddisk", NSCSI_HARDDISK); - device.option_add("cdrom", NSCSI_CDROM_APPLE); + default_scsi_devices(device); + device.option_replace("cdrom", NSCSI_CDROM_APPLE); } diff --git a/src/emu/dislot.cpp b/src/emu/dislot.cpp index e30cd41d46f..6f7bb4b592f 100644 --- a/src/emu/dislot.cpp +++ b/src/emu/dislot.cpp @@ -72,6 +72,42 @@ device_slot_interface::slot_option &device_slot_interface::option_add_internal(c } +device_slot_interface::slot_option &device_slot_interface::option_replace(const char *name, const device_type &devtype) +{ + if (!name || !*name) + throw emu_fatalerror("slot '%s' attempt to replace option without name\n", device().tag()); + + auto search = m_options.find(name); + if (search == m_options.end()) + throw emu_fatalerror("slot '%s' attempt to replace nonexistent option '%s'\n", device().tag(), name); + + return (search->second = std::make_unique(name, devtype, true))->clock(m_default_clock); +} + + +device_slot_interface::slot_option &device_slot_interface::option_replace_internal(const char *name, const device_type &devtype) +{ + if (!name || !*name) + throw emu_fatalerror("slot '%s' attempt to replace option without name\n", device().tag()); + + auto search = m_options.find(name); + if (search == m_options.end()) + throw emu_fatalerror("slot '%s' attempt to replace nonexistent option '%s'\n", device().tag(), name); + + return (search->second = std::make_unique(name, devtype, false))->clock(m_default_clock); +} + + +void device_slot_interface::option_remove(const char *name) +{ + if (!name || !*name) + throw emu_fatalerror("slot '%s' attempt to remove option without name\n", device().tag()); + + if (m_options.erase(name) == 0) + throw emu_fatalerror("slot '%s' attempt to remove nonexistent option '%s'\n", device().tag(), name); +} + + device_slot_interface::slot_option *device_slot_interface::config_option(const char *name) { auto const search = m_options.find(name); diff --git a/src/emu/dislot.h b/src/emu/dislot.h index 97d314028a2..dd2fde5fac1 100644 --- a/src/emu/dislot.h +++ b/src/emu/dislot.h @@ -132,6 +132,10 @@ public: /// configuration. slot_option &option_add_internal(const char *option, const device_type &devtype); + slot_option &option_replace(const char *option, const device_type &devtype); + slot_option &option_replace_internal(const char *option, const device_type &devtype); + void option_remove(const char *option); + void set_option_default_bios(const char *option, const char *default_bios) { config_option(option)->default_bios(default_bios); } template void set_option_machine_config(const char *option, T &&machine_config) { config_option(option)->machine_config(std::forward(machine_config)); } void set_option_device_input_defaults(const char *option, const input_device_default *default_input) { config_option(option)->input_device_defaults(default_input); } -- cgit v1.2.3