atari_s1 : last commit for now

This commit is contained in:
Robbbert 2012-10-09 11:08:19 +00:00
parent a3c79cb5f0
commit 8d64132168

View File

@ -3,19 +3,33 @@
Pinball Pinball
Atari Generation/System 1 Atari Generation/System 1
These were the first widebody pinball machines. 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. 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: ToDo:
- Inputs per game; the ones there are for Airborne Avenger - Inputs per game; the ones there are for Airborne Avenger
- Link up switches where 2 or more act together - Link up switches where 2 or more act together
- Sound - Sound
- Lamps, solenoids - 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 "cpu/m6800/m6800.h"
#include "atari_s1.lh" #include "atari_s1.lh"
// looking at chip '29 74', this could be /8
#define MASTER_CLK XTAL_4MHz / 4 #define MASTER_CLK XTAL_4MHz / 4
#define DMA_CLK MASTER_CLK / 2 #define DMA_CLK MASTER_CLK / 2
//#define AUDIO_CLK DMA_CLK / 4 //#define AUDIO_CLK DMA_CLK / 4
@ -43,8 +57,9 @@ public:
{ } { }
DECLARE_READ8_MEMBER(switch_r); DECLARE_READ8_MEMBER(switch_r);
DECLARE_READ8_MEMBER(latch_r); DECLARE_WRITE8_MEMBER(meter_w);
DECLARE_WRITE8_MEMBER(latch_w); DECLARE_WRITE8_MEMBER(audioen_w) {};
DECLARE_WRITE8_MEMBER(audiores_w) {};
TIMER_DEVICE_CALLBACK_MEMBER(nmi); TIMER_DEVICE_CALLBACK_MEMBER(nmi);
@ -60,257 +75,213 @@ protected:
private: private:
UINT8 m_bit6; UINT8 m_bit6;
UINT8 m_out_offs; UINT8 m_out_offs;
UINT8 m_t_c;
}; };
static ADDRESS_MAP_START( atari_s1_map, AS_PROGRAM, 8, atari_s1_state ) static ADDRESS_MAP_START( atari_s1_map, AS_PROGRAM, 8, atari_s1_state )
ADDRESS_MAP_GLOBAL_MASK(0x7fff) ADDRESS_MAP_GLOBAL_MASK(0x7fff)
AM_RANGE(0x0000, 0x00ff) AM_RAM AM_SHARE("ram") AM_RANGE(0x0000, 0x00ff) AM_MIRROR(0x1C00) AM_RAM AM_SHARE("ram")
//AM_RANGE(0x1000, 0x100f) AM_MIRROR(0x0F70) AM_WRITE(latch1000_w) // lamps AM_RANGE(0x2000, 0x204f) AM_MIRROR(0x0F80) AM_READ(switch_r) AM_WRITENOP // aavenger ROL 200B causes a spurious write
AM_RANGE(0x1080, 0x108f) AM_MIRROR(0x0F70) AM_READWRITE(latch_r,latch_w) AM_RANGE(0x3000, 0x3fff) AM_WRITE(audioen_w) // audio enable
//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(0x4000, 0x4fff) AM_WRITE(watchdog_reset_w) AM_RANGE(0x4000, 0x4fff) AM_WRITE(watchdog_reset_w)
//AM_RANGE(0x508c, 0x508c) AM_WRITE(latch508c_w) AM_RANGE(0x5080, 0x508c) AM_MIRROR(3) AM_WRITE(meter_w) // time2000 only
//AM_RANGE(0x6000, 0x6fff) AM_WRITE(audiog1_w) // audio reset AM_RANGE(0x6000, 0x6fff) AM_WRITE(audiores_w) // audio reset
AM_RANGE(0x7000, 0x7fff) AM_ROM AM_RANGE(0x7000, 0x7fff) AM_ROM
ADDRESS_MAP_END 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 ) static INPUT_PORTS_START( atari_s1 )
// need to fix these, the manual has a lot of mistakes PORT_START("X0") // 2000-2007
PORT_START("INP00") PORT_DIPNAME( 0xc3, 0x00, DEF_STR( Coinage ) ) // left chute; right chute
PORT_DIPNAME( 0x80, 0x80, "2000" ) PORT_DIPSETTING( 0x00, DEF_STR( 1C_1C ) ) // 1C_1C ; 1C_1C
PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) PORT_DIPSETTING( 0x02, DEF_STR( 1C_2C ) ) // 1C_2C ; 1C_2C
PORT_DIPSETTING( 0x00, DEF_STR( On ) ) PORT_DIPSETTING( 0x01, DEF_STR( 1C_3C ) ) // 1C_3C ; 1C_3C
PORT_START("INP01") PORT_DIPSETTING( 0x03, DEF_STR( 1C_4C ) ) // 1C_4C ; 1C_4C
PORT_DIPNAME( 0x80, 0x80, "Spelling Award" ) // actually = coins PORT_DIPSETTING( 0x80, DEF_STR( 2C_1C ) ) // 2C_1C ; 2C_1C
PORT_DIPSETTING( 0x80, "Extra Ball" ) PORT_DIPSETTING( 0x82, DEF_STR( 2C_3C ) ) // 2C_3C ; 2C_3C
PORT_DIPSETTING( 0x00, "20,000 points" ) PORT_DIPSETTING( 0x81, DEF_STR( 2C_5C ) ) // 2C_5C ; 2C_5C
PORT_START("INP02") // these work but they confuse the dipswitch menu
PORT_DIPNAME( 0x80, 0x80, "Last Ball double bonus" ) // actually = match //PORT_DIPSETTING( 0x83, DEF_STR( 2C_1C ) ) // 2C_1C ; 1C_1C
PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) //PORT_DIPSETTING( 0x40, DEF_STR( 1C_1C ) ) // 1C_1C ; 1C_2C
PORT_DIPSETTING( 0x00, DEF_STR( On ) ) //PORT_DIPSETTING( 0x42, DEF_STR( 1C_2C ) ) // 1C_2C ; 1C_4C
PORT_START("INP03") //PORT_DIPSETTING( 0x41, DEF_STR( 1C_3C ) ) // 1C_3C ; 1C_6C
// This switch together with INP4C thru 4F, sets the scores at which a replay is awarded //PORT_DIPSETTING( 0x43, DEF_STR( 2C_3C ) ) // 2C_3C ; 2C_7C
PORT_DIPNAME( 0x80, 0x80, "Replay score" ) // actually = number of balls //PORT_DIPSETTING( 0xc0, DEF_STR( 2C_5C ) ) // 2C_5C ; 1C_5C
PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) //PORT_DIPSETTING( 0xc2, DEF_STR( 2C_7C ) ) // 2C_7C ; 1C_7C
PORT_DIPSETTING( 0x00, DEF_STR( On ) ) //PORT_DIPSETTING( 0xc1, DEF_STR( 3C_1C ) ) // 3C_1C ; 1C_1C
// These 2 dips control max number of credits (both off = 8; then 12, 15, both on=20) //PORT_DIPSETTING( 0xc3, DEF_STR( 1C_1C ) ) // 1C_1C ; 1C_3C
PORT_START("INP04") PORT_DIPNAME( 0x04, 0x04, "Match" )
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_DIPSETTING( 0x00, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
// next 4 dips control coins and credits. Leave them all off for 1coin=1credit. PORT_DIPSETTING( 0x04, DEF_STR( On ) )
PORT_START("INP0A") PORT_DIPNAME( 0x08, 0x08, "Balls" )
PORT_DIPNAME( 0x80, 0x80, "Coins-a" ) PORT_DIPSETTING( 0x00, "5" )
PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) PORT_DIPSETTING( 0x08, "3" )
PORT_DIPSETTING( 0x00, DEF_STR( On ) ) PORT_DIPNAME( 0x30, 0x20, "Special" )
PORT_START("INP0B") PORT_DIPSETTING( 0x00, "Extra Ball" )
PORT_DIPNAME( 0x80, 0x80, "Coins-b" ) // this is actually the test button PORT_DIPSETTING( 0x20, "Free Game" )
PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) PORT_DIPSETTING( 0x10, "20000 points" ) // same as 0x30
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_START("INP0C") PORT_START("X1") // 2008-200F
PORT_DIPNAME( 0x80, 0x80, "Coins-c" ) // This switch together with 204C thru 204F, sets the scores at which a replay is awarded
PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) PORT_DIPNAME( 0x01, 0x00, "Replay score" )
PORT_DIPSETTING( 0x00, DEF_STR( On ) ) PORT_DIPSETTING( 0x01, DEF_STR( High ) )
PORT_START("INP0D") PORT_DIPSETTING( 0x00, DEF_STR( Low ) )
PORT_DIPNAME( 0x80, 0x80, "Coins-d" ) PORT_DIPNAME( 0x02, 0x02, "Last Ball double bonus" )
PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) ) PORT_DIPSETTING( 0x02, DEF_STR( On ) )
PORT_START("INP0E") PORT_DIPNAME( 0x04, 0x00, "Spelling Award" )
PORT_DIPNAME( 0x80, 0x80, "Special" ) PORT_DIPSETTING( 0x00, "Extra Ball" )
PORT_DIPSETTING( 0x80, "Extra Ball" ) PORT_DIPSETTING( 0x04, "20,000 points" )
PORT_DIPSETTING( 0x00, "Free Game" ) PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Test") PORT_CODE(KEYCODE_0)
PORT_START("INP0F") PORT_DIPNAME( 0x30, 0x10, "Exceed replay score" )
PORT_DIPNAME( 0x80, 0x80, "20000 points for special" ) // overrides INP0E if on PORT_DIPSETTING( 0x00, "Nothing" )
PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) PORT_DIPSETTING( 0x20, "Extra Ball" )
PORT_DIPSETTING( 0x00, DEF_STR( On ) ) PORT_DIPSETTING( 0x10, "Replay" ) // same as 0x30
PORT_START("INP10") PORT_DIPNAME( 0xc0, 0x00, "Max Credits" )
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_COIN1 ) PORT_DIPSETTING( 0x00, "8" )
PORT_START("INP11") PORT_DIPSETTING( 0x80, "12" )
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_COIN2 ) PORT_DIPSETTING( 0x40, "15" )
PORT_START("INP12") PORT_DIPSETTING( 0xc0, "20" )
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_START )
PORT_START("INP13") PORT_START("X2") // 2010-2017
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Slam Tilt") PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_COIN1 )
PORT_START("INP14") 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_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_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER )
PORT_START("INP16")
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_START("X4") // 2020-2027
PORT_START("INP17") PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Cabinet Tilt")
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_TILT ) PORT_NAME("Pendulum Tilt")
PORT_START("INP18") PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Left Flipper") PORT_CODE(KEYCODE_LSHIFT)
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Right Flipper") PORT_CODE(KEYCODE_RSHIFT)
PORT_START("INP19") PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Target 4")
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Target 3")
PORT_START("INP1A") PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Target 2")
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_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Target 1") 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_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER )
PORT_START("INP29")
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_START("X6") // 2030-2037
PORT_START("INP2A") PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_OTHER )
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Rollover 3") PORT_CODE(KEYCODE_Q)
PORT_START("INP2B") PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Rollover 2") PORT_CODE(KEYCODE_W)
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Rollover 1") PORT_CODE(KEYCODE_E)
PORT_START("INP2C") PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Rollover 8") PORT_CODE(KEYCODE_R)
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Rollover 7") PORT_CODE(KEYCODE_Y)
PORT_START("INP2D") 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_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_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Rollover 5") PORT_CODE(KEYCODE_I) 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("X7") // 2038-203F
PORT_START("INP39") PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("L Hole") PORT_CODE(KEYCODE_O)
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Bumper 1") PORT_CODE(KEYCODE_V) PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Bumper 1") PORT_CODE(KEYCODE_V)
PORT_START("INP3A") PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Bumper 2") PORT_CODE(KEYCODE_B)
PORT_BIT( 0x80, 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_START("INP3B") PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Spinner") PORT_CODE(KEYCODE_M)
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Bumper 3") PORT_CODE(KEYCODE_N) PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("R Pocket") PORT_CODE(KEYCODE_A)
PORT_START("INP3C") 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("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_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("R Hole") PORT_CODE(KEYCODE_D) 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("X8") // 2040-2047
PORT_START("INP41") PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("L Triangle") PORT_CODE(KEYCODE_F)
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("10 points") PORT_CODE(KEYCODE_G) PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("10 points") PORT_CODE(KEYCODE_G)
PORT_START("INP42") PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("50 points") PORT_CODE(KEYCODE_H)
PORT_BIT( 0x80, 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_START("INP43") PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_OTHER )
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("OutHole") PORT_CODE(KEYCODE_X) PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_OTHER )
PORT_START("INP44") PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_OTHER )
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_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("R Triangle") PORT_CODE(KEYCODE_J) 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("X9") // 2048-204F
PORT_START("INP49") PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("50 points and adv letter") PORT_CODE(KEYCODE_K)
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Captive ball rollovers") PORT_CODE(KEYCODE_L) PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Captive ball rollovers") PORT_CODE(KEYCODE_L)
PORT_START("INP4A") PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Rollover 'B' centre") PORT_CODE(KEYCODE_Z)
PORT_BIT( 0x80, 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_START("INP4B") PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_OTHER )
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Roll thru upper right") PORT_CODE(KEYCODE_C) PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_OTHER )
PORT_START("INP4C") PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_OTHER )
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_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER )
INPUT_PORTS_END INPUT_PORTS_END
void atari_s1_state::machine_reset() void atari_s1_state::machine_reset()
{ {
m_t_c = 0;
} }
READ8_MEMBER( atari_s1_state::latch_r ) WRITE8_MEMBER( atari_s1_state::meter_w )
{
return 0;
}
WRITE8_MEMBER( atari_s1_state::latch_w )
{ {
// time2000 has optional coin counters etc
} }
READ8_MEMBER( atari_s1_state::switch_r ) READ8_MEMBER( atari_s1_state::switch_r )
{ {
char kbdrow[8]; char kbdrow[8];
sprintf(kbdrow,"INP%02X",offset); sprintf(kbdrow,"X%X",offset>>3);
return ioport(kbdrow)->read() | (BIT(m_bit6, 1) << 6); 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 ) 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_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++;
m_out_offs &= 0x1f; m_out_offs &= 0x1f;
if ((m_out_offs & 3) == 3) if ((m_out_offs & 3) == 3)
{ {
// Player number
char wordnum[8]; char wordnum[8];
sprintf(wordnum,"text%d",m_out_offs>>2); 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 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, 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]); 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) MCFG_DEFAULT_LAYOUT(layout_atari_s1)
MACHINE_CONFIG_END 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) / The Atarians (11/1976)
/-------------------------------------------------------------------*/ /-------------------------------------------------------------------*/
@ -384,9 +365,9 @@ ROM_START(spcrider)
ROM_END ROM_END
GAME( 1976, atarians, 0, atari_s1, atari_s1, driver_device, 0, ROT0, "Atari","The Atarians", 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( 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, 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_IS_SKELETON_MECHANICAL) GAME( 1977, aavenger, 0, atari_s1, atari_s1, driver_device, 0, ROT0, "Atari", "Airborne Avenger", GAME_MECHANICAL | GAME_NO_SOUND)
GAME( 1978, midearth, 0, atari_s1, atari_s1, driver_device, 0, ROT0, "Atari","Middle Earth", GAME_IS_SKELETON_MECHANICAL) 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_IS_SKELETON_MECHANICAL) GAME( 1978, spcrider, 0, atari_s1, atari_s1, driver_device, 0, ROT0, "Atari", "Space Riders", GAME_MECHANICAL | GAME_NO_SOUND)