diff options
Diffstat (limited to 'src/emu/dinetwork.cpp')
-rw-r--r-- | src/emu/dinetwork.cpp | 44 |
1 files changed, 40 insertions, 4 deletions
diff --git a/src/emu/dinetwork.cpp b/src/emu/dinetwork.cpp index 094d3476af1..cc1c4402759 100644 --- a/src/emu/dinetwork.cpp +++ b/src/emu/dinetwork.cpp @@ -10,6 +10,7 @@ device_network_interface::device_network_interface(const machine_config &mconfig m_bandwidth = bandwidth; set_mac("\0\0\0\0\0\0"); m_intf = 0; + m_loopback_control = false; } device_network_interface::~device_network_interface() @@ -22,14 +23,30 @@ void device_network_interface::interface_pre_start() m_recv_timer = device().machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(device_network_interface::recv_complete), this)); } -int device_network_interface::send(u8 *buf, int len) const +void device_network_interface::interface_post_start() +{ + device().save_item(NAME(m_loopback_control)); +} + +int device_network_interface::send(u8 *buf, int len) { // TODO: enable this check when other devices implement delayed transmit //assert_always(!m_send_timer->enabled(), "attempted to transmit while transmit already in progress"); int result = 0; - if (m_dev) + if (m_loopback_control) + { + // loop data back to receiver + result = recv_start_cb(buf, len); + + if (result) + { + // schedule receive complete callback + m_recv_timer->adjust(attotime::from_ticks(len, m_bandwidth * 1'000'000 / 8), result); + } + } + else if (m_dev) { // send the data result = m_dev->send(buf, len); @@ -50,8 +67,11 @@ void device_network_interface::recv_cb(u8 *buf, int len) { assert_always(!m_recv_timer->enabled(), "attempted to receive while receive already in progress"); + int result = 0; + // process the received data - int result = recv_start_cb(buf, len); + if (!m_loopback_control) + result = recv_start_cb(buf, len); if (result) { @@ -69,7 +89,7 @@ TIMER_CALLBACK_MEMBER(device_network_interface::recv_complete) recv_complete_cb(param); // start receiving data from the network again - if (m_dev) + if (m_dev && !m_loopback_control) m_dev->start(); } @@ -96,3 +116,19 @@ void device_network_interface::set_interface(int id) } m_intf = id; } + +void device_network_interface::set_loopback(bool loopback) +{ + if (m_loopback_control == loopback) + return; + + m_loopback_control = loopback; + + if (m_dev) + { + if (loopback) + m_dev->stop(); + else if (!m_recv_timer->enabled()) + m_dev->start(); + } +} |