From 381061eef3a002210125df4218303942e50b8bef Mon Sep 17 00:00:00 2001 From: angelosa Date: Mon, 20 Nov 2023 21:42:16 +0100 Subject: taito/pkspirit.cpp, taito/taito_o.cpp: add TAITOIO_OPTO coin chutes --- src/mame/taito/pkspirit.cpp | 41 +++++++++++++++++++++++------------- src/mame/taito/taito_o.cpp | 46 ++++++++++++++++++++++++++++------------- src/mame/taito/taitoio_opto.cpp | 1 + 3 files changed, 60 insertions(+), 28 deletions(-) diff --git a/src/mame/taito/pkspirit.cpp b/src/mame/taito/pkspirit.cpp index a23abe236dc..5ae43caad3a 100644 --- a/src/mame/taito/pkspirit.cpp +++ b/src/mame/taito/pkspirit.cpp @@ -1,5 +1,5 @@ // license:BSD-3-Clause -// copyright-holders: +// copyright-holders:Angelo Salese /************************************************************************************************** Poker Spirit (c) 1992 Taito @@ -48,6 +48,8 @@ Video PCB: #include "sound/okim6295.h" #include "sound/ymopn.h" +#include "taitoio_opto.h" + #include "emupal.h" #include "screen.h" #include "speaker.h" @@ -59,14 +61,15 @@ namespace { class pkspirit_state : public driver_device { public: - pkspirit_state(const machine_config &mconfig, device_type type, const char *tag) : - driver_device(mconfig, type, tag), - m_maincpu(*this, "maincpu"), - m_mainio(*this, "mainio"), - m_gfxdecode(*this, "gfxdecode"), - m_bg_videoram(*this, "bg_videoram"), - m_fg_videoram(*this, "fg_videoram"), - m_audiobank(*this, "audiobank") + pkspirit_state(const machine_config &mconfig, device_type type, const char *tag) + : driver_device(mconfig, type, tag) + , m_maincpu(*this, "maincpu") + , m_mainio(*this, "mainio") + , m_gfxdecode(*this, "gfxdecode") + , m_bg_videoram(*this, "bg_videoram") + , m_fg_videoram(*this, "fg_videoram") + , m_audiobank(*this, "audiobank") + , m_opto(*this, "opto%u", 1U) { } void pkspirit(machine_config &config); @@ -84,6 +87,8 @@ private: required_shared_ptr m_fg_videoram; required_memory_bank m_audiobank; + required_device_array m_opto; + tilemap_t *m_bg_tilemap = nullptr; tilemap_t *m_fg_tilemap = nullptr; @@ -180,8 +185,12 @@ void pkspirit_state::sound_map(address_map &map) // TODO: verify everything // TODO: verify some of these labels means anything in normal English, remap accordingly -// TODO: Opto labels are supposedly coin chutes static INPUT_PORTS_START( pkspirit ) + PORT_START("COIN") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_COIN1 ) PORT_WRITE_LINE_DEVICE_MEMBER("opto1", taitoio_opto_device, coin_sense_w) + // FIXME: check error triggered if pressed for too long once video emulation is better + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_COIN2 ) PORT_WRITE_LINE_DEVICE_MEMBER("opto2", taitoio_opto_device, coin_sense_w) + PORT_START("IN1") PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_GAMBLE_BET ) PORT_NAME("1 Bet SW") PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("Duabet SW") @@ -189,8 +198,8 @@ static INPUT_PORTS_START( pkspirit ) PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_GAMBLE_DEAL ) PORT_NAME("Deal/Draw SW") // "DE/DR" PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_GAMBLE_D_UP ) PORT_NAME("Double SW") PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_GAMBLE_PAYOUT ) PORT_NAME("Payout SW") - PORT_BIT (0x40, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("Opto2 (H)") - PORT_BIT (0x80, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("Opto2 (L)") + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_CUSTOM ) PORT_READ_LINE_DEVICE_MEMBER("opto2", taitoio_opto_device, opto_h_r) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_CUSTOM ) PORT_READ_LINE_DEVICE_MEMBER("opto2", taitoio_opto_device, opto_l_r) PORT_START("IN2") PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POKER_HOLD1 ) @@ -199,8 +208,8 @@ static INPUT_PORTS_START( pkspirit ) PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_POKER_HOLD4 ) PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_POKER_HOLD5 ) PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_BIT (0x40, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("Opto1 (H)") - PORT_BIT (0x80, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("Opto1 (L)") + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_CUSTOM ) PORT_READ_LINE_DEVICE_MEMBER("opto1", taitoio_opto_device, opto_h_r) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_CUSTOM ) PORT_READ_LINE_DEVICE_MEMBER("opto1", taitoio_opto_device, opto_l_r) PORT_START("IN3") PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_SERVICE1 ) PORT_NAME("Reset Key") @@ -264,6 +273,7 @@ static INPUT_PORTS_START( pkspirit ) PORT_DIPNAME( 0x4000, 0x4000, "Bell" ) PORT_DIPLOCATION("SW2:7") PORT_DIPSETTING( 0x4000, DEF_STR( On ) ) PORT_DIPSETTING( 0x0000, DEF_STR( Off ) ) + // debug/cheat option PORT_DIPNAME( 0x8000, 0x8000, "Credit Pool 500" ) PORT_DIPLOCATION("SW2:8") PORT_DIPSETTING( 0x8000, DEF_STR( Off ) ) PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) @@ -305,6 +315,9 @@ void pkspirit_state::pkspirit(machine_config &config) m_mainio->in_port3_cb().set_ioport("IN3"); m_mainio->in_port4_cb().set_ioport("IN4"); + for (auto & opto : m_opto) + TAITOIO_OPTO(config, opto, 0); + // video hardware screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER)); // TODO: wrong screen.set_refresh_hz(60); diff --git a/src/mame/taito/taito_o.cpp b/src/mame/taito/taito_o.cpp index 91bcbf835d6..ad0f444dd11 100644 --- a/src/mame/taito/taito_o.cpp +++ b/src/mame/taito/taito_o.cpp @@ -53,6 +53,8 @@ Notes: #include "machine/watchdog.h" #include "sound/ymopn.h" +#include "taitoio_opto.h" + #include "emupal.h" #include "screen.h" #include "speaker.h" @@ -71,7 +73,8 @@ public: m_screen(*this, "screen"), m_palette(*this, "palette"), m_nvram(*this, "nvram"), - m_io_in(*this, "IN%u", 0U) + m_io_in(*this, "IN%u", 0U), + m_opto(*this, "opto%u", 1U) { } void parentj(machine_config &config); @@ -86,6 +89,7 @@ private: required_device m_nvram; required_ioport_array<2> m_io_in; + required_device_array m_opto; u32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); TIMER_DEVICE_CALLBACK_MEMBER(interrupt); @@ -140,18 +144,20 @@ void taitoo_state::prg_map(address_map &map) map(0x100000, 0x10ffff).mirror(0x010000).ram().share("nvram"); // Unknown, definitely not TC0220IOC map(0x200000, 0x200001).portr("IN0").lw16( - NAME([this] (offs_t offset, u16 data, u16 mem_mask) { - if (ACCESSING_BITS_8_15) - machine().bookkeeping().coin_lockout_w(0, !BIT(data, 11)); + NAME([] (offs_t offset, u16 data, u16 mem_mask) { + //if (ACCESSING_BITS_8_15) { + // TODO: custom signal to opto's (will block input trigger in service mode) + // machine().bookkeeping().coin_lockout_w(0, !BIT(data, 11)); + // } // BIT(data, 10); goes high when "coin in reversed" is detected, - // denoted as "bell" in eibise + // denoted as "bell" in eibise (physical one?) // m_hopper_io = BIT(data, 9); }) ); map(0x200002, 0x200003).portr("IN1").lw16( NAME([] (offs_t offset, u16 data, u16 mem_mask) { // m_hop_stop_coil = BIT(data, 14); - // m_divider = BIT(data, 12); active low + // m_coin_divider = BIT(data, 12); active low // lamps & 0x370f // \- bet & 0x000f, not present in eibise // \- deal & 0x1000 @@ -165,6 +171,11 @@ void taitoo_state::prg_map(address_map &map) } static INPUT_PORTS_START( parentj ) + PORT_START("COIN") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_COIN1 ) PORT_WRITE_LINE_DEVICE_MEMBER("opto1", taitoio_opto_device, coin_sense_w) + // FIXME: never triggers + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_COIN2 ) PORT_WRITE_LINE_DEVICE_MEMBER("opto2", taitoio_opto_device, coin_sense_w) + PORT_START("IN0") PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_POKER_HOLD1 ) PORT_NAME("Bet 1") PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_POKER_HOLD2 ) PORT_NAME("Bet 2") @@ -180,13 +191,13 @@ static INPUT_PORTS_START( parentj ) PORT_BIT( 0x0800, IP_ACTIVE_LOW, IPT_SERVICE1 ) PORT_NAME("Reset Key") PORT_BIT( 0x1000, IP_ACTIVE_LOW, IPT_SERVICE2 ) PORT_NAME("Last Key") PORT_BIT( 0x2000, IP_ACTIVE_LOW, IPT_SERVICE3 ) PORT_NAME("Meter Key") - PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("Opto 1H") - PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("Opto 1L") + PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_CUSTOM ) PORT_READ_LINE_DEVICE_MEMBER("opto1", taitoio_opto_device, opto_h_r) + PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_CUSTOM ) PORT_READ_LINE_DEVICE_MEMBER("opto1", taitoio_opto_device, opto_l_r) PORT_START("IN1") PORT_BIT (0x0001, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("Hopper Over") // "Hop Over"? - PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("Opto 2H") - PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("Opto 2L") + PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_CUSTOM ) PORT_READ_LINE_DEVICE_MEMBER("opto2", taitoio_opto_device, opto_h_r) + PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_CUSTOM ) PORT_READ_LINE_DEVICE_MEMBER("opto2", taitoio_opto_device, opto_l_r) PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_SERVICE4 ) PORT_NAME("All Clear SW") PORT_SERVICE_NO_TOGGLE(0x0010, IP_ACTIVE_LOW ) PORT_BIT( 0x00e0, IP_ACTIVE_LOW, IPT_UNKNOWN ) @@ -231,6 +242,10 @@ static INPUT_PORTS_START( parentj ) INPUT_PORTS_END static INPUT_PORTS_START( eibise ) + PORT_START("COIN") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_COIN1 ) PORT_WRITE_LINE_DEVICE_MEMBER("opto1", taitoio_opto_device, coin_sense_w) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_COIN2 ) PORT_WRITE_LINE_DEVICE_MEMBER("opto2", taitoio_opto_device, coin_sense_w) + PORT_START("IN0") PORT_BIT( 0x001f, IP_ACTIVE_LOW, IPT_UNKNOWN ) PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_GAMBLE_PAYOUT ) PORT_NAME("Payout Button") @@ -242,13 +257,13 @@ static INPUT_PORTS_START( eibise ) PORT_BIT( 0x0800, IP_ACTIVE_LOW, IPT_SERVICE1 ) PORT_NAME("Reset Key") PORT_BIT( 0x1000, IP_ACTIVE_LOW, IPT_SERVICE2 ) PORT_NAME("Last Key") PORT_BIT( 0x2000, IP_ACTIVE_LOW, IPT_SERVICE3 ) PORT_NAME("Meter Key") - PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("Opto 1H") - PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("Opto 1L") + PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_CUSTOM ) PORT_READ_LINE_DEVICE_MEMBER("opto1", taitoio_opto_device, opto_h_r) + PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_CUSTOM ) PORT_READ_LINE_DEVICE_MEMBER("opto1", taitoio_opto_device, opto_l_r) PORT_START("IN1") PORT_BIT (0x0001, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("Hopper Over") // "Hop Over"? - PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("Opto 2H") - PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("Opto 2L") + PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_CUSTOM ) PORT_READ_LINE_DEVICE_MEMBER("opto2", taitoio_opto_device, opto_h_r) + PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_CUSTOM ) PORT_READ_LINE_DEVICE_MEMBER("opto2", taitoio_opto_device, opto_l_r) PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_SERVICE4 ) PORT_NAME("All Clear SW") PORT_SERVICE_NO_TOGGLE(0x0010, IP_ACTIVE_LOW ) PORT_BIT( 0x00e0, IP_ACTIVE_LOW, IPT_UNKNOWN ) @@ -332,6 +347,9 @@ void taitoo_state::parentj(machine_config &config) NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0); + for (auto & opto : m_opto) + TAITOIO_OPTO(config, opto, 0); + SCREEN(config, m_screen, SCREEN_TYPE_RASTER); m_screen->set_refresh_hz(60); m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(2500)); diff --git a/src/mame/taito/taitoio_opto.cpp b/src/mame/taito/taitoio_opto.cpp index bc7801f956b..f05dbd0cc12 100644 --- a/src/mame/taito/taitoio_opto.cpp +++ b/src/mame/taito/taitoio_opto.cpp @@ -8,6 +8,7 @@ Detects coin weight tied to a non-JAMMA harness. Parent Jack pinout has two input pins, labeled "in medal sen(sor?)" and "coin drop". Used by Taito gambling/medal games: +- taito/cchance.cpp - taito/pkspirit.cpp - taito/sbmjb.cpp - taito/taito_o.cpp -- cgit v1.2.3