summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/machine/vt1682_io.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/machine/vt1682_io.cpp')
-rw-r--r--src/mame/machine/vt1682_io.cpp136
1 files changed, 136 insertions, 0 deletions
diff --git a/src/mame/machine/vt1682_io.cpp b/src/mame/machine/vt1682_io.cpp
new file mode 100644
index 00000000000..6a9bae520e4
--- /dev/null
+++ b/src/mame/machine/vt1682_io.cpp
@@ -0,0 +1,136 @@
+// license:BSD-3-Clause
+// copyright-holders:David Haywood
+
+#include "machine/vt1682_io.h"
+
+#define LOG_IO (1U << 1)
+
+#define LOG_ALL ( LOG_IO )
+
+#define VERBOSE (0)
+#include "logmacro.h"
+
+
+DEFINE_DEVICE_TYPE(VT_VT1682_IO, vrt_vt1682_io_device, "vt1682io", "VRT VT1682 I/O")
+
+vrt_vt1682_io_device::vrt_vt1682_io_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) :
+ device_t(mconfig, VT_VT1682_IO, tag, owner, clock),
+ m_porta_out(*this),
+ m_portb_out(*this),
+ m_portc_out(*this),
+ m_portd_out(*this),
+ m_porta_in(*this),
+ m_portb_in(*this),
+ m_portc_in(*this),
+ m_portd_in(*this)
+{
+}
+
+void vrt_vt1682_io_device::device_start()
+{
+ m_porta_out.resolve_safe();
+ m_portb_out.resolve_safe();
+ m_portc_out.resolve_safe();
+ m_portd_out.resolve_safe();
+ m_porta_in.resolve_safe(0);
+ m_portb_in.resolve_safe(0);
+ m_portc_in.resolve_safe(0);
+ m_portd_in.resolve_safe(0);
+
+ save_item(NAME(m_210d_ioconfig));
+}
+
+void vrt_vt1682_io_device::device_reset()
+{
+ m_210d_ioconfig = 0;
+}
+
+
+/*
+ Address 0x210d r/w (MAIN CPU)
+
+ 0x80 - IOD ENB
+ 0x40 - IOD OE
+ 0x20 - IOC ENB
+ 0x10 - IOC OE
+ 0x08 - IOB ENB
+ 0x04 - IOB OE
+ 0x02 - IOA ENB
+ 0x01 - IOA OE
+*/
+
+READ8_MEMBER(vrt_vt1682_io_device::vt1682_210d_ioconfig_r)
+{
+ uint8_t ret = m_210d_ioconfig;
+ LOGMASKED(LOG_IO, "%s: vt1682_210d_ioconfig_r returning: %02x\n", machine().describe_context(), ret);
+ return ret;
+}
+
+WRITE8_MEMBER(vrt_vt1682_io_device::vt1682_210d_ioconfig_w)
+{
+ LOGMASKED(LOG_IO, "%s: vt1682_210d_ioconfig_w writing: %02x ( IOD_ENB:%1x IOD_OE:%1x | IOC_ENB:%1x IOC_OE:%1x | IOB_ENB:%1x IOB_OE:%1x | IOA_ENB:%1x IOA_OE:%1x )\n", machine().describe_context(), data,
+ (data & 0x80) ? 1 : 0,
+ (data & 0x40) ? 1 : 0,
+ (data & 0x20) ? 1 : 0,
+ (data & 0x10) ? 1 : 0,
+ (data & 0x08) ? 1 : 0,
+ (data & 0x04) ? 1 : 0,
+ (data & 0x02) ? 1 : 0,
+ (data & 0x01) ? 1 : 0);
+
+ m_210d_ioconfig = data;
+}
+
+/*
+ Address 0x210e r/w (MAIN CPU)
+
+ 0x80 - IOB:3
+ 0x40 - IOB:2
+ 0x20 - IOB:1
+ 0x10 - IOB:0
+ 0x08 - IOA:3
+ 0x04 - IOA:2
+ 0x02 - IOA:1
+ 0x01 - IOA:0
+*/
+
+READ8_MEMBER(vrt_vt1682_io_device::vt1682_210e_io_ab_r)
+{
+ uint8_t ret = (m_porta_in(0, 0x0f) & 0x0f) | ((m_portb_in(0, 0x0f) & 0x0f)<<4);
+ LOGMASKED(LOG_IO, "%s: vt1682_210e_io_ab_r returning: %02x\n", machine().describe_context(), ret);
+ return ret;
+}
+
+WRITE8_MEMBER(vrt_vt1682_io_device::vt1682_210e_io_ab_w)
+{
+ LOGMASKED(LOG_IO, "%s: vt1682_210e_io_ab_w writing: %02x (portb: %1x porta: %1x)\n", machine().describe_context(), data, (data & 0xf0) >> 4, data & 0x0f);
+ m_porta_out(0, (data & 0x0f), 0x0f);
+ m_portb_out(0, ((data & 0xf0)>>4), 0x0f);
+}
+
+/*
+ Address 0x210f r/w (MAIN CPU)
+
+ 0x80 - IOD:3
+ 0x40 - IOD:2
+ 0x20 - IOD:1
+ 0x10 - IOD:0
+ 0x08 - IOC:3
+ 0x04 - IOC:2
+ 0x02 - IOC:1
+ 0x01 - IOC:0
+*/
+
+READ8_MEMBER(vrt_vt1682_io_device::vt1682_210f_io_cd_r)
+{
+ uint8_t ret = (m_portc_in(0, 0x0f) & 0x0f) | ((m_portd_in(0, 0x0f) & 0x0f)<<4);
+ LOGMASKED(LOG_IO, "%s: vt1682_210f_io_cd_r returning: %02x\n", machine().describe_context(), ret);
+ return ret;
+}
+
+WRITE8_MEMBER(vrt_vt1682_io_device::vt1682_210f_io_cd_w)
+{
+ LOGMASKED(LOG_IO, "%s: vt1682_210f_io_cd_w writing: %02x (portd: %1x portc: %1x)\n", machine().describe_context(), data, (data & 0xf0) >> 4, data & 0x0f);
+ m_portc_out(0, (data & 0x0f), 0x0f);
+ m_portd_out(0, ((data & 0xf0)>>4), 0x0f);
+}