summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/bus/pce_ctrl/pachinko.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/bus/pce_ctrl/pachinko.cpp')
-rw-r--r--src/devices/bus/pce_ctrl/pachinko.cpp151
1 files changed, 151 insertions, 0 deletions
diff --git a/src/devices/bus/pce_ctrl/pachinko.cpp b/src/devices/bus/pce_ctrl/pachinko.cpp
new file mode 100644
index 00000000000..4913dac3e5b
--- /dev/null
+++ b/src/devices/bus/pce_ctrl/pachinko.cpp
@@ -0,0 +1,151 @@
+// license:BSD-3-Clause
+// copyright-holders:kmg
+/**********************************************************************
+
+ NEC PC Engine Coconuts Japan CJPC-101 Pachinko Controller
+
+ This controller was originally released as a set with PC Engine CD
+ game Pachio-kun Maboroshi no Densetsu. A near identical model was
+ then put out for the Famicom.
+
+ Functionally, this works like the non-turbo 2-button joypad with an
+ additional spring loaded analog rotating trigger. The trigger is read
+ after the standard buttons, much like a 2nd controller on a multitap.
+ Hence, this controller cannot be used in conjunction with a multitap.
+
+ TODO: according to games' packaging this controller works with all four
+ Pachio-kun games. However, only Maboroshi no Densetsu and Juuban Shoubu
+ prompt for controller type at boot. How to enable on the other two games?
+
+**********************************************************************/
+
+#include "emu.h"
+#include "pachinko.h"
+
+
+
+//**************************************************************************
+// DEVICE DEFINITIONS
+//**************************************************************************
+
+DEFINE_DEVICE_TYPE(PCE_PACHINKO, pce_pachinko_device, "pce_pachinko", "Coconuts Japan Pachinko Controller CJPC-101")
+
+
+static INPUT_PORTS_START( pce_pachinko )
+ // II is left of I on the original pad so we map them in reverse order
+ PORT_START("BUTTONS")
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_NAME("%p Button I")
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_NAME("%p Button II")
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_SELECT ) PORT_NAME("%p Select")
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_START ) PORT_NAME("%p Run")
+
+ PORT_START("DPAD")
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_8WAY
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_8WAY
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY
+
+ PORT_START("TRIGGER")
+ PORT_BIT( 0xff, 0x80, IPT_PEDAL ) PORT_MINMAX(0x80, 0xff) PORT_SENSITIVITY(10) PORT_KEYDELTA(20) PORT_INVERT PORT_REVERSE
+INPUT_PORTS_END
+
+
+//-------------------------------------------------
+// input_ports - device-specific input ports
+//-------------------------------------------------
+
+ioport_constructor pce_pachinko_device::device_input_ports() const
+{
+ return INPUT_PORTS_NAME( pce_pachinko );
+}
+
+
+
+//**************************************************************************
+// LIVE DEVICE
+//**************************************************************************
+
+//-------------------------------------------------
+// pce_pachinko_device - constructor
+//-------------------------------------------------
+
+pce_pachinko_device::pce_pachinko_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) :
+ device_t(mconfig, PCE_PACHINKO, tag, owner, clock),
+ device_pce_control_port_interface(mconfig, *this),
+ m_buttons(*this, "BUTTONS"),
+ m_dpad(*this, "DPAD"),
+ m_trigger(*this, "TRIGGER"),
+ m_counter(0),
+ m_prev_sel(false),
+ m_prev_clr(false)
+{
+}
+
+
+//-------------------------------------------------
+// device_start - device-specific startup
+//-------------------------------------------------
+
+void pce_pachinko_device::device_start()
+{
+ save_item(NAME(m_counter));
+ save_item(NAME(m_prev_sel));
+ save_item(NAME(m_prev_clr));
+}
+
+
+//-------------------------------------------------
+// peripheral_r - joypad read
+//-------------------------------------------------
+
+u8 pce_pachinko_device::peripheral_r()
+{
+ u8 data = 0xf;
+
+ if (!m_prev_clr)
+ {
+ switch (m_counter)
+ {
+ case 0:
+ data = m_dpad->read();
+ break;
+ case 1:
+ data = m_buttons->read();
+ break;
+ case 2:
+ data = m_trigger->read() >> 4;
+ break;
+ case 3:
+ data = m_trigger->read();
+ break;
+ }
+ }
+
+ return data;
+}
+
+
+//-------------------------------------------------
+// sel_w - MUXer select pin write
+//-------------------------------------------------
+
+void pce_pachinko_device::sel_w(int state)
+{
+ if (!m_prev_clr && m_prev_sel != state)
+ m_counter = (m_counter + 1) & 7;
+
+ m_prev_sel = state;
+}
+
+
+//-------------------------------------------------
+// clr_w - MUXer strobe pin write
+//-------------------------------------------------
+
+void pce_pachinko_device::clr_w(int state)
+{
+ if (m_prev_sel && !m_prev_clr && state)
+ m_counter = 0;
+
+ m_prev_clr = state;
+}