diff options
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 |
commit | 1fe82affcb2f15fc89645e68db44695f56d3f166 (patch) | |
tree | 3f1c06f1686e0315f1fe468f2852ad383935fda8 | |
parent | 64c92a4f5f8d2f4d15893d65cba04958f4adf7e9 (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.lua | 2 | ||||
-rw-r--r-- | src/mame/drivers/taitoair.cpp | 51 | ||||
-rw-r--r-- | src/mame/includes/taitoair.h | 3 | ||||
-rw-r--r-- | src/mame/machine/taitoio_yoke.cpp | 137 | ||||
-rw-r--r-- | src/mame/machine/taitoio_yoke.h | 69 |
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 |