diff options
Diffstat (limited to 'src/emu/dislot.cpp')
-rw-r--r-- | src/emu/dislot.cpp | 107 |
1 files changed, 58 insertions, 49 deletions
diff --git a/src/emu/dislot.cpp b/src/emu/dislot.cpp index e5bb4cff0d3..43d2ed96cdd 100644 --- a/src/emu/dislot.cpp +++ b/src/emu/dislot.cpp @@ -8,12 +8,11 @@ #include "emu.h" #include "emuopts.h" -#include "zippath.h" +#include "corestr.h" +#include "path.h" +#include "zippath.h" -// ------------------------------------------------- -// ctor -// ------------------------------------------------- device_slot_interface::device_slot_interface(const machine_config &mconfig, device_t &device) : device_interface(device, "slot"), @@ -24,21 +23,12 @@ device_slot_interface::device_slot_interface(const machine_config &mconfig, devi { } - -// ------------------------------------------------- -// dtor -// ------------------------------------------------- - device_slot_interface::~device_slot_interface() { } -// ------------------------------------------------- -// device_slot_option ctor -// ------------------------------------------------- - -device_slot_interface::slot_option::slot_option(const char *name, const device_type &devtype, bool selectable) : +device_slot_interface::slot_option::slot_option(const char *name, device_type devtype, bool selectable) : m_name(name), m_devtype(devtype), m_selectable(selectable), @@ -50,43 +40,74 @@ device_slot_interface::slot_option::slot_option(const char *name, const device_t } -// ------------------------------------------------- -// option_add -// ------------------------------------------------- +void device_slot_interface::interface_validity_check(validity_checker &valid) const +{ + if (m_default_option && (m_options.find(m_default_option) == m_options.end())) + osd_printf_error("Default option '%s' does not correspond to any configured option\n", m_default_option); +} + -device_slot_interface::slot_option &device_slot_interface::option_add(const char *name, const device_type &devtype) +device_slot_interface::slot_option &device_slot_interface::option_add(const char *name, device_type devtype) { + if (!name || !*name) + throw emu_fatalerror("slot '%s' attempt to add option without name\n", device().tag()); + const slot_option *const existing = option(name); if (existing) throw emu_fatalerror("slot '%s' duplicate option '%s'\n", device().tag(), name); - if (m_options.count(name)) - throw tag_add_exception(name); - return m_options.emplace(name, std::make_unique<slot_option>(name, devtype, true)).first->second->clock(m_default_clock); } -// ------------------------------------------------- -// option_add_internal -// ------------------------------------------------- - -device_slot_interface::slot_option &device_slot_interface::option_add_internal(const char *name, const device_type &devtype) +device_slot_interface::slot_option &device_slot_interface::option_add_internal(const char *name, device_type devtype) { + if (!name || !*name) + throw emu_fatalerror("slot '%s' attempt to add option without name\n", device().tag()); + const slot_option *const existing = option(name); if (existing) throw emu_fatalerror("slot '%s' duplicate option '%s'\n", device().tag(), name); - if (m_options.count(name)) - throw tag_add_exception(name); - return m_options.emplace(name, std::make_unique<slot_option>(name, devtype, false)).first->second->clock(m_default_clock); } -// ------------------------------------------------- -// option -// ------------------------------------------------- +device_slot_interface::slot_option &device_slot_interface::option_replace(const char *name, 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<slot_option>(name, devtype, true))->clock(m_default_clock); +} + + +device_slot_interface::slot_option &device_slot_interface::option_replace_internal(const char *name, 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<slot_option>(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) { @@ -98,10 +119,6 @@ device_slot_interface::slot_option *device_slot_interface::config_option(const c } -// ------------------------------------------------- -// has_selectable_options -// ------------------------------------------------- - bool device_slot_interface::has_selectable_options() const { if (!fixed()) @@ -114,10 +131,6 @@ bool device_slot_interface::has_selectable_options() const } -// ------------------------------------------------- -// option -// ------------------------------------------------- - const device_slot_interface::slot_option *device_slot_interface::option(const char *name) const { if (name) @@ -130,15 +143,6 @@ const device_slot_interface::slot_option *device_slot_interface::option(const ch } -device_slot_card_interface::device_slot_card_interface(const machine_config &mconfig, device_t &device) - : device_interface(device, "slot") -{ -} - -device_slot_card_interface::~device_slot_card_interface() -{ -} - get_default_card_software_hook::get_default_card_software_hook(const std::string &path, std::function<bool(util::core_file &, std::string&)> &&get_hashfile_extrainfo) : m_get_hashfile_extrainfo(std::move(get_hashfile_extrainfo)) , m_called_get_hashfile_extrainfo(false) @@ -164,3 +168,8 @@ bool get_default_card_software_hook::hashfile_extrainfo(std::string &extrainfo) extrainfo = m_hash_extrainfo; return m_has_hash_extrainfo; } + +bool get_default_card_software_hook::is_filetype(std::string_view candidate_filetype) const +{ + return util::streqlower(m_file_type, candidate_filetype); +} |