From 2c0c1257fc9f9304abbaafc395c141798702444d Mon Sep 17 00:00:00 2001 From: Vas Crabb Date: Wed, 10 May 2023 00:26:50 +1000 Subject: 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. --- src/devices/bus/s100/s100.cpp | 51 +++++++++++++-------------------------- src/devices/bus/s100/s100.h | 18 ++++++-------- src/frontend/mame/ui/datmenu.cpp | 5 ++-- src/frontend/mame/ui/filemngr.cpp | 3 ++- src/frontend/mame/ui/imgcntrl.cpp | 36 ++++++++++++++++++++++++--- src/frontend/mame/ui/inifile.cpp | 2 +- src/frontend/mame/ui/swlist.cpp | 4 +-- src/frontend/mame/ui/utils.cpp | 5 ---- src/frontend/mame/ui/utils.h | 1 - 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 +#include @@ -78,11 +80,8 @@ class s100_bus_device; class device_s100_card_interface : public device_interface { friend class s100_bus_device; - template 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 >; + 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 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 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(ui(), container(), *selected_device); - + } else { floppy_image_device *floppy_device = dynamic_cast(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(ui(), container(), m_swi, m_swp->interface().c_str(), &m_swp, true, m_submenu_result.swparts); + menu::stack_push(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 tokenize(const std::string &text, char sep); -- cgit v1.2.3