summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author angelosa <salese_corp_ltd@email.it>2017-08-20 13:34:48 +0200
committer angelosa <salese_corp_ltd@email.it>2017-08-20 13:35:10 +0200
commit1fe82affcb2f15fc89645e68db44695f56d3f166 (patch)
tree3f1c06f1686e0315f1fe468f2852ad383935fda8
parent64c92a4f5f8d2f4d15893d65cba04958f4adf7e9 (diff)
Written a new device for Taito Yoke based inputs, i.e. ones found in Midnight Landing and Top Landing [Angelo Salese]
-rw-r--r--scripts/target/mame/arcade.lua2
-rw-r--r--src/mame/drivers/taitoair.cpp51
-rw-r--r--src/mame/includes/taitoair.h3
-rw-r--r--src/mame/machine/taitoio_yoke.cpp137
-rw-r--r--src/mame/machine/taitoio_yoke.h69
5 files changed, 227 insertions, 35 deletions
diff --git a/scripts/target/mame/arcade.lua b/scripts/target/mame/arcade.lua
index 722d316c124..4d8deeb069c 100644
--- a/scripts/target/mame/arcade.lua
+++ b/scripts/target/mame/arcade.lua
@@ -3842,6 +3842,8 @@ files {
MAME_DIR .. "src/mame/audio/taito_zm.h",
MAME_DIR .. "src/mame/machine/taitoio.cpp",
MAME_DIR .. "src/mame/machine/taitoio.h",
+ MAME_DIR .. "src/mame/machine/taitoio_yoke.cpp",
+ MAME_DIR .. "src/mame/machine/taitoio_yoke.h",
MAME_DIR .. "src/mame/video/taito_helper.cpp",
MAME_DIR .. "src/mame/video/taito_helper.h",
MAME_DIR .. "src/mame/video/pc080sn.cpp",
diff --git a/src/mame/drivers/taitoair.cpp b/src/mame/drivers/taitoair.cpp
index 0c7f060aea3..68e812bc3c4 100644
--- a/src/mame/drivers/taitoair.cpp
+++ b/src/mame/drivers/taitoair.cpp
@@ -300,28 +300,24 @@ WRITE16_MEMBER(taitoair_state::airsys_gradram_w)
INPUTS
***********************************************************/
-#define STICK1_PORT_TAG "STICK1"
-#define STICK2_PORT_TAG "STICK2"
-#define STICK3_PORT_TAG "STICK3"
-
READ16_MEMBER(taitoair_state::stick_input_r)
{
switch( offset )
{
case 0x00: /* "counter 1" lo */
- return ioport(STICK1_PORT_TAG)->read();
+ return m_yoke->throttle_r(space,0) & 0xff; //ioport(STICK1_PORT_TAG)->read();
case 0x01: /* "counter 2" lo */
- return ioport(STICK2_PORT_TAG)->read();
+ return m_yoke->stickx_r(space,0) & 0xff;
case 0x02: /* "counter 1" hi */
- if(ioport(STICK1_PORT_TAG)->read() & 0x80)
+ if(m_yoke->throttle_r(space,0) & 0x80)
return 0xff;
return 0;
case 0x03: /* "counter 2" hi */
- return (ioport(STICK2_PORT_TAG)->read() & 0xff00) >> 8;
+ return (m_yoke->stickx_r(space,0) & 0xff00) >> 8;
}
return 0;
@@ -332,10 +328,10 @@ READ16_MEMBER(taitoair_state::stick2_input_r)
switch( offset )
{
case 0x00: /* "counter 3" lo */
- return ioport(STICK3_PORT_TAG)->read();
+ return m_yoke->sticky_r(space,0);
case 0x02: /* "counter 3" hi */
- return (ioport(STICK3_PORT_TAG)->read() & 0xff00) >> 8;
+ return (m_yoke->sticky_r(space,0) & 0xff00) >> 8;
}
return 0;
@@ -578,29 +574,20 @@ static INPUT_PORTS_START( topland )
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_SERVICE1 )
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_TILT )
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_START1 )
- PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(1) /* "door" (!) */
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(1) PORT_NAME("Door Switch") /* "door" (!) */
PORT_START("IN1")
- PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(1) /* slot down */
- PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(1) /* slot up */
- PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_PLAYER(1) /* handle */
- PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_PLAYER(1)
- PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_PLAYER(1)
- PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY PORT_PLAYER(1)
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_SPECIAL ) PORT_READ_LINE_DEVICE_MEMBER("yokectrl", taitoio_yoke_device, slot_down_r )
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_SPECIAL ) PORT_READ_LINE_DEVICE_MEMBER("yokectrl", taitoio_yoke_device, slot_up_r )
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_SPECIAL ) PORT_READ_LINE_DEVICE_MEMBER("yokectrl", taitoio_yoke_device, handle_left_r )
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_SPECIAL ) PORT_READ_LINE_DEVICE_MEMBER("yokectrl", taitoio_yoke_device, handle_right_r )
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_SPECIAL ) PORT_READ_LINE_DEVICE_MEMBER("yokectrl", taitoio_yoke_device, handle_down_r )
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_SPECIAL ) PORT_READ_LINE_DEVICE_MEMBER("yokectrl", taitoio_yoke_device, handle_up_r )
PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_OTHER ) // DMA status flag
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_START("IN2")
PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNUSED )
-
- PORT_START(STICK1_PORT_TAG)
- PORT_BIT( 0x00ff, 0x0000, IPT_AD_STICK_Z ) PORT_MINMAX(0x0080,0x007f) PORT_SENSITIVITY(30) PORT_KEYDELTA(40) PORT_PLAYER(1) PORT_REVERSE
-
- PORT_START(STICK2_PORT_TAG)
- PORT_BIT( 0x0fff, 0x0000, IPT_AD_STICK_X ) PORT_MINMAX(0x00800, 0x07ff) PORT_SENSITIVITY(100) PORT_KEYDELTA(20) PORT_PLAYER(1)
-
- PORT_START(STICK3_PORT_TAG)
- PORT_BIT( 0x0fff, 0x0000, IPT_AD_STICK_Y ) PORT_MINMAX(0x00800, 0x07ff) PORT_SENSITIVITY(100) PORT_KEYDELTA(20) PORT_PLAYER(1)
INPUT_PORTS_END
static INPUT_PORTS_START( ainferno )
@@ -641,6 +628,7 @@ static INPUT_PORTS_START( ainferno )
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_START2 )
PORT_START("IN1")
+ // TODO: understand these
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(1) /* lever */
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(1) /* handle x */
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(1) /* handle y */
@@ -652,15 +640,6 @@ static INPUT_PORTS_START( ainferno )
PORT_START("IN2")
PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNUSED )
-
- PORT_START(STICK1_PORT_TAG)
- PORT_BIT( 0x00ff, 0x0000, IPT_AD_STICK_Z ) PORT_MINMAX(0x0080,0x007f) PORT_SENSITIVITY(30) PORT_KEYDELTA(40) PORT_PLAYER(1) PORT_REVERSE
-
- PORT_START(STICK2_PORT_TAG)
- PORT_BIT( 0x0fff, 0x0000, IPT_AD_STICK_X ) PORT_MINMAX(0x00800, 0x07ff) PORT_SENSITIVITY(100) PORT_KEYDELTA(20) PORT_PLAYER(1)
-
- PORT_START(STICK3_PORT_TAG)
- PORT_BIT( 0x0fff, 0x0000, IPT_AD_STICK_Y ) PORT_MINMAX(0x00800, 0x07ff) PORT_SENSITIVITY(100) PORT_KEYDELTA(20) PORT_PLAYER(1)
INPUT_PORTS_END
@@ -745,6 +724,8 @@ static MACHINE_CONFIG_START( airsys )
MCFG_TC0220IOC_WRITE_4_CB(WRITE8(taitoair_state, coin_control_w))
MCFG_TC0220IOC_READ_7_CB(IOPORT("IN2"))
+ MCFG_TAITOIO_YOKE_ADD("yokectrl")
+
/* video hardware */
MCFG_SCREEN_ADD("screen", RASTER)
MCFG_SCREEN_REFRESH_RATE(60)
diff --git a/src/mame/includes/taitoair.h b/src/mame/includes/taitoair.h
index 1e81e093fe0..8db8ae58f8f 100644
--- a/src/mame/includes/taitoair.h
+++ b/src/mame/includes/taitoair.h
@@ -7,6 +7,7 @@
*************************************************************************/
#include "machine/taitoio.h"
+#include "machine/taitoio_yoke.h"
#include "video/tc0080vco.h"
#include "screen.h"
@@ -39,6 +40,7 @@ public:
m_dsp(*this, "dsp"),
m_tc0080vco(*this, "tc0080vco"),
m_tc0220ioc(*this, "tc0220ioc"),
+ m_yoke(*this, "yokectrl"),
m_gfxdecode(*this, "gfxdecode"),
m_screen(*this, "screen"),
m_palette(*this, "palette")
@@ -64,6 +66,7 @@ public:
required_device<cpu_device> m_dsp;
required_device<tc0080vco_device> m_tc0080vco;
required_device<tc0220ioc_device> m_tc0220ioc;
+ required_device<taitoio_yoke_device> m_yoke;
required_device<gfxdecode_device> m_gfxdecode;
required_device<screen_device> m_screen;
required_device<palette_device> m_palette;
diff --git a/src/mame/machine/taitoio_yoke.cpp b/src/mame/machine/taitoio_yoke.cpp
new file mode 100644
index 00000000000..516ebdd0513
--- /dev/null
+++ b/src/mame/machine/taitoio_yoke.cpp
@@ -0,0 +1,137 @@
+// license:BSD-3-Clause
+// copyright-holders:Angelo Salese
+/***************************************************************************
+
+ Taito Yoke + Throttle Flight device
+
+ Used in Midnight Landing, Top Landing and Air Inferno
+
+ TODO:
+ - Custom part #;
+ - Air Inferno uses different limit types (helicopter inputs?)
+
+***************************************************************************/
+
+#include "emu.h"
+#include "taitoio_yoke.h"
+
+
+
+//**************************************************************************
+// GLOBAL VARIABLES
+//**************************************************************************
+
+// device type definition
+DEFINE_DEVICE_TYPE(TAITOIO_YOKE, taitoio_yoke_device, "namcoio_gearbox", "Namco I/O Gearbox")
+
+
+//**************************************************************************
+// LIVE DEVICE
+//**************************************************************************
+
+//-------------------------------------------------
+// taitoio_yoke_device - constructor
+//-------------------------------------------------
+
+taitoio_yoke_device::taitoio_yoke_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ : device_t(mconfig, TAITOIO_YOKE, tag, owner, clock)
+{
+}
+
+
+
+
+//-------------------------------------------------
+// device_start - device-specific startup
+//-------------------------------------------------
+
+void taitoio_yoke_device::device_start()
+{
+}
+
+
+//-------------------------------------------------
+// device_reset - device-specific reset
+//-------------------------------------------------
+
+void taitoio_yoke_device::device_reset()
+{
+}
+
+static INPUT_PORTS_START( yoke_inputs )
+ PORT_START("THROTTLE")
+ PORT_BIT( 0x00ff, 0x0000, IPT_AD_STICK_Z ) PORT_MINMAX(0x0080,0x007f) PORT_SENSITIVITY(30) PORT_KEYDELTA(40) PORT_REVERSE
+
+ PORT_START("STICK_X")
+ PORT_BIT( 0x0fff, 0x0000, IPT_AD_STICK_X ) PORT_MINMAX(0x00800, 0x07ff) PORT_SENSITIVITY(100) PORT_KEYDELTA(20)
+
+ PORT_START("STICK_Y")
+ PORT_BIT( 0x0fff, 0x0000, IPT_AD_STICK_Y ) PORT_MINMAX(0x00800, 0x07ff) PORT_SENSITIVITY(100) PORT_KEYDELTA(20)
+INPUT_PORTS_END
+
+ioport_constructor taitoio_yoke_device::device_input_ports() const
+{
+ return INPUT_PORTS_NAME( yoke_inputs );
+}
+
+
+//**************************************************************************
+// READ/WRITE HANDLERS
+//**************************************************************************
+
+READ16_MEMBER( taitoio_yoke_device::stickx_r )
+{
+ return ioport("STICK_X")->read();
+}
+
+READ16_MEMBER( taitoio_yoke_device::sticky_r )
+{
+ return ioport("STICK_Y")->read();
+}
+
+READ16_MEMBER( taitoio_yoke_device::throttle_r )
+{
+ return ioport("THROTTLE")->read();
+}
+
+READ_LINE_MEMBER( taitoio_yoke_device::slot_down_r )
+{
+ uint16_t throttle = ioport("THROTTLE")->read();
+
+ return (throttle != 0) && (throttle & 0x80) == 0x00;
+}
+
+READ_LINE_MEMBER( taitoio_yoke_device::slot_up_r )
+{
+ uint16_t throttle = ioport("THROTTLE")->read();
+
+ return (throttle & 0x80) == 0x80;
+}
+
+READ_LINE_MEMBER( taitoio_yoke_device::handle_left_r )
+{
+ uint16_t x = ioport("STICK_X")->read();
+
+ return (x & 0x800) == 0x800;
+}
+
+READ_LINE_MEMBER( taitoio_yoke_device::handle_right_r )
+{
+ uint16_t x = ioport("STICK_X")->read();
+
+ return (x != 0) && (!(x & 0x800));
+}
+
+READ_LINE_MEMBER( taitoio_yoke_device::handle_up_r )
+{
+ uint16_t y = ioport("STICK_Y")->read();
+
+ return (y & 0x800) == 0x800;
+}
+
+READ_LINE_MEMBER( taitoio_yoke_device::handle_down_r )
+{
+ uint16_t y = ioport("STICK_Y")->read();
+
+ return (y != 0) && (!(y & 0x800));
+}
diff --git a/src/mame/machine/taitoio_yoke.h b/src/mame/machine/taitoio_yoke.h
new file mode 100644
index 00000000000..f0ee62abd05
--- /dev/null
+++ b/src/mame/machine/taitoio_yoke.h
@@ -0,0 +1,69 @@
+// license:BSD-3-Clause
+// copyright-holders:Angelo Salese
+/***************************************************************************
+
+ Taito Yoke + Throttle Flight device
+
+***************************************************************************/
+#ifndef MAME_MACHINE_TAITO_YOKE_H
+#define MAME_MACHINE_TAITO_YOKE_H
+
+#pragma once
+
+
+
+
+//**************************************************************************
+// INTERFACE CONFIGURATION MACROS
+//**************************************************************************
+
+#define MCFG_TAITOIO_YOKE_ADD(_tag) \
+ MCFG_DEVICE_ADD(_tag, TAITOIO_YOKE, 0)
+
+//**************************************************************************
+// TYPE DEFINITIONS
+//**************************************************************************
+
+// ======================> namcoio_gearbox_device
+
+class taitoio_yoke_device : public device_t
+{
+public:
+ // construction/destruction
+ taitoio_yoke_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+
+ // I/O operations
+ DECLARE_READ16_MEMBER( throttle_r );
+ DECLARE_READ16_MEMBER( stickx_r );
+ DECLARE_READ16_MEMBER( sticky_r );
+
+ DECLARE_READ_LINE_MEMBER( slot_up_r );
+ DECLARE_READ_LINE_MEMBER( slot_down_r );
+ DECLARE_READ_LINE_MEMBER( handle_left_r );
+ DECLARE_READ_LINE_MEMBER( handle_right_r );
+ DECLARE_READ_LINE_MEMBER( handle_up_r );
+ DECLARE_READ_LINE_MEMBER( handle_down_r );
+
+
+ virtual ioport_constructor device_input_ports() const override;
+
+protected:
+ // device-level overrides
+// virtual void device_validity_check(validity_checker &valid) const;
+ virtual void device_start() override;
+ virtual void device_reset() override;
+};
+
+
+// device type definition
+DECLARE_DEVICE_TYPE(TAITOIO_YOKE, taitoio_yoke_device)
+
+
+
+//**************************************************************************
+// GLOBAL VARIABLES
+//**************************************************************************
+
+
+
+#endif // MAME_MACHINE_TAITO_YOKE_H