summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/machine/ds75161a.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/machine/ds75161a.cpp')
-rw-r--r--src/devices/machine/ds75161a.cpp353
1 files changed, 353 insertions, 0 deletions
diff --git a/src/devices/machine/ds75161a.cpp b/src/devices/machine/ds75161a.cpp
new file mode 100644
index 00000000000..5ec21a0e003
--- /dev/null
+++ b/src/devices/machine/ds75161a.cpp
@@ -0,0 +1,353 @@
+// license:BSD-3-Clause
+// copyright-holders:Curt Coder
+/**********************************************************************
+
+ National Semiconductor DS75161A IEEE-488 GPIB Transceiver emulation
+
+**********************************************************************/
+
+#include "ds75161a.h"
+
+
+
+//**************************************************************************
+// DEVICE TYPE DEFINITIONS
+//**************************************************************************
+
+const device_type DS75161A = &device_creator<ds75161a_device>;
+
+
+
+//**************************************************************************
+// LIVE DEVICE
+//**************************************************************************
+
+//-------------------------------------------------
+// ds75161a_device - constructor
+//-------------------------------------------------
+
+ds75161a_device::ds75161a_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
+ : device_t(mconfig, DS75161A, "DS75161A", tag, owner, clock, "ds75161a", __FILE__),
+ m_in_ren_cb(*this),
+ m_in_ifc_cb(*this),
+ m_in_ndac_cb(*this),
+ m_in_nrfd_cb(*this),
+ m_in_dav_cb(*this),
+ m_in_eoi_cb(*this),
+ m_in_atn_cb(*this),
+ m_in_srq_cb(*this),
+ m_out_ren_cb(*this),
+ m_out_ifc_cb(*this),
+ m_out_ndac_cb(*this),
+ m_out_nrfd_cb(*this),
+ m_out_dav_cb(*this),
+ m_out_eoi_cb(*this),
+ m_out_atn_cb(*this),
+ m_out_srq_cb(*this),
+ m_ren(1),
+ m_ifc(1),
+ m_ndac(1),
+ m_nrfd(1),
+ m_dav(1),
+ m_eoi(1),
+ m_atn(1),
+ m_srq(1),
+ m_te(0),
+ m_dc(0)
+{
+}
+
+//-------------------------------------------------
+// device_start - device-specific startup
+//-------------------------------------------------
+
+void ds75161a_device::device_start()
+{
+ // resolve callbacks
+ m_in_ren_cb.resolve_safe(0);
+ m_in_ifc_cb.resolve_safe(0);
+ m_in_ndac_cb.resolve_safe(0);
+ m_in_nrfd_cb.resolve_safe(0);
+ m_in_dav_cb.resolve_safe(0);
+ m_in_eoi_cb.resolve_safe(0);
+ m_in_atn_cb.resolve_safe(0);
+ m_in_srq_cb.resolve_safe(0);
+
+ m_out_ren_cb.resolve_safe();
+ m_out_ifc_cb.resolve_safe();
+ m_out_ndac_cb.resolve_safe();
+ m_out_nrfd_cb.resolve_safe();
+ m_out_dav_cb.resolve_safe();
+ m_out_eoi_cb.resolve_safe();
+ m_out_atn_cb.resolve_safe();
+ m_out_srq_cb.resolve_safe();
+
+ // register for state saving
+ save_item(NAME(m_ren));
+ save_item(NAME(m_ifc));
+ save_item(NAME(m_ndac));
+ save_item(NAME(m_nrfd));
+ save_item(NAME(m_dav));
+ save_item(NAME(m_eoi));
+ save_item(NAME(m_atn));
+ save_item(NAME(m_srq));
+ save_item(NAME(m_te));
+ save_item(NAME(m_dc));
+}
+
+
+//-------------------------------------------------
+// update_signals -
+//-------------------------------------------------
+
+void ds75161a_device::update_signals()
+{
+ m_out_ren_cb(m_dc ? 1 : m_ren);
+ m_out_ifc_cb(m_dc ? 1 : m_ifc);
+ m_out_ndac_cb(m_te ? 1 : m_ndac);
+ m_out_nrfd_cb(m_te ? 1 : m_nrfd);
+ m_out_dav_cb(m_te ? m_dav : 1);
+ m_out_atn_cb(m_dc ? 1 : m_atn);
+ m_out_srq_cb(m_dc ? m_srq : 1 );
+
+ int atn = m_in_atn_cb();
+
+ if (m_te && atn) m_out_eoi_cb(m_eoi);
+ else if (!m_dc && !atn) m_out_eoi_cb(m_eoi);
+ else m_out_eoi_cb(1);
+}
+
+
+//-------------------------------------------------
+// te_w - transmit enable
+//-------------------------------------------------
+
+WRITE_LINE_MEMBER( ds75161a_device::te_w )
+{
+ if (m_te != state)
+ {
+ m_te = state;
+
+ update_signals();
+ }
+}
+
+
+//-------------------------------------------------
+// dc_w - direction control
+//-------------------------------------------------
+
+WRITE_LINE_MEMBER( ds75161a_device::dc_w )
+{
+ if (m_dc != state)
+ {
+ m_dc = state;
+
+ update_signals();
+ }
+}
+
+
+//-------------------------------------------------
+// ren_r - remote enable read
+//-------------------------------------------------
+
+READ_LINE_MEMBER( ds75161a_device::ren_r )
+{
+ return m_dc ? m_in_ren_cb() : 0;
+}
+
+
+//-------------------------------------------------
+// ifc_r - interface clear read
+//-------------------------------------------------
+
+READ_LINE_MEMBER( ds75161a_device::ifc_r )
+{
+ return m_dc ? m_in_ifc_cb() : 0;
+}
+
+
+//-------------------------------------------------
+// ndac_r - not data acknowledge read
+//-------------------------------------------------
+
+READ_LINE_MEMBER( ds75161a_device::ndac_r )
+{
+ return m_te ? m_in_ndac_cb() : 0;
+}
+
+
+//-------------------------------------------------
+// nrfd_r - not ready for data read
+//-------------------------------------------------
+
+READ_LINE_MEMBER( ds75161a_device::nrfd_r )
+{
+ return m_te ? m_in_nrfd_cb() : 0;
+}
+
+
+//-------------------------------------------------
+// dav_r - data valid read
+//-------------------------------------------------
+
+READ_LINE_MEMBER( ds75161a_device::dav_r )
+{
+ return m_te ? 0 : m_in_dav_cb();
+}
+
+
+//-------------------------------------------------
+// eoi_r - end or identify read
+//-------------------------------------------------
+
+READ_LINE_MEMBER( ds75161a_device::eoi_r )
+{
+ int atn = m_in_atn_cb();
+ int eoi = m_in_eoi_cb();
+
+ if (!m_te && atn) return eoi;
+ else if (m_dc && !atn) return eoi;
+ else return 0;
+}
+
+
+//-------------------------------------------------
+// atn_r - attention read
+//-------------------------------------------------
+
+READ_LINE_MEMBER( ds75161a_device::atn_r )
+{
+ return m_dc ? m_in_atn_cb() : 0;
+}
+
+
+//-------------------------------------------------
+// srq_r - service request read
+//-------------------------------------------------
+
+READ_LINE_MEMBER( ds75161a_device::srq_r )
+{
+ return m_dc ? 0 : m_in_srq_cb();
+}
+
+
+//-------------------------------------------------
+// ren_w - remote enable write
+//-------------------------------------------------
+
+WRITE_LINE_MEMBER( ds75161a_device::ren_w )
+{
+ if (m_ren != state)
+ {
+ m_ren = state;
+
+ update_signals();
+ }
+}
+
+
+//-------------------------------------------------
+// ifc_w - interface clear write
+//-------------------------------------------------
+
+WRITE_LINE_MEMBER( ds75161a_device::ifc_w )
+{
+ if (m_ifc != state)
+ {
+ m_ifc = state;
+
+ update_signals();
+ }
+}
+
+
+//-------------------------------------------------
+// ndac_w - not data acknowledge write
+//-------------------------------------------------
+
+WRITE_LINE_MEMBER( ds75161a_device::ndac_w )
+{
+ if (m_ndac != state)
+ {
+ m_ndac = state;
+
+ update_signals();
+ }
+}
+
+
+//-------------------------------------------------
+// nrfd_w - not ready for data write
+//-------------------------------------------------
+
+WRITE_LINE_MEMBER( ds75161a_device::nrfd_w )
+{
+ if (m_nrfd != state)
+ {
+ m_nrfd = state;
+
+ update_signals();
+ }
+}
+
+
+//-------------------------------------------------
+// dav_w - data valid write
+//-------------------------------------------------
+
+WRITE_LINE_MEMBER( ds75161a_device::dav_w )
+{
+ if (m_dav != state)
+ {
+ m_dav = state;
+
+ update_signals();
+ }
+}
+
+
+//-------------------------------------------------
+// eoi_w - end or identify write
+//-------------------------------------------------
+
+WRITE_LINE_MEMBER( ds75161a_device::eoi_w )
+{
+ if (m_eoi != state)
+ {
+ m_eoi = state;
+
+ update_signals();
+ }
+}
+
+
+//-------------------------------------------------
+// atn_w - attention write
+//-------------------------------------------------
+
+WRITE_LINE_MEMBER( ds75161a_device::atn_w )
+{
+ if (m_atn != state)
+ {
+ m_atn = state;
+
+ update_signals();
+ }
+}
+
+
+//-------------------------------------------------
+// srq_w - service request write
+//-------------------------------------------------
+
+WRITE_LINE_MEMBER( ds75161a_device::srq_w )
+{
+ if (m_srq != state)
+ {
+ m_srq = state;
+
+ update_signals();
+ }
+}