diff --git a/src/mame/drivers/atari_s1.c b/src/mame/drivers/atari_s1.c index fc76d5b70d2..4872d274001 100644 --- a/src/mame/drivers/atari_s1.c +++ b/src/mame/drivers/atari_s1.c @@ -3,19 +3,33 @@ Pinball Atari Generation/System 1 These were the first widebody pinball machines. - Unfortunately they tended to be boring. - - The design of having the circuit boards under the playfield wasn't such a good - idea, because it allowed debris and loose screws that could fall off the - playfield to cause havoc among the electronics. Schematics and PinMAME used as references. + Dipswitch vs address: + SW1 Toggle 1 = 200B + SW1 Toggle 2 = 200A + SW1 Toggle 3 = 2009 + SW1 Toggle 4 = 2008 + SW1 Toggle 5 = 200F + SW1 Toggle 6 = 200E + SW1 Toggle 7 = 200D + SW1 Toggle 8 = 200C + SW2 Toggle 1 = 2003 + SW2 Toggle 2 = 2002 + SW2 Toggle 3 = 2001 + SW2 Toggle 4 = 2000 + SW2 Toggle 5 = 2007 + SW2 Toggle 6 = 2006 + SW2 Toggle 7 = 2005 + SW2 Toggle 8 = 2004 + ToDo: - Inputs per game; the ones there are for Airborne Avenger - Link up switches where 2 or more act together - Sound - Lamps, solenoids +- There is an undumped PROM type 020252 (D12) in the sound circuit. ************************************************************************************/ @@ -24,7 +38,7 @@ ToDo: #include "cpu/m6800/m6800.h" #include "atari_s1.lh" -// looking at chip '29 74', this could be /8 + #define MASTER_CLK XTAL_4MHz / 4 #define DMA_CLK MASTER_CLK / 2 //#define AUDIO_CLK DMA_CLK / 4 @@ -43,8 +57,9 @@ public: { } DECLARE_READ8_MEMBER(switch_r); - DECLARE_READ8_MEMBER(latch_r); - DECLARE_WRITE8_MEMBER(latch_w); + DECLARE_WRITE8_MEMBER(meter_w); + DECLARE_WRITE8_MEMBER(audioen_w) {}; + DECLARE_WRITE8_MEMBER(audiores_w) {}; TIMER_DEVICE_CALLBACK_MEMBER(nmi); @@ -60,257 +75,213 @@ protected: private: UINT8 m_bit6; UINT8 m_out_offs; + UINT8 m_t_c; }; static ADDRESS_MAP_START( atari_s1_map, AS_PROGRAM, 8, atari_s1_state ) ADDRESS_MAP_GLOBAL_MASK(0x7fff) - AM_RANGE(0x0000, 0x00ff) AM_RAM AM_SHARE("ram") - //AM_RANGE(0x1000, 0x100f) AM_MIRROR(0x0F70) AM_WRITE(latch1000_w) // lamps - AM_RANGE(0x1080, 0x108f) AM_MIRROR(0x0F70) AM_READWRITE(latch_r,latch_w) - //AM_RANGE(0x2000, 0x200f) AM_WRITE(dipg1_w) - AM_RANGE(0x2000, 0x204f) AM_MIRROR(0x0F80) AM_READ(switch_r) - //AM_RANGE(0x3000, 0x3fff) AM_WRITE(soundg1_w) // audio enable + AM_RANGE(0x0000, 0x00ff) AM_MIRROR(0x1C00) AM_RAM AM_SHARE("ram") + AM_RANGE(0x2000, 0x204f) AM_MIRROR(0x0F80) AM_READ(switch_r) AM_WRITENOP // aavenger ROL 200B causes a spurious write + AM_RANGE(0x3000, 0x3fff) AM_WRITE(audioen_w) // audio enable AM_RANGE(0x4000, 0x4fff) AM_WRITE(watchdog_reset_w) - //AM_RANGE(0x508c, 0x508c) AM_WRITE(latch508c_w) - //AM_RANGE(0x6000, 0x6fff) AM_WRITE(audiog1_w) // audio reset + AM_RANGE(0x5080, 0x508c) AM_MIRROR(3) AM_WRITE(meter_w) // time2000 only + AM_RANGE(0x6000, 0x6fff) AM_WRITE(audiores_w) // audio reset AM_RANGE(0x7000, 0x7fff) AM_ROM ADDRESS_MAP_END +static ADDRESS_MAP_START( atarians_map, AS_PROGRAM, 8, atari_s1_state ) // more ram + ADDRESS_MAP_GLOBAL_MASK(0x7fff) + AM_RANGE(0x0000, 0x01ff) AM_MIRROR(0x1C00) AM_RAM AM_SHARE("ram") + AM_RANGE(0x2000, 0x204f) AM_MIRROR(0x0F80) AM_READ(switch_r) + AM_RANGE(0x3000, 0x3fff) AM_WRITE(audioen_w) // audio enable + AM_RANGE(0x4000, 0x4fff) AM_WRITE(watchdog_reset_w) + AM_RANGE(0x6000, 0x6fff) AM_WRITE(audiores_w) // audio reset + AM_RANGE(0x7000, 0x7fff) AM_ROM +ADDRESS_MAP_END + +static ADDRESS_MAP_START( midearth_map, AS_PROGRAM, 8, atari_s1_state ) + ADDRESS_MAP_GLOBAL_MASK(0x7fff) + AM_RANGE(0x0000, 0x00ff) AM_MIRROR(0x1C00) AM_RAM AM_SHARE("ram") + AM_RANGE(0x1100, 0x11ff) AM_WRITENOP + AM_RANGE(0x2000, 0x204f) AM_MIRROR(0x0F80) AM_READ(switch_r) + AM_RANGE(0x3000, 0x3fff) AM_WRITE(audioen_w) // audio enable + AM_RANGE(0x4000, 0x4fff) AM_WRITE(watchdog_reset_w) + AM_RANGE(0x6000, 0x6fff) AM_WRITE(audiores_w) // audio reset + AM_RANGE(0x7000, 0x7fff) AM_ROM AM_WRITENOP // writes to FFFF due to poor coding at 7FF5 +ADDRESS_MAP_END + static INPUT_PORTS_START( atari_s1 ) - // need to fix these, the manual has a lot of mistakes - PORT_START("INP00") - PORT_DIPNAME( 0x80, 0x80, "2000" ) - PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_START("INP01") - PORT_DIPNAME( 0x80, 0x80, "Spelling Award" ) // actually = coins - PORT_DIPSETTING( 0x80, "Extra Ball" ) - PORT_DIPSETTING( 0x00, "20,000 points" ) - PORT_START("INP02") - PORT_DIPNAME( 0x80, 0x80, "Last Ball double bonus" ) // actually = match - PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_START("INP03") - // This switch together with INP4C thru 4F, sets the scores at which a replay is awarded - PORT_DIPNAME( 0x80, 0x80, "Replay score" ) // actually = number of balls - PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - // These 2 dips control max number of credits (both off = 8; then 12, 15, both on=20) - PORT_START("INP04") - PORT_DIPNAME( 0x80, 0x80, "Max Credits-a" ) - PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_START("INP05") - PORT_DIPNAME( 0x80, 0x80, "Max Credits-b" ) - PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_START("INP06") - PORT_DIPNAME( 0x80, 0x80, "Exceed replay score" ) - PORT_DIPSETTING( 0x80, "Nothing" ) - PORT_DIPSETTING( 0x00, "Extra Ball" ) - PORT_START("INP07") - PORT_DIPNAME( 0x80, 0x80, "Replay when Exceed replay score" ) // overrides INP06 if on - PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_START("INP08") - PORT_DIPNAME( 0x80, 0x80, "Balls" ) - PORT_DIPSETTING( 0x80, "5" ) - PORT_DIPSETTING( 0x00, "3" ) - PORT_START("INP09") - PORT_DIPNAME( 0x80, 0x80, "Match" ) - PORT_DIPSETTING( 0x80, DEF_STR( On ) ) + PORT_START("X0") // 2000-2007 + PORT_DIPNAME( 0xc3, 0x00, DEF_STR( Coinage ) ) // left chute; right chute + PORT_DIPSETTING( 0x00, DEF_STR( 1C_1C ) ) // 1C_1C ; 1C_1C + PORT_DIPSETTING( 0x02, DEF_STR( 1C_2C ) ) // 1C_2C ; 1C_2C + PORT_DIPSETTING( 0x01, DEF_STR( 1C_3C ) ) // 1C_3C ; 1C_3C + PORT_DIPSETTING( 0x03, DEF_STR( 1C_4C ) ) // 1C_4C ; 1C_4C + PORT_DIPSETTING( 0x80, DEF_STR( 2C_1C ) ) // 2C_1C ; 2C_1C + PORT_DIPSETTING( 0x82, DEF_STR( 2C_3C ) ) // 2C_3C ; 2C_3C + PORT_DIPSETTING( 0x81, DEF_STR( 2C_5C ) ) // 2C_5C ; 2C_5C + // these work but they confuse the dipswitch menu + //PORT_DIPSETTING( 0x83, DEF_STR( 2C_1C ) ) // 2C_1C ; 1C_1C + //PORT_DIPSETTING( 0x40, DEF_STR( 1C_1C ) ) // 1C_1C ; 1C_2C + //PORT_DIPSETTING( 0x42, DEF_STR( 1C_2C ) ) // 1C_2C ; 1C_4C + //PORT_DIPSETTING( 0x41, DEF_STR( 1C_3C ) ) // 1C_3C ; 1C_6C + //PORT_DIPSETTING( 0x43, DEF_STR( 2C_3C ) ) // 2C_3C ; 2C_7C + //PORT_DIPSETTING( 0xc0, DEF_STR( 2C_5C ) ) // 2C_5C ; 1C_5C + //PORT_DIPSETTING( 0xc2, DEF_STR( 2C_7C ) ) // 2C_7C ; 1C_7C + //PORT_DIPSETTING( 0xc1, DEF_STR( 3C_1C ) ) // 3C_1C ; 1C_1C + //PORT_DIPSETTING( 0xc3, DEF_STR( 1C_1C ) ) // 1C_1C ; 1C_3C + PORT_DIPNAME( 0x04, 0x04, "Match" ) PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) - // next 4 dips control coins and credits. Leave them all off for 1coin=1credit. - PORT_START("INP0A") - PORT_DIPNAME( 0x80, 0x80, "Coins-a" ) - PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_START("INP0B") - PORT_DIPNAME( 0x80, 0x80, "Coins-b" ) // this is actually the test button - PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_START("INP0C") - PORT_DIPNAME( 0x80, 0x80, "Coins-c" ) - PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_START("INP0D") - PORT_DIPNAME( 0x80, 0x80, "Coins-d" ) - PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_START("INP0E") - PORT_DIPNAME( 0x80, 0x80, "Special" ) - PORT_DIPSETTING( 0x80, "Extra Ball" ) - PORT_DIPSETTING( 0x00, "Free Game" ) - PORT_START("INP0F") - PORT_DIPNAME( 0x80, 0x80, "20000 points for special" ) // overrides INP0E if on - PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_START("INP10") - PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_COIN1 ) - PORT_START("INP11") - PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_COIN2 ) - PORT_START("INP12") - PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_START ) - PORT_START("INP13") - PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Slam Tilt") - PORT_START("INP14") + PORT_DIPSETTING( 0x04, DEF_STR( On ) ) + PORT_DIPNAME( 0x08, 0x08, "Balls" ) + PORT_DIPSETTING( 0x00, "5" ) + PORT_DIPSETTING( 0x08, "3" ) + PORT_DIPNAME( 0x30, 0x20, "Special" ) + PORT_DIPSETTING( 0x00, "Extra Ball" ) + PORT_DIPSETTING( 0x20, "Free Game" ) + PORT_DIPSETTING( 0x10, "20000 points" ) // same as 0x30 + + PORT_START("X1") // 2008-200F + // This switch together with 204C thru 204F, sets the scores at which a replay is awarded + PORT_DIPNAME( 0x01, 0x00, "Replay score" ) + PORT_DIPSETTING( 0x01, DEF_STR( High ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Low ) ) + PORT_DIPNAME( 0x02, 0x02, "Last Ball double bonus" ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x02, DEF_STR( On ) ) + PORT_DIPNAME( 0x04, 0x00, "Spelling Award" ) + PORT_DIPSETTING( 0x00, "Extra Ball" ) + PORT_DIPSETTING( 0x04, "20,000 points" ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Test") PORT_CODE(KEYCODE_0) + PORT_DIPNAME( 0x30, 0x10, "Exceed replay score" ) + PORT_DIPSETTING( 0x00, "Nothing" ) + PORT_DIPSETTING( 0x20, "Extra Ball" ) + PORT_DIPSETTING( 0x10, "Replay" ) // same as 0x30 + PORT_DIPNAME( 0xc0, 0x00, "Max Credits" ) + PORT_DIPSETTING( 0x00, "8" ) + PORT_DIPSETTING( 0x80, "12" ) + PORT_DIPSETTING( 0x40, "15" ) + PORT_DIPSETTING( 0xc0, "20" ) + + PORT_START("X2") // 2010-2017 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_COIN1 ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_COIN2 ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Slam Tilt") + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_OTHER ) + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_OTHER ) + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) - PORT_START("INP15") + + PORT_START("X3") // 2018-201F + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_OTHER ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_OTHER ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_OTHER ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_OTHER ) + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_OTHER ) + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_OTHER ) + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) - PORT_START("INP16") - PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) - PORT_START("INP17") - PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) - PORT_START("INP18") - PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) - PORT_START("INP19") - PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) - PORT_START("INP1A") - PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) - PORT_START("INP1B") - PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) - PORT_START("INP1C") - PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) - PORT_START("INP1D") - PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) - PORT_START("INP1E") - PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) - PORT_START("INP1F") - PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) - PORT_START("INP20") - PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Cabinet Tilt") - PORT_START("INP21") - PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_TILT ) PORT_NAME("Pendulum Tilt") - PORT_START("INP22") - PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Left Flipper") PORT_CODE(KEYCODE_LSHIFT) - PORT_START("INP23") - PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Right Flipper") PORT_CODE(KEYCODE_RSHIFT) - PORT_START("INP24") - PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Target 4") - PORT_START("INP25") - PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Target 3") - PORT_START("INP26") - PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Target 2") - PORT_START("INP27") + + PORT_START("X4") // 2020-2027 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Cabinet Tilt") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_TILT ) PORT_NAME("Pendulum Tilt") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Left Flipper") PORT_CODE(KEYCODE_LSHIFT) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Right Flipper") PORT_CODE(KEYCODE_RSHIFT) + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Target 4") + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Target 3") + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Target 2") PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Target 1") - PORT_START("INP28") + + PORT_START("X5") // 2028-202F + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_OTHER ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_OTHER ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_OTHER ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_OTHER ) + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_OTHER ) + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_OTHER ) + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) - PORT_START("INP29") - PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) - PORT_START("INP2A") - PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) - PORT_START("INP2B") - PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) - PORT_START("INP2C") - PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) - PORT_START("INP2D") - PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) - PORT_START("INP2E") - PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) - PORT_START("INP2F") - PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) - PORT_START("INP30") - PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) - PORT_START("INP31") - PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Rollover 3") PORT_CODE(KEYCODE_Q) - PORT_START("INP32") - PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Rollover 2") PORT_CODE(KEYCODE_W) - PORT_START("INP33") - PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Rollover 1") PORT_CODE(KEYCODE_E) - PORT_START("INP34") - PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Rollover 8") PORT_CODE(KEYCODE_R) - PORT_START("INP35") - PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Rollover 7") PORT_CODE(KEYCODE_Y) - PORT_START("INP36") - PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Rollover 6") PORT_CODE(KEYCODE_U) - PORT_START("INP37") + + PORT_START("X6") // 2030-2037 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_OTHER ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Rollover 3") PORT_CODE(KEYCODE_Q) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Rollover 2") PORT_CODE(KEYCODE_W) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Rollover 1") PORT_CODE(KEYCODE_E) + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Rollover 8") PORT_CODE(KEYCODE_R) + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Rollover 7") PORT_CODE(KEYCODE_Y) + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Rollover 6") PORT_CODE(KEYCODE_U) PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Rollover 5") PORT_CODE(KEYCODE_I) - PORT_START("INP38") - PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("L Hole") PORT_CODE(KEYCODE_O) - PORT_START("INP39") - PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Bumper 1") PORT_CODE(KEYCODE_V) - PORT_START("INP3A") - PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Bumper 2") PORT_CODE(KEYCODE_B) - PORT_START("INP3B") - PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Bumper 3") PORT_CODE(KEYCODE_N) - PORT_START("INP3C") - PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Spinner") PORT_CODE(KEYCODE_M) - PORT_START("INP3D") - PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("R Pocket") PORT_CODE(KEYCODE_A) - PORT_START("INP3E") - PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("L Pocket") PORT_CODE(KEYCODE_S) - PORT_START("INP3F") + + PORT_START("X7") // 2038-203F + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("L Hole") PORT_CODE(KEYCODE_O) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Bumper 1") PORT_CODE(KEYCODE_V) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Bumper 2") PORT_CODE(KEYCODE_B) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Bumper 3") PORT_CODE(KEYCODE_N) + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Spinner") PORT_CODE(KEYCODE_M) + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("R Pocket") PORT_CODE(KEYCODE_A) + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("L Pocket") PORT_CODE(KEYCODE_S) PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("R Hole") PORT_CODE(KEYCODE_D) - PORT_START("INP40") - PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("L Triangle") PORT_CODE(KEYCODE_F) - PORT_START("INP41") - PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("10 points") PORT_CODE(KEYCODE_G) - PORT_START("INP42") - PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("50 points") PORT_CODE(KEYCODE_H) - PORT_START("INP43") - PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("OutHole") PORT_CODE(KEYCODE_X) - PORT_START("INP44") - PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) - PORT_START("INP45") - PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) - PORT_START("INP46") - PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) - PORT_START("INP47") + + PORT_START("X8") // 2040-2047 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("L Triangle") PORT_CODE(KEYCODE_F) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("10 points") PORT_CODE(KEYCODE_G) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("50 points") PORT_CODE(KEYCODE_H) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("OutHole") PORT_CODE(KEYCODE_X) + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_OTHER ) + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_OTHER ) + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("R Triangle") PORT_CODE(KEYCODE_J) - PORT_START("INP48") - PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("50 points and adv letter") PORT_CODE(KEYCODE_K) - PORT_START("INP49") - PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Captive ball rollovers") PORT_CODE(KEYCODE_L) - PORT_START("INP4A") - PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Rollover 'B' centre") PORT_CODE(KEYCODE_Z) - PORT_START("INP4B") - PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Roll thru upper right") PORT_CODE(KEYCODE_C) - PORT_START("INP4C") - PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) - PORT_START("INP4D") - PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) - PORT_START("INP4E") - PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) - PORT_START("INP4F") + + PORT_START("X9") // 2048-204F + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("50 points and adv letter") PORT_CODE(KEYCODE_K) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Captive ball rollovers") PORT_CODE(KEYCODE_L) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Rollover 'B' centre") PORT_CODE(KEYCODE_Z) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Roll thru upper right") PORT_CODE(KEYCODE_C) + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_OTHER ) + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_OTHER ) + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) INPUT_PORTS_END void atari_s1_state::machine_reset() { + m_t_c = 0; } -READ8_MEMBER( atari_s1_state::latch_r ) -{ - return 0; -} - -WRITE8_MEMBER( atari_s1_state::latch_w ) +WRITE8_MEMBER( atari_s1_state::meter_w ) { +// time2000 has optional coin counters etc } READ8_MEMBER( atari_s1_state::switch_r ) { char kbdrow[8]; - sprintf(kbdrow,"INP%02X",offset); - return ioport(kbdrow)->read() | (BIT(m_bit6, 1) << 6); + sprintf(kbdrow,"X%X",offset>>3); + return (BIT(ioport(kbdrow)->read(), offset&7 ) << 7) | (BIT(m_bit6, 1) << 6); // switch bit | BIT6_CLK } TIMER_DEVICE_CALLBACK_MEMBER( atari_s1_state::nmi ) { - static const UINT8 patterns[16] = { 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0, 0, 0, 0, 0, 0 }; + static const UINT8 patterns[16] = { 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7c, 0x07, 0x7f, 0x67, 0, 0, 0, 0, 0, 0 }; // 4511 m_bit6++; - m_maincpu->set_input_line(INPUT_LINE_NMI, PULSE_LINE); + if (m_t_c > 0x40) + m_maincpu->set_input_line(INPUT_LINE_NMI, PULSE_LINE); + else + m_t_c++; m_out_offs++; m_out_offs &= 0x1f; if ((m_out_offs & 3) == 3) { + // Player number char wordnum[8]; sprintf(wordnum,"text%d",m_out_offs>>2); - output_set_value(wordnum, !(m_p_ram[m_out_offs]==8)); + output_set_value(wordnum, !BIT(patterns[m_p_ram[m_out_offs]&15], 6)); // uses 'g' segment } else { + // Digits output_set_digit_value(m_out_offs << 1, patterns[m_p_ram[m_out_offs]>>4]); output_set_digit_value((m_out_offs << 1)+1, patterns[m_p_ram[m_out_offs]&15]); } @@ -329,6 +300,16 @@ static MACHINE_CONFIG_START( atari_s1, atari_s1_state ) MCFG_DEFAULT_LAYOUT(layout_atari_s1) MACHINE_CONFIG_END +static MACHINE_CONFIG_DERIVED( atarians, atari_s1 ) + MCFG_CPU_MODIFY("maincpu") + MCFG_CPU_PROGRAM_MAP(atarians_map) +MACHINE_CONFIG_END + +static MACHINE_CONFIG_DERIVED( midearth, atari_s1 ) + MCFG_CPU_MODIFY("maincpu") + MCFG_CPU_PROGRAM_MAP(midearth_map) +MACHINE_CONFIG_END + /*------------------------------------------------------------------- / The Atarians (11/1976) /-------------------------------------------------------------------*/ @@ -384,9 +365,9 @@ ROM_START(spcrider) ROM_END -GAME( 1976, atarians, 0, atari_s1, atari_s1, driver_device, 0, ROT0, "Atari","The Atarians", GAME_IS_SKELETON_MECHANICAL) -//GAME( 2002, atarianb, atarians, atari_s1, atari_s1, driver_device, 0, ROT0, "Atari / Gaston","The Atarians (working bootleg)", GAME_IS_SKELETON_MECHANICAL) -GAME( 1977, time2000, 0, atari_s1, atari_s1, driver_device, 0, ROT0, "Atari","Time 2000", GAME_IS_SKELETON_MECHANICAL) -GAME( 1977, aavenger, 0, atari_s1, atari_s1, driver_device, 0, ROT0, "Atari","Airborne Avenger", GAME_IS_SKELETON_MECHANICAL) -GAME( 1978, midearth, 0, atari_s1, atari_s1, driver_device, 0, ROT0, "Atari","Middle Earth", GAME_IS_SKELETON_MECHANICAL) -GAME( 1978, spcrider, 0, atari_s1, atari_s1, driver_device, 0, ROT0, "Atari","Space Riders", GAME_IS_SKELETON_MECHANICAL) +GAME( 1976, atarians, 0, atarians, atari_s1, driver_device, 0, ROT0, "Atari", "The Atarians", GAME_MECHANICAL | GAME_NO_SOUND) +//GAME( 2002, atarianb, atarians, atari_s1, atari_s1, driver_device, 0, ROT0, "Atari / Gaston", "The Atarians (working bootleg)", GAME_IS_SKELETON_MECHANICAL) +GAME( 1977, time2000, 0, atari_s1, atari_s1, driver_device, 0, ROT0, "Atari", "Time 2000", GAME_MECHANICAL | GAME_NO_SOUND) +GAME( 1977, aavenger, 0, atari_s1, atari_s1, driver_device, 0, ROT0, "Atari", "Airborne Avenger", GAME_MECHANICAL | GAME_NO_SOUND) +GAME( 1978, midearth, 0, midearth, atari_s1, driver_device, 0, ROT0, "Atari", "Middle Earth", GAME_IS_SKELETON_MECHANICAL) +GAME( 1978, spcrider, 0, atari_s1, atari_s1, driver_device, 0, ROT0, "Atari", "Space Riders", GAME_MECHANICAL | GAME_NO_SOUND)