summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/bus/a2bus/snesmax.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/bus/a2bus/snesmax.cpp')
-rw-r--r--src/devices/bus/a2bus/snesmax.cpp97
1 files changed, 97 insertions, 0 deletions
diff --git a/src/devices/bus/a2bus/snesmax.cpp b/src/devices/bus/a2bus/snesmax.cpp
new file mode 100644
index 00000000000..25638da62ed
--- /dev/null
+++ b/src/devices/bus/a2bus/snesmax.cpp
@@ -0,0 +1,97 @@
+// license:BSD-3-Clause
+// copyright-holders:Vas Crabb
+#include "emu.h"
+#include "snesmax.h"
+
+#include "bus/snes_ctrl/ctrl.h"
+
+namespace {
+
+class a2bus_snes_max_device : public device_t, public device_a2bus_card_interface
+{
+public:
+ a2bus_snes_max_device(
+ machine_config const &mconfig,
+ char const *tag,
+ device_t *owner,
+ u32 clock) :
+ device_t(mconfig, A2BUS_SNES_MAX, tag, owner, clock),
+ device_a2bus_card_interface(mconfig, *this),
+ m_controllers(*this, "%u", 1U),
+ m_latch_timer(nullptr),
+ m_data(0xff)
+ {
+ }
+
+ virtual u8 read_c0nx(u8 offset) override
+ {
+ return m_data;
+ }
+
+ virtual void write_c0nx(u8 offset, u8 data) override
+ {
+ if (BIT(offset, 0))
+ {
+ m_data =
+ (m_controllers[0]->read_pin4() ? 0x00 : 0x80) |
+ (m_controllers[1]->read_pin4() ? 0x00 : 0x40) |
+ 0x3f;
+ }
+ else
+ {
+ machine().scheduler().synchronize(timer_expired_delegate(FUNC(a2bus_snes_max_device::set_latch), this), 0);
+ }
+ }
+
+ virtual bool take_c800() override
+ {
+ return false;
+ }
+
+protected:
+ virtual void device_add_mconfig(machine_config &config) override ATTR_COLD
+ {
+ SNES_CONTROL_PORT(config, m_controllers[0], snes_control_port_devices, "joypad");
+ SNES_CONTROL_PORT(config, m_controllers[1], snes_control_port_devices, "joypad");
+ }
+
+ virtual void device_start() override ATTR_COLD
+ {
+ m_latch_timer = timer_alloc(FUNC(a2bus_snes_max_device::reset_latch), this);
+
+ m_data = 0xff;
+
+ save_item(NAME(m_data));
+
+ m_controllers[0]->write_strobe(0);
+ m_controllers[1]->write_strobe(0);
+ }
+
+private:
+ TIMER_CALLBACK_MEMBER(set_latch)
+ {
+ m_controllers[0]->write_strobe(1);
+ m_controllers[1]->write_strobe(1);
+ m_latch_timer->adjust(attotime::from_ticks(7, clock()));
+ }
+
+ TIMER_CALLBACK_MEMBER(reset_latch)
+ {
+ m_controllers[0]->write_strobe(0);
+ m_controllers[1]->write_strobe(0);
+
+ m_data =
+ (m_controllers[0]->read_pin4() ? 0x00 : 0x80) |
+ (m_controllers[1]->read_pin4() ? 0x00 : 0x40) |
+ 0x3f;
+ }
+
+ required_device_array<snes_control_port_device, 2> m_controllers;
+ emu_timer *m_latch_timer;
+ u8 m_data;
+};
+
+} // anonymous namespace
+
+
+DEFINE_DEVICE_TYPE_PRIVATE(A2BUS_SNES_MAX, device_a2bus_card_interface, a2bus_snes_max_device, "a2snesmax", "SNES MAX Game Controller Interface")