From 9b6503ac9521fa3c5b6b057f6c7c7fa5ac4f159a Mon Sep 17 00:00:00 2001 From: Robbbert Date: Thu, 23 Aug 2012 13:32:57 +0000 Subject: [PATCH] Flicker: added remaining inputs, some notes, sound (of sorts), marked as working. [Robbbert] --- src/mame/drivers/flicker.c | 117 ++++++++++++++++++++++++++++++------- 1 file changed, 96 insertions(+), 21 deletions(-) diff --git a/src/mame/drivers/flicker.c b/src/mame/drivers/flicker.c index 00131854533..efbd4ce3efd 100644 --- a/src/mame/drivers/flicker.c +++ b/src/mame/drivers/flicker.c @@ -12,13 +12,15 @@ Some clues from PinMAME ToDo: -- Add remaining inputs +- Better artwork +- It freezes when F3 pressed or game tilted ************************************************************************************/ #include "emu.h" #include "cpu/i4004/i4004.h" +#include "sound/beep.h" #include "flicker.lh" class flicker_state : public driver_device @@ -26,8 +28,10 @@ class flicker_state : public driver_device public: flicker_state(const machine_config &mconfig, device_type type, const char *tag) : driver_device(mconfig, type, tag), - m_maincpu(*this, "maincpu") + m_maincpu(*this, "maincpu"), + m_beeper(*this, BEEPER_TAG) { } + DECLARE_WRITE8_MEMBER(port00_w); DECLARE_WRITE8_MEMBER(port01_w); DECLARE_WRITE8_MEMBER(port10_w); @@ -37,11 +41,10 @@ protected: // devices required_device m_maincpu; + required_device m_beeper; // driver_device overrides virtual void machine_reset(); -public: - DECLARE_DRIVER_INIT(flicker); }; @@ -53,20 +56,16 @@ static ADDRESS_MAP_START(flicker_map, AS_DATA, 8, flicker_state ) AM_RANGE(0x0000, 0x00FF) AM_RAM ADDRESS_MAP_END -static ADDRESS_MAP_START( flicker_io , AS_IO, 8, flicker_state ) +static ADDRESS_MAP_START( flicker_io, AS_IO, 8, flicker_state ) AM_RANGE(0x0000, 0x0000) AM_WRITE(port00_w) AM_RANGE(0x0001, 0x0001) AM_WRITE(port01_w) AM_RANGE(0x0002, 0x0002) AM_READ(port02_r) AM_RANGE(0x0010, 0x0010) AM_WRITE(port10_w) ADDRESS_MAP_END -// from us patent 4093232 static INPUT_PORTS_START( flicker ) PORT_START("TEST") PORT_BIT(0x0002, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("Door Slam") PORT_CODE(KEYCODE_HOME) - PORT_BIT(0x0004, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("4 coins") - PORT_BIT(0x0008, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("3 coins") - PORT_BIT(0x0010, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("2 coins") PORT_BIT(0x0020, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("1 coin credit") PORT_CODE(KEYCODE_5) PORT_BIT(0x0040, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("2 credit") PORT_CODE(KEYCODE_6) PORT_BIT(0x0080, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("3 credit") PORT_CODE(KEYCODE_7) @@ -75,20 +74,52 @@ static INPUT_PORTS_START( flicker ) PORT_BIT(0x0400, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("6 credit") PORT_CODE(KEYCODE_0) PORT_BIT(0x0800, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("Tilt") PORT_CODE(KEYCODE_T) PORT_BIT(0x1000, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("Start") PORT_CODE(KEYCODE_1) - PORT_BIT(0x8000, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("Test") PORT_CODE(KEYCODE_W) + PORT_BIT(0x8000, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("Test") + PORT_START("B0") + PORT_BIT(0x0001, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("Left Lane Target") PORT_CODE(KEYCODE_W) + PORT_BIT(0x0002, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("/B Target") PORT_CODE(KEYCODE_E) + PORT_BIT(0x0004, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("Left Lane 1000") PORT_CODE(KEYCODE_R) + PORT_BIT(0x0008, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("/A Target") PORT_CODE(KEYCODE_Y) PORT_START("B1") - PORT_BIT(0x0002, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("Bumper") PORT_CODE(KEYCODE_M) + PORT_BIT(0x0001, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("Right Lane Target") PORT_CODE(KEYCODE_U) + PORT_BIT(0x0002, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("/C Target") PORT_CODE(KEYCODE_I) + PORT_BIT(0x0004, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("Right Lane 1000") PORT_CODE(KEYCODE_O) + PORT_BIT(0x0008, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("/D Target") PORT_CODE(KEYCODE_A) + PORT_START("B2") + PORT_BIT(0x0001, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("Spinner") PORT_CODE(KEYCODE_S) + PORT_START("B3") + PORT_BIT(0x0001, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("10's Target") PORT_CODE(KEYCODE_D) + PORT_BIT(0x0002, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("100's Target") PORT_CODE(KEYCODE_F) + PORT_BIT(0x0004, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("Pot Bumper") PORT_CODE(KEYCODE_G) + PORT_BIT(0x0008, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("3000 Hole") PORT_CODE(KEYCODE_H) + PORT_START("B4") + PORT_BIT(0x0001, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("1000 Bonus") PORT_CODE(KEYCODE_J) + PORT_BIT(0x0004, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("500 Target") PORT_CODE(KEYCODE_K) + PORT_BIT(0x0008, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("Out Hole") PORT_CODE(KEYCODE_X) + PORT_START("B5") + PORT_BIT(0x0001, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("Left 500 Out") PORT_CODE(KEYCODE_L) + PORT_BIT(0x0002, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("Left Bumper") PORT_CODE(KEYCODE_Z) + PORT_BIT(0x0004, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("Right 500 Out") PORT_CODE(KEYCODE_C) + PORT_BIT(0x0008, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("Right Bumper") PORT_CODE(KEYCODE_V) + PORT_START("B6") + PORT_BIT(0x0001, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("A Target") PORT_CODE(KEYCODE_B) + PORT_BIT(0x0002, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("B target") PORT_CODE(KEYCODE_N) + PORT_BIT(0x0004, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("C target") PORT_CODE(KEYCODE_M) + PORT_BIT(0x0008, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("D Target") PORT_CODE(KEYCODE_COMMA) INPUT_PORTS_END READ8_MEMBER( flicker_state::port02_r ) { offset = cpu_get_reg(m_maincpu, I4004_RAM) - 0x20; // we need the full address - if (offset == 0) - return ioport("B1")->read(); - else - return 0; + if (offset < 7) + { + char kbdrow[6]; + sprintf(kbdrow,"B%X",offset); + return ioport(kbdrow)->read(); + } + return 0; } WRITE8_MEMBER( flicker_state::port00_w ) @@ -100,6 +131,7 @@ WRITE8_MEMBER( flicker_state::port00_w ) WRITE8_MEMBER( flicker_state::port01_w ) { +// The output lines operate the various lamps (44 of them) offset = cpu_get_reg(m_maincpu, I4004_RAM) - 0x10; // we need the full address if (offset < 0x10) @@ -108,7 +140,49 @@ WRITE8_MEMBER( flicker_state::port01_w ) WRITE8_MEMBER( flicker_state::port10_w ) { - //offset = cpu_get_reg(m_maincpu, I4004_RAM) - 0x10; // we need the full address +/* Outputs depend on data: + 1 = tens chime + 2 = hundreds chime + 3 = thousands chime + 4 = left bumper + 5 = right bumper + 6 = pot bumper + 7 = out hole + 8 = 3000 hole + 9 = knocker + A = coin counter + B = coin acceptor */ + offset = cpu_get_reg(m_maincpu, I4004_RAM) - 0x10; // we need the full address + if (data && data != offset) + { + switch (offset) + { + case 0x01: + beep_set_state(m_beeper, 1); + beep_set_frequency(m_beeper, 2000); + break; + case 0x02: + beep_set_state(m_beeper, 1); + beep_set_frequency(m_beeper, 1500); + break; + case 0x03: + beep_set_state(m_beeper, 1); + beep_set_frequency(m_beeper, 800); + break; + case 0x09: + beep_set_state(m_beeper, 1); + beep_set_frequency(m_beeper, 200); + break; + case 0x0a: + coin_counter_w(machine(), 0, 1); + coin_counter_w(machine(), 0, 0); + break; + default: + break; + } + } + else + beep_set_state(m_beeper, 0); } @@ -116,10 +190,6 @@ void flicker_state::machine_reset() { } -DRIVER_INIT_MEMBER(flicker_state,flicker) -{ -} - static MACHINE_CONFIG_START( flicker, flicker_state ) /* basic machine hardware */ MCFG_CPU_ADD("maincpu", I4004, XTAL_5MHz / 8) @@ -129,6 +199,11 @@ static MACHINE_CONFIG_START( flicker, flicker_state ) /* Video */ MCFG_DEFAULT_LAYOUT(layout_flicker) + + /* Sound */ + MCFG_SPEAKER_STANDARD_MONO("mono") + MCFG_SOUND_ADD(BEEPER_TAG, BEEP, 0) + MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50) MACHINE_CONFIG_END @@ -138,4 +213,4 @@ ROM_START(flicker) ROM_END // YEAR GAME PARENT MACHINE INPUT CLASS INIT ORIENTATION COMPANY DESCRIPTION FLAGS -GAME(1974, flicker, 0, flicker, flicker, flicker_state, flicker, ROT0, "Nutting Associates", "Flicker (Prototype)", GAME_IS_SKELETON_MECHANICAL) +GAME(1974, flicker, 0, flicker, flicker, driver_device, 0, ROT0, "Nutting Associates", "Flicker (Prototype)", GAME_MECHANICAL )