trunk/src/mame/drivers/atari_s1.c
| r18372 | r18373 | |
| 3 | 3 | Pinball |
| 4 | 4 | Atari Generation/System 1 |
| 5 | 5 | These were the first widebody pinball machines. |
| 6 | | Unfortunately they tended to be boring. |
| 7 | 6 | |
| 8 | | The design of having the circuit boards under the playfield wasn't such a good |
| 9 | | idea, because it allowed debris and loose screws that could fall off the |
| 10 | | playfield to cause havoc among the electronics. |
| 11 | | |
| 12 | 7 | Schematics and PinMAME used as references. |
| 13 | 8 | |
| 9 | Dipswitch vs address: |
| 10 | SW1 Toggle 1 = 200B |
| 11 | SW1 Toggle 2 = 200A |
| 12 | SW1 Toggle 3 = 2009 |
| 13 | SW1 Toggle 4 = 2008 |
| 14 | SW1 Toggle 5 = 200F |
| 15 | SW1 Toggle 6 = 200E |
| 16 | SW1 Toggle 7 = 200D |
| 17 | SW1 Toggle 8 = 200C |
| 18 | SW2 Toggle 1 = 2003 |
| 19 | SW2 Toggle 2 = 2002 |
| 20 | SW2 Toggle 3 = 2001 |
| 21 | SW2 Toggle 4 = 2000 |
| 22 | SW2 Toggle 5 = 2007 |
| 23 | SW2 Toggle 6 = 2006 |
| 24 | SW2 Toggle 7 = 2005 |
| 25 | SW2 Toggle 8 = 2004 |
| 26 | |
| 14 | 27 | ToDo: |
| 15 | 28 | - Inputs per game; the ones there are for Airborne Avenger |
| 16 | 29 | - Link up switches where 2 or more act together |
| 17 | 30 | - Sound |
| 18 | 31 | - Lamps, solenoids |
| 32 | - There is an undumped PROM type 020252 (D12) in the sound circuit. |
| 19 | 33 | |
| 20 | 34 | |
| 21 | 35 | ************************************************************************************/ |
| r18372 | r18373 | |
| 24 | 38 | #include "cpu/m6800/m6800.h" |
| 25 | 39 | #include "atari_s1.lh" |
| 26 | 40 | |
| 27 | | // looking at chip '29 74', this could be /8 |
| 41 | |
| 28 | 42 | #define MASTER_CLK XTAL_4MHz / 4 |
| 29 | 43 | #define DMA_CLK MASTER_CLK / 2 |
| 30 | 44 | //#define AUDIO_CLK DMA_CLK / 4 |
| r18372 | r18373 | |
| 43 | 57 | { } |
| 44 | 58 | |
| 45 | 59 | DECLARE_READ8_MEMBER(switch_r); |
| 46 | | DECLARE_READ8_MEMBER(latch_r); |
| 47 | | DECLARE_WRITE8_MEMBER(latch_w); |
| 60 | DECLARE_WRITE8_MEMBER(meter_w); |
| 61 | DECLARE_WRITE8_MEMBER(audioen_w) {}; |
| 62 | DECLARE_WRITE8_MEMBER(audiores_w) {}; |
| 48 | 63 | |
| 49 | 64 | TIMER_DEVICE_CALLBACK_MEMBER(nmi); |
| 50 | 65 | |
| r18372 | r18373 | |
| 60 | 75 | private: |
| 61 | 76 | UINT8 m_bit6; |
| 62 | 77 | UINT8 m_out_offs; |
| 78 | UINT8 m_t_c; |
| 63 | 79 | }; |
| 64 | 80 | |
| 65 | 81 | static ADDRESS_MAP_START( atari_s1_map, AS_PROGRAM, 8, atari_s1_state ) |
| 66 | 82 | ADDRESS_MAP_GLOBAL_MASK(0x7fff) |
| 67 | | AM_RANGE(0x0000, 0x00ff) AM_RAM AM_SHARE("ram") |
| 68 | | //AM_RANGE(0x1000, 0x100f) AM_MIRROR(0x0F70) AM_WRITE(latch1000_w) // lamps |
| 69 | | AM_RANGE(0x1080, 0x108f) AM_MIRROR(0x0F70) AM_READWRITE(latch_r,latch_w) |
| 70 | | //AM_RANGE(0x2000, 0x200f) AM_WRITE(dipg1_w) |
| 83 | AM_RANGE(0x0000, 0x00ff) AM_MIRROR(0x1C00) AM_RAM AM_SHARE("ram") |
| 84 | AM_RANGE(0x2000, 0x204f) AM_MIRROR(0x0F80) AM_READ(switch_r) AM_WRITENOP // aavenger ROL 200B causes a spurious write |
| 85 | AM_RANGE(0x3000, 0x3fff) AM_WRITE(audioen_w) // audio enable |
| 86 | AM_RANGE(0x4000, 0x4fff) AM_WRITE(watchdog_reset_w) |
| 87 | AM_RANGE(0x5080, 0x508c) AM_MIRROR(3) AM_WRITE(meter_w) // time2000 only |
| 88 | AM_RANGE(0x6000, 0x6fff) AM_WRITE(audiores_w) // audio reset |
| 89 | AM_RANGE(0x7000, 0x7fff) AM_ROM |
| 90 | ADDRESS_MAP_END |
| 91 | |
| 92 | static ADDRESS_MAP_START( atarians_map, AS_PROGRAM, 8, atari_s1_state ) // more ram |
| 93 | ADDRESS_MAP_GLOBAL_MASK(0x7fff) |
| 94 | AM_RANGE(0x0000, 0x01ff) AM_MIRROR(0x1C00) AM_RAM AM_SHARE("ram") |
| 71 | 95 | AM_RANGE(0x2000, 0x204f) AM_MIRROR(0x0F80) AM_READ(switch_r) |
| 72 | | //AM_RANGE(0x3000, 0x3fff) AM_WRITE(soundg1_w) // audio enable |
| 96 | AM_RANGE(0x3000, 0x3fff) AM_WRITE(audioen_w) // audio enable |
| 73 | 97 | AM_RANGE(0x4000, 0x4fff) AM_WRITE(watchdog_reset_w) |
| 74 | | //AM_RANGE(0x508c, 0x508c) AM_WRITE(latch508c_w) |
| 75 | | //AM_RANGE(0x6000, 0x6fff) AM_WRITE(audiog1_w) // audio reset |
| 98 | AM_RANGE(0x6000, 0x6fff) AM_WRITE(audiores_w) // audio reset |
| 76 | 99 | AM_RANGE(0x7000, 0x7fff) AM_ROM |
| 77 | 100 | ADDRESS_MAP_END |
| 78 | 101 | |
| 102 | static ADDRESS_MAP_START( midearth_map, AS_PROGRAM, 8, atari_s1_state ) |
| 103 | ADDRESS_MAP_GLOBAL_MASK(0x7fff) |
| 104 | AM_RANGE(0x0000, 0x00ff) AM_MIRROR(0x1C00) AM_RAM AM_SHARE("ram") |
| 105 | AM_RANGE(0x1100, 0x11ff) AM_WRITENOP |
| 106 | AM_RANGE(0x2000, 0x204f) AM_MIRROR(0x0F80) AM_READ(switch_r) |
| 107 | AM_RANGE(0x3000, 0x3fff) AM_WRITE(audioen_w) // audio enable |
| 108 | AM_RANGE(0x4000, 0x4fff) AM_WRITE(watchdog_reset_w) |
| 109 | AM_RANGE(0x6000, 0x6fff) AM_WRITE(audiores_w) // audio reset |
| 110 | AM_RANGE(0x7000, 0x7fff) AM_ROM AM_WRITENOP // writes to FFFF due to poor coding at 7FF5 |
| 111 | ADDRESS_MAP_END |
| 112 | |
| 79 | 113 | static INPUT_PORTS_START( atari_s1 ) |
| 80 | | // need to fix these, the manual has a lot of mistakes |
| 81 | | PORT_START("INP00") |
| 82 | | PORT_DIPNAME( 0x80, 0x80, "2000" ) |
| 83 | | PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) |
| 84 | | PORT_DIPSETTING( 0x00, DEF_STR( On ) ) |
| 85 | | PORT_START("INP01") |
| 86 | | PORT_DIPNAME( 0x80, 0x80, "Spelling Award" ) // actually = coins |
| 87 | | PORT_DIPSETTING( 0x80, "Extra Ball" ) |
| 88 | | PORT_DIPSETTING( 0x00, "20,000 points" ) |
| 89 | | PORT_START("INP02") |
| 90 | | PORT_DIPNAME( 0x80, 0x80, "Last Ball double bonus" ) // actually = match |
| 91 | | PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) |
| 92 | | PORT_DIPSETTING( 0x00, DEF_STR( On ) ) |
| 93 | | PORT_START("INP03") |
| 94 | | // This switch together with INP4C thru 4F, sets the scores at which a replay is awarded |
| 95 | | PORT_DIPNAME( 0x80, 0x80, "Replay score" ) // actually = number of balls |
| 96 | | PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) |
| 97 | | PORT_DIPSETTING( 0x00, DEF_STR( On ) ) |
| 98 | | // These 2 dips control max number of credits (both off = 8; then 12, 15, both on=20) |
| 99 | | PORT_START("INP04") |
| 100 | | PORT_DIPNAME( 0x80, 0x80, "Max Credits-a" ) |
| 101 | | PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) |
| 102 | | PORT_DIPSETTING( 0x00, DEF_STR( On ) ) |
| 103 | | PORT_START("INP05") |
| 104 | | PORT_DIPNAME( 0x80, 0x80, "Max Credits-b" ) |
| 105 | | PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) |
| 106 | | PORT_DIPSETTING( 0x00, DEF_STR( On ) ) |
| 107 | | PORT_START("INP06") |
| 108 | | PORT_DIPNAME( 0x80, 0x80, "Exceed replay score" ) |
| 109 | | PORT_DIPSETTING( 0x80, "Nothing" ) |
| 114 | PORT_START("X0") // 2000-2007 |
| 115 | PORT_DIPNAME( 0xc3, 0x00, DEF_STR( Coinage ) ) // left chute; right chute |
| 116 | PORT_DIPSETTING( 0x00, DEF_STR( 1C_1C ) ) // 1C_1C ; 1C_1C |
| 117 | PORT_DIPSETTING( 0x02, DEF_STR( 1C_2C ) ) // 1C_2C ; 1C_2C |
| 118 | PORT_DIPSETTING( 0x01, DEF_STR( 1C_3C ) ) // 1C_3C ; 1C_3C |
| 119 | PORT_DIPSETTING( 0x03, DEF_STR( 1C_4C ) ) // 1C_4C ; 1C_4C |
| 120 | PORT_DIPSETTING( 0x80, DEF_STR( 2C_1C ) ) // 2C_1C ; 2C_1C |
| 121 | PORT_DIPSETTING( 0x82, DEF_STR( 2C_3C ) ) // 2C_3C ; 2C_3C |
| 122 | PORT_DIPSETTING( 0x81, DEF_STR( 2C_5C ) ) // 2C_5C ; 2C_5C |
| 123 | // these work but they confuse the dipswitch menu |
| 124 | //PORT_DIPSETTING( 0x83, DEF_STR( 2C_1C ) ) // 2C_1C ; 1C_1C |
| 125 | //PORT_DIPSETTING( 0x40, DEF_STR( 1C_1C ) ) // 1C_1C ; 1C_2C |
| 126 | //PORT_DIPSETTING( 0x42, DEF_STR( 1C_2C ) ) // 1C_2C ; 1C_4C |
| 127 | //PORT_DIPSETTING( 0x41, DEF_STR( 1C_3C ) ) // 1C_3C ; 1C_6C |
| 128 | //PORT_DIPSETTING( 0x43, DEF_STR( 2C_3C ) ) // 2C_3C ; 2C_7C |
| 129 | //PORT_DIPSETTING( 0xc0, DEF_STR( 2C_5C ) ) // 2C_5C ; 1C_5C |
| 130 | //PORT_DIPSETTING( 0xc2, DEF_STR( 2C_7C ) ) // 2C_7C ; 1C_7C |
| 131 | //PORT_DIPSETTING( 0xc1, DEF_STR( 3C_1C ) ) // 3C_1C ; 1C_1C |
| 132 | //PORT_DIPSETTING( 0xc3, DEF_STR( 1C_1C ) ) // 1C_1C ; 1C_3C |
| 133 | PORT_DIPNAME( 0x04, 0x04, "Match" ) |
| 134 | PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) |
| 135 | PORT_DIPSETTING( 0x04, DEF_STR( On ) ) |
| 136 | PORT_DIPNAME( 0x08, 0x08, "Balls" ) |
| 137 | PORT_DIPSETTING( 0x00, "5" ) |
| 138 | PORT_DIPSETTING( 0x08, "3" ) |
| 139 | PORT_DIPNAME( 0x30, 0x20, "Special" ) |
| 110 | 140 | PORT_DIPSETTING( 0x00, "Extra Ball" ) |
| 111 | | PORT_START("INP07") |
| 112 | | PORT_DIPNAME( 0x80, 0x80, "Replay when Exceed replay score" ) // overrides INP06 if on |
| 113 | | PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) |
| 114 | | PORT_DIPSETTING( 0x00, DEF_STR( On ) ) |
| 115 | | PORT_START("INP08") |
| 116 | | PORT_DIPNAME( 0x80, 0x80, "Balls" ) |
| 117 | | PORT_DIPSETTING( 0x80, "5" ) |
| 118 | | PORT_DIPSETTING( 0x00, "3" ) |
| 119 | | PORT_START("INP09") |
| 120 | | PORT_DIPNAME( 0x80, 0x80, "Match" ) |
| 121 | | PORT_DIPSETTING( 0x80, DEF_STR( On ) ) |
| 141 | PORT_DIPSETTING( 0x20, "Free Game" ) |
| 142 | PORT_DIPSETTING( 0x10, "20000 points" ) // same as 0x30 |
| 143 | |
| 144 | PORT_START("X1") // 2008-200F |
| 145 | // This switch together with 204C thru 204F, sets the scores at which a replay is awarded |
| 146 | PORT_DIPNAME( 0x01, 0x00, "Replay score" ) |
| 147 | PORT_DIPSETTING( 0x01, DEF_STR( High ) ) |
| 148 | PORT_DIPSETTING( 0x00, DEF_STR( Low ) ) |
| 149 | PORT_DIPNAME( 0x02, 0x02, "Last Ball double bonus" ) |
| 122 | 150 | PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) |
| 123 | | // next 4 dips control coins and credits. Leave them all off for 1coin=1credit. |
| 124 | | PORT_START("INP0A") |
| 125 | | PORT_DIPNAME( 0x80, 0x80, "Coins-a" ) |
| 126 | | PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) |
| 127 | | PORT_DIPSETTING( 0x00, DEF_STR( On ) ) |
| 128 | | PORT_START("INP0B") |
| 129 | | PORT_DIPNAME( 0x80, 0x80, "Coins-b" ) // this is actually the test button |
| 130 | | PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) |
| 131 | | PORT_DIPSETTING( 0x00, DEF_STR( On ) ) |
| 132 | | PORT_START("INP0C") |
| 133 | | PORT_DIPNAME( 0x80, 0x80, "Coins-c" ) |
| 134 | | PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) |
| 135 | | PORT_DIPSETTING( 0x00, DEF_STR( On ) ) |
| 136 | | PORT_START("INP0D") |
| 137 | | PORT_DIPNAME( 0x80, 0x80, "Coins-d" ) |
| 138 | | PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) |
| 139 | | PORT_DIPSETTING( 0x00, DEF_STR( On ) ) |
| 140 | | PORT_START("INP0E") |
| 141 | | PORT_DIPNAME( 0x80, 0x80, "Special" ) |
| 142 | | PORT_DIPSETTING( 0x80, "Extra Ball" ) |
| 143 | | PORT_DIPSETTING( 0x00, "Free Game" ) |
| 144 | | PORT_START("INP0F") |
| 145 | | PORT_DIPNAME( 0x80, 0x80, "20000 points for special" ) // overrides INP0E if on |
| 146 | | PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) |
| 147 | | PORT_DIPSETTING( 0x00, DEF_STR( On ) ) |
| 148 | | PORT_START("INP10") |
| 149 | | PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_COIN1 ) |
| 150 | | PORT_START("INP11") |
| 151 | | PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_COIN2 ) |
| 152 | | PORT_START("INP12") |
| 153 | | PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_START ) |
| 154 | | PORT_START("INP13") |
| 155 | | PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Slam Tilt") |
| 156 | | PORT_START("INP14") |
| 151 | PORT_DIPSETTING( 0x02, DEF_STR( On ) ) |
| 152 | PORT_DIPNAME( 0x04, 0x00, "Spelling Award" ) |
| 153 | PORT_DIPSETTING( 0x00, "Extra Ball" ) |
| 154 | PORT_DIPSETTING( 0x04, "20,000 points" ) |
| 155 | PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Test") PORT_CODE(KEYCODE_0) |
| 156 | PORT_DIPNAME( 0x30, 0x10, "Exceed replay score" ) |
| 157 | PORT_DIPSETTING( 0x00, "Nothing" ) |
| 158 | PORT_DIPSETTING( 0x20, "Extra Ball" ) |
| 159 | PORT_DIPSETTING( 0x10, "Replay" ) // same as 0x30 |
| 160 | PORT_DIPNAME( 0xc0, 0x00, "Max Credits" ) |
| 161 | PORT_DIPSETTING( 0x00, "8" ) |
| 162 | PORT_DIPSETTING( 0x80, "12" ) |
| 163 | PORT_DIPSETTING( 0x40, "15" ) |
| 164 | PORT_DIPSETTING( 0xc0, "20" ) |
| 165 | |
| 166 | PORT_START("X2") // 2010-2017 |
| 167 | PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_COIN1 ) |
| 168 | PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_COIN2 ) |
| 169 | PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START ) |
| 170 | PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Slam Tilt") |
| 171 | PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_OTHER ) |
| 172 | PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_OTHER ) |
| 173 | PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_OTHER ) |
| 157 | 174 | PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) |
| 158 | | PORT_START("INP15") |
| 175 | |
| 176 | PORT_START("X3") // 2018-201F |
| 177 | PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_OTHER ) |
| 178 | PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_OTHER ) |
| 179 | PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_OTHER ) |
| 180 | PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_OTHER ) |
| 181 | PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_OTHER ) |
| 182 | PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_OTHER ) |
| 183 | PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_OTHER ) |
| 159 | 184 | PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) |
| 160 | | PORT_START("INP16") |
| 161 | | PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) |
| 162 | | PORT_START("INP17") |
| 163 | | PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) |
| 164 | | PORT_START("INP18") |
| 165 | | PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) |
| 166 | | PORT_START("INP19") |
| 167 | | PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) |
| 168 | | PORT_START("INP1A") |
| 169 | | PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) |
| 170 | | PORT_START("INP1B") |
| 171 | | PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) |
| 172 | | PORT_START("INP1C") |
| 173 | | PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) |
| 174 | | PORT_START("INP1D") |
| 175 | | PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) |
| 176 | | PORT_START("INP1E") |
| 177 | | PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) |
| 178 | | PORT_START("INP1F") |
| 179 | | PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) |
| 180 | | PORT_START("INP20") |
| 181 | | PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Cabinet Tilt") |
| 182 | | PORT_START("INP21") |
| 183 | | PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_TILT ) PORT_NAME("Pendulum Tilt") |
| 184 | | PORT_START("INP22") |
| 185 | | PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Left Flipper") PORT_CODE(KEYCODE_LSHIFT) |
| 186 | | PORT_START("INP23") |
| 187 | | PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Right Flipper") PORT_CODE(KEYCODE_RSHIFT) |
| 188 | | PORT_START("INP24") |
| 189 | | PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Target 4") |
| 190 | | PORT_START("INP25") |
| 191 | | PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Target 3") |
| 192 | | PORT_START("INP26") |
| 193 | | PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Target 2") |
| 194 | | PORT_START("INP27") |
| 185 | |
| 186 | PORT_START("X4") // 2020-2027 |
| 187 | PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Cabinet Tilt") |
| 188 | PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_TILT ) PORT_NAME("Pendulum Tilt") |
| 189 | PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Left Flipper") PORT_CODE(KEYCODE_LSHIFT) |
| 190 | PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Right Flipper") PORT_CODE(KEYCODE_RSHIFT) |
| 191 | PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Target 4") |
| 192 | PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Target 3") |
| 193 | PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Target 2") |
| 195 | 194 | PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Target 1") |
| 196 | | PORT_START("INP28") |
| 195 | |
| 196 | PORT_START("X5") // 2028-202F |
| 197 | PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_OTHER ) |
| 198 | PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_OTHER ) |
| 199 | PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_OTHER ) |
| 200 | PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_OTHER ) |
| 201 | PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_OTHER ) |
| 202 | PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_OTHER ) |
| 203 | PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_OTHER ) |
| 197 | 204 | PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) |
| 198 | | PORT_START("INP29") |
| 199 | | PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) |
| 200 | | PORT_START("INP2A") |
| 201 | | PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) |
| 202 | | PORT_START("INP2B") |
| 203 | | PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) |
| 204 | | PORT_START("INP2C") |
| 205 | | PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) |
| 206 | | PORT_START("INP2D") |
| 207 | | PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) |
| 208 | | PORT_START("INP2E") |
| 209 | | PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) |
| 210 | | PORT_START("INP2F") |
| 211 | | PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) |
| 212 | | PORT_START("INP30") |
| 213 | | PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) |
| 214 | | PORT_START("INP31") |
| 215 | | PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Rollover 3") PORT_CODE(KEYCODE_Q) |
| 216 | | PORT_START("INP32") |
| 217 | | PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Rollover 2") PORT_CODE(KEYCODE_W) |
| 218 | | PORT_START("INP33") |
| 219 | | PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Rollover 1") PORT_CODE(KEYCODE_E) |
| 220 | | PORT_START("INP34") |
| 221 | | PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Rollover 8") PORT_CODE(KEYCODE_R) |
| 222 | | PORT_START("INP35") |
| 223 | | PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Rollover 7") PORT_CODE(KEYCODE_Y) |
| 224 | | PORT_START("INP36") |
| 225 | | PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Rollover 6") PORT_CODE(KEYCODE_U) |
| 226 | | PORT_START("INP37") |
| 205 | |
| 206 | PORT_START("X6") // 2030-2037 |
| 207 | PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_OTHER ) |
| 208 | PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Rollover 3") PORT_CODE(KEYCODE_Q) |
| 209 | PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Rollover 2") PORT_CODE(KEYCODE_W) |
| 210 | PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Rollover 1") PORT_CODE(KEYCODE_E) |
| 211 | PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Rollover 8") PORT_CODE(KEYCODE_R) |
| 212 | PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Rollover 7") PORT_CODE(KEYCODE_Y) |
| 213 | PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Rollover 6") PORT_CODE(KEYCODE_U) |
| 227 | 214 | PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Rollover 5") PORT_CODE(KEYCODE_I) |
| 228 | | PORT_START("INP38") |
| 229 | | PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("L Hole") PORT_CODE(KEYCODE_O) |
| 230 | | PORT_START("INP39") |
| 231 | | PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Bumper 1") PORT_CODE(KEYCODE_V) |
| 232 | | PORT_START("INP3A") |
| 233 | | PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Bumper 2") PORT_CODE(KEYCODE_B) |
| 234 | | PORT_START("INP3B") |
| 235 | | PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Bumper 3") PORT_CODE(KEYCODE_N) |
| 236 | | PORT_START("INP3C") |
| 237 | | PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Spinner") PORT_CODE(KEYCODE_M) |
| 238 | | PORT_START("INP3D") |
| 239 | | PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("R Pocket") PORT_CODE(KEYCODE_A) |
| 240 | | PORT_START("INP3E") |
| 241 | | PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("L Pocket") PORT_CODE(KEYCODE_S) |
| 242 | | PORT_START("INP3F") |
| 215 | |
| 216 | PORT_START("X7") // 2038-203F |
| 217 | PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("L Hole") PORT_CODE(KEYCODE_O) |
| 218 | PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Bumper 1") PORT_CODE(KEYCODE_V) |
| 219 | PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Bumper 2") PORT_CODE(KEYCODE_B) |
| 220 | PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Bumper 3") PORT_CODE(KEYCODE_N) |
| 221 | PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Spinner") PORT_CODE(KEYCODE_M) |
| 222 | PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("R Pocket") PORT_CODE(KEYCODE_A) |
| 223 | PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("L Pocket") PORT_CODE(KEYCODE_S) |
| 243 | 224 | PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("R Hole") PORT_CODE(KEYCODE_D) |
| 244 | | PORT_START("INP40") |
| 245 | | PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("L Triangle") PORT_CODE(KEYCODE_F) |
| 246 | | PORT_START("INP41") |
| 247 | | PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("10 points") PORT_CODE(KEYCODE_G) |
| 248 | | PORT_START("INP42") |
| 249 | | PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("50 points") PORT_CODE(KEYCODE_H) |
| 250 | | PORT_START("INP43") |
| 251 | | PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("OutHole") PORT_CODE(KEYCODE_X) |
| 252 | | PORT_START("INP44") |
| 253 | | PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) |
| 254 | | PORT_START("INP45") |
| 255 | | PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) |
| 256 | | PORT_START("INP46") |
| 257 | | PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) |
| 258 | | PORT_START("INP47") |
| 225 | |
| 226 | PORT_START("X8") // 2040-2047 |
| 227 | PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("L Triangle") PORT_CODE(KEYCODE_F) |
| 228 | PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("10 points") PORT_CODE(KEYCODE_G) |
| 229 | PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("50 points") PORT_CODE(KEYCODE_H) |
| 230 | PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("OutHole") PORT_CODE(KEYCODE_X) |
| 231 | PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_OTHER ) |
| 232 | PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_OTHER ) |
| 233 | PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_OTHER ) |
| 259 | 234 | PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("R Triangle") PORT_CODE(KEYCODE_J) |
| 260 | | PORT_START("INP48") |
| 261 | | PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("50 points and adv letter") PORT_CODE(KEYCODE_K) |
| 262 | | PORT_START("INP49") |
| 263 | | PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Captive ball rollovers") PORT_CODE(KEYCODE_L) |
| 264 | | PORT_START("INP4A") |
| 265 | | PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Rollover 'B' centre") PORT_CODE(KEYCODE_Z) |
| 266 | | PORT_START("INP4B") |
| 267 | | PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Roll thru upper right") PORT_CODE(KEYCODE_C) |
| 268 | | PORT_START("INP4C") |
| 235 | |
| 236 | PORT_START("X9") // 2048-204F |
| 237 | PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("50 points and adv letter") PORT_CODE(KEYCODE_K) |
| 238 | PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Captive ball rollovers") PORT_CODE(KEYCODE_L) |
| 239 | PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Rollover 'B' centre") PORT_CODE(KEYCODE_Z) |
| 240 | PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Roll thru upper right") PORT_CODE(KEYCODE_C) |
| 241 | PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_OTHER ) |
| 242 | PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_OTHER ) |
| 243 | PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_OTHER ) |
| 269 | 244 | PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) |
| 270 | | PORT_START("INP4D") |
| 271 | | PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) |
| 272 | | PORT_START("INP4E") |
| 273 | | PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) |
| 274 | | PORT_START("INP4F") |
| 275 | | PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) |
| 276 | 245 | INPUT_PORTS_END |
| 277 | 246 | |
| 278 | 247 | void atari_s1_state::machine_reset() |
| 279 | 248 | { |
| 249 | m_t_c = 0; |
| 280 | 250 | } |
| 281 | 251 | |
| 282 | | READ8_MEMBER( atari_s1_state::latch_r ) |
| 252 | WRITE8_MEMBER( atari_s1_state::meter_w ) |
| 283 | 253 | { |
| 284 | | return 0; |
| 254 | // time2000 has optional coin counters etc |
| 285 | 255 | } |
| 286 | 256 | |
| 287 | | WRITE8_MEMBER( atari_s1_state::latch_w ) |
| 288 | | { |
| 289 | | } |
| 290 | | |
| 291 | 257 | READ8_MEMBER( atari_s1_state::switch_r ) |
| 292 | 258 | { |
| 293 | 259 | char kbdrow[8]; |
| 294 | | sprintf(kbdrow,"INP%02X",offset); |
| 295 | | return ioport(kbdrow)->read() | (BIT(m_bit6, 1) << 6); |
| 260 | sprintf(kbdrow,"X%X",offset>>3); |
| 261 | return (BIT(ioport(kbdrow)->read(), offset&7 ) << 7) | (BIT(m_bit6, 1) << 6); // switch bit | BIT6_CLK |
| 296 | 262 | } |
| 297 | 263 | |
| 298 | 264 | TIMER_DEVICE_CALLBACK_MEMBER( atari_s1_state::nmi ) |
| 299 | 265 | { |
| 300 | | static const UINT8 patterns[16] = { 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0, 0, 0, 0, 0, 0 }; |
| 266 | static const UINT8 patterns[16] = { 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7c, 0x07, 0x7f, 0x67, 0, 0, 0, 0, 0, 0 }; // 4511 |
| 301 | 267 | m_bit6++; |
| 302 | | m_maincpu->set_input_line(INPUT_LINE_NMI, PULSE_LINE); |
| 268 | if (m_t_c > 0x40) |
| 269 | m_maincpu->set_input_line(INPUT_LINE_NMI, PULSE_LINE); |
| 270 | else |
| 271 | m_t_c++; |
| 303 | 272 | |
| 304 | 273 | m_out_offs++; |
| 305 | 274 | m_out_offs &= 0x1f; |
| 306 | 275 | if ((m_out_offs & 3) == 3) |
| 307 | 276 | { |
| 277 | // Player number |
| 308 | 278 | char wordnum[8]; |
| 309 | 279 | sprintf(wordnum,"text%d",m_out_offs>>2); |
| 310 | | output_set_value(wordnum, !(m_p_ram[m_out_offs]==8)); |
| 280 | output_set_value(wordnum, !BIT(patterns[m_p_ram[m_out_offs]&15], 6)); // uses 'g' segment |
| 311 | 281 | } |
| 312 | 282 | else |
| 313 | 283 | { |
| 284 | // Digits |
| 314 | 285 | output_set_digit_value(m_out_offs << 1, patterns[m_p_ram[m_out_offs]>>4]); |
| 315 | 286 | output_set_digit_value((m_out_offs << 1)+1, patterns[m_p_ram[m_out_offs]&15]); |
| 316 | 287 | } |
| r18372 | r18373 | |
| 329 | 300 | MCFG_DEFAULT_LAYOUT(layout_atari_s1) |
| 330 | 301 | MACHINE_CONFIG_END |
| 331 | 302 | |
| 303 | static MACHINE_CONFIG_DERIVED( atarians, atari_s1 ) |
| 304 | MCFG_CPU_MODIFY("maincpu") |
| 305 | MCFG_CPU_PROGRAM_MAP(atarians_map) |
| 306 | MACHINE_CONFIG_END |
| 307 | |
| 308 | static MACHINE_CONFIG_DERIVED( midearth, atari_s1 ) |
| 309 | MCFG_CPU_MODIFY("maincpu") |
| 310 | MCFG_CPU_PROGRAM_MAP(midearth_map) |
| 311 | MACHINE_CONFIG_END |
| 312 | |
| 332 | 313 | /*------------------------------------------------------------------- |
| 333 | 314 | / The Atarians (11/1976) |
| 334 | 315 | /-------------------------------------------------------------------*/ |
| r18372 | r18373 | |
| 384 | 365 | ROM_END |
| 385 | 366 | |
| 386 | 367 | |
| 387 | | GAME( 1976, atarians, 0, atari_s1, atari_s1, driver_device, 0, ROT0, "Atari","The Atarians", GAME_IS_SKELETON_MECHANICAL) |
| 388 | | //GAME( 2002, atarianb, atarians, atari_s1, atari_s1, driver_device, 0, ROT0, "Atari / Gaston","The Atarians (working bootleg)", GAME_IS_SKELETON_MECHANICAL) |
| 389 | | GAME( 1977, time2000, 0, atari_s1, atari_s1, driver_device, 0, ROT0, "Atari","Time 2000", GAME_IS_SKELETON_MECHANICAL) |
| 390 | | GAME( 1977, aavenger, 0, atari_s1, atari_s1, driver_device, 0, ROT0, "Atari","Airborne Avenger", GAME_IS_SKELETON_MECHANICAL) |
| 391 | | GAME( 1978, midearth, 0, atari_s1, atari_s1, driver_device, 0, ROT0, "Atari","Middle Earth", GAME_IS_SKELETON_MECHANICAL) |
| 392 | | GAME( 1978, spcrider, 0, atari_s1, atari_s1, driver_device, 0, ROT0, "Atari","Space Riders", GAME_IS_SKELETON_MECHANICAL) |
| 368 | GAME( 1976, atarians, 0, atarians, atari_s1, driver_device, 0, ROT0, "Atari", "The Atarians", GAME_MECHANICAL | GAME_NO_SOUND) |
| 369 | //GAME( 2002, atarianb, atarians, atari_s1, atari_s1, driver_device, 0, ROT0, "Atari / Gaston", "The Atarians (working bootleg)", GAME_IS_SKELETON_MECHANICAL) |
| 370 | GAME( 1977, time2000, 0, atari_s1, atari_s1, driver_device, 0, ROT0, "Atari", "Time 2000", GAME_MECHANICAL | GAME_NO_SOUND) |
| 371 | GAME( 1977, aavenger, 0, atari_s1, atari_s1, driver_device, 0, ROT0, "Atari", "Airborne Avenger", GAME_MECHANICAL | GAME_NO_SOUND) |
| 372 | GAME( 1978, midearth, 0, midearth, atari_s1, driver_device, 0, ROT0, "Atari", "Middle Earth", GAME_IS_SKELETON_MECHANICAL) |
| 373 | GAME( 1978, spcrider, 0, atari_s1, atari_s1, driver_device, 0, ROT0, "Atari", "Space Riders", GAME_MECHANICAL | GAME_NO_SOUND) |