summaryrefslogtreecommitdiffstatshomepage
path: root/src/emu/ioport.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/emu/ioport.cpp')
-rw-r--r--src/emu/ioport.cpp29
1 files changed, 26 insertions, 3 deletions
diff --git a/src/emu/ioport.cpp b/src/emu/ioport.cpp
index 09bea86931e..06766134370 100644
--- a/src/emu/ioport.cpp
+++ b/src/emu/ioport.cpp
@@ -652,7 +652,10 @@ ioport_field::ioport_field(ioport_port &port, ioport_type type, ioport_value def
void ioport_field::set_value(ioport_value value)
{
- m_digital_value = value != 0;
+ if (is_analog())
+ live().analog->set_value(s32(value));
+ else
+ m_digital_value = value != 0;
}
@@ -3234,6 +3237,7 @@ analog_field::analog_field(ioport_field &field)
m_accum(0),
m_previous(0),
m_previousanalog(0),
+ m_prog_analog_value(0),
m_minimum(INPUT_ABSOLUTE_MIN),
m_maximum(INPUT_ABSOLUTE_MAX),
m_center(0),
@@ -3248,7 +3252,8 @@ analog_field::analog_field(ioport_field &field)
m_autocenter(false),
m_single_scale(false),
m_interpolate(false),
- m_lastdigital(false)
+ m_lastdigital(false),
+ m_was_written(false)
{
// compute the shift amount and number of bits
for (ioport_value mask = field.mask(); !(mask & 1); mask >>= 1)
@@ -3488,6 +3493,17 @@ s32 analog_field::apply_settings(s32 value) const
//-------------------------------------------------
+// set_value - take a new value to be used
+// at next frame update
+//-------------------------------------------------
+
+void analog_field::set_value(s32 value)
+{
+ m_was_written = true;
+ m_prog_analog_value = value;
+}
+
+//-------------------------------------------------
// frame_update - update the internals of a
// single analog field periodically
//-------------------------------------------------
@@ -3504,7 +3520,14 @@ void analog_field::frame_update(running_machine &machine)
// get the new raw analog value and its type
input_item_class itemclass;
s32 rawvalue = machine.input().seq_axis_value(m_field.seq(SEQ_TYPE_STANDARD), itemclass);
-
+
+ // use programmatically set value if avaiable
+ if (m_was_written)
+ {
+ m_was_written = false;
+ rawvalue = m_prog_analog_value;
+ }
+
// if we got an absolute input, it overrides everything else
if (itemclass == ITEM_CLASS_ABSOLUTE)
{