summaryrefslogtreecommitdiffstats
path: root/src/emu/rendlay.cpp
diff options
context:
space:
mode:
author Vas Crabb <vas@vastheman.com>2019-07-06 02:56:24 +1000
committer Vas Crabb <vas@vastheman.com>2019-07-06 02:56:37 +1000
commitabb0842eca6a9285a1038a7aef8f405d8199fd9e (patch)
tree6f3612b25624a560df0b87c5b1374fda887a5576 /src/emu/rendlay.cpp
parent4e2959b5c0e40019bf944b2b503ef71c1a60e8f5 (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.cpp28
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;
+ }
+ }
+ }
}
}