summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author Vas Crabb <vas@vastheman.com>2023-05-10 00:26:50 +1000
committer Vas Crabb <vas@vastheman.com>2023-05-10 00:26:50 +1000
commit2c0c1257fc9f9304abbaafc395c141798702444d (patch)
tree9594386c46390ba8371ae97d9e14d55c2ae43b87
parenta4482f90ed10d1c74556b08b2eca802450ca5f4f (diff)
UI refinements/fixes:
ui/filemngr.cpp: For an empty media device, look for another device with a mounted software item that has compatible parts before falling back to the file manager. This is useful when mounting a multi-part item via the menus, or for a system like the X68000 with multiple drives where the boot disk remains mounted but another application disk is automatically ejected when you're prompted for the next disk. ui/datmenu.cpp: Don't assume mounted images are always from software lists (fixes MT08620), and take the first image mounted from a software list rather than the last. bus/s100: Got rid of simple_list.
-rw-r--r--src/devices/bus/s100/s100.cpp51
-rw-r--r--src/devices/bus/s100/s100.h18
-rw-r--r--src/frontend/mame/ui/datmenu.cpp5
-rw-r--r--src/frontend/mame/ui/filemngr.cpp3
-rw-r--r--src/frontend/mame/ui/imgcntrl.cpp36
-rw-r--r--src/frontend/mame/ui/inifile.cpp2
-rw-r--r--src/frontend/mame/ui/swlist.cpp4
-rw-r--r--src/frontend/mame/ui/utils.cpp5
-rw-r--r--src/frontend/mame/ui/utils.h1
9 files changed, 65 insertions, 60 deletions
diff --git a/src/devices/bus/s100/s100.cpp b/src/devices/bus/s100/s100.cpp
index 67a5df55124..1df02138290 100644
--- a/src/devices/bus/s100/s100.cpp
+++ b/src/devices/bus/s100/s100.cpp
@@ -29,8 +29,7 @@ DEFINE_DEVICE_TYPE(S100_SLOT, s100_slot_device, "s100_slot", "S100 slot")
device_s100_card_interface::device_s100_card_interface(const machine_config &mconfig, device_t &device) :
device_interface(device, "s100bus"),
- m_bus(nullptr),
- m_next(nullptr)
+ m_bus(nullptr)
{
}
@@ -60,7 +59,7 @@ void s100_slot_device::device_start()
{
device_s100_card_interface *const dev = get_card_device();
if (dev)
- m_bus->add_card(dev);
+ m_bus->add_card(*dev);
}
@@ -90,6 +89,10 @@ s100_bus_device::s100_bus_device(const machine_config &mconfig, const char *tag,
{
}
+s100_bus_device::~s100_bus_device()
+{
+}
+
//-------------------------------------------------
// device_start - device-specific startup
@@ -131,10 +134,10 @@ void s100_bus_device::device_reset()
// add_card - add card
//-------------------------------------------------
-void s100_bus_device::add_card(device_s100_card_interface *card)
+void s100_bus_device::add_card(device_s100_card_interface &card)
{
- card->m_bus = this;
- m_device_list.append(*card);
+ card.m_bus = this;
+ m_device_list.emplace_back(card);
}
@@ -146,13 +149,8 @@ uint8_t s100_bus_device::smemr_r(offs_t offset)
{
uint8_t data = 0xff;
- device_s100_card_interface *entry = m_device_list.first();
-
- while (entry)
- {
- data &= entry->s100_smemr_r(offset);
- entry = entry->next();
- }
+ for (device_s100_card_interface &entry : m_device_list)
+ data &= entry.s100_smemr_r(offset);
return data;
}
@@ -164,13 +162,8 @@ uint8_t s100_bus_device::smemr_r(offs_t offset)
void s100_bus_device::mwrt_w(offs_t offset, uint8_t data)
{
- device_s100_card_interface *entry = m_device_list.first();
-
- while (entry)
- {
- entry->s100_mwrt_w(offset, data);
- entry = entry->next();
- }
+ for (device_s100_card_interface &entry : m_device_list)
+ entry.s100_mwrt_w(offset, data);
}
@@ -182,13 +175,8 @@ uint8_t s100_bus_device::sinp_r(offs_t offset)
{
uint8_t data = 0xff;
- device_s100_card_interface *entry = m_device_list.first();
-
- while (entry)
- {
- data &= entry->s100_sinp_r(offset);
- entry = entry->next();
- }
+ for (device_s100_card_interface &entry : m_device_list)
+ data &= entry.s100_sinp_r(offset);
return data;
}
@@ -200,11 +188,6 @@ uint8_t s100_bus_device::sinp_r(offs_t offset)
void s100_bus_device::sout_w(offs_t offset, uint8_t data)
{
- device_s100_card_interface *entry = m_device_list.first();
-
- while (entry)
- {
- entry->s100_sout_w(offset, data);
- entry = entry->next();
- }
+ for (device_s100_card_interface &entry : m_device_list)
+ entry.s100_sout_w(offset, data);
}
diff --git a/src/devices/bus/s100/s100.h b/src/devices/bus/s100/s100.h
index ae10f4e70bc..0a32b83f73b 100644
--- a/src/devices/bus/s100/s100.h
+++ b/src/devices/bus/s100/s100.h
@@ -64,6 +64,8 @@
#pragma once
+#include <functional>
+#include <vector>
@@ -78,11 +80,8 @@ class s100_bus_device;
class device_s100_card_interface : public device_interface
{
friend class s100_bus_device;
- template <class ElementType> friend class simple_list;
public:
- device_s100_card_interface *next() const { return m_next; }
-
// interrupts
virtual void s100_int_w(int state) { }
virtual void s100_nmi_w(int state) { }
@@ -125,9 +124,6 @@ protected:
virtual void interface_pre_start() override;
s100_bus_device *m_bus;
-
-private:
- device_s100_card_interface *m_next;
};
@@ -139,7 +135,7 @@ class s100_bus_device : public device_t
public:
// construction/destruction
s100_bus_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- ~s100_bus_device() { m_device_list.detach_all(); }
+ ~s100_bus_device();
auto irq() { return m_write_irq.bind(); }
auto nmi() { return m_write_nmi.bind(); }
@@ -159,7 +155,7 @@ public:
auto hold() { return m_write_hold.bind(); }
auto error() { return m_write_error.bind(); }
- void add_card(device_s100_card_interface *card);
+ void add_card(device_s100_card_interface &card);
uint8_t smemr_r(offs_t offset);
void mwrt_w(offs_t offset, uint8_t data);
@@ -186,11 +182,13 @@ public:
DECLARE_WRITE_LINE_MEMBER( error_w ) { m_write_error(state); }
protected:
- // device-level overrides
+ // device_t implementation
virtual void device_start() override;
virtual void device_reset() override;
private:
+ using card_vector = std::vector<std::reference_wrapper<device_s100_card_interface> >;
+
devcb_write_line m_write_irq;
devcb_write_line m_write_nmi;
devcb_write_line m_write_vi0;
@@ -209,7 +207,7 @@ private:
devcb_write_line m_write_hold;
devcb_write_line m_write_error;
- simple_list<device_s100_card_interface> m_device_list;
+ card_vector m_device_list;
};
diff --git a/src/frontend/mame/ui/datmenu.cpp b/src/frontend/mame/ui/datmenu.cpp
index 35deb7ff523..a4f919a7f62 100644
--- a/src/frontend/mame/ui/datmenu.cpp
+++ b/src/frontend/mame/ui/datmenu.cpp
@@ -45,12 +45,13 @@ menu_dats_view::menu_dats_view(mame_ui_manager &mui, render_container &container
set_process_flags(PROCESS_LR_ALWAYS | PROCESS_CUSTOM_NAV);
for (device_image_interface& image : image_interface_enumerator(mui.machine().root_device()))
{
- if (image.filename())
+ if (image.loaded_through_softlist())
{
- m_list = strensure(image.software_list_name());
+ m_list = image.software_list_name();
m_short = image.software_entry()->shortname();
m_long = image.software_entry()->longname();
m_parent = image.software_entry()->parentname();
+ break;
}
}
std::vector<std::string> lua_list;
diff --git a/src/frontend/mame/ui/filemngr.cpp b/src/frontend/mame/ui/filemngr.cpp
index d30ed505e9b..a23a6d70649 100644
--- a/src/frontend/mame/ui/filemngr.cpp
+++ b/src/frontend/mame/ui/filemngr.cpp
@@ -210,8 +210,9 @@ bool menu_file_manager::handle(event const *ev)
if (selected_device && (IPT_UI_SELECT == ev->iptkey))
{
if (selected_device->has_preset_images_selection())
+ {
menu::stack_push<menu_control_device_preset>(ui(), container(), *selected_device);
-
+ }
else
{
floppy_image_device *floppy_device = dynamic_cast<floppy_image_device *>(selected_device);
diff --git a/src/frontend/mame/ui/imgcntrl.cpp b/src/frontend/mame/ui/imgcntrl.cpp
index 3b1253d755c..8f8aaffd3bb 100644
--- a/src/frontend/mame/ui/imgcntrl.cpp
+++ b/src/frontend/mame/ui/imgcntrl.cpp
@@ -41,17 +41,45 @@ menu_control_device_image::menu_control_device_image(mame_ui_manager &mui, rende
, m_image(image)
, m_create_ok(false)
, m_create_confirmed(false)
+ , m_swi(nullptr)
+ , m_swp(nullptr)
+ , m_sld(nullptr)
{
m_submenu_result.i = -1;
if (m_image.software_list_name())
m_sld = software_list_device::find_by_name(mui.machine().config(), m_image.software_list_name());
- else
- m_sld = nullptr;
m_swi = m_image.software_entry();
m_swp = m_image.part_entry();
- if (m_swi != nullptr)
+ // if there's no image mounted, check for a software item with compatible parts mounted elsewhere
+ if (!m_image.exists() && m_image.image_interface())
+ {
+ assert(!m_swi);
+
+ for (device_image_interface &other : image_interface_enumerator(mui.machine().root_device()))
+ {
+ if (other.loaded_through_softlist() && (!m_sld || (m_sld->list_name() == other.software_list_name())))
+ {
+ software_info const &swi = *other.software_entry();
+ for (software_part const &swp : swi.parts())
+ {
+ if (swp.interface() == m_image.image_interface())
+ {
+ if (!m_sld)
+ m_sld = software_list_device::find_by_name(mui.machine().config(), other.software_list_name());
+ m_swi = &swi;
+ break;
+ }
+ }
+ }
+
+ if (m_swi)
+ break;
+ }
+ }
+
+ if (m_swi)
{
m_state = START_OTHER_PART;
m_current_directory = m_image.working_directory();
@@ -236,7 +264,7 @@ void menu_control_device_image::menu_activated()
case START_OTHER_PART:
m_submenu_result.swparts = menu_software_parts::result::INVALID;
- menu::stack_push<menu_software_parts>(ui(), container(), m_swi, m_swp->interface().c_str(), &m_swp, true, m_submenu_result.swparts);
+ menu::stack_push<menu_software_parts>(ui(), container(), m_swi, m_image.image_interface(), &m_swp, true, m_submenu_result.swparts);
m_state = SELECT_OTHER_PART;
break;
diff --git a/src/frontend/mame/ui/inifile.cpp b/src/frontend/mame/ui/inifile.cpp
index 85794bb2bf1..5e4be6502ef 100644
--- a/src/frontend/mame/ui/inifile.cpp
+++ b/src/frontend/mame/ui/inifile.cpp
@@ -345,7 +345,7 @@ void favorite_manager::add_favorite(running_machine &machine)
driver,
imagedev->software_list_name(),
imagedev->instance_name(),
- strensure(imagedev->image_type_name()));
+ imagedev->image_type_name() ? imagedev->image_type_name() : "");
// assume it's available if it's mounted
info.available = true;
diff --git a/src/frontend/mame/ui/swlist.cpp b/src/frontend/mame/ui/swlist.cpp
index 8ae73e00c3c..70428ade32f 100644
--- a/src/frontend/mame/ui/swlist.cpp
+++ b/src/frontend/mame/ui/swlist.cpp
@@ -54,8 +54,8 @@ static bool is_valid_softlist_part_char(char32_t ch)
//-------------------------------------------------
menu_software_parts::menu_software_parts(mame_ui_manager &mui, render_container &container, const software_info *info, const char *interface, const software_part **part, bool other_opt, result &result)
- : menu(mui, container),
- m_result(result)
+ : menu(mui, container)
+ , m_result(result)
{
m_info = info;
m_interface = interface;
diff --git a/src/frontend/mame/ui/utils.cpp b/src/frontend/mame/ui/utils.cpp
index a0fe2a58c97..d9e58280e7a 100644
--- a/src/frontend/mame/ui/utils.cpp
+++ b/src/frontend/mame/ui/utils.cpp
@@ -1970,11 +1970,6 @@ char* chartrimcarriage(char str[])
return str;
}
-const char* strensure(const char* s)
-{
- return s == nullptr ? "" : s;
-}
-
int getprecisionchr(const char* s)
{
int precision = 1;
diff --git a/src/frontend/mame/ui/utils.h b/src/frontend/mame/ui/utils.h
index 69390a6bc01..ba340541078 100644
--- a/src/frontend/mame/ui/utils.h
+++ b/src/frontend/mame/ui/utils.h
@@ -404,7 +404,6 @@ struct ui_globals
// GLOBAL FUNCTIONS
char* chartrimcarriage(char str[]);
-const char* strensure(const char* s);
int getprecisionchr(const char* s);
std::vector<std::string> tokenize(const std::string &text, char sep);