From a27b5ee8b453c8fea11620e6542e00f965b6f2bb Mon Sep 17 00:00:00 2001 From: Vas Crabb Date: Tue, 22 Jan 2019 00:44:00 +1100 Subject: vsmile_ctrl: hack to survive F3 reset (nw) --- src/devices/bus/vsmile/pad.cpp | 12 ++++++++++++ src/devices/bus/vsmile/pad.h | 1 + src/devices/bus/vsmile/vsmile_ctrl.cpp | 4 +++- 3 files changed, 16 insertions(+), 1 deletion(-) diff --git a/src/devices/bus/vsmile/pad.cpp b/src/devices/bus/vsmile/pad.cpp index c1a0ff74eeb..b973b16df57 100644 --- a/src/devices/bus/vsmile/pad.cpp +++ b/src/devices/bus/vsmile/pad.cpp @@ -65,6 +65,17 @@ void vsmile_pad_device::device_start() save_item(NAME(m_ctrl_probe_history)); } +void vsmile_pad_device::device_reset() +{ + vsmile_ctrl_device_base::device_reset(); + + // HACK: the controller detects an RTS timeout or something, it doesn't have a reset line + m_stale = STALE_ALL; + m_active = false; + std::fill(std::begin(m_ctrl_probe_history), std::end(m_ctrl_probe_history), 0U); + m_idle_timer->adjust(attotime::from_seconds(1)); +} + void vsmile_pad_device::tx_complete() { // update joystick @@ -129,6 +140,7 @@ void vsmile_pad_device::tx_timeout() m_idle_timer->adjust(attotime::from_seconds(1)); m_active = false; m_stale = STALE_ALL; + std::fill(std::begin(m_ctrl_probe_history), std::end(m_ctrl_probe_history), 0U); LOG("left active state\n"); } } diff --git a/src/devices/bus/vsmile/pad.h b/src/devices/bus/vsmile/pad.h index 5e2515c2b58..8bfc92403fa 100644 --- a/src/devices/bus/vsmile/pad.h +++ b/src/devices/bus/vsmile/pad.h @@ -45,6 +45,7 @@ protected: // device_t implementation virtual ioport_constructor device_input_ports() const override; virtual void device_start() override; + virtual void device_reset() override; // vsmile_ctrl_device_base implementation virtual void tx_complete() override; diff --git a/src/devices/bus/vsmile/vsmile_ctrl.cpp b/src/devices/bus/vsmile/vsmile_ctrl.cpp index 3a109484be1..601171be07e 100644 --- a/src/devices/bus/vsmile/vsmile_ctrl.cpp +++ b/src/devices/bus/vsmile/vsmile_ctrl.cpp @@ -193,7 +193,7 @@ bool vsmile_ctrl_device_base::queue_tx(uint8_t data) else { LOG("asserting RTS to transmit byte %02X\n", data); - m_rts_timer->adjust(attotime::from_msec(500)); + m_rts_timer->adjust(attotime::from_msec(100)); } } else @@ -290,6 +290,8 @@ TIMER_CALLBACK_MEMBER(vsmile_ctrl_device_base::rts_timer_expired) m_tx_fifo_head = m_tx_fifo_tail = 0U; m_tx_fifo_empty = true; tx_timeout(); + if (m_tx_fifo_empty) + rts_out(0); } } -- cgit v1.2.3