diff options
author | 2019-07-06 02:56:24 +1000 | |
---|---|---|
committer | 2019-07-06 02:56:37 +1000 | |
commit | abb0842eca6a9285a1038a7aef8f405d8199fd9e (patch) | |
tree | 6f3612b25624a560df0b87c5b1374fda887a5576 /src/emu/rendlay.cpp | |
parent | 4e2959b5c0e40019bf944b2b503ef71c1a60e8f5 (diff) |
don't crash when a layout references a conditional I/O port field (nw)
Diffstat (limited to 'src/emu/rendlay.cpp')
-rw-r--r-- | src/emu/rendlay.cpp | 28 |
1 files changed, 19 insertions, 9 deletions
diff --git a/src/emu/rendlay.cpp b/src/emu/rendlay.cpp index 317114a032e..b104089529c 100644 --- a/src/emu/rendlay.cpp +++ b/src/emu/rendlay.cpp @@ -3368,17 +3368,17 @@ int layout_view::item::state() const else if (!m_input_tag.empty()) { // if configured to an input, fetch the input value - if (m_input_raw) + if (m_input_port) { - if (m_input_port) + if (m_input_raw) + { return (m_input_port->read() & m_input_mask) >> m_input_shift; - } - else - { - if (m_input_field) + } + else { - assert(m_input_port); - return ((m_input_port->read() ^ m_input_field->defvalue()) & m_input_mask) ? 1 : 0; + ioport_field const *const field(m_input_field ? m_input_field : m_input_port->field(m_input_mask)); + if (field) + return ((m_input_port->read() ^ field->defvalue()) & m_input_mask) ? 1 : 0; } } } @@ -3397,7 +3397,17 @@ void layout_view::item::resolve_tags() { m_input_port = m_element->machine().root_device().ioport(m_input_tag.c_str()); if (m_input_port) - m_input_field = m_input_port->field(m_input_mask); + { + for (ioport_field &field : m_input_port->fields()) + { + if (field.mask() & m_input_mask) + { + if (field.condition().condition() == ioport_condition::ALWAYS) + m_input_field = &field; + break; + } + } + } } } |