summaryrefslogtreecommitdiffstatshomepage
path: root/src/emu/dislot.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/emu/dislot.cpp')
-rw-r--r--src/emu/dislot.cpp107
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);
+}