diff --git a/.gitattributes b/.gitattributes index 9395f9bbc4a..cc401a121b0 100644 --- a/.gitattributes +++ b/.gitattributes @@ -4273,6 +4273,7 @@ src/mame/layout/fashion.lay svneol=native#text/plain src/mame/layout/fhunter.lay svneol=native#text/plain src/mame/layout/finallap.lay svneol=native#text/plain src/mame/layout/firebeat.lay svneol=native#text/plain +src/mame/layout/flicker.lay svneol=native#text/plain src/mame/layout/fortecrd.lay svneol=native#text/plain src/mame/layout/galaxi.lay -text svneol=native#plain/text src/mame/layout/gamball.lay svneol=native#text/plain diff --git a/src/mame/drivers/flicker.c b/src/mame/drivers/flicker.c index 7b62d6d0dfa..00131854533 100644 --- a/src/mame/drivers/flicker.c +++ b/src/mame/drivers/flicker.c @@ -1,6 +1,25 @@ +/*********************************************************************************** + + Flicker Pinball + + Prototype create by Nutting Associates for Bally. + + Seems to be the first ever microprocessor-controlled pinball machine. + + 2012-08-23 Made working [Robbbert] + + Inputs from US Patent 4093232 + Some clues from PinMAME + +ToDo: +- Add remaining inputs + + +************************************************************************************/ #include "emu.h" #include "cpu/i4004/i4004.h" +#include "flicker.lh" class flicker_state : public driver_device { @@ -9,6 +28,10 @@ public: : driver_device(mconfig, type, tag), m_maincpu(*this, "maincpu") { } + DECLARE_WRITE8_MEMBER(port00_w); + DECLARE_WRITE8_MEMBER(port01_w); + DECLARE_WRITE8_MEMBER(port10_w); + DECLARE_READ8_MEMBER(port02_r); protected: @@ -23,22 +46,72 @@ public: static ADDRESS_MAP_START( flicker_rom, AS_PROGRAM, 8, flicker_state ) - AM_RANGE(0x0000, 0xffff) AM_NOP AM_RANGE(0x0000, 0x03FF) AM_ROM ADDRESS_MAP_END static ADDRESS_MAP_START(flicker_map, AS_DATA, 8, flicker_state ) - AM_RANGE(0x0000, 0xffff) AM_NOP AM_RANGE(0x0000, 0x00FF) AM_RAM ADDRESS_MAP_END static ADDRESS_MAP_START( flicker_io , AS_IO, 8, flicker_state ) - AM_RANGE(0x0000, 0xffff) AM_NOP + 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) + PORT_BIT(0x0100, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("4 credit") PORT_CODE(KEYCODE_8) + PORT_BIT(0x0200, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("5 credit") PORT_CODE(KEYCODE_9) + 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_START("B1") + PORT_BIT(0x0002, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("Bumper") PORT_CODE(KEYCODE_M) 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; +} + +WRITE8_MEMBER( flicker_state::port00_w ) +{ + static const UINT8 patterns[16] = { 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0, 0, 0, 0, 0, 0 }; + offset = cpu_get_reg(m_maincpu, I4004_RAM); // we need the full address + output_set_digit_value(offset, patterns[data]); +} + +WRITE8_MEMBER( flicker_state::port01_w ) +{ + offset = cpu_get_reg(m_maincpu, I4004_RAM) - 0x10; // we need the full address + + if (offset < 0x10) + i4004_set_test(m_maincpu, BIT(ioport("TEST")->read(), offset)); +} + +WRITE8_MEMBER( flicker_state::port10_w ) +{ + //offset = cpu_get_reg(m_maincpu, I4004_RAM) - 0x10; // we need the full address +} + + void flicker_state::machine_reset() { } @@ -53,6 +126,9 @@ static MACHINE_CONFIG_START( flicker, flicker_state ) MCFG_CPU_PROGRAM_MAP(flicker_rom) MCFG_CPU_DATA_MAP(flicker_map) MCFG_CPU_IO_MAP(flicker_io) + + /* Video */ + MCFG_DEFAULT_LAYOUT(layout_flicker) MACHINE_CONFIG_END @@ -61,5 +137,5 @@ ROM_START(flicker) ROM_LOAD("flicker.rom", 0x0000, 0x0400, CRC(c692e586) SHA1(5cabb28a074d18b589b5b8f700c57e1610071c68)) ROM_END - -GAME(1974, flicker, 0, flicker, flicker, flicker_state, flicker, ROT0, "Nutting Associates", "Flicker (Prototype)", GAME_IS_SKELETON_MECHANICAL) +// 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) diff --git a/src/mame/layout/flicker.lay b/src/mame/layout/flicker.lay new file mode 100644 index 00000000000..f2892cf2b64 --- /dev/null +++ b/src/mame/layout/flicker.lay @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/mame/mame.mak b/src/mame/mame.mak index ba4146c69cb..f54d652bc14 100644 --- a/src/mame/mame.mak +++ b/src/mame/mame.mak @@ -2033,6 +2033,8 @@ $(DRIVERS)/dlair.o: $(LAYOUT)/dlair.lh $(DRIVERS)/firebeat.o: $(LAYOUT)/firebeat.lh +$(DRIVERS)/flicker.o: $(LAYOUT)/flicker.lh + $(DRIVERS)/fortecar.o: $(LAYOUT)/fortecrd.lh $(DRIVERS)/funworld.o: $(LAYOUT)/jollycrd.lh \