diff options
| author | 2024-04-18 05:59:03 +1000 | |
|---|---|---|
| committer | 2024-04-18 05:59:03 +1000 | |
| commit | 520ed5e44b49f80ec38bb812d8477e2b8a607cfc (patch) | |
| tree | 75b7c39026aab815269f1a69343c88a68984fa73 | |
| parent | 80dd0682d8ae2eecc9680069981b07b2b8a19948 (diff) | |
-ui/ui.cpp, ui/videoopt.cpp: Made pointer activity timeout configurable.
-midway/wmg.cpp: Use a memory bank for NVRAM; also got rid of a really pointless trampoline function.
| -rw-r--r-- | docs/source/advanced/ctrlr_config.rst | 46 | ||||
| -rw-r--r-- | docs/source/conf.py | 4 | ||||
| -rw-r--r-- | src/frontend/mame/ui/ui.cpp | 224 | ||||
| -rw-r--r-- | src/frontend/mame/ui/ui.h | 36 | ||||
| -rw-r--r-- | src/frontend/mame/ui/videoopt.cpp | 78 | ||||
| -rw-r--r-- | src/mame/midway/wmg.cpp | 55 |
6 files changed, 377 insertions, 66 deletions
diff --git a/docs/source/advanced/ctrlr_config.rst b/docs/source/advanced/ctrlr_config.rst index 7fb531b604c..1f19924e741 100644 --- a/docs/source/advanced/ctrlr_config.rst +++ b/docs/source/advanced/ctrlr_config.rst @@ -71,8 +71,10 @@ with a ``version`` attribute specifying the configuration format version (currently ``10`` – MAME will not load a file using a different version). The ``mameconfig`` element contains one or more ``system`` elements, each of which has a ``name`` attribute specifying the system(s) it applies to. Each -``system`` element contains an ``input`` element which holds the actual +``system`` element may contain an ``input`` element which holds the actual ``remap`` and ``port`` configuration elements, which will be described later. +Each ``system`` element may also contain a ``pointer_input`` element to set +pointer input options for systems with interactive artwork. When launching an emulated system, MAME will apply configuration from ``system`` elements where the value of the ``name`` attribute meets one of the following @@ -261,3 +263,45 @@ MAME applies ``mapdevice`` elements found inside the first applicable ``system`` element only. To avoid confusion, it’s simplest to place the ``system`` element applying to all systems (``name`` attribute set to ``default``) first in the file, and use it to assign input device numbers. + + +.. _ctrlrcfg-pointers: + +Setting pointer input options +----------------------------- + +A ``pointer_input`` element may contain ``target`` elements to set pointer input +options for each output screen or window. Each ``target`` element must have an +``index`` attribute containing the zero-based index of the screen to which it +applies. + +Each ``target`` element may have an ``activity_timeout`` attribute to set the +time after which a mouse pointer that has not moved and has no buttons pressed +will be considered inactive. The value is specified in seconds, and must be in +the range of 0.1 seconds to 10 seconds, inclusive. + +Each ``target`` element may have a ``hide_inactive`` element to set whether +inactive pointers may be hidden. If the value is ``0`` (zero), inactive +pointers will not be hidden. If the value is ``1``, inactive pointers may be +hidden, but layout views can still specify that inactive pointers should not be +hidden. + +Here’s an example demonstrating the use of this feature: + +.. code-block:: XML + + <system name="default"> + <pointer_input> + <target index="0" activity_timeout="1.5" /> + </pointer_input> + </system> + <system name="intellec4.cpp"> + <pointer_input> + <target index="0" hide_inactive="0" /> + </pointer_input> + </system> + +For all systems, pointers over the first output screen or window will be +considered inactive after not moving for 1.5 seconds with no buttons pressed. +For systems defined in ``intellec4.cpp``, inactive pointers over the first +window will not be hidden. diff --git a/docs/source/conf.py b/docs/source/conf.py index 3ab96db14b5..4f5f06b3e52 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -63,9 +63,9 @@ copyright = u'1997-2024, MAMEdev and contributors' # built documents. # # The short X.Y version. -version = '0.264' +version = '0.265' # The full version, including alpha/beta/rc tags. -release = '0.264' +release = '0.265' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. diff --git a/src/frontend/mame/ui/ui.cpp b/src/frontend/mame/ui/ui.cpp index 0c4af7b8ba5..e697f861da2 100644 --- a/src/frontend/mame/ui/ui.cpp +++ b/src/frontend/mame/ui/ui.cpp @@ -48,7 +48,6 @@ #include "../osd/modules/lib/osdlib.h" #include "../osd/modules/lib/osdobj_common.h" -#include <chrono> #include <functional> #include <type_traits> @@ -189,6 +188,28 @@ struct mame_ui_manager::active_pointer }; +struct mame_ui_manager::pointer_options +{ + pointer_options() + : timeout(std::chrono::seconds(3)) + , hide_inactive(true) + , timeout_set(false) + , hide_inactive_set(false) + { + } + + bool options_set() const + { + return timeout_set || hide_inactive_set; + } + + std::chrono::steady_clock::duration timeout; + bool hide_inactive; + bool timeout_set; + bool hide_inactive_set; +}; + + //------------------------------------------------- // ctor - set up the user interface //------------------------------------------------- @@ -252,8 +273,12 @@ void mame_ui_manager::init() machine().add_notifier(MACHINE_NOTIFY_EXIT, machine_notify_delegate(&mame_ui_manager::exit, this)); machine().configuration().config_register( "ui_warnings", - configuration_manager::load_delegate(&mame_ui_manager::config_load, this), - configuration_manager::save_delegate(&mame_ui_manager::config_save, this)); + configuration_manager::load_delegate(&mame_ui_manager::config_load_warnings, this), + configuration_manager::save_delegate(&mame_ui_manager::config_save_warnings, this)); + machine().configuration().config_register( + "pointer_input", + configuration_manager::load_delegate(&mame_ui_manager::config_load_pointers, this), + configuration_manager::save_delegate(&mame_ui_manager::config_save_pointers, this)); // create mouse bitmap uint32_t *dst = &m_mouse_bitmap.pix(0); @@ -311,10 +336,14 @@ void mame_ui_manager::exit() //------------------------------------------------- -// config_load - load configuration data +// config_load_warnings - load info on last time +// emulation status warnings showed //------------------------------------------------- -void mame_ui_manager::config_load(config_type cfg_type, config_level cfg_level, util::xml::data_node const *parentnode) +void mame_ui_manager::config_load_warnings( + config_type cfg_type, + config_level cfg_level, + util::xml::data_node const *parentnode) { // make sure it's relevant and there's data available if (config_type::SYSTEM == cfg_type) @@ -352,10 +381,13 @@ void mame_ui_manager::config_load(config_type cfg_type, config_level cfg_level, //------------------------------------------------- -// config_save - save configuration data +// config_save_warnings - save information on +// last time emulation status warnings showed //------------------------------------------------- -void mame_ui_manager::config_save(config_type cfg_type, util::xml::data_node *parentnode) +void mame_ui_manager::config_save_warnings( + config_type cfg_type, + util::xml::data_node *parentnode) { // only save system-level configuration when times are valid if ((config_type::SYSTEM == cfg_type) && (std::time_t(-1) != m_last_launch_time) && (std::time_t(-1) != m_last_warning_time)) @@ -383,6 +415,101 @@ void mame_ui_manager::config_save(config_type cfg_type, util::xml::data_node *pa //------------------------------------------------- +// config_load_pointers - load pointer input +// settings +//------------------------------------------------- + +void mame_ui_manager::config_load_pointers( + config_type cfg_type, + config_level cfg_level, + util::xml::data_node const *parentnode) +{ + switch (cfg_type) + { + case config_type::INIT: + { + int last(-1); + for (auto const &target : machine().render().targets()) + { + assert(target.index() >= 0); + if (!target.hidden()) + last = (std::max)(target.index(), last); + } + m_pointer_options.resize(last + 1); + } + break; + + case config_type::CONTROLLER: + case config_type::SYSTEM: + if (!parentnode) + break; + for (auto const *targetnode = parentnode->get_child("target"); targetnode; targetnode = targetnode->get_next_sibling("target")) + { + auto const index(targetnode->get_attribute_int("index", -1)); + if ((0 <= index) && (m_pointer_options.size() > index)) + { + auto const timeout(targetnode->get_attribute_float("activity_timeout", -1.0F)); + auto const ms(std::lround(timeout * 1000.0F)); + if ((100 <= ms) && (10'000 >= ms)) + { + m_pointer_options[index].timeout = std::chrono::milliseconds(ms); + if (config_type::SYSTEM == cfg_type) + m_pointer_options[index].timeout_set = true; + } + + auto const hide(targetnode->get_attribute_int("hide_inactive", -1)); + if (0 <= hide) + { + m_pointer_options[index].hide_inactive = hide != 0; + if (config_type::SYSTEM == cfg_type) + m_pointer_options[index].hide_inactive_set = true; + } + } + } + break; + + case config_type::DEFAULT: + case config_type::FINAL: + break; + } +} + + +//------------------------------------------------- +// config_save_pointers - save pointer input +// settings +//------------------------------------------------- + +void mame_ui_manager::config_save_pointers( + config_type cfg_type, + util::xml::data_node *parentnode) +{ + if (config_type::SYSTEM == cfg_type) + { + for (std::size_t i = 0; m_pointer_options.size() > i; ++i) + { + pointer_options const &options(m_pointer_options[i]); + if (options.options_set()) + { + util::xml::data_node *const targetnode = parentnode->add_child("target", nullptr); + if (targetnode) + { + targetnode->set_attribute_int("index", i); + if (options.timeout_set) + { + auto const ms(std::chrono::duration_cast<std::chrono::milliseconds>(options.timeout)); + targetnode->set_attribute_float("activity_timeout", float(ms.count()) * 0.001F); + } + if (options.hide_inactive_set) + targetnode->set_attribute_int("hide_inactive", options.hide_inactive); + } + } + } + } +} + + +//------------------------------------------------- // initialize - initialize ui lists //------------------------------------------------- @@ -1381,14 +1508,23 @@ uint32_t mame_ui_manager::handler_ingame(render_container &container) display_pointer_vector pointers; pointers.reserve(m_active_pointers.size()); auto const now(std::chrono::steady_clock::now()); + auto expiry(now); + render_target *target(nullptr); + layout_view const *view(nullptr); + bool hide_inactive(true); for (auto const &pointer : m_active_pointers) { - layout_view const &view(pointer.target->current_view()); - if (view.show_pointers()) + if (pointer.target != target) + { + target = pointer.target; + view = &target->current_view(); + hide_inactive = m_pointer_options[target->index()].hide_inactive && view->hide_inactive_pointers(); + expiry = now - m_pointer_options[target->index()].timeout; + } + if (view->show_pointers()) { - // TODO: make timeout configurable - if (!view.hide_inactive_pointers() || (osd::ui_event_handler::pointer::PEN == pointer.type) || ((now - pointer.updated) <= std::chrono::seconds(3))) - pointers.emplace_back(display_pointer{ *pointer.target, pointer.type, pointer.x, pointer.y }); + if (!hide_inactive || (osd::ui_event_handler::pointer::PEN == pointer.type) || (pointer.updated >= expiry)) + pointers.emplace_back(display_pointer{ *target, pointer.type, pointer.x, pointer.y }); } } set_pointers(pointers.begin(), pointers.end()); @@ -1590,6 +1726,70 @@ void mame_ui_manager::request_quit() } +//------------------------------------------------- +// set_pointer_activity_timeout - set per-target +// pointer activity timeout +//------------------------------------------------- + +void mame_ui_manager::set_pointer_activity_timeout(int target, std::chrono::steady_clock::duration timeout) noexcept +{ + assert((0 <= target) && (m_pointer_options.size() > target)); + if ((0 <= target) && (m_pointer_options.size() > target)) + { + m_pointer_options[target].timeout = timeout; + m_pointer_options[target].timeout_set = true; + } +} + + +//------------------------------------------------- +// set_hide_inactive_pointers - set per-target +// hide inactive pointers setting +//------------------------------------------------- + +void mame_ui_manager::set_hide_inactive_pointers(int target, bool hide) noexcept +{ + assert((0 <= target) && (m_pointer_options.size() > target)); + if ((0 <= target) && (m_pointer_options.size() > target)) + { + m_pointer_options[target].hide_inactive = hide; + m_pointer_options[target].hide_inactive_set = true; + } +} + + +//------------------------------------------------- +// pointer_activity_timeout - get per-target +// pointer activity timeout +//------------------------------------------------- + +std::chrono::steady_clock::duration mame_ui_manager::pointer_activity_timeout(int target) const noexcept +{ + assert((0 <= target) && (m_pointer_options.size() > target)); + if ((0 <= target) && (m_pointer_options.size() > target)) + return m_pointer_options[target].timeout; + else + return pointer_options().timeout; +} + + + +//------------------------------------------------- +// hide_inactive_pointers - get per-target hide +// inactive pointers setting +//------------------------------------------------- + +bool mame_ui_manager::hide_inactive_pointers(int target) const noexcept +{ + assert((0 <= target) && (m_pointer_options.size() > target)); + if ((0 <= target) && (m_pointer_options.size() > target)) + return m_pointer_options[target].hide_inactive; + else + return pointer_options().hide_inactive; +} + + + /*************************************************************************** SLIDER CONTROLS ***************************************************************************/ diff --git a/src/frontend/mame/ui/ui.h b/src/frontend/mame/ui/ui.h index d213d861f34..128300576e5 100644 --- a/src/frontend/mame/ui/ui.h +++ b/src/frontend/mame/ui/ui.h @@ -26,6 +26,7 @@ #include <any> #include <cassert> +#include <chrono> #include <ctime> #include <functional> #include <set> @@ -164,13 +165,21 @@ public: void display_startup_screens(bool first_time); virtual void set_startup_text(const char *text, bool force) override; bool update_and_render(render_container &container); + + // getting display font and metrics render_font *get_font(); float get_line_height(float scale = 1.0F); + float target_font_height() const { return m_target_font_height; } float get_char_width(char32_t ch); float get_string_width(std::string_view s); float get_string_width(std::string_view s, float text_size); + float box_lr_border() const { return target_font_height() * 0.25f; } + float box_tb_border() const { return target_font_height() * 0.25f; } + + // drawing boxes and text void draw_outlined_box(render_container &container, float x0, float y0, float x1, float y1, rgb_t backcolor); void draw_outlined_box(render_container &container, float x0, float y0, float x1, float y1, rgb_t fgcolor, rgb_t bgcolor); + void draw_textured_box(render_container &container, float x0, float y0, float x1, float y1, rgb_t backcolor, rgb_t linecolor, render_texture *texture = nullptr, uint32_t flags = PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA)); void draw_text(render_container &container, std::string_view buf, float x, float y); void draw_text_full(render_container &container, std::string_view origs, float x, float y, float origwrapwidth, ui::text_layout::text_justify justify, ui::text_layout::word_wrapping wrap, draw_mode draw, rgb_t fgcolor, rgb_t bgcolor, float *totalwidth = nullptr, float *totalheight = nullptr); void draw_text_full(render_container &container, std::string_view origs, float x, float y, float origwrapwidth, ui::text_layout::text_justify justify, ui::text_layout::word_wrapping wrap, draw_mode draw, rgb_t fgcolor, rgb_t bgcolor, float *totalwidth, float *totalheight, float text_size); @@ -197,13 +206,17 @@ public: bool can_paste(); bool found_machine_warnings() const { return m_has_warnings; } void image_handler_ingame(); - void increase_frameskip(); - void decrease_frameskip(); void request_quit(); + void set_pointer_activity_timeout(int target, std::chrono::steady_clock::duration timeout) noexcept; + void set_hide_inactive_pointers(int target, bool hide) noexcept; + std::chrono::steady_clock::duration pointer_activity_timeout(int target) const noexcept; + bool hide_inactive_pointers(int target) const noexcept; + + // drawing informational overlays void draw_fps_counter(render_container &container); void draw_profiler(render_container &container); - // pointer display + // pointer display for UI handlers template <typename T> void set_pointers(T first, T last) { @@ -238,9 +251,6 @@ public: std::vector<ui::menu_item> &get_slider_list(); // metrics - float target_font_height() const { return m_target_font_height; } - float box_lr_border() const { return target_font_height() * 0.25f; } - float box_tb_border() const { return target_font_height() * 0.25f; } void update_target_font_height(); // other @@ -248,9 +258,6 @@ public: ui::text_layout create_layout(render_container &container, float width = 1.0, ui::text_layout::text_justify justify = ui::text_layout::text_justify::LEFT, ui::text_layout::word_wrapping wrap = ui::text_layout::word_wrapping::WORD); void set_image_display_enabled(bool image_display_enabled) { m_image_display_enabled = image_display_enabled; } bool image_display_enabled() const { return m_image_display_enabled; } - - // draw an outlined box with given line color and filled with a texture - void draw_textured_box(render_container &container, float x0, float y0, float x1, float y1, rgb_t backcolor, rgb_t linecolor, render_texture *texture = nullptr, uint32_t flags = PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA)); virtual void popup_time_string(int seconds, std::string message) override; virtual void menu_reset() override; @@ -275,11 +282,13 @@ private: enum class ui_callback_type : int; struct active_pointer; + struct pointer_options; using handler_callback_func = delegate<uint32_t (render_container &)>; using device_feature_set = std::set<std::pair<std::string, std::string> >; using session_data_map = std::unordered_map<std::type_index, std::any>; using active_pointer_vector = std::vector<active_pointer>; + using pointer_options_vector = std::vector<pointer_options>; using display_pointer_vector = std::vector<display_pointer>; // instance variables @@ -294,6 +303,7 @@ private: osd_ticks_t m_popup_text_end; std::unique_ptr<uint8_t []> m_non_char_keys_down; + pointer_options_vector m_pointer_options; active_pointer_vector m_active_pointers; display_pointer_vector m_display_pointers; bitmap_argb32 m_mouse_bitmap; @@ -328,8 +338,12 @@ private: void set_handler(ui_callback_type callback_type, handler_callback_func &&callback); void frame_update(); void exit(); - void config_load(config_type cfg_type, config_level cfg_level, util::xml::data_node const *parentnode); - void config_save(config_type cfg_type, util::xml::data_node *parentnode); + void increase_frameskip(); + void decrease_frameskip(); + void config_load_warnings(config_type cfg_type, config_level cfg_level, util::xml::data_node const *parentnode); + void config_save_warnings(config_type cfg_type, util::xml::data_node *parentnode); + void config_load_pointers(config_type cfg_type, config_level cfg_level, util::xml::data_node const *parentnode); + void config_save_pointers(config_type cfg_type, util::xml::data_node *parentnode); template <typename... Params> void slider_alloc(Params &&...args) { m_sliders.push_back(std::make_unique<slider_state>(std::forward<Params>(args)...)); } // slider controls diff --git a/src/frontend/mame/ui/videoopt.cpp b/src/frontend/mame/ui/videoopt.cpp index 84ae6b6867d..7aeb2ac7bf3 100644 --- a/src/frontend/mame/ui/videoopt.cpp +++ b/src/frontend/mame/ui/videoopt.cpp @@ -15,6 +15,8 @@ #include "rendlay.h" #include "rendutil.h" +#include <chrono> + namespace ui { @@ -24,6 +26,7 @@ constexpr uintptr_t ITEM_ROTATE = 0x00000100; constexpr uintptr_t ITEM_ZOOM = 0x00000101; constexpr uintptr_t ITEM_UNEVENSTRETCH = 0x00000102; constexpr uintptr_t ITEM_KEEPASPECT = 0x00000103; +constexpr uintptr_t ITEM_POINTERTIMEOUT = 0x00000104; constexpr uintptr_t ITEM_TOGGLE_FIRST = 0x00000200; constexpr uintptr_t ITEM_VIEW_FIRST = 0x00000300; @@ -192,6 +195,29 @@ void menu_video_options::populate() item_append_on_off(_("Maintain Aspect Ratio"), m_target.keepaspect(), 0, reinterpret_cast<void *>(ITEM_KEEPASPECT)); } + // add pointer display options + if (!m_target.hidden()) + { + item_append(menu_item_type::SEPARATOR); + + // use millisecond precision for timeout display + auto const timeout = std::chrono::duration_cast<std::chrono::milliseconds>(ui().pointer_activity_timeout(m_target.index())); + bool const hide = ui().hide_inactive_pointers(m_target.index()); + if (hide) + { + int const precision = (timeout.count() % 10) ? 3 : (timeout.count() % 100) ? 2 : 1; + item_append( + _("Hide Inactive Pointers After Delay"), + util::string_format(_("%1$.*2$f s"), timeout.count() * 1e-3, precision), + ((timeout > std::chrono::milliseconds(100)) ? FLAG_LEFT_ARROW : 0) | FLAG_RIGHT_ARROW, + reinterpret_cast<void *>(ITEM_POINTERTIMEOUT)); + } + else + { + item_append(_("Hide Inactive Pointers After Delay"), _("Never"), FLAG_LEFT_ARROW, reinterpret_cast<void *>(ITEM_POINTERTIMEOUT)); + } + } + item_append(menu_item_type::SEPARATOR); } @@ -211,6 +237,7 @@ bool menu_video_options::handle(event const *ev) }); bool const snap_lockout(m_snapshot && machine().video().is_recording()); bool changed(false); + set_process_flags((reinterpret_cast<uintptr_t>(get_selection_ref()) == ITEM_POINTERTIMEOUT) ? PROCESS_LR_REPEAT : 0); // process the menu if (ev && uintptr_t(ev->itemref)) @@ -306,7 +333,7 @@ bool menu_video_options::handle(event const *ev) } break; - // keep aspect handles left/right keys the same (toggle) + // keep aspect handles left/right keys identically (toggle) case ITEM_KEEPASPECT: if ((ev->iptkey == IPT_UI_LEFT) || (ev->iptkey == IPT_UI_RIGHT)) { @@ -317,6 +344,55 @@ bool menu_video_options::handle(event const *ev) } break; + // pointer inactivity timeout + case ITEM_POINTERTIMEOUT: + if (ev->iptkey == IPT_UI_SELECT) + { + // toggle hide after delay + ui().set_hide_inactive_pointers(m_target.index(), !ui().hide_inactive_pointers(m_target.index())); + changed = true; + } + else if (ev->iptkey == IPT_UI_LEFT) + { + if (!ui().hide_inactive_pointers(m_target.index())) + { + ui().set_hide_inactive_pointers(m_target.index(), true); + ui().set_pointer_activity_timeout(m_target.index(), std::chrono::milliseconds(10'000)); + changed = true; + } + else + { + auto const timeout = ui().pointer_activity_timeout(m_target.index()); + if (std::chrono::milliseconds(100) < timeout) + { + auto const remainder = timeout % std::chrono::milliseconds(100); + ui().set_pointer_activity_timeout( + m_target.index(), + timeout - (remainder.count() ? remainder : std::chrono::milliseconds(100))); + changed = true; + } + } + } + else if (ev->iptkey == IPT_UI_RIGHT) + { + if (ui().hide_inactive_pointers(m_target.index())) + { + auto const timeout = ui().pointer_activity_timeout(m_target.index()); + if (std::chrono::milliseconds(10'000) <= timeout) + { + ui().set_hide_inactive_pointers(m_target.index(), false); + } + else + { + ui().set_pointer_activity_timeout( + m_target.index(), + std::chrono::milliseconds((1 + (timeout / std::chrono::milliseconds(100))) * 100)); + } + changed = true; + } + } + break; + // anything else is a view item default: if (reinterpret_cast<uintptr_t>(ev->itemref) >= ITEM_VIEW_FIRST) diff --git a/src/mame/midway/wmg.cpp b/src/mame/midway/wmg.cpp index a5f35e9823d..7fa02c999d3 100644 --- a/src/mame/midway/wmg.cpp +++ b/src/mame/midway/wmg.cpp @@ -90,6 +90,7 @@ public: , m_keyboard(*this, "X%d", 0U) , m_mainbank(*this, "mainbank") , m_codebank(*this, "codebank") + , m_nvrambank(*this, "nvrambank") , m_soundbank(*this, "soundbank") , m_io_view(*this, "io_view") { } @@ -107,6 +108,7 @@ private: required_ioport_array<17> m_keyboard; required_memory_bank m_mainbank; required_memory_bank m_codebank; + required_memory_bank m_nvrambank; required_memory_bank m_soundbank; memory_view m_io_view; @@ -114,12 +116,9 @@ private: uint8_t m_wmg_d000 = 0U; uint8_t m_port_select = 0U; - u8 wmg_nvram_r(offs_t offset); - void wmg_nvram_w(offs_t offset, u8 data); u8 wmg_pia_0_r(offs_t offset); void wmg_c400_w(u8 data); void wmg_d000_w(u8 data); - void wmg_blitter_w(offs_t, u8); void wmg_port_select_w(int state); void wmg_sound_reset_w(u8 data); void wmg_vram_select_w(u8 data); @@ -149,10 +148,10 @@ void wmg_state::wmg_cpu1(address_map &map) m_io_view[0](0xc804, 0xc807).r(FUNC(wmg_state::wmg_pia_0_r)).w(m_pia[0], FUNC(pia6821_device::write)); m_io_view[0](0xc80c, 0xc80f).rw(m_pia[1], FUNC(pia6821_device::read), FUNC(pia6821_device::write)); m_io_view[0](0xc900, 0xc9ff).nopr().w(FUNC(wmg_state::wmg_vram_select_w)); - m_io_view[0](0xca00, 0xca07).w(FUNC(wmg_state::wmg_blitter_w)); + m_io_view[0](0xca00, 0xca07).w(FUNC(wmg_state::blitter_w)); m_io_view[0](0xcb00, 0xcbff).r(FUNC(wmg_state::video_counter_r)); m_io_view[0](0xcbff, 0xcbff).w(FUNC(wmg_state::watchdog_reset_w)); - m_io_view[0](0xcc00, 0xcfff).rw(FUNC(wmg_state::wmg_nvram_r), FUNC(wmg_state::wmg_nvram_w)); + m_io_view[0](0xcc00, 0xcfff).bankrw(m_nvrambank); m_io_view[1](0xc000, 0xcfff).rom().region("maincpu", 0x58000); // Defender ROMs m_io_view[2](0xc000, 0xcfff).rom().region("maincpu", 0x59000); m_io_view[3](0xc000, 0xcfff).rom().region("maincpu", 0x5a000); @@ -322,31 +321,6 @@ INPUT_PORTS_END /************************************* * - * NVRAM (8k x 8), banked - * - *************************************/ -u8 wmg_state::wmg_nvram_r(offs_t offset) -{ - return m_p_ram[offset+(m_wmg_c400<<10)]; -} - -void wmg_state::wmg_nvram_w(offs_t offset, u8 data) -{ - m_p_ram[offset+(m_wmg_c400<<10)] = data; -} - -/************************************* - * - * Blitter - * - *************************************/ -void wmg_state::wmg_blitter_w(offs_t offset, u8 data) -{ - blitter_w(m_maincpu->space(AS_PROGRAM), offset, data); -} - -/************************************* - * * Bankswitching * *************************************/ @@ -360,13 +334,14 @@ void wmg_state::wmg_c400_w(u8 data) if (m_wmg_c400 == data) return; - if ((data == 0) || (m_wmg_c400 == 0)) // we must be going to/from the menu + if ((data == 0) || (m_wmg_c400 == 0)) // we must be going to/from the menu { m_wmg_c400 = data; - wmg_d000_w(0); // select i/o - m_mainbank->set_entry(data); // Gfx etc + wmg_d000_w(0); // select I/O + m_mainbank->set_entry(data); // Graphics, etc. m_codebank->set_entry(data); // Code - m_soundbank->set_entry(data); // Sound + m_nvrambank->set_entry(data); // NVRAM + m_soundbank->set_entry(data); // Sound m_soundcpu->reset(); } } @@ -432,11 +407,12 @@ void wmg_state::machine_start() { williams_state::machine_start(); - uint8_t *cpu = memregion("maincpu")->base(); - uint8_t *snd = memregion("soundcpu")->base(); - m_mainbank->configure_entries(0, 8, &cpu[0x00000], 0x10000); // Gfx etc - m_codebank->configure_entries(0, 8, &cpu[0x0d000], 0x10000); // Code - m_soundbank->configure_entries(0, 8, &snd[0x00000], 0x1000); // Sound + uint8_t *const cpu = memregion("maincpu")->base(); + uint8_t *const snd = memregion("soundcpu")->base(); + m_mainbank->configure_entries(0, 8, &cpu[0x00000], 0x10000); // Graphics, etc. + m_codebank->configure_entries(0, 8, &cpu[0x0d000], 0x10000); // Code + m_nvrambank->configure_entries(0, 8, &m_nvram[0], 0x400); // NVRAM + m_soundbank->configure_entries(0, 8, &snd[0x00000], 0x1000); // Sound save_item(NAME(m_wmg_c400)); save_item(NAME(m_wmg_d000)); @@ -518,6 +494,7 @@ void wmg_state::wmg(machine_config &config) M6808(config, m_soundcpu, SOUND_CLOCK); m_soundcpu->set_addrmap(AS_PROGRAM, &wmg_state::wmg_cpu2); + // 8k x 8, banked NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0); // set a timer to go off every 32 scanlines, to toggle the VA11 line and update the screen |
