1 // license:BSD-3-Clause
2 // copyright-holders:Brad Oliver, Bernd Wiebelt, Allard van der Bas
3 /***************************************************************************
4 
5     Atari Asteroids hardware
6 
7     Games supported:
8         * Asteroids
9         * Asteroids Deluxe
10         * Lunar Lander
11 
12     Known bugs:
13         * the ERROR message in Asteroids Deluxe self test is related to a pokey problem
14 
15 Information from a Tech Tip:
16 
17 Asteroids Modification:
18 
19 As a result of inquires regarding the achievement of extremely high scores on Asteroids,
20 we have developed a modification that will accomplish the following:
21   When the small flying saucer enters the screen, it fires immediately in the direction
22     of the player. The missiles also have a wraparound capability.
23   Originally, the program was entered so that the saucer would go one-sixth of the way
24     across the screen before firing, without the wraparound capability.
25 
26 There are two revisions currently in the field, ROM revision 02 has the flip-flop capability,
27   version 01 does not.
28 Kits are available immediately from your Atari Distributor.  To determine which kit you
29   require, check ROMs on your Asteroids PCB.  If ROM code is "-01" order kit no. 08-0303009.
30   If ROM code is "-02", order no. 08-0303008.
31 
32 For kit 08-0303009 (from rev 01) swap the following:
33 
34  035127-01 --> 035127-02
35  035143-01 --> 035143-02
36  035144-01 --> 034144-04E
37  035145-01 --> 034145-04E
38 
39 For kit 08-0303008 (from rev 02) swap the following:
40 
41  035144-02 --> 034144-04E
42  035145-02 --> 034145-04E
43 
44   A rom set was found labeled:
45 
46     035144-02-03
47     035145-02-03
48 
49   However, when dumped they matched the rev 02 set.
50 
51 There is not a rev 03 known or dumped. An Asteroids rev 03 is not mentioned in any known Atari docs found to date.
52 
53 
54 ****************************************************************************
55 
56 For revision 3 of Asteroids Deluxe:
57 
58 U.S. Update
59 New Program with Easier Game Play for Asteroids Deluxe
60 
61 The read-only memories (ROMs) in this kit contain a new program that changes the Asteroids Deluxe
62 game play. To attract new players, the game play is now operator-adjustable to be either easy for
63 approximately the first 30,000 points or hard through-out the game.
64 
65 The technical manual describes the game play correctly if the game PCB option switch at R5 is set
66 to "hard". If you set the switch to "easy", then the following game-play changes happen:
67 
68 * FOUR large asteroids begin the game. The second wave of asteroids begins with FIVE, and the
69   subsequent waves start with SIX through NINE large asteroids. In addition, the asteriods move
70   much more slowly across the screen. (If the option switch is set to hard, the waves begin with
71   SIX to NINE large asteriods.)
72 * The large ships ("death stars") when shot will break up into three slowly-moving diamonds. (If
73   the option switch is set to hard, diamonds would immediatly begin chasing the player's
74   spaceship at high speed.)
75 
76 After installing these five ROMs, we recommend you set your game to easy game play.  To do so, refer
77 to the figure that follows. You should note also that the self-test now deisplays and addition 0 or 1
78 to represent your game difficulty selection.
79 
80 
81 ROM kit for Asteroids Deluxe Game PCB Assembly A036471-03 and -04  F
82 
83 Part Number   PCB Location
84 --------------------------------
85 036430-02      D1
86 036431-02      E/F1
87 036432-02      H1
88 036433-03      J1
89 036800-02      R2
90 
91 ***********************
92 
93 Self-Test screen shows:
94 
95  0000     (left to right: Coin Bonus Adder, Left Mech Mutiplier, Right Mech Multiplier & Game Price)
96 
97  01000    (left to right: Game Language, Ships at Game Start, Minimum Plays, Difficulty, Bonus Ship)
98 
99  ^^       (Graphic display of the number of ships per game [up to 7])
100 
101  10000    (Point score at which a bonus ship is granted, blank is no bonus ship)
102 
103 
104 NOTE: Previous program versions, for the second line would only show 4 digits.  The 6th switch has
105       a currently unknown effect in the game. However, on the Minimum Number of Plays display (on the
106       Self-Test screen) changes the values shown from 0 for a 1-Play Minimum to show a 2 and from
107       1 for a 2-Play Minimum to show a 3. Known documentation for ealier game versions state the 6th
108       switch is "Unused"
109 
110 ****************************************************************************
111 
112     Asteroids-deluxe state-prom added by HIGHWAYMAN.
113     The prom pcb location is:C8 and is 256x4
114     (i need to update the dump, this one is read in 8bit-mode)
115 
116 ****************************************************************************
117 
118     Asteroids Memory Map (preliminary)
119 
120     Asteroids settings:
121 
122     0 = OFF  1 = ON  X = Don't Care  $ = Atari suggests
123 
124 
125     8 SWITCH DIP
126     87654321
127     --------
128     XXXXXX11   English
129     XXXXXX10   German
130     XXXXXX01   French
131     XXXXXX00   Spanish
132     XXXXX1XX   4-ship game
133     XXXXX0XX   3-ship game
134     11XXXXXX   Free Play
135     10XXXXXX   1 Coin  for 2 Plays
136     01XXXXXX   1 Coin  for 1 Play
137     00XXXXXX   2 Coins for 1 Play
138 
139     Asteroids Deluxe settings:
140 
141     0 = OFF  1 = ON  X = Don't Care  $ = Atari suggests
142 
143 
144     8 SWITCH DIP (R5)
145     87654321
146     --------
147     XXXXXX11   English $
148     XXXXXX10   German
149     XXXXXX01   French
150     XXXXXX00   Spanish
151     XXXX11XX   2-4 ships
152     XXXX10XX   3-5 ships $
153     XXXX01XX   4-6 ships
154     XXXX00XX   5-7 ships
155     XXX1XXXX   1-play minimum $
156     XXX0XXXX   2-play minimum
157     XX1XXXXX   Easier gameplay for first 30000 points +
158     XX0XXXXX   Hard gameplay throughout the game      +
159     11XXXXXX   Bonus ship every 10,000 points $ !
160     10XXXXXX   Bonus ship every 12,000 points !
161     01XXXXXX   Bonus ship every 15,000 points !
162     00XXXXXX   No bonus ships (adds one ship at game start)
163 
164     + only with the newer romset
165     ! not "every", but "at", e.g. only once.
166 
167     Thanks to Gregg Woodcock for the info.
168 
169     8 SWITCH DIP (L8)
170     87654321
171     --------
172     XXXXXX11   Free Play
173     XXXXXX10   1 Coin = 2 Plays
174     XXXXXX01   1 Coin = 1 Play
175     XXXXXX00   2 Coins = 1 Play $
176     XXXX11XX   Right coin mech * 1 $
177     XXXX10XX   Right coin mech * 4
178     XXXX01XX   Right coin mech * 5
179     XXXX00XX   Right coin mech * 6
180     XXX1XXXX   Center coin mech * 1 $
181     XXX0XXXX   Center coin mech * 2
182     111XXXXX   No bonus coins
183     110XXXXX   For every 2 coins inserted, game logic adds 1 more coin
184     101XXXXX   For every 4 coins inserted, game logic adds 1 more coin
185     100XXXXX   For every 4 coins inserted, game logic adds 2 more coins $
186     011XXXXX   For every 5 coins inserted, game logic adds 1 more coin
187 
188 ****************************************************************************
189 
190     Lunar Lander Memory Map (preliminary)
191 
192     Lunar Lander settings:
193 
194     0 = OFF  1 = ON  x = Don't Care  $ = Atari suggests
195 
196 
197     8 SWITCH DIP (P8) with -01 ROMs on PCB
198     87654321
199     --------
200     11xxxxxx   450 fuel units per coin
201     10xxxxxx   600 fuel units per coin
202     01xxxxxx   750 fuel units per coin  $
203     00xxxxxx   900 fuel units per coin
204     xxx0xxxx   Free play
205     xxx1xxxx   Coined play as determined by toggles 7 & 8  $
206     xxxx00xx   German instructions
207     xxxx01xx   Spanish instructions
208     xxxx10xx   French instructions
209     xxxx11xx   English instructions  $
210     xxxxxx11   Right coin == 1 credit/coin  $
211     xxxxxx10   Right coin == 4 credit/coin
212     xxxxxx01   Right coin == 5 credit/coin
213     xxxxxx00   Right coin == 6 credit/coin
214                (Left coin always registers 1 credit/coin)
215 
216 
217     8 SWITCH DIP (P8) with -02 ROMs on PCB
218     87654321
219     --------
220     11x1xxxx   450 fuel units per coin
221     10x1xxxx   600 fuel units per coin
222     01x1xxxx   750 fuel units per coin  $
223     00x1xxxx   900 fuel units per coin
224     11x0xxxx   1100 fuel units per coin
225     10x0xxxx   1300 fuel units per coin
226     01x0xxxx   1550 fuel units per coin
227     00x0xxxx   1800 fuel units per coin
228     xx0xxxxx   Free play
229     xx1xxxxx   Coined play as determined by toggles 5, 7, & 8  $
230     xxxx00xx   German instructions
231     xxxx01xx   Spanish instructions
232     xxxx10xx   French instructions
233     xxxx11xx   English instructions  $
234     xxxxxx11   Right coin == 1 credit/coin  $
235     xxxxxx10   Right coin == 4 credit/coin
236     xxxxxx01   Right coin == 5 credit/coin
237     xxxxxx00   Right coin == 6 credit/coin
238                (Left coin always registers 1 credit/coin)
239 
240    DIP locations verified from manual for:
241     - asteroid
242     - llander
243     - llander1
244     - astdelux
245 
246 ***************************************************************************/
247 
248 #include "emu.h"
249 #include "includes/asteroid.h"
250 #include "cpu/m6502/m6502.h"
251 #include "machine/74259.h"
252 #include "machine/output_latch.h"
253 #include "machine/rescap.h"
254 #include "machine/watchdog.h"
255 #include "sound/pokey.h"
256 #include "video/avgdvg.h"
257 #include "video/vector.h"
258 #include "screen.h"
259 
260 #include "astdelux.lh"
261 
262 #define MASTER_CLOCK (XTAL(12'096'000))
263 #define CLOCK_3KHZ   (MASTER_CLOCK / 4096)
264 
265 /*************************************
266  *
267  *  Coin counters
268  *
269  *************************************/
270 
WRITE_LINE_MEMBER(asteroid_state::coin_counter_left_w)271 WRITE_LINE_MEMBER(asteroid_state::coin_counter_left_w)
272 {
273 	machine().bookkeeping().coin_counter_w(0, state);
274 }
275 
WRITE_LINE_MEMBER(asteroid_state::coin_counter_center_w)276 WRITE_LINE_MEMBER(asteroid_state::coin_counter_center_w)
277 {
278 	machine().bookkeeping().coin_counter_w(1, state);
279 }
280 
WRITE_LINE_MEMBER(asteroid_state::coin_counter_right_w)281 WRITE_LINE_MEMBER(asteroid_state::coin_counter_right_w)
282 {
283 	machine().bookkeeping().coin_counter_w(2, state);
284 }
285 
286 
287 
288 /*************************************
289  *
290  *  High score EAROM
291  *
292  *************************************/
293 
earom_read()294 uint8_t asteroid_state::earom_read()
295 {
296 	return m_earom->data();
297 }
298 
earom_write(offs_t offset,uint8_t data)299 void asteroid_state::earom_write(offs_t offset, uint8_t data)
300 {
301 	m_earom->set_address(offset & 0x3f);
302 	m_earom->set_data(data);
303 }
304 
earom_control_w(uint8_t data)305 void asteroid_state::earom_control_w(uint8_t data)
306 {
307 	// CK = DB0, C1 = /DB2, C2 = DB1, CS1 = DB3, /CS2 = GND
308 	m_earom->set_control(BIT(data, 3), 1, !BIT(data, 2), BIT(data, 1));
309 	m_earom->set_clk(BIT(data, 0));
310 }
311 
312 
313 
314 /*************************************
315  *
316  *  Main CPU memory handlers
317  *
318  *************************************/
319 
asteroid_map(address_map & map)320 void asteroid_state::asteroid_map(address_map &map)
321 {
322 	map.global_mask(0x7fff);
323 	map(0x0000, 0x01ff).ram();
324 	map(0x0200, 0x02ff).bankrw("ram1").share("ram1");
325 	map(0x0300, 0x03ff).bankrw("ram2").share("ram2");
326 	map(0x2000, 0x2007).r(FUNC(asteroid_state::asteroid_IN0_r)).nopw();    // IN0
327 	map(0x2400, 0x2407).r(FUNC(asteroid_state::asteroid_IN1_r));    // IN1
328 	map(0x2800, 0x2803).r(FUNC(asteroid_state::asteroid_DSW1_r)).nopw();   // DSW1
329 	map(0x3000, 0x3000).w(m_dvg, FUNC(dvg_device::go_w));
330 	map(0x3200, 0x3200).w("outlatch", FUNC(output_latch_device::write));
331 	map(0x3400, 0x3400).w("watchdog", FUNC(watchdog_timer_device::reset_w));
332 	map(0x3600, 0x3600).w(FUNC(asteroid_state::asteroid_explode_w));
333 	map(0x3a00, 0x3a00).w(FUNC(asteroid_state::asteroid_thump_w));
334 	map(0x3c00, 0x3c07).w("audiolatch", FUNC(ls259_device::write_d7));
335 	map(0x3e00, 0x3e00).w(FUNC(asteroid_state::asteroid_noise_reset_w));
336 	map(0x4000, 0x47ff).ram().share("dvg:vectorram").region("maincpu", 0x4000);
337 	map(0x5000, 0x57ff).rom();                     // Vector ROM
338 	map(0x6800, 0x7fff).rom();
339 }
340 
341 
astdelux_map(address_map & map)342 void asteroid_state::astdelux_map(address_map &map)
343 {
344 	map.global_mask(0x7fff);
345 	map(0x0000, 0x01ff).ram();
346 	map(0x0200, 0x02ff).bankrw("ram1").share("ram1");
347 	map(0x0300, 0x03ff).bankrw("ram2").share("ram2");
348 	map(0x2000, 0x2007).r(FUNC(asteroid_state::asteroid_IN0_r)).nopw();    // IN0
349 	map(0x2400, 0x2407).r(FUNC(asteroid_state::asteroid_IN1_r)).nopw();    // IN1
350 	map(0x2800, 0x2803).r(FUNC(asteroid_state::asteroid_DSW1_r));   // DSW1
351 	map(0x2c00, 0x2c0f).rw("pokey", FUNC(pokey_device::read), FUNC(pokey_device::write));
352 	map(0x2c40, 0x2c7f).r(FUNC(asteroid_state::earom_read));
353 	map(0x3000, 0x3000).w(m_dvg, FUNC(dvg_device::go_w));
354 	map(0x3200, 0x323f).w(FUNC(asteroid_state::earom_write)).nopr();
355 	map(0x3400, 0x3400).w("watchdog", FUNC(watchdog_timer_device::reset_w));
356 	map(0x3600, 0x3600).w(FUNC(asteroid_state::asteroid_explode_w));
357 	map(0x3a00, 0x3a00).w(FUNC(asteroid_state::earom_control_w));
358 	map(0x3c00, 0x3c07).w("audiolatch", FUNC(ls259_device::write_d7));
359 	map(0x3e00, 0x3e00).w(FUNC(asteroid_state::asteroid_noise_reset_w));
360 	map(0x4000, 0x47ff).ram().share("dvg:vectorram").region("maincpu", 0x4000);
361 	map(0x4800, 0x57ff).rom();                     // Vector ROM
362 	map(0x6000, 0x7fff).rom();
363 }
364 
365 
llander_map(address_map & map)366 void asteroid_state::llander_map(address_map &map)
367 {
368 	map.global_mask(0x7fff);
369 	map(0x0000, 0x00ff).ram().mirror(0x1f00);
370 	map(0x2000, 0x2000).portr("IN0");
371 	map(0x2400, 0x2407).r(FUNC(asteroid_state::asteroid_IN1_r));    // IN1
372 	map(0x2800, 0x2803).r(FUNC(asteroid_state::asteroid_DSW1_r));   // DSW1
373 	map(0x2c00, 0x2c00).portr("THRUST");
374 	map(0x3000, 0x3000).w(m_dvg, FUNC(dvg_device::go_w));
375 	map(0x3200, 0x3200).w("outlatch", FUNC(output_latch_device::write));
376 	map(0x3400, 0x3400).w("watchdog", FUNC(watchdog_timer_device::reset_w));
377 	map(0x3c00, 0x3c00).w(FUNC(asteroid_state::llander_sounds_w));
378 	map(0x3e00, 0x3e00).w(FUNC(asteroid_state::llander_snd_reset_w));
379 	map(0x4000, 0x47ff).ram().share("dvg:vectorram").region("maincpu", 0x4000);
380 	map(0x4800, 0x5fff).rom();                     // Vector ROM
381 	map(0x5800, 0x5800).nopw(); // INC access?
382 	map(0x6000, 0x7fff).rom();
383 }
384 
385 
386 
387 /*************************************
388  *
389  *  Port definitions
390  *
391  *************************************/
392 
READ_LINE_MEMBER(asteroid_state::clock_r)393 READ_LINE_MEMBER(asteroid_state::clock_r)
394 {
395 	return (m_maincpu->total_cycles() & 0x100) ? 1 : 0;
396 }
397 
398 static INPUT_PORTS_START( asteroid )
399 	PORT_START("IN0")
400 	PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNKNOWN )
401 	// Bit 2 is the 3 KHz source and Bit 3 the VG_HALT bit
PORT_READ_LINE_MEMBER(asteroid_state,clock_r)402 	PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_READ_LINE_MEMBER(asteroid_state, clock_r)
403 	PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_CUSTOM ) PORT_READ_LINE_DEVICE_MEMBER("dvg", dvg_device, done_r)
404 	PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON5 ) PORT_CODE(KEYCODE_SPACE) PORT_CODE(JOYCODE_BUTTON3)       // Hyperspace
405 	PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_CODE(KEYCODE_LCONTROL) PORT_CODE(JOYCODE_BUTTON1)    // Fire
406 	PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_NAME("Diagnostic Step")
407 	PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_TILT )
408 	PORT_SERVICE( 0x80, IP_ACTIVE_HIGH )
409 
410 	PORT_START("IN1")
411 	PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_COIN1 )
412 	PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_COIN2 )
413 	PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_COIN3 )
414 	PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START1 )
415 	PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_START2 )
416 	PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_CODE(KEYCODE_LALT) PORT_CODE(JOYCODE_BUTTON2)        // Thrust
417 	PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CODE(KEYCODE_RIGHT) PORT_CODE(JOYCODE_X_RIGHT_SWITCH)// Right
418 	PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CODE(KEYCODE_LEFT) PORT_CODE(JOYCODE_X_LEFT_SWITCH)  // Left
419 
420 	PORT_START("DSW1")
421 	PORT_DIPNAME( 0x03, 0x00, DEF_STR( Language ) ) PORT_DIPLOCATION("SW:1,2")
422 	PORT_DIPSETTING (   0x00, DEF_STR( English ) )
423 	PORT_DIPSETTING (   0x01, DEF_STR( German ) )
424 	PORT_DIPSETTING (   0x02, DEF_STR( French ) )
425 	PORT_DIPSETTING (   0x03, DEF_STR( Spanish ) )
426 	PORT_DIPNAME( 0x04, 0x04, DEF_STR( Lives ) )    PORT_DIPLOCATION("SW:3")
427 	PORT_DIPSETTING (   0x04, "3" )
428 	PORT_DIPSETTING (   0x00, "4" )
429 	PORT_DIPNAME( 0x08, 0x00, "Center Mech" )       PORT_DIPLOCATION("SW:4") // Left/Center for 3-door mech
430 	PORT_DIPSETTING (   0x00, "X 1" )
431 	PORT_DIPSETTING (   0x08, "X 2" )
432 	PORT_DIPNAME( 0x30, 0x00, "Right Mech" )        PORT_DIPLOCATION("SW:5,6")
433 	PORT_DIPSETTING (   0x00, "X 1" )
434 	PORT_DIPSETTING (   0x10, "X 4" )
435 	PORT_DIPSETTING (   0x20, "X 5" )
436 	PORT_DIPSETTING (   0x30, "X 6" )
437 	PORT_DIPNAME( 0xc0, 0x80, DEF_STR( Coinage ) )  PORT_DIPLOCATION("SW:7,8")
438 	PORT_DIPSETTING (   0xc0, DEF_STR( 2C_1C ) )
439 	PORT_DIPSETTING (   0x80, DEF_STR( 1C_1C ) )
440 	PORT_DIPSETTING (   0x40, DEF_STR( 1C_2C ) )
441 	PORT_DIPSETTING (   0x00, DEF_STR( Free_Play ) )
442 
443 	PORT_START("COCKTAIL")
444 	PORT_CONFNAME(1, 0, DEF_STR(Cabinet))
445 	PORT_CONFSETTING(0, DEF_STR(Upright))
446 	PORT_CONFSETTING(1, DEF_STR(Cocktail))
447 INPUT_PORTS_END
448 
449 
450 static INPUT_PORTS_START( asteroidb )
451 	PORT_INCLUDE( asteroid )
452 
453 	PORT_MODIFY("IN0")
454 	PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNKNOWN )    // Resets
455 	PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNKNOWN )    // Resets
456 	PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_TILT )
457 	PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNKNOWN )
458 	PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_UNKNOWN )
459 	PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN )
460 	PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN )
461 	// Bit 7 is VG_HALT
462 	PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_CUSTOM ) PORT_READ_LINE_DEVICE_MEMBER("dvg", dvg_device, done_r)
463 
464 	PORT_MODIFY("IN1")
465 	PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_START1 )
466 	PORT_BIT( 0x02, IP_ACTIVE_LOW,  IPT_COIN1 )
467 	PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_CODE(KEYCODE_LALT) PORT_CODE(JOYCODE_BUTTON2)            // Thrust
468 	PORT_BIT( 0x08, IP_ACTIVE_LOW,  IPT_COIN2 )
469 	PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_CODE(KEYCODE_LCONTROL) PORT_CODE(JOYCODE_BUTTON1)        // Fire
470 
471 	PORT_MODIFY("DSW1")
472 	PORT_DIPUNKNOWN_DIPLOC( 0x08, 0x08, "SW:4" )
473 	PORT_DIPUNKNOWN_DIPLOC( 0x10, 0x10, "SW:5" )
474 	PORT_DIPUNKNOWN_DIPLOC( 0x20, 0x20, "SW:6" )
475 
476 	PORT_START("HS") // Hyperspace
477 	PORT_BIT( 0x7f, IP_ACTIVE_LOW, IPT_UNUSED )
478 	PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_BUTTON5 ) PORT_CODE(KEYCODE_SPACE) PORT_CODE(JOYCODE_BUTTON3)            // Hyperspace
479 INPUT_PORTS_END
480 
481 
482 static INPUT_PORTS_START( aerolitos )
483 	PORT_INCLUDE( asteroid )
484 
485 	PORT_MODIFY("DSW1") // this bootleg was for the Spanish market, so set it to Spanish by default
486 	PORT_DIPNAME( 0x03, 0x03, DEF_STR( Language ) ) PORT_DIPLOCATION("SW:1,2")
487 	PORT_DIPSETTING (   0x00, DEF_STR( English ) )
488 	PORT_DIPSETTING (   0x01, DEF_STR( German ) )
489 	PORT_DIPSETTING (   0x02, DEF_STR( French ) )
490 	PORT_DIPSETTING (   0x03, DEF_STR( Spanish ) )
491 INPUT_PORTS_END
492 
493 
494 static INPUT_PORTS_START( asterock )
495 	PORT_INCLUDE( asteroid )
496 
497 	PORT_MODIFY("IN0")
498 	// Bit 0 is VG_HALT and Bit 2 is the 3 KHz source
499 	PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_CUSTOM ) PORT_READ_LINE_DEVICE_MEMBER("dvg", dvg_device, done_r)
500 	PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNKNOWN )
501 	PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_READ_LINE_MEMBER(asteroid_state, clock_r)
502 	PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON5 ) PORT_CODE(KEYCODE_SPACE) PORT_CODE(JOYCODE_BUTTON3)        // Hyperspace
503 	PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_CODE(KEYCODE_LCONTROL) PORT_CODE(JOYCODE_BUTTON1)     // Fire
504 	PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_SERVICE1 ) PORT_NAME("Diagnostic Step")
505 	PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_TILT )
506 	PORT_SERVICE( 0x80, IP_ACTIVE_LOW )
507 
508 	PORT_MODIFY("DSW1")
509 	PORT_DIPNAME( 0x03, 0x03, DEF_STR( Language ) )                 PORT_DIPLOCATION("SW:1,2")
510 	PORT_DIPSETTING(    0x00, DEF_STR( English ) )
511 	PORT_DIPSETTING(    0x01, DEF_STR( French ) )
512 	PORT_DIPSETTING(    0x02, DEF_STR( German ) )
513 	PORT_DIPSETTING(    0x03, DEF_STR( Italian ) )
514 	PORT_DIPNAME( 0x0c, 0x04, DEF_STR( Lives ) )                    PORT_DIPLOCATION("SW:3,4")
515 	PORT_DIPSETTING(    0x00, "2" )
516 	PORT_DIPSETTING(    0x04, "3" )
517 	PORT_DIPSETTING(    0x08, "4" )
518 	PORT_DIPSETTING(    0x0c, "5" )
519 	PORT_DIPNAME( 0x10, 0x00, "Records Table" )                     PORT_DIPLOCATION("SW:5")
520 	PORT_DIPSETTING(    0x00, DEF_STR( Normal ) )
521 	PORT_DIPSETTING(    0x10, "Special" )
522 	PORT_DIPNAME( 0x20, 0x00, "Coin Mode" )                         PORT_DIPLOCATION("SW:6")
523 	PORT_DIPSETTING (   0x00, DEF_STR( Normal ) )
524 	PORT_DIPSETTING (   0x20, "Special" )
525 	PORT_DIPNAME( 0xc0, 0x80, DEF_STR( Coinage ) )                  PORT_DIPLOCATION("SW:7,8")
526 	PORT_DIPSETTING (   0xc0, DEF_STR( 2C_1C ) )                    PORT_CONDITION("DSW1",0x20,EQUALS,0x00)
527 	PORT_DIPSETTING (   0x80, DEF_STR( 1C_1C ) )                    PORT_CONDITION("DSW1",0x20,EQUALS,0x00)
528 	PORT_DIPSETTING (   0x40, DEF_STR( 1C_2C ) )                    PORT_CONDITION("DSW1",0x20,EQUALS,0x00)
529 //  PORT_DIPSETTING (   0x00, DEF_STR( 1C_1C ) )                    PORT_CONDITION("DSW1",0x20,EQUALS,0x00)
530 	PORT_DIPSETTING (   0xc0, "Coin A 2/1 Coin B 2/1 Coin C 1/1" )  PORT_CONDITION("DSW1",0x20,NOTEQUALS,0x00)
531 	PORT_DIPSETTING (   0x80, "Coin A 1/1 Coin B 1/1 Coin C 1/2" )  PORT_CONDITION("DSW1",0x20,NOTEQUALS,0x00)
532 	PORT_DIPSETTING (   0x40, "Coin A 1/2 Coin B 1/2 Coin C 1/4" )  PORT_CONDITION("DSW1",0x20,NOTEQUALS,0x00)
533 //  PORT_DIPSETTING (   0x00, "Coin A 1/1 Coin B 1/1 Coin C 1/2" )  PORT_CONDITION("DSW1",0x20,NOTEQUALS,0x00)
534 INPUT_PORTS_END
535 
536 
537 static INPUT_PORTS_START( astdelux )
538 	PORT_START("IN0")
539 	PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) // According to schematics
540 	// Bit 2 is the 3 KHz source and Bit 3 the VG_HALT bit
541 	PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_READ_LINE_MEMBER(asteroid_state, clock_r)
542 	PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_CUSTOM ) PORT_READ_LINE_DEVICE_MEMBER("dvg", dvg_device, done_r)
543 	PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON5 ) PORT_CODE(KEYCODE_SPACE) PORT_CODE(JOYCODE_BUTTON3)       // Hyperspace
544 	PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_CODE(KEYCODE_LCONTROL) PORT_CODE(JOYCODE_BUTTON1)    // Fire
545 	PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_NAME("Diagnostic Step")
546 	PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_TILT )
547 	PORT_SERVICE( 0x80, IP_ACTIVE_HIGH )
548 
549 	PORT_START("IN1")
550 	PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_COIN1 ) // Coin Left
551 	PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_COIN2 ) // Coin Center
552 	PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_COIN3 ) // Coin Right
553 	PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START1 )
554 	PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_START2 )
555 	PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_CODE(KEYCODE_LALT) PORT_CODE(JOYCODE_BUTTON2)        // Thrust
556 	PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CODE(KEYCODE_RIGHT) PORT_CODE(JOYCODE_X_RIGHT_SWITCH)// Right
557 	PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CODE(KEYCODE_LEFT) PORT_CODE(JOYCODE_X_LEFT_SWITCH)  // Left
558 
559 	PORT_START("DSW1")
560 	PORT_DIPNAME( 0x03, 0x00, DEF_STR( Language ) )     PORT_DIPLOCATION("R5:1,2")
561 	PORT_DIPSETTING (   0x00, DEF_STR( English ) )
562 	PORT_DIPSETTING (   0x01, DEF_STR( German ) )
563 	PORT_DIPSETTING (   0x02, DEF_STR( French ) )
564 	PORT_DIPSETTING (   0x03, DEF_STR( Spanish ) )
565 	/*  Default lives is 2,3,4,5. Values incremented by 1 if Bonus Life set to None or Coinage set to 2C_1C.
566 	    Incremented by 2 if both are set at the same time. PORT_CONDITION() can only test for 1 switch at a time. */
567 	PORT_DIPNAME( 0x0c, 0x00, DEF_STR( Lives ) )        PORT_DIPLOCATION("R5:3,4") // Default is 2 or 3 depending on manual version
568 	PORT_DIPSETTING (   0x00, "2-4" )
569 	PORT_DIPSETTING (   0x04, "3-5" )
570 	PORT_DIPSETTING (   0x08, "4-6" )
571 	PORT_DIPSETTING (   0x0c, "5-7" )
572 	PORT_DIPNAME( 0x10, 0x00, "Minimum Plays" )         PORT_DIPLOCATION("R5:5")
573 	PORT_DIPSETTING (   0x00, "1" )
574 	PORT_DIPSETTING (   0x10, "2" )
575 	PORT_DIPNAME( 0x20, 0x00, DEF_STR( Difficulty ) )   PORT_DIPLOCATION("R5:6") // Listed as "Unused" for pre Revision 03 versions
576 	PORT_DIPSETTING (   0x20, DEF_STR( Hard ) )
577 	PORT_DIPSETTING (   0x00, DEF_STR( Easy ) )
578 	PORT_DIPNAME( 0xc0, 0x00, DEF_STR( Bonus_Life ) )   PORT_DIPLOCATION("R5:7,8")
579 	PORT_DIPSETTING (   0x00, "10000" )
580 	PORT_DIPSETTING (   0x40, "12000" )
581 	PORT_DIPSETTING (   0x80, "15000" )
582 	PORT_DIPSETTING (   0xc0, DEF_STR( None ) )
583 
584 	PORT_START("DSW2")
585 	PORT_DIPNAME( 0x03, 0x01, DEF_STR( Coinage ) )      PORT_DIPLOCATION("L8:1,2")
586 	PORT_DIPSETTING (   0x00, DEF_STR( 2C_1C ) )
587 	PORT_DIPSETTING (   0x01, DEF_STR( 1C_1C ) )
588 	PORT_DIPSETTING (   0x02, DEF_STR( 1C_2C ) )
589 	PORT_DIPSETTING (   0x03, DEF_STR( Free_Play ) )
590 	PORT_DIPNAME( 0x0c, 0x0c, "Right Coin" )            PORT_DIPLOCATION("L8:3,4")
591 	PORT_DIPSETTING (   0x00, "X 6" )
592 	PORT_DIPSETTING (   0x04, "X 5" )
593 	PORT_DIPSETTING (   0x08, "X 4" )
594 	PORT_DIPSETTING (   0x0c, "X 1" )
595 	PORT_DIPNAME( 0x10, 0x10, "Center Coin" )           PORT_DIPLOCATION("L8:5") // "Left Coin" in a 2-mech door
596 	PORT_DIPSETTING (   0x00, "X 2" )
597 	PORT_DIPSETTING (   0x10, "X 1" )
598 	PORT_DIPNAME( 0xe0, 0xe0, "Bonus Coins" )           PORT_DIPLOCATION("L8:6,7,8")
599 	PORT_DIPSETTING (   0x60, "1 Coin Each 5 Coins" )
600 	PORT_DIPSETTING (   0x80, "2 Coins Each 4 Coins" )
601 	PORT_DIPSETTING (   0xa0, "1 Coin Each 4 Coins" )
602 	PORT_DIPSETTING (   0xc0, "1 Coin Each 2 Coins" )
603 	PORT_DIPSETTING (   0xe0, DEF_STR( None ) )
604 
605 	// The manual includes a 3rd DIP controlling the number & configuration of coin counters, defined as:
606 #if 0
607 	PORT_START("DSW3")                                  // 4-Toggle switch located on game PCB at M12
608 	PORT_DIPNAME( 0x03, 0x00, "Coin Counters" )             PORT_DIPLOCATION("M12:1,2")
609 	PORT_DIPSETTING (   0x00, "1=Left, Center & Right" )    // "For games having these coin doors: Thai 1Baht/1Baht, German 1DM/1DM, US 25c/25c,
610 															// Belgian or French 5Fr/5Fr, Swiss or French 1Fr/1Fr, US 25c/25c/25c,
611 															// Japanese 100Y/100Y, Swedish 1Kr/1Kr, UK 10P/10P, Australian 20c/20c, or Italian 100L/100L."
612 	PORT_DIPSETTING (   0x01, "1=Left & Center, 2=Right" )  // "For games having these coin doors: German 2DM/1DM, German 1DM/5DM, US 25c/25c/1$, or US 25c/1$."
613 	PORT_DIPSETTING (   0x02, "1=Left, 2=Center & Right" )  // "No coin door is currently designed for this configuration."
614 	PORT_DIPSETTING (   0x03, "1=Left, 2=Center, 3=Right" ) // "For games having these coin doors: German 1DM/2DM/5DM."
615 	PORT_DIPUNUSED_DIPLOC( 0x04, 0x04, "M12:3" )            // Listed as "Unused"
616 	PORT_DIPUNUSED_DIPLOC( 0x08, 0x08, "M12:4" )            // Listed as "Unused"
617 #endif
618 
619 	PORT_START("COCKTAIL")
620 	PORT_CONFNAME(1, 0, DEF_STR(Cabinet))
621 	PORT_CONFSETTING(0, DEF_STR(Upright))
622 	PORT_CONFSETTING(1, DEF_STR(Cocktail))
623 INPUT_PORTS_END
624 
625 
626 static INPUT_PORTS_START( llander )
627 	PORT_START("IN0")
628 	// Bit 0 is VG_HALT
629 	PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_READ_LINE_DEVICE_MEMBER("dvg", dvg_device, done_r)
630 	PORT_SERVICE( 0x02, IP_ACTIVE_LOW )
631 	PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_TILT )
632 	// Of the rest, Bit 6 is the 3KHz source. 3,4 and 5 are unknown
633 	PORT_BIT( 0x38, IP_ACTIVE_LOW, IPT_UNKNOWN )
634 	PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_READ_LINE_MEMBER(asteroid_state, clock_r)
635 	PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_SERVICE1 ) PORT_NAME("Diagnostic Step")
636 
637 	PORT_START("IN1")
638 	PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_START1 )
639 	PORT_BIT( 0x02, IP_ACTIVE_LOW,  IPT_COIN1 )
640 	PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_COIN2 )
641 	PORT_BIT( 0x08, IP_ACTIVE_LOW,  IPT_COIN3 )
642 	PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_START2 )  PORT_NAME("Select Game")
643 	PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("Abort")
644 	PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CODE(KEYCODE_RIGHT) PORT_CODE(JOYCODE_X_RIGHT_SWITCH)    // Right
645 	PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CODE(KEYCODE_LEFT) PORT_CODE(JOYCODE_X_LEFT_SWITCH)      // Left
646 
647 	PORT_START("DSW1")
648 	PORT_DIPNAME( 0x03, 0x00, "Right Coin" )            PORT_DIPLOCATION("P8:1,2") // "Left Coin Mech always registers X 1"
649 	PORT_DIPSETTING (   0x00, "X 1" )
650 	PORT_DIPSETTING (   0x01, "X 4" )
651 	PORT_DIPSETTING (   0x02, "X 5" )
652 	PORT_DIPSETTING (   0x03, "X 6" )
653 	PORT_DIPNAME( 0x0c, 0x00, DEF_STR( Language ) )     PORT_DIPLOCATION("P8:3,4")
654 	PORT_DIPSETTING (   0x00, DEF_STR( English ) )
655 	PORT_DIPSETTING (   0x04, DEF_STR( French ) )
656 	PORT_DIPSETTING (   0x08, DEF_STR( Spanish ) )
657 	PORT_DIPSETTING (   0x0c, DEF_STR( German ) )
658 	PORT_DIPNAME( 0x20, 0x00, DEF_STR( Coinage ) )      PORT_DIPLOCATION("P8:6")
659 	PORT_DIPSETTING (   0x00, DEF_STR( Normal ) )
660 	PORT_DIPSETTING (   0x20, DEF_STR( Free_Play ) )
661 	PORT_DIPNAME( 0xd0, 0x80, "Fuel Units Per Coin" )   PORT_DIPLOCATION("P8:5,7,8")
662 	PORT_DIPSETTING (   0x00, "450" )
663 	PORT_DIPSETTING (   0x40, "600" )
664 	PORT_DIPSETTING (   0x80, "750" )
665 	PORT_DIPSETTING (   0xc0, "900" )
666 	PORT_DIPSETTING (   0x10, "1100" )
667 	PORT_DIPSETTING (   0x50, "1300" )
668 	PORT_DIPSETTING (   0x90, "1550" )
669 	PORT_DIPSETTING (   0xd0, "1800" )
670 
671 	/* The next one is a potentiometer */
672 	/* The way the DAC/counter circuit always tries to self center at the voltage derived from the thrust control, */
673 	/* I don't think it ever expected to get to 0xff. We can not emulate the external DAC circuit exactly, */
674 	/* so changing the range to 0xfe seems to solve the problem. */
675 	/* The thrust control is basically a hand operated pedal. */
676 	/* so IPT_PEDAL is used because it more accurately emulates the control then using IPT_PADDLE */
677 	PORT_START("THRUST")
678 	PORT_BIT( 0xff, 0x00, IPT_PEDAL ) PORT_MINMAX(0,254) PORT_SENSITIVITY(100) PORT_KEYDELTA(10)
679 INPUT_PORTS_END
680 
681 
682 static INPUT_PORTS_START( llander1 )
683 	PORT_INCLUDE( llander )
684 
685 	PORT_MODIFY("DSW1")
686 	PORT_DIPNAME( 0x10, 0x00, DEF_STR( Coinage ) )      PORT_DIPLOCATION("P8:5") // "Left Coin Mech always registers X 1"
687 	PORT_DIPSETTING (   0x00, DEF_STR( Normal ) )
688 	PORT_DIPSETTING (   0x10, DEF_STR( Free_Play ) )
689 	PORT_DIPUNUSED_DIPLOC( 0x20, 0x20, "P8:6" )         // Listed as "Unused"
690 	PORT_DIPNAME( 0xc0, 0x80, "Fuel units" )            PORT_DIPLOCATION("P8:7,8")
691 	PORT_DIPSETTING (   0x00, "450" )
692 	PORT_DIPSETTING (   0x40, "600" )
693 	PORT_DIPSETTING (   0x80, "750" )
694 	PORT_DIPSETTING (   0xc0, "900" )
695 INPUT_PORTS_END
696 
697 
698 static INPUT_PORTS_START( llandert )
699 	PORT_START("IN0")
700 	PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNUSED )
701 
702 	PORT_START("IN1")
703 	PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNUSED )
704 
705 	PORT_START("DSW1")
706 	PORT_DIPUNKNOWN_DIPLOC( 0x01, 0x00, "P8:1" ) // lock up
707 	PORT_DIPUNKNOWN_DIPLOC( 0x02, 0x00, "P8:2" ) // lock up
708 	PORT_DIPUNKNOWN_DIPLOC( 0x08, 0x00, "P8:4" ) // lock up
709 	PORT_DIPNAME( 0x24, 0x00, "Parameter 1" )   PORT_DIPLOCATION("P8:3,6")
710 	PORT_DIPSETTING (   0x00, "0" )
711 	PORT_DIPSETTING (   0x04, "1" )
712 	PORT_DIPSETTING (   0x20, "2" )
713 	PORT_DIPSETTING (   0x24, "Invalid" )
714 	PORT_DIPNAME( 0xd0, 0x40, "Parameter 2" )   PORT_DIPLOCATION("P8:5,7,8")
715 	PORT_DIPSETTING (   0x00, "0" )
716 	PORT_DIPSETTING (   0x40, "1" )
717 	PORT_DIPSETTING (   0x80, "2" )
718 	PORT_DIPSETTING (   0xc0, "3" )
719 	PORT_DIPSETTING (   0x10, "4" )
720 	PORT_DIPSETTING (   0x50, "5" )
721 	PORT_DIPSETTING (   0x90, "6" )
722 	PORT_DIPSETTING (   0xd0, "7" )
723 
724 	PORT_START("THRUST")
725 	PORT_BIT( 0xff, IP_ACTIVE_HIGH, IPT_UNUSED )
726 INPUT_PORTS_END
727 
728 
729 /*************************************
730  *
731  *  Machine drivers
732  *
733  *************************************/
734 
735 void asteroid_state::asteroid_base(machine_config &config)
736 {
737 	// Basic machine hardware
738 	M6502(config, m_maincpu, MASTER_CLOCK/8);
739 	m_maincpu->set_addrmap(AS_PROGRAM, &asteroid_state::asteroid_map);
740 	m_maincpu->set_periodic_int(FUNC(asteroid_state::asteroid_interrupt), attotime::from_hz(CLOCK_3KHZ/12));
741 
742 	WATCHDOG_TIMER(config, "watchdog");
743 
744 	TTL153(config, m_dsw_sel);
745 
746 	output_latch_device &outlatch(OUTPUT_LATCH(config, "outlatch")); // LS174 at N11
747 	outlatch.bit_handler<0>().set_output("led1").invert(); // 2 PLYR START LAMP
748 	outlatch.bit_handler<1>().set_output("led0").invert(); // 1 PLYR START LAMP
749 	outlatch.bit_handler<2>().set_membank("ram1"); // RAMSEL
750 	outlatch.bit_handler<2>().append_membank("ram2");
751 	outlatch.bit_handler<2>().append(FUNC(asteroid_state::cocktail_inv_w));
752 	outlatch.bit_handler<3>().set(FUNC(asteroid_state::coin_counter_left_w)); // COIN CNTRL
753 	outlatch.bit_handler<4>().set(FUNC(asteroid_state::coin_counter_center_w)); // COIN CNTRC
754 	outlatch.bit_handler<5>().set(FUNC(asteroid_state::coin_counter_right_w)); // COIN CNTRR
755 
756 	// Video hardware
757 	VECTOR(config, "vector");
758 	screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_VECTOR));
759 	screen.set_refresh_hz(CLOCK_3KHZ/12/4);
760 	screen.set_size(400,300);
761 	screen.set_visarea(522, 1566, 394, 1182);
762 	screen.set_screen_update("vector", FUNC(vector_device::screen_update));
763 
764 	DVG(config, m_dvg, 0);
765 	m_dvg->set_vector_tag("vector");
766 }
767 
asteroid(machine_config & config)768 void asteroid_state::asteroid(machine_config &config)
769 {
770 	asteroid_base(config);
771 
772 	// Sound hardware
773 	asteroid_sound(config);
774 }
775 
asterock(machine_config & config)776 void asteroid_state::asterock(machine_config &config)
777 {
778 	asteroid(config);
779 
780 	// Basic machine hardware
781 	m_maincpu->set_periodic_int(FUNC(asteroid_state::asterock_interrupt), attotime::from_hz(CLOCK_3KHZ/12));
782 }
783 
astdelux(machine_config & config)784 void asteroid_state::astdelux(machine_config &config)
785 {
786 	asteroid_base(config);
787 
788 	// Basic machine hardware
789 	m_maincpu->set_addrmap(AS_PROGRAM, &asteroid_state::astdelux_map);
790 
791 	ER2055(config, m_earom);
792 
793 	// Sound hardware
794 	astdelux_sound(config);
795 
796 	pokey_device &pokey(POKEY(config, "pokey", MASTER_CLOCK/8));
797 	pokey.allpot_r().set_ioport("DSW2");
798 	pokey.set_output_rc(RES_K(10), CAP_U(0.015), 5.0);
799 	pokey.add_route(ALL_OUTPUTS, "mono", 1.0);
800 
801 	config.device_remove("outlatch");
802 
803 	ls259_device &audiolatch(*subdevice<ls259_device>("audiolatch"));
804 	audiolatch.q_out_cb<0>().set_output("led0").invert(); // START1
805 	audiolatch.q_out_cb<1>().set_output("led1").invert(); // START2
806 	audiolatch.q_out_cb<4>().set_membank("ram1"); // RAMSEL
807 	audiolatch.q_out_cb<4>().append_membank("ram2");
808 	audiolatch.q_out_cb<4>().append(FUNC(asteroid_state::cocktail_inv_w));
809 	audiolatch.q_out_cb<5>().set(FUNC(asteroid_state::coin_counter_left_w)); // LEFT COIN
810 	audiolatch.q_out_cb<6>().set(FUNC(asteroid_state::coin_counter_center_w)); // CENTER COIN
811 	audiolatch.q_out_cb<7>().set(FUNC(asteroid_state::coin_counter_right_w)); // RIGHT COIN
812 }
813 
814 
llander(machine_config & config)815 void asteroid_state::llander(machine_config &config)
816 {
817 	asteroid_base(config);
818 
819 	// Basic machine hardware
820 	m_maincpu->set_addrmap(AS_PROGRAM, &asteroid_state::llander_map);
821 	m_maincpu->set_periodic_int(FUNC(asteroid_state::llander_interrupt), attotime::from_hz(MASTER_CLOCK/4096/12));
822 
823 	screen_device &screen(*subdevice<screen_device>("screen"));
824 	screen.set_refresh_hz(CLOCK_3KHZ/12/6);
825 	screen.set_visarea(522, 1566, 270, 1070);
826 	screen.set_screen_update("vector", FUNC(vector_device::screen_update));
827 
828 	output_latch_device &outlatch(*subdevice<output_latch_device>("outlatch")); // LS174 at N11
829 	outlatch.bit_handler<0>().set_output("lamp4"); // LAMP5 (COMMAND MISSION)
830 	outlatch.bit_handler<1>().set_output("lamp3"); // LAMP4 (PRIME MISSION)
831 	outlatch.bit_handler<2>().set_output("lamp2"); // LAMP3 (CADET MISSION)
832 	outlatch.bit_handler<3>().set_output("lamp1"); // LAMP2 (TRAINING MISSION)
833 	outlatch.bit_handler<4>().set_output("lamp0"); // START/SELECT LEDs
834 	outlatch.bit_handler<5>().set_nop();
835 
836 	// Sound hardware
837 	llander_sound(config);
838 }
839 
840 
841 
842 /*************************************
843  *
844  *  ROM definitions
845  *
846  *************************************/
847 
848 ROM_START( asteroid )
849 	ROM_REGION( 0x8000, "maincpu", 0 )
CRC(b503eaf7)850 	ROM_LOAD( "035145-04e.ef2", 0x6800, 0x0800, CRC(b503eaf7) SHA1(5369dcfe01c0b9e48b15a96a0de8d23ee8ef9145) )
851 	ROM_LOAD( "035144-04e.h2",  0x7000, 0x0800, CRC(25233192) SHA1(51b2865fa897cdaa84ac6500c4b4833a80827019) )
852 	ROM_LOAD( "035143-02.j2",   0x7800, 0x0800, CRC(312caa02) SHA1(1ce2eac1ab90b972e3f1fc3d250908f26328d6cb) )
853 	// Vector ROM
854 	ROM_LOAD( "035127-02.np3",  0x5000, 0x0800, CRC(8b71fd9e) SHA1(8cd5005e531eafa361d6b7e9eed159d164776c70) )
855 
856 	// DVG PROM
857 	ROM_REGION( 0x100, "dvg:prom", 0 )
858 	ROM_LOAD( "034602-01.c8",   0x0000, 0x0100, CRC(97953db8) SHA1(8cbded64d1dd35b18c4d5cece00f77e7b2cab2ad) )
859 ROM_END
860 
861 ROM_START( asteroid2 )
862 	ROM_REGION( 0x8000, "maincpu", 0 )
863 	ROM_LOAD( "035145-02.ef2",  0x6800, 0x0800, CRC(0cc75459) SHA1(2af85c9689b878155004da47fedbde5853a18723) )
864 	ROM_LOAD( "035144-02.h2",   0x7000, 0x0800, CRC(096ed35c) SHA1(064d680ded7f30c543f93ae5ca85f90d550f73e5) )
865 	ROM_LOAD( "035143-02.j2",   0x7800, 0x0800, CRC(312caa02) SHA1(1ce2eac1ab90b972e3f1fc3d250908f26328d6cb) )
866 	// Vector ROM
867 	ROM_LOAD( "035127-02.np3",  0x5000, 0x0800, CRC(8b71fd9e) SHA1(8cd5005e531eafa361d6b7e9eed159d164776c70) )
868 
869 	// DVG PROM
870 	ROM_REGION( 0x100, "dvg:prom", 0 )
871 	ROM_LOAD( "034602-01.c8",   0x0000, 0x0100, CRC(97953db8) SHA1(8cbded64d1dd35b18c4d5cece00f77e7b2cab2ad) )
872 ROM_END
873 
874 ROM_START( asteroid1 )
875 	ROM_REGION( 0x8000, "maincpu", 0 )
876 	ROM_LOAD( "035145-01.ef2",  0x6800, 0x0800, CRC(e9bfda64) SHA1(291dc567ebb31b35df83d9fb87f4080f251ff9c8) )
877 	ROM_LOAD( "035144-01.h2",   0x7000, 0x0800, CRC(e53c28a9) SHA1(d9f081e73511ec43377f0c6457747f15a470d4dc) )
878 	ROM_LOAD( "035143-01.j2",   0x7800, 0x0800, CRC(7d4e3d05) SHA1(d88000e904e158efde50e453e2889ecd2cb95f24) )
879 	// Vector ROM
880 	ROM_LOAD( "035127-01.np3",  0x5000, 0x0800, CRC(99699366) SHA1(9b2828fc1cef7727f65fa65e1e11e309b7c98792) )
881 
882 	// DVG PROM
883 	ROM_REGION( 0x100, "dvg:prom", 0 )
884 	ROM_LOAD( "034602-01.c8",   0x0000, 0x0100, CRC(97953db8) SHA1(8cbded64d1dd35b18c4d5cece00f77e7b2cab2ad) )
885 ROM_END
886 
887 ROM_START( asteroidb )
888 	ROM_REGION( 0x8000, "maincpu", 0 )
889 	ROM_LOAD( "035145ll.de1",  0x6800, 0x0800, CRC(605fc0f2) SHA1(8d897a3b75bd1f2537470f0a34a97a8c0853ee08) )
890 	ROM_LOAD( "035144ll.c1",   0x7000, 0x0800, CRC(e106de77) SHA1(003e99d095bd4df6fae243ea1dd5b12f3eb974f1) )
891 	ROM_LOAD( "035143ll.b1",   0x7800, 0x0800, CRC(6b1d8594) SHA1(ff3cd93f1bc5734bface285e442125b395602d7d) )
892 	// Vector ROM
893 	ROM_LOAD( "035127-02.np3",  0x5000, 0x0800, CRC(8b71fd9e) SHA1(8cd5005e531eafa361d6b7e9eed159d164776c70) )
894 
895 	// DVG PROM
896 	ROM_REGION( 0x100, "dvg:prom", 0 )
897 	ROM_LOAD( "034602-01.c8",  0x0000, 0x0100, CRC(97953db8) SHA1(8cbded64d1dd35b18c4d5cece00f77e7b2cab2ad) )
898 ROM_END
899 
900 /*  Space Rocks (J.Estevez, Barcelona).
901     Seems to be a legit spanish set, since there are documented cabs
902     registered in Spain.
903 */
904 ROM_START( spcrocks )
905 	ROM_REGION( 0x8000, "maincpu", 0 )
906 	ROM_LOAD( "1.bin", 0x6800, 0x0800, CRC(0cc75459) SHA1(2af85c9689b878155004da47fedbde5853a18723) )
907 	ROM_LOAD( "2.bin", 0x7000, 0x0800, CRC(096ed35c) SHA1(064d680ded7f30c543f93ae5ca85f90d550f73e5) )
908 	ROM_LOAD( "3.bin", 0x7800, 0x0800, CRC(b912754d) SHA1(d4ada3e162ff454a48468f6309947276df0c5331) )
909 	// Vector ROM
910 	ROM_LOAD( "e.bin",  0x5000, 0x0800, CRC(148ef465) SHA1(4b1158112364bc55b8aab4127949f9238c36b238) )
911 
912 	// DVG PROM
913 	ROM_REGION( 0x100, "dvg:prom", 0 )
914 	ROM_LOAD( "034602-01.c8",  0x0000, 0x0100, BAD_DUMP CRC(97953db8) SHA1(8cbded64d1dd35b18c4d5cece00f77e7b2cab2ad) ) // still undumped.
915 ROM_END
916 
917 ROM_START( aerolitos )
918 	ROM_REGION( 0x8000, "maincpu", 0 )
919 	ROM_LOAD( "2516_1e.bin", 0x6800, 0x0800, CRC(0cc75459) SHA1(2af85c9689b878155004da47fedbde5853a18723) )
920 	ROM_LOAD( "2516_1d.bin", 0x7000, 0x0800, CRC(096ed35c) SHA1(064d680ded7f30c543f93ae5ca85f90d550f73e5) )
921 	ROM_LOAD( "2516_1c.bin", 0x7800, 0x0800, CRC(b912754d) SHA1(d4ada3e162ff454a48468f6309947276df0c5331) )
922 	// Vector ROM
923 	ROM_LOAD( "2716_3n.bin", 0x5000, 0x0800, CRC(32e69e66) SHA1(a4cce36bc781443b430003280ef4185a4a04de96) )
924 
925 	// DVG PROM
926 	ROM_REGION( 0x100, "dvg:prom", 0 )
927 	ROM_LOAD( "034602-01.c8",   0x0000, 0x0100, CRC(97953db8) SHA1(8cbded64d1dd35b18c4d5cece00f77e7b2cab2ad) )
928 ROM_END
929 
930 ROM_START( asterock )
931 	ROM_REGION( 0x8000, "maincpu", 0 )
932 	ROM_LOAD( "10505.2",       0x6800, 0x0400, CRC(cdf720c6) SHA1(85fe748096478e28a06bd98ff3aad73ab21b22a4) )
933 	ROM_LOAD( "10505.3",       0x6c00, 0x0400, CRC(ee58bdf0) SHA1(80094cb5dafd327aff6658ede33106f0493a809d) )
934 	ROM_LOAD( "10505.4",       0x7000, 0x0400, CRC(8d3e421e) SHA1(5f5719ab84d4755e69bef205d313b455bc59c413) )
935 	ROM_LOAD( "10505.5",       0x7400, 0x0400, CRC(d2ce7672) SHA1(b6012e09b2439a614a55bcf23be0692c42830e21) )
936 	ROM_LOAD( "10505.6",       0x7800, 0x0400, CRC(74103c87) SHA1(e568b5ac573a6d0474cf672b3c62abfbd3320799) )
937 	ROM_LOAD( "10505.7",       0x7c00, 0x0400, CRC(75a39768) SHA1(bf22998fd692fb01964d8894e421435c55d746a0) )
938 	// Vector ROM
939 	ROM_LOAD( "10505.0",       0x5000, 0x0400, CRC(6bd2053f) SHA1(790f2858f44bbb1854e2d9d549e29f4815c4665b) )
940 	ROM_LOAD( "10505.1",       0x5400, 0x0400, CRC(231ce201) SHA1(710f4c19864d725ba1c9ea447a97e84001a679f7) )
941 
942 	// DVG PROM
943 	ROM_REGION( 0x100, "dvg:prom", 0 )
944 	ROM_LOAD( "034602-01.c8",  0x0000, 0x0100, CRC(97953db8) SHA1(8cbded64d1dd35b18c4d5cece00f77e7b2cab2ad) )
945 ROM_END
946 
947 ROM_START( asterockv )
948 	ROM_REGION( 0x8000, "maincpu", 0 )
949 	ROM_LOAD( "10505.2",       0x6800, 0x0400, CRC(cdf720c6) SHA1(85fe748096478e28a06bd98ff3aad73ab21b22a4) )
950 	ROM_LOAD( "10505.3",       0x6c00, 0x0400, CRC(ee58bdf0) SHA1(80094cb5dafd327aff6658ede33106f0493a809d) )
951 	ROM_LOAD( "10505.4",       0x7000, 0x0400, CRC(8d3e421e) SHA1(5f5719ab84d4755e69bef205d313b455bc59c413) )
952 	ROM_LOAD( "10505.5",       0x7400, 0x0400, CRC(d2ce7672) SHA1(b6012e09b2439a614a55bcf23be0692c42830e21) )
953 	ROM_LOAD( "10505.6",       0x7800, 0x0400, CRC(74103c87) SHA1(e568b5ac573a6d0474cf672b3c62abfbd3320799) )
954 	ROM_LOAD( "10505.7",       0x7c00, 0x0400, CRC(75a39768) SHA1(bf22998fd692fb01964d8894e421435c55d746a0) )
955 	// Vector ROM
956 	ROM_LOAD( "videotronas.0", 0x5000, 0x0400, CRC(d1ac90b5) SHA1(7209027d2099c75c6336605ae80491ffc5673674) ) // only this rom differs from Sidam's Asterock
957 	ROM_LOAD( "10505.1",       0x5400, 0x0400, CRC(231ce201) SHA1(710f4c19864d725ba1c9ea447a97e84001a679f7) )
958 
959 	// DVG PROM
960 	ROM_REGION( 0x100, "dvg:prom", 0 )
961 	ROM_LOAD( "034602-01.c8",  0x0000, 0x0100, CRC(97953db8) SHA1(8cbded64d1dd35b18c4d5cece00f77e7b2cab2ad) )
962 ROM_END
963 
964 ROM_START( meteorite )
965 	ROM_REGION( 0x8000, "maincpu", 0 )
966 	ROM_LOAD( "2",       0x6800, 0x0400, CRC(cdf720c6) SHA1(85fe748096478e28a06bd98ff3aad73ab21b22a4) )
967 	ROM_LOAD( "3",       0x6c00, 0x0400, CRC(ee58bdf0) SHA1(80094cb5dafd327aff6658ede33106f0493a809d) )
968 	ROM_LOAD( "4",       0x7000, 0x0400, CRC(8d3e421e) SHA1(5f5719ab84d4755e69bef205d313b455bc59c413) )
969 	ROM_LOAD( "5",       0x7400, 0x0400, CRC(d2ce7672) SHA1(b6012e09b2439a614a55bcf23be0692c42830e21) )
970 	ROM_LOAD( "6",       0x7800, 0x0400, CRC(379072ed) SHA1(1ea788f58490f6d0aa6fda1374e33aa25fa343c6) )
971 	ROM_LOAD( "7",       0x7c00, 0x0400, CRC(75a39768) SHA1(bf22998fd692fb01964d8894e421435c55d746a0) )
972 	// Vector ROM
973 	ROM_LOAD( "0",       0x5000, 0x0400, CRC(7a3ff3ac) SHA1(11dc452d2804bbaa7cee4dff85a2ab02e6f2c3a9) )
974 	ROM_LOAD( "1",       0x5400, 0x0400, CRC(d62b2887) SHA1(8832953c7166d2f0ed1067c43ebf369db4a4aa70) )
975 
976 	// DVG PROM
977 	ROM_REGION( 0x100, "dvg:prom", 0 )
978 	ROM_LOAD( "meteorites_bprom.bin",  0x0000, 0x0100, CRC(97953db8) SHA1(8cbded64d1dd35b18c4d5cece00f77e7b2cab2ad) )
979 ROM_END
980 
981 ROM_START( meteorts )
982 	ROM_REGION( 0x8000, "maincpu", 0 )
983 	ROM_LOAD( "m0_c1.bin",    0x6800, 0x0800, CRC(dff88688) SHA1(7f4148a580fb6f605499c99e7dde7068eca1651a) )
984 	ROM_LOAD( "m1_f1.bin",    0x7000, 0x0800, CRC(e53c28a9) SHA1(d9f081e73511ec43377f0c6457747f15a470d4dc) )
985 	ROM_LOAD( "m2_j1.bin",    0x7800, 0x0800, CRC(64bd0408) SHA1(141d053cb4cce3fece98293136928b527d3ade0f) )
986 	// Vector ROM
987 	ROM_LOAD( "mv_np3.bin",   0x5000, 0x0800, CRC(11d1c4ae) SHA1(433c2c05b92094bbe102c356d7f1a907db13da67) )
988 
989 	// DVG PROM
990 	ROM_REGION( 0x100, "dvg:prom", 0 )
991 	ROM_LOAD( "034602-01.c8",    0x0000, 0x0100, CRC(97953db8) SHA1(8cbded64d1dd35b18c4d5cece00f77e7b2cab2ad) )
992 ROM_END
993 
994 ROM_START( meteorho )
995 	ROM_REGION( 0x8000, "maincpu", 0 )
996 	ROM_LOAD( "g.bin",    0x6800, 0x0400, CRC(7420421b) SHA1(e84a340c0cbc8816bbe43120bc8e692d2a3db0ab) )
997 	ROM_LOAD( "h.bin",    0x6c00, 0x0400, CRC(a6aa56bc) SHA1(8298e1667c3bd9af9e0be7d53c00d73ef59d742e) )
998 	ROM_LOAD( "f.bin",    0x7000, 0x0400, CRC(2711bd52) SHA1(219499b9b8dcc221173f9b9a34c9e6f2fb936231) )
999 	ROM_LOAD( "d.bin",    0x7400, 0x0400, CRC(9f169db9) SHA1(b6a4a8ea9d48c6b1faebf104faae7c67b2b060b5) )
1000 	ROM_LOAD( "c.bin",    0x7800, 0x0400, CRC(bd99556a) SHA1(8c712b205125c0c2a45dbb4fa9e5e5302c5bbd1b) )
1001 	ROM_LOAD( "e.bin",    0x7c00, 0x0400, CRC(10fdfe9a) SHA1(9db4b3ab904e66d3622ec98e13ef6baf5d4f7099) )
1002 	// Vector ROM
1003 	ROM_LOAD( "a.bin",    0x5000, 0x0400, CRC(d7822110) SHA1(bf6c5e622fdc16c39a1d8f23fc029abaa1e99b19) )
1004 	ROM_LOAD( "b.bin",    0x5400, 0x0400, CRC(d62b2887) SHA1(8832953c7166d2f0ed1067c43ebf369db4a4aa70) )
1005 
1006 	// DVG PROM
1007 	ROM_REGION( 0x100, "dvg:prom", 0 )
1008 	ROM_LOAD( "prom.bin",   0x0000, 0x0100, CRC(9e237193) SHA1(f663e12d5db0fa50ea49d03591475ae0a7168bc0) )
1009 ROM_END
1010 
1011 // The PCB was found inside a "Kasteroides" cab (a Spanish Asteriods bootleg from "Sede 3")
1012 ROM_START( meteorbl )
1013 	ROM_REGION( 0x8000, "maincpu", 0 )
1014 	ROM_LOAD( "2as.12", 0x6800, 0x0400, CRC(cdf720c6) SHA1(85fe748096478e28a06bd98ff3aad73ab21b22a4) )
1015 	ROM_LOAD( "3as.13", 0x6c00, 0x0400, CRC(ee58bdf0) SHA1(80094cb5dafd327aff6658ede33106f0493a809d) )
1016 	ROM_LOAD( "4as.14", 0x7000, 0x0400, CRC(8d3e421e) SHA1(5f5719ab84d4755e69bef205d313b455bc59c413) )
1017 	ROM_LOAD( "5as.15", 0x7400, 0x0400, CRC(d2ce7672) SHA1(b6012e09b2439a614a55bcf23be0692c42830e21) )
1018 	ROM_LOAD( "6as.16", 0x7800, 0x0400, CRC(74103c87) SHA1(e568b5ac573a6d0474cf672b3c62abfbd3320799) )
1019 	ROM_LOAD( "7as.17", 0x7c00, 0x0400, CRC(75a39768) SHA1(bf22998fd692fb01964d8894e421435c55d746a0) )
1020 	// Vector ROM
1021 	ROM_LOAD( "0as.10", 0x5000, 0x0400, CRC(dc10767a) SHA1(579951ced16d4c538eaddbc58474f9d8bf4906f3) )
1022 	ROM_LOAD( "1as.11", 0x5400, 0x0400, CRC(231ce201) SHA1(710f4c19864d725ba1c9ea447a97e84001a679f7) )
1023 
1024 	// DVG PROM
1025 	ROM_REGION( 0x100, "dvg:prom", 0 )
1026 	ROM_LOAD( "034602-01.c8",  0x0000, 0x0100, BAD_DUMP CRC(97953db8) SHA1(8cbded64d1dd35b18c4d5cece00f77e7b2cab2ad) ) // Not dumped on this set
1027 ROM_END
1028 
1029 ROM_START( hyperspc )
1030 	ROM_REGION( 0x8000, "maincpu", 0 )
1031 	ROM_LOAD( "035145-01.bin",   0x6800, 0x0800, CRC(e9bfda64) SHA1(291dc567ebb31b35df83d9fb87f4080f251ff9c8) )
1032 	ROM_LOAD( "035144-01.bin",   0x7000, 0x0800, CRC(e53c28a9) SHA1(d9f081e73511ec43377f0c6457747f15a470d4dc) )
1033 	ROM_LOAD( "035143-01.bin",   0x7800, 0x0800, CRC(7d4e3d05) SHA1(d88000e904e158efde50e453e2889ecd2cb95f24) )
1034 	// Vector ROM
1035 	ROM_LOAD( "035127-01.bin",   0x5000, 0x0800, CRC(7dec48bd) SHA1(8bc926a763ff80b101b2e1c24d45615c3daf67d5) )
1036 
1037 	// DVG PROM
1038 	ROM_REGION( 0x100, "dvg:prom", 0 )
1039 	ROM_LOAD( "034602-01.c8",   0x0000, 0x0100, CRC(97953db8) SHA1(8cbded64d1dd35b18c4d5cece00f77e7b2cab2ad) )
1040 ROM_END
1041 
1042 ROM_START( astdelux )
1043 	ROM_REGION( 0x8000, "maincpu", 0 )
1044 	ROM_LOAD( "036430-02.d1",  0x6000, 0x0800, CRC(a4d7a525) SHA1(abe262193ec8e1981be36928e9a89a8ac95cd0ad) )
1045 	ROM_LOAD( "036431-02.ef1", 0x6800, 0x0800, CRC(d4004aae) SHA1(aa2099b8fc62a79879efeea70ea1e9ed77e3e6f0) )
1046 	ROM_LOAD( "036432-02.fh1", 0x7000, 0x0800, CRC(6d720c41) SHA1(198218cd2f43f8b83e4463b1f3a8aa49da5015e4) )
1047 	ROM_LOAD( "036433-03.j1",  0x7800, 0x0800, CRC(0dcc0be6) SHA1(bf10ffb0c4870e777d6b509cbede35db8bb6b0b8) )
1048 	// Vector ROM
1049 	ROM_LOAD( "036800-02.r2",  0x4800, 0x0800, CRC(bb8cabe1) SHA1(cebaa1b91b96e8b80f2b2c17c6fd31fa9f156386) )
1050 	ROM_LOAD( "036799-01.np2", 0x5000, 0x0800, CRC(7d511572) SHA1(1956a12bccb5d3a84ce0c1cc10c6ad7f64e30b40) )
1051 
1052 	// DVG PROM
1053 	ROM_REGION( 0x100, "dvg:prom", 0 )
1054 	ROM_LOAD( "034602-01.c8",  0x0000, 0x0100, CRC(97953db8) SHA1(8cbded64d1dd35b18c4d5cece00f77e7b2cab2ad) )
1055 
1056 	ROM_REGION( 0x40, "earom", ROMREGION_ERASE00 ) // default to zero fill to suppress invalid high score display
1057 ROM_END
1058 
1059 ROM_START( astdelux2 )
1060 	ROM_REGION( 0x8000, "maincpu", 0 )
1061 	ROM_LOAD( "036430-01.d1",  0x6000, 0x0800, CRC(8f5dabc6) SHA1(5d7543e19acab99ddb63c0ffd60f54d7a0f267f5) )
1062 	ROM_LOAD( "036431-01.ef1", 0x6800, 0x0800, CRC(157a8516) SHA1(9041d8c2369d004f198681e02b59a923fa8f70c9) )
1063 	ROM_LOAD( "036432-01.fh1", 0x7000, 0x0800, CRC(fdea913c) SHA1(ded0138a20d80317d67add5bb2a64e6274e0e409) )
1064 	ROM_LOAD( "036433-02.j1",  0x7800, 0x0800, CRC(d8db74e3) SHA1(52b64e867df98d14742eb1817b59931bb7f941d9) )
1065 	// Vector ROM
1066 	ROM_LOAD( "036800-01.r2",  0x4800, 0x0800, CRC(3b597407) SHA1(344fea2e5d84acce365d76daed61e96b9b6b37cc) )
1067 	ROM_LOAD( "036799-01.np2", 0x5000, 0x0800, CRC(7d511572) SHA1(1956a12bccb5d3a84ce0c1cc10c6ad7f64e30b40) )
1068 
1069 	// DVG PROM
1070 	ROM_REGION( 0x100, "dvg:prom", 0 )
1071 	ROM_LOAD( "034602-01.c8",  0x0000, 0x0100, CRC(97953db8) SHA1(8cbded64d1dd35b18c4d5cece00f77e7b2cab2ad) )
1072 
1073 	ROM_REGION( 0x40, "earom", ROMREGION_ERASE00 ) // default to zero fill to suppress invalid high score display
1074 ROM_END
1075 
1076 /***************************************************************************
1077 
1078 Asteroids Deluxe revision 1 romset
1079 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
1080 
1081 I have had a number of Asteroids deluxe pcbs pass through my hands, every one i have come across has had
1082 a revision -01 marked romset apart from the rom at J1, this is always marked -02.
1083 
1084 This revision 2 rom in that location works fine, and i believe was a
1085 factory upgrade, and production fit on 99% of pcbs.
1086 
1087 This pcb was from a cabinet with a serial number of 000967, so its an early one, and
1088 it has a completely -01 romset on the pcb.
1089 
1090 Coincidentally i went through a pile of my manuals and came across some service bulletins which might
1091 explain why there is this mismatch in revision numbers, it seems Atari released the game, and found
1092 they needed to change default settings becasue of earnings potential in their default
1093 first set (revision 1), not once, but twice! then they changed the romset altogether. The documents
1094 in question are CO-174-02 (2 pages, 3 sides). this document shows what i think was the final revision
1095 of roms to be produced, they consist of a wholly -02 romset, with the exception being a -03 rom at
1096 location J1.
1097 
1098 So, anyhow, find in this file, the FIRST revision of rom -01 in J1. This pcb contained the following
1099 roms in the following locations :
1100 
1101 all roms are TMS 2516, marked with silver atari labels 'ATARI 8105 ' then the info below:
1102 
1103 R2   = 036800 01E
1104 N/P2 = 036799 01E
1105 J1   = 036433 01E
1106 F/H1 = 036432 01E
1107 E/F1 = 036431 01E
1108 D1   = 036430 01E
1109 
1110 Dumped 24/08/05
1111 by Andy Welburn
1112 www.andys-arcade.com
1113 */
1114 ROM_START( astdelux1 )
1115 	ROM_REGION( 0x8000, "maincpu", 0 )
1116 	ROM_LOAD( "036430-01.d1",  0x6000, 0x0800, CRC(8f5dabc6) SHA1(5d7543e19acab99ddb63c0ffd60f54d7a0f267f5) )
1117 	ROM_LOAD( "036431-01.ef1", 0x6800, 0x0800, CRC(157a8516) SHA1(9041d8c2369d004f198681e02b59a923fa8f70c9) )
1118 	ROM_LOAD( "036432-01.fh1", 0x7000, 0x0800, CRC(fdea913c) SHA1(ded0138a20d80317d67add5bb2a64e6274e0e409) )
1119 	ROM_LOAD( "036433-01.j1",  0x7800, 0x0800, CRC(ef09bac7) SHA1(6a4b37dbfe4e6badc4e81036b1430da2e9cb8ca4) )
1120 	// Vector ROM
1121 	ROM_LOAD( "036800-01.r2",  0x4800, 0x0800, CRC(3b597407) SHA1(344fea2e5d84acce365d76daed61e96b9b6b37cc) )
1122 	ROM_LOAD( "036799-01.np2", 0x5000, 0x0800, CRC(7d511572) SHA1(1956a12bccb5d3a84ce0c1cc10c6ad7f64e30b40) )
1123 
1124 	// DVG PROM
1125 	ROM_REGION( 0x100, "dvg:prom", 0 )
1126 	ROM_LOAD( "034602-01.c8",  0x0000, 0x0100, CRC(97953db8) SHA1(8cbded64d1dd35b18c4d5cece00f77e7b2cab2ad) )
1127 
1128 	ROM_REGION( 0x40, "earom", ROMREGION_ERASE00 ) // default to zero fill to suppress invalid high score display
1129 ROM_END
1130 
1131 ROM_START( llander )
1132 	ROM_REGION( 0x8000, "maincpu", 0 )
1133 	ROM_LOAD( "034572-02.f1",  0x6000, 0x0800, CRC(b8763eea) SHA1(5a15eaeaf825ccdf9ce013a6789cf51da20f785c) )
1134 	ROM_LOAD( "034571-02.de1", 0x6800, 0x0800, CRC(77da4b2f) SHA1(4be6cef5af38734d580cbfb7e4070fe7981ddfd6) )
1135 	ROM_LOAD( "034570-01.c1",  0x7000, 0x0800, CRC(2724e591) SHA1(ecf4430a0040c227c896aa2cd81ee03960b4d641) )
1136 	ROM_LOAD( "034569-02.b1",  0x7800, 0x0800, CRC(72837a4e) SHA1(9b21ba5e1518079c326ca6e15b9993e6c4483caa) )
1137 	// Vector ROM
1138 	ROM_LOAD( "034599-01.r3",  0x4800, 0x0800, CRC(355a9371) SHA1(6ecb40169b797d9eb623bcb17872f745b1bf20fa) )
1139 	ROM_LOAD( "034598-01.np3", 0x5000, 0x0800, CRC(9c4ffa68) SHA1(eb4ffc289d254f699f821df3146aa2c6cd78597f) )
1140 	ROM_LOAD( "034597-01.m3",  0x5800, 0x0800, CRC(ebb744f2) SHA1(e685b094c1261a351e4e82dfb487462163f136a4) ) // Built from original Atari source code
1141 
1142 	// DVG PROM
1143 	ROM_REGION( 0x100, "dvg:prom", 0 )
1144 	ROM_LOAD( "034602-01.c8",  0x0000, 0x0100, CRC(97953db8) SHA1(8cbded64d1dd35b18c4d5cece00f77e7b2cab2ad) )
1145 ROM_END
1146 
1147 ROM_START( llander1 )
1148 	ROM_REGION( 0x8000, "maincpu", 0 )
1149 	ROM_LOAD( "034572-01.f1",  0x6000, 0x0800, CRC(2aff3140) SHA1(4fc8aae640ce655417c11d9a3121aae9a1238e7c) )
1150 	ROM_LOAD( "034571-01.de1", 0x6800, 0x0800, CRC(493e24b7) SHA1(125a2c335338ccabababef12fd7096ef4b605a31) )
1151 	ROM_LOAD( "034570-01.c1",  0x7000, 0x0800, CRC(2724e591) SHA1(ecf4430a0040c227c896aa2cd81ee03960b4d641) )
1152 	ROM_LOAD( "034569-01.b1",  0x7800, 0x0800, CRC(b11a7d01) SHA1(8f2935dbe04ee68815d69ea9e71853b5a145d7c3) )
1153 	// Vector ROM
1154 	ROM_LOAD( "034599-01.r3",  0x4800, 0x0800, CRC(355a9371) SHA1(6ecb40169b797d9eb623bcb17872f745b1bf20fa) )
1155 	ROM_LOAD( "034598-01.np3", 0x5000, 0x0800, CRC(9c4ffa68) SHA1(eb4ffc289d254f699f821df3146aa2c6cd78597f) )
1156 	ROM_LOAD( "034597-01.m3",  0x5800, 0x0800, CRC(ebb744f2) SHA1(e685b094c1261a351e4e82dfb487462163f136a4) ) // Built from original Atari source code
1157 
1158 	// DVG PROM
1159 	ROM_REGION( 0x100, "dvg:prom", 0 )
1160 	ROM_LOAD( "034602-01.c8",  0x0000, 0x0100, CRC(97953db8) SHA1(8cbded64d1dd35b18c4d5cece00f77e7b2cab2ad) )
1161 ROM_END
1162 
1163 ROM_START( llandert )
1164 	ROM_REGION( 0x8000, "maincpu", 0 )
1165 	ROM_LOAD( "llprom0.de1",   0x6800, 0x0800, CRC(b5302947) SHA1(622245053682b838762b4eb04be5d4bbed5e78ef) )
1166 	ROM_LOAD( "llprom1.c1",    0x7000, 0x0800, CRC(761a5b45) SHA1(dde08ef856caed4b017bfbb8e3f3260747c0a1e5) )
1167 	ROM_LOAD( "llprom2.b1",    0x7800, 0x0800, CRC(9ec62656) SHA1(2247fd187d0aa7305d7326722c99578ad20718fa) )
1168 
1169 	// Vector ROM
1170 	ROM_LOAD( "llvrom0.r3",    0x4800, 0x0800, CRC(c307b42a) SHA1(6872c7671f4ab314962892b3cf93cc9d6c380ee2) ) // unused
1171 	ROM_LOAD( "llvrom1.np3",   0x5000, 0x0800, CRC(ace6b2be) SHA1(afdf4e6fc4be23197977e67c04b9baf9597756a0) ) // unused
1172 	ROM_LOAD( "llvrom2.m3",    0x5800, 0x0800, CRC(56c38219) SHA1(714878c0b24c9657c972a2ba25e790a4d3b81d64) ) // unused, filled with garbage? (it is not the language rom)
1173 
1174 	// DVG PROM
1175 	ROM_REGION( 0x100, "dvg:prom", 0 )
1176 	ROM_LOAD( "034602-01.c8",  0x0000, 0x0100, CRC(97953db8) SHA1(8cbded64d1dd35b18c4d5cece00f77e7b2cab2ad) ) // taken from parent
1177 ROM_END
1178 
1179 
1180 /*************************************
1181  *
1182  *  Driver initialization
1183  *
1184  *************************************/
1185 
1186 void asteroid_state::init_asteroidb()
1187 {
1188 	m_maincpu->space(AS_PROGRAM).install_read_port(0x2000, 0x2000, "IN0");
1189 	m_maincpu->space(AS_PROGRAM).install_read_port(0x2003, 0x2003, "HS");
1190 }
1191 
1192 
init_asterock()1193 void asteroid_state::init_asterock()
1194 {
1195 	m_maincpu->space(AS_PROGRAM).install_read_handler(0x2000, 0x2007, read8sm_delegate(*this, FUNC(asteroid_state::asterock_IN0_r)));
1196 }
1197 
1198 
1199 /*************************************
1200  *
1201  *  Game drivers
1202  *
1203  *************************************/
1204 
1205 GAME( 1979, asteroid,  0,        asteroid, asteroid,  asteroid_state, empty_init,     ROT0, "Atari",                     "Asteroids (rev 4)",                            MACHINE_SUPPORTS_SAVE )
1206 GAME( 1979, asteroid2, asteroid, asteroid, asteroid,  asteroid_state, empty_init,     ROT0, "Atari",                     "Asteroids (rev 2)",                            MACHINE_SUPPORTS_SAVE )
1207 GAME( 1979, asteroid1, asteroid, asteroid, asteroid,  asteroid_state, empty_init,     ROT0, "Atari",                     "Asteroids (rev 1)",                            MACHINE_SUPPORTS_SAVE )
1208 GAME( 1979, asteroidb, asteroid, asteroid, asteroidb, asteroid_state, init_asteroidb, ROT0, "bootleg",                   "Asteroids (bootleg on Lunar Lander hardware)", MACHINE_SUPPORTS_SAVE )
1209 GAME( 1981, spcrocks,  asteroid, asteroid, aerolitos, asteroid_state, empty_init,     ROT0, "Atari (J.Estevez license)", "Space Rocks (Spanish clone of Asteroids)",     MACHINE_SUPPORTS_SAVE ) // Space Rocks seems to be a legit set. Cabinet registered to 'J.Estevez (Barcelona).
1210 GAME( 1980, aerolitos, asteroid, asteroid, aerolitos, asteroid_state, empty_init,     ROT0, "bootleg (Rodmar Elec.)",    "Aerolitos (Spanish bootleg of Asteroids)",     MACHINE_SUPPORTS_SAVE ) // 'Aerolitos' appears on the cabinet, this was distributed in Spain, the Spanish text is different to that contained in the original version (corrected)
1211 GAME( 1979, asterock,  asteroid, asterock, asterock,  asteroid_state, init_asterock,  ROT0, "bootleg (Sidam)",           "Asterock (Sidam bootleg of Asteroids)",        MACHINE_SUPPORTS_SAVE )
1212 GAME( 1979, asterockv, asteroid, asterock, asterock,  asteroid_state, init_asterock,  ROT0, "bootleg (Videotron)",       "Asterock (Videotron bootleg of Asteroids)",    MACHINE_SUPPORTS_SAVE )
1213 GAME( 1979, meteorite, asteroid, asterock, asterock,  asteroid_state, init_asterock,  ROT0, "bootleg (Proel)",           "Meteorite (Proel bootleg of Asteroids)",       MACHINE_SUPPORTS_SAVE )
1214 GAME( 1979, meteorts,  asteroid, asteroid, asteroid,  asteroid_state, empty_init,     ROT0, "bootleg (VGG)",             "Meteorites (VGG bootleg of Asteroids)",        MACHINE_SUPPORTS_SAVE )
1215 GAME( 1979, meteorho,  asteroid, asteroid, asteroid,  asteroid_state, empty_init,     ROT0, "bootleg (Hoei)",            "Meteor (Hoei bootleg of Asteroids)",           MACHINE_SUPPORTS_SAVE )
1216 GAME( 1979, meteorbl,  asteroid, asterock, asterock,  asteroid_state, init_asterock,  ROT0, "bootleg",                   "Meteor (bootleg of Asteroids)",                MACHINE_SUPPORTS_SAVE )
1217 GAME( 1979, hyperspc,  asteroid, asteroid, asteroid,  asteroid_state, empty_init,     ROT0, "bootleg (Rumiano)",         "Hyperspace (bootleg of Asteroids)",            MACHINE_SUPPORTS_SAVE )
1218 
1219 GAMEL(1980, astdelux,  0,        astdelux, astdelux,  asteroid_state, empty_init,     ROT0, "Atari",   "Asteroids Deluxe (rev 3)", MACHINE_SUPPORTS_SAVE, layout_astdelux )
1220 GAMEL(1980, astdelux2, astdelux, astdelux, astdelux,  asteroid_state, empty_init,     ROT0, "Atari",   "Asteroids Deluxe (rev 2)", MACHINE_SUPPORTS_SAVE, layout_astdelux )
1221 GAMEL(1980, astdelux1, astdelux, astdelux, astdelux,  asteroid_state, empty_init,     ROT0, "Atari",   "Asteroids Deluxe (rev 1)", MACHINE_SUPPORTS_SAVE, layout_astdelux )
1222 
1223 GAME( 1979, llander,   0,        llander,  llander,   asteroid_state, empty_init,     ROT0, "Atari",   "Lunar Lander (rev 2)",       MACHINE_SUPPORTS_SAVE )
1224 GAME( 1979, llander1,  llander,  llander,  llander1,  asteroid_state, empty_init,     ROT0, "Atari",   "Lunar Lander (rev 1)",       MACHINE_SUPPORTS_SAVE )
1225 GAME( 1979, llandert,  llander,  llander,  llandert,  asteroid_state, empty_init,     ROT0, "Atari",   "Lunar Lander (screen test)", MACHINE_SUPPORTS_SAVE ) // No copyright shown, assume it's an in-house diagnostics romset (PCB came from a seller that has had Atari prototypes in his possession before)
1226