1 // license:BSD-3-Clause
2 // copyright-holders:David Graves
3 // thanks-to:Richard Bush
4 /****************************************************************************
5 
6 Top Speed / Full Throttle    (c) Taito 1987
7 -------------------------
8 
9 David Graves
10 
11 Sources:        Rastan driver by Jarek Burczynski
12             MAME Taito F2 & Z drivers
13             Raine source - special thanks to Richard Bush
14               and the Raine Team.
15 
16                 *****
17 
18 Top Speed / Full Throttle is the forerunner of the Taito Z system on
19 which Taito's driving games were based from 1988-91. (You can spot some
20 similarities with Continental Circus, the first of the TaitoZ games.)
21 
22 The game hardware has 5 separate layers of graphics - four 64x64 tiled
23 scrolling background planes of 8x8 tiles (two of which are used for
24 drawing the road), and a sprite plane.
25 
26 Taito got round the limitations of the tilemap generator they were using
27 (which only supports two layers) by using a pair of them.
28 
29 [Trivia: Taito employed the same trick three years later, this time with
30 the TC0100SCN in "Thunderfox".]
31 
32 Top Speed's sprites are 16x8 tiles aggregated through a RAM sprite map
33 area into 128x128 big sprites. (The TaitoZ system also used a similar
34 sprite map system, but moved the sprite map from RAM to ROM.)
35 
36 Top Speed has twin 68K CPUs which communicate via $10000 bytes of
37 shared ram. The first 68000 handles screen, palette and sprites, and
38 the road. The second 68000 handles inputs/dips, and does data processing
39 in shared ram to relieve CPUA. There is also a Z80, which takes over
40 sound duties.
41 
42 
43 PCB contents (from CPU PCB photo)
44 -------------
45 
46 XTAL: 16000.00KHZ and 26686.00KHZ
47 CPU: 2 * 68000-8, Z80 + Z80 CTC
48 Sound: YM2151, YM3012(DAC), 2 * OKI M5205
49 Taito: 2 * PC080SN, PC060HA, TC0040IOC, 2 * TC0060DCA, PC050CM
50 
51 
52 
53 TODO Lists
54 ==========
55 
56 Minor black glitches on the road: these are all on the right
57 hand edge of the tilemap making up the "left" half: this is
58 the upper of the two road tilemaps so any gunk will be visible.
59 
60 'Tearing' effect between the two road tilemaps is visible when
61 single-stepping. A sync issue?
62 
63 CPUA (on all variants) could have a spin_until_int at $63a.
64 
65 Motor CPU: appears to be identical to one in ChaseHQ.
66 
67 
68 Stephh's notes (based on the game M68000 code and some tests) :
69 
70 1) 'topspeed' and 'topspedu'
71 
72   - All addresses are for 2nd M68000 CPU !
73   - Region stored at 0x01fffe.w
74   - Sets :
75       * 'topspeed' : region = 0x0003
76       * 'topspedu' : region = 0x0004
77   - Coinage relies on the region (code at 0x00dd10) :
78       * 0x0001 (Japan), 0x0002 (US) and 0x0004 (US, Romstar license) use TAITO_COINAGE_JAPAN_OLD
79       * 0x0003 (World) uses TAITO_COINAGE_WORLD
80   - Notice screen only if region = 0x0001
81   - Game name : "Top Speed"
82   - It's only possible to continue a game when you reach at least level 2
83   - The "Continue Price" Dip Switch is a bit weird when set to 1C_1C :
84       * coin 1 : 1C_1C (normal behaviour)
85       * coin 2 : same number of credits as per Coin B settings, but twice coins
86         for example, when Coin B setting is 1C_2C, when pressing COIN2,
87         you'll get 2 credits, but you'll be able to continue 4 times
88         before needing to insert another coin
89   - There is sort of built-in cheat (code at 0x015332) :
90       * set "Allow Continue" Dip Switch to "No"
91       * set "Continue Price" Dip Switch to 1C_1C
92       * set contents of 0x000402.b to 0x55 (be aware that this address is in ROM area)
93       * you'll then be awarded infinite time :)
94 
95 
96 2) 'fullthrl'
97 
98   - All addresses are for 2nd M68000 CPU !
99   - Region stored at 0x01fffe.w
100   - Sets :
101       * 'fullthrl' : region = 0x0001
102   - Game name : "Full Throttle"
103   - Same other notes as for 'topspeed'
104 
105 Main board
106     V  Connector                 G  Connector
107     ------------                 ------------
108     1  Video GND                Solder   Parts
109     2  Video RED                GND  A   1  GND
110     3  Video GREEN              GND  B   2  GND
111     4  Video BLUE               +5V  C   3  +5V
112     5  Video SYNC               +5V  D   4  +5V
113                                 -5V  E   5  -5V
114                                +13V  F   6  +12V
115     H  Connector                ---  H   7  ---
116     ------------     Coin Counter 2  J   8  Coin Counter 1
117     1  GND           Coin Lockout 2  K   9  Coin Lockout 1
118     2  GND          Speaker CH1 [-]  L  10  Speaker CH1 [+]
119     3  GND          Speaker CH2 [-]  M  11  Speaker CH2 [+]
120     4  GND                 Volume 1  N  12  Volume 3
121     5  +5V                      ---  P  13  Volume 2
122     6  +5V               Service SW  R  14  GND
123     7  +5V               Brake SW 1  S  15  GND
124     8  +5V                Coin SW 2  T  16  Coin SW 1
125     9  -5V               Brake SW 3  U  17  Brake SW 2
126     10 ---                  Tilt SW  V  18  Nitro SW
127     11 +12V             1P Start SW  W  19  Handle Center SW
128     12 ---               Accel SW 1  X  20  Shift SW
129                          Accel SW 3  Y  21  Accel SW 2
130                                 ---  Z  22  ---
131                                 ---  a  23  ---
132                                 ---  b  24  ---
133                                 ---  c  25  ---
134                   Handle Sensor [-]  d  26  Handle Sensor [+]
135                                 GND  e  27  GND
136                                 GND  f  28  GND
137 
138 Handle Sensor board
139     1  Handle Sensor [-]
140     2  +5V
141     3  GND
142     4  Handle Sensor [+]
143 
144 Sound Volume Connection
145     Sound Volume 1  1  ----   -\
146     Sound Volume 2  2  ----   -----| short with only one pin
147     Sound Volume 3  3  ----   -/   |
148                GND  4  ------------|
149 
150 From JP manual
151     If Cabinet is Upright (see DSWA:1,2), These SWs are unused.
152         Accel SW 2 (21), Accel SW 3 (Y), Brake SW 2 (17), Brake SW 3 (U) and Handle Center SW (19)
153 
154 ***************************************************************************/
155 
156 #include "emu.h"
157 #include "includes/topspeed.h"
158 #include "includes/taitoipt.h"
159 #include "audio/taitosnd.h"
160 
161 #include "cpu/m68000/m68000.h"
162 #include "cpu/z80/z80.h"
163 #include "machine/taitoio.h"
164 #include "machine/z80ctc.h"
165 #include "sound/flt_vol.h"
166 #include "sound/msm5205.h"
167 #include "sound/ym2151.h"
168 #include "emupal.h"
169 #include "screen.h"
170 #include "speaker.h"
171 
172 #include "topspeed.lh"
173 
174 
175 
176 /**********************************************************
177                        CPU CONTROL
178 **********************************************************/
179 
cpua_ctrl_w(u16 data)180 void topspeed_state::cpua_ctrl_w(u16 data)
181 {
182 	// Written only twice; once on startup at 0x00 then 0xc3 after init
183 	m_cpua_ctrl = data;
184 }
185 
186 
187 /**********************************************************
188                        GAME INPUTS
189 **********************************************************/
190 
input_bypass_r()191 u8 topspeed_state::input_bypass_r()
192 {
193 	// Read port number
194 	const u8 port = m_tc0040ioc->port_r();
195 	const u16 steer = 0xff80 + m_steer.read_safe(0);
196 
197 	switch (port)
198 	{
199 		case 0x0c:
200 			return steer & 0xff;
201 
202 		case 0x0d:
203 			return steer >> 8;
204 
205 		default:
206 			return m_tc0040ioc->portreg_r();
207 	}
208 }
209 
CUSTOM_INPUT_MEMBER(topspeed_state::gas_pedal_r)210 CUSTOM_INPUT_MEMBER(topspeed_state::gas_pedal_r)
211 {
212 	static const u8 retval[8] = { 0,1,3,2,6,7,5,4 };
213 	return retval[m_gas.read_safe(0) & 7];
214 }
215 
CUSTOM_INPUT_MEMBER(topspeed_state::brake_pedal_r)216 CUSTOM_INPUT_MEMBER(topspeed_state::brake_pedal_r)
217 {
218 	static const u8 retval[8] = { 0,1,3,2,6,7,5,4 };
219 	return retval[m_brake.read_safe(0) & 7];
220 }
221 
222 // TODO: proper motorcpu hook-up
223 
motor_r(offs_t offset)224 u16 topspeed_state::motor_r(offs_t offset)
225 {
226 	switch (offset)
227 	{
228 		case 0x0:   // Motor status?
229 			return (machine().rand() & 0xff);
230 
231 		case 0x101: // Motor CPU status?
232 			return 0x55;
233 
234 		case 0x141: // Left limit data
235 		case 0x142: // Right limit data
236 		case 0x143: // Horizontal center data
237 
238 		case 0x144: // Upper limit data
239 		case 0x145: // Lower limit data
240 		case 0x146: // Vertical center data
241 
242 		case 0x147: // Horizontal motor position
243 		case 0x148: // Vertical motor position
244 			return 0;
245 
246 		default:
247 			logerror("CPU #0 PC %06x: warning - read from motor cpu %03x\n", m_subcpu->pc(), offset);
248 			return 0;
249 	}
250 }
251 
motor_w(offs_t offset,u16 data)252 void topspeed_state::motor_w(offs_t offset, u16 data)
253 {
254 	// Writes $900000-25 and $900200-219
255 	logerror("CPU #0 PC %06x: warning - write %04x to motor cpu %03x\n", m_subcpu->pc(), data, offset);
256 }
257 
coins_w(u8 data)258 void topspeed_state::coins_w(u8 data)
259 {
260 	machine().bookkeeping().coin_lockout_w(0, ~data & 0x01);
261 	machine().bookkeeping().coin_lockout_w(1, ~data & 0x02);
262 	machine().bookkeeping().coin_counter_w(0, data & 0x04);
263 	machine().bookkeeping().coin_counter_w(1, data & 0x08);
264 }
265 
266 
267 /*****************************************************
268                         SOUND
269 *****************************************************/
270 
msm5205_update(int chip)271 void topspeed_state::msm5205_update(int chip)
272 {
273 	if (m_msm_reset[chip])
274 		return;
275 
276 	const u8 data = m_msm_rom[chip][m_msm_pos[chip]];
277 
278 	m_msm[chip]->data_w((m_msm_nibble[chip] ? data : data >> 4) & 0xf);
279 
280 	if (m_msm_nibble[chip])
281 		++m_msm_pos[chip];
282 
283 	m_msm_nibble[chip] ^= 1;
284 }
285 
WRITE_LINE_MEMBER(topspeed_state::msm5205_1_vck)286 WRITE_LINE_MEMBER(topspeed_state::msm5205_1_vck)
287 {
288 	msm5205_update(0);
289 }
290 
msm5205_command_w(offs_t offset,u8 data)291 void topspeed_state::msm5205_command_w(offs_t offset, u8 data)
292 {
293 	int chip = (offset >> 12) & 1;
294 
295 	switch (offset >> 8 & 0x2e)
296 	{
297 		// $b000 / $c000: Start address
298 		case 0x00:
299 			m_msm_pos[chip] = data << 8;
300 			break;
301 
302 		// $b400 / $c400: Run
303 		case 0x04:
304 			m_msm_reset[chip] = 0;
305 			m_msm[chip]->reset_w(0);
306 			break;
307 
308 		// $b800 / $c800: Stop
309 		case 0x08:
310 			m_msm_reset[chip] = 1;
311 			m_msm_nibble[chip] = 0;
312 			m_msm[chip]->reset_w(1);
313 			break;
314 
315 		// $cc00: ? Chip 2 only
316 		case 0x0c:
317 			break;
318 
319 		default:
320 			logerror("Unhandled MSM5205 control write to %x with %x (PC:%.4x)\n", 0xb000 + offset, data, m_audiocpu->pc());
321 			break;
322 	}
323 }
324 
volume_w(offs_t offset,u8 data)325 void topspeed_state::volume_w(offs_t offset, u8 data)
326 {
327 	// The volume is controlled by two Taito TC0060DCA hybrid volume modules
328 	filter_volume_device *filter = nullptr;
329 
330 	switch (offset)
331 	{
332 		case 0x000: filter = m_filter2;     break; // MSM5205 1
333 		case 0x200: filter = m_filter3;     break; // MSM5205 2
334 		case 0x400: filter = m_filter1l;    break; // YM-2151 L
335 		case 0x600: filter = m_filter1r;    break; // YM-2151 R
336 	}
337 
338 	filter->flt_volume_set_volume(data / 255.0f);
339 }
340 
WRITE_LINE_MEMBER(topspeed_state::z80ctc_to0)341 WRITE_LINE_MEMBER(topspeed_state::z80ctc_to0)
342 {
343 	if (m_msm2_vck2 && !state)
344 	{
345 		// CTC output is divided by 2
346 		if (m_msm2_vck)
347 		{
348 			m_msm[1]->vclk_w(1);
349 		}
350 		else
351 		{
352 			// Update on falling edge of /VCK
353 			u16 oldpos = m_msm_pos[1];
354 
355 			msm5205_update(1);
356 
357 			// Handle looping
358 			if ((oldpos >> 8) == 0x0f && ((m_msm_pos[1] >> 8) == 0x10))
359 			{
360 				m_msm_pos[1] = 0;
361 				m_msm[1]->reset_w(1);
362 				m_msm[1]->vclk_w(0);
363 				m_msm[1]->reset_w(0);
364 			}
365 			else
366 			{
367 				m_msm[1]->vclk_w(0);
368 			}
369 		}
370 
371 		m_msm2_vck ^= 1;
372 	}
373 	m_msm2_vck2 = state;
374 }
375 
376 
377 /***********************************************************
378                       MEMORY STRUCTURES
379 ***********************************************************/
380 
cpua_map(address_map & map)381 void topspeed_state::cpua_map(address_map &map)
382 {
383 	map(0x000000, 0x0fffff).rom();
384 	map(0x400000, 0x40ffff).ram().share("sharedram");
385 	map(0x500000, 0x503fff).ram().w("palette", FUNC(palette_device::write16)).share("palette");
386 	map(0x600002, 0x600003).w(FUNC(topspeed_state::cpua_ctrl_w));
387 	map(0x7e0000, 0x7e0001).nopr();
388 	map(0x7e0001, 0x7e0001).w("ciu", FUNC(pc060ha_device::master_port_w));
389 	map(0x7e0003, 0x7e0003).rw("ciu", FUNC(pc060ha_device::master_comm_r), FUNC(pc060ha_device::master_comm_w));
390 	map(0x800000, 0x8003ff).ram().share("raster_ctrl");
391 	map(0x800400, 0x80ffff).ram();
392 	map(0x880000, 0x880007).nopw(); // Lamps/outputs?
393 	map(0xa00000, 0xa0ffff).rw(m_pc080sn[0], FUNC(pc080sn_device::word_r), FUNC(pc080sn_device::word_w));
394 	map(0xa20000, 0xa20003).w(m_pc080sn[0], FUNC(pc080sn_device::yscroll_word_w));
395 	map(0xa40000, 0xa40003).w(m_pc080sn[0], FUNC(pc080sn_device::xscroll_word_w));
396 	map(0xa50000, 0xa50003).w(m_pc080sn[0], FUNC(pc080sn_device::ctrl_word_w));
397 	map(0xb00000, 0xb0ffff).rw(m_pc080sn[1], FUNC(pc080sn_device::word_r), FUNC(pc080sn_device::word_w));
398 	map(0xb20000, 0xb20003).w(m_pc080sn[1], FUNC(pc080sn_device::yscroll_word_w));
399 	map(0xb40000, 0xb40003).w(m_pc080sn[1], FUNC(pc080sn_device::xscroll_word_w));
400 	map(0xb50000, 0xb50003).w(m_pc080sn[1], FUNC(pc080sn_device::ctrl_word_w));
401 	map(0xd00000, 0xd00fff).ram().share("spriteram");
402 	map(0xe00000, 0xe0ffff).ram().share("spritemap");
403 }
404 
cpub_map(address_map & map)405 void topspeed_state::cpub_map(address_map &map)
406 {
407 	map(0x000000, 0x01ffff).rom();
408 	map(0x400000, 0x40ffff).ram().share("sharedram");
409 	map(0x880001, 0x880001).r(FUNC(topspeed_state::input_bypass_r)).w(m_tc0040ioc, FUNC(tc0040ioc_device::portreg_w)).umask16(0x00ff);
410 	map(0x880003, 0x880003).rw(m_tc0040ioc, FUNC(tc0040ioc_device::port_r), FUNC(tc0040ioc_device::port_w));
411 	map(0x900000, 0x9003ff).rw(FUNC(topspeed_state::motor_r), FUNC(topspeed_state::motor_w));
412 }
413 
414 
415 /***************************************************************************/
416 
z80_prg(address_map & map)417 void topspeed_state::z80_prg(address_map &map)
418 {
419 	map(0x0000, 0x3fff).rom();
420 	map(0x4000, 0x7fff).bankr("sndbank");
421 	map(0x8000, 0x8fff).ram();
422 	map(0x9000, 0x9001).rw("ymsnd", FUNC(ym2151_device::read), FUNC(ym2151_device::write));
423 	map(0xa000, 0xa000).w("ciu", FUNC(pc060ha_device::slave_port_w));
424 	map(0xa001, 0xa001).rw("ciu", FUNC(pc060ha_device::slave_comm_r), FUNC(pc060ha_device::slave_comm_w));
425 	map(0xb000, 0xcfff).w(FUNC(topspeed_state::msm5205_command_w));
426 	map(0xd000, 0xdfff).w(FUNC(topspeed_state::volume_w));
427 }
428 
z80_io(address_map & map)429 void topspeed_state::z80_io(address_map &map)
430 {
431 	map.global_mask(0xff);
432 	map(0x00, 0x00).rw("ctc", FUNC(z80ctc_device::read), FUNC(z80ctc_device::write));
433 }
434 
435 
436 /***********************************************************
437                     INPUT PORTS, DIPs
438 ***********************************************************/
439 
440 static INPUT_PORTS_START( topspeed )
441 	// 0x880000 (port 0) -> 0x400852 (-$77ae,A5) (shared RAM)
442 	PORT_START("DSWA")
443 	PORT_DIPNAME( 0x03, 0x03, DEF_STR( Cabinet ) )          PORT_DIPLOCATION("SWA:1,2")
444 	PORT_DIPSETTING(    0x03, "Deluxe" )    // analog pedals, racing wheel, motor (tilt disabled)
445 	PORT_DIPSETTING(    0x02, "Standard" )  // digital pedals, continuous wheel
446 //  PORT_DIPSETTING(    0x01, "Standard" )
447 	PORT_DIPSETTING(    0x00, "Mini" )      // analog pedals, racing wheel
448 	TAITO_DSWA_BITS_2_TO_3_LOC(SWA)
449 	TAITO_COINAGE_WORLD_LOC(SWA)
450 
451 	// 0x880000 (port 1) -> 0x400850 (-$77b0,A5) (shared RAM)
452 	PORT_START("DSWB")
453 	TAITO_DIFFICULTY_LOC(SWB)
454 	PORT_DIPNAME( 0x0c, 0x0c, "Initial Time" )              PORT_DIPLOCATION("SWB:3,4")
455 	PORT_DIPSETTING(    0x00, "40 seconds" )
456 	PORT_DIPSETTING(    0x04, "50 seconds" )
457 	PORT_DIPSETTING(    0x0c, "60 seconds" )
458 	PORT_DIPSETTING(    0x08, "70 seconds" )
459 	PORT_DIPNAME( 0x30, 0x30, "Nitros" )                    PORT_DIPLOCATION("SWB:5,6")
460 	PORT_DIPSETTING(    0x20, "2" )
461 	PORT_DIPSETTING(    0x30, "3" )
462 	PORT_DIPSETTING(    0x10, "4" )
463 	PORT_DIPSETTING(    0x00, "5" )
464 	PORT_DIPNAME( 0x40, 0x40, DEF_STR( Allow_Continue ) )   PORT_DIPLOCATION("SWB:7")
465 	PORT_DIPSETTING(    0x40, DEF_STR( No ) )
466 	PORT_DIPSETTING(    0x00, DEF_STR( Yes ) )
467 	PORT_DIPNAME( 0x80, 0x80, DEF_STR( Continue_Price ) )   PORT_DIPLOCATION("SWB:8") // "KEEP OFF" in manual, see notes
468 	PORT_DIPSETTING(    0x80, "Same as Start" )
469 	PORT_DIPSETTING(    0x00, "Half of Start" )
470 
471 	PORT_START("IN0")
472 	PORT_BIT( 0x01, IP_ACTIVE_LOW,  IPT_UNKNOWN )
473 	PORT_BIT( 0x02, IP_ACTIVE_LOW,  IPT_UNKNOWN )
474 	PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_COIN2 )
475 	PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_COIN1 )
476 	PORT_BIT( 0x10, IP_ACTIVE_LOW,  IPT_SERVICE1 )
477 	PORT_BIT( 0xe0, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_CUSTOM_MEMBER(topspeed_state, brake_pedal_r) PORT_CONDITION("DSWA", 0x03, NOTEQUALS, 0x02)
478 	PORT_BIT( 0x20, IP_ACTIVE_LOW,  IPT_BUTTON2 ) PORT_NAME("Brake Switch") PORT_CONDITION("DSWA", 0x03, EQUALS, 0x02)
479 
480 	PORT_START("IN1")
481 	PORT_BIT( 0x01, IP_ACTIVE_LOW,  IPT_BUTTON3 ) PORT_NAME("Nitro")
482 	PORT_BIT( 0x02, IP_ACTIVE_LOW,  IPT_TILT )
483 	PORT_BIT( 0x04, IP_ACTIVE_LOW,  IPT_SERVICE2 ) PORT_NAME("Calibrate") // ?
484 	PORT_BIT( 0x08, IP_ACTIVE_LOW,  IPT_START1 )
485 	PORT_BIT( 0x10, IP_ACTIVE_LOW,  IPT_BUTTON4 ) PORT_NAME("Shifter") PORT_TOGGLE
486 	PORT_BIT( 0xe0, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_CUSTOM_MEMBER(topspeed_state, gas_pedal_r) PORT_CONDITION("DSWA", 0x03, NOTEQUALS, 0x02)
487 	PORT_BIT( 0x20, IP_ACTIVE_LOW,  IPT_BUTTON1 ) PORT_NAME("Gas Switch") PORT_CONDITION("DSWA", 0x03, EQUALS, 0x02)
488 
489 	PORT_START("IN2")   // Unused
490 
491 	PORT_START("STEER")
492 	PORT_BIT( 0xff, 0x80, IPT_PADDLE ) PORT_SENSITIVITY(100) PORT_KEYDELTA(10) PORT_NAME("Steering Wheel") PORT_CONDITION("DSWA", 0x03, NOTEQUALS, 0x02)    // racing wheel (absolute)
493 	PORT_BIT( 0xffff, 0x00, IPT_DIAL ) PORT_SENSITIVITY(100) PORT_KEYDELTA(2)  PORT_NAME("Steering Wheel") PORT_CONDITION("DSWA", 0x03, EQUALS,    0x02)    // continuous (relative)
494 
495 	PORT_START("GAS")
496 	PORT_BIT( 0x07, 0x00, IPT_PEDAL )  PORT_SENSITIVITY(25) PORT_KEYDELTA(1) PORT_NAME("Gas Pedal") PORT_CONDITION("DSWA", 0x03, NOTEQUALS, 0x02)
497 
498 	PORT_START("BRAKE")
499 	PORT_BIT( 0x07, 0x00, IPT_PEDAL2 ) PORT_SENSITIVITY(25) PORT_KEYDELTA(1) PORT_NAME("Brake Pedal") PORT_CONDITION("DSWA", 0x03, NOTEQUALS, 0x02)
500 INPUT_PORTS_END
501 
502 static INPUT_PORTS_START( fullthrl )
503 	PORT_INCLUDE(topspeed)
504 
505 	PORT_MODIFY("DSWA")
506 	TAITO_COINAGE_JAPAN_OLD_LOC(SWA)
507 INPUT_PORTS_END
508 
509 
510 /**************************************************************
511                         GFX DECODING
512 **************************************************************/
513 
514 static const gfx_layout tile16x8_layout =
515 {
516 	16,8,   // 16*8 sprites
517 	RGN_FRAC(1,1),
518 	4,      // 4 bits per pixel
519 	{ STEP4(0,16) },
520 	{ STEP16(0,1) },
521 	{ STEP8(0,16*4) },
522 	16*8*4    // every sprite takes 64 consecutive bytes
523 };
524 
525 static GFXDECODE_START( gfx_topspeed )
526 	GFXDECODE_ENTRY( "sprites", 0x0, tile16x8_layout,      0, 256 ) // Sprite parts
527 	GFXDECODE_ENTRY( "pc080sn", 0x0, gfx_8x8x4_packed_msb, 0, 512 ) // Playfield
528 	// Road Lines gfxdecodable ?
529 GFXDECODE_END
530 
531 
532 /***********************************************************
533                      MACHINE DRIVERS
534 ***********************************************************/
535 
machine_start()536 void topspeed_state::machine_start()
537 {
538 	m_sndbank->configure_entry(0, memregion("audiocpu")->base() + 0x10000);
539 	m_sndbank->configure_entries(1, 3, memregion("audiocpu")->base() + 0x4000, 0x4000);
540 
541 	save_item(NAME(m_cpua_ctrl));
542 	save_item(NAME(m_ioc220_port));
543 	save_item(NAME(m_msm_pos));
544 	save_item(NAME(m_msm_reset));
545 	save_item(NAME(m_msm_nibble));
546 	save_item(NAME(m_msm2_vck));
547 	save_item(NAME(m_msm2_vck2));
548 }
549 
machine_reset()550 void topspeed_state::machine_reset()
551 {
552 	m_cpua_ctrl = 0;
553 	m_ioc220_port = 0;
554 
555 	m_msm_reset[0] = 0;
556 	m_msm_reset[1] = 0;
557 	m_msm[0]->reset_w(1);
558 	m_msm[1]->reset_w(1);
559 	m_msm2_vck = 0;
560 	m_msm2_vck2 = 0;
561 }
562 
563 
topspeed(machine_config & config)564 void topspeed_state::topspeed(machine_config &config)
565 {
566 	// basic machine hardware
567 	M68000(config, m_maincpu, XTAL(16'000'000) / 2);
568 	m_maincpu->set_addrmap(AS_PROGRAM, &topspeed_state::cpua_map);
569 	m_maincpu->set_vblank_int("screen", FUNC(topspeed_state::irq6_line_hold));
570 
571 	M68000(config, m_subcpu, XTAL(16'000'000) / 2);
572 	m_subcpu->set_addrmap(AS_PROGRAM, &topspeed_state::cpub_map);
573 	m_subcpu->set_vblank_int("screen", FUNC(topspeed_state::irq5_line_hold));
574 
575 	Z80(config, m_audiocpu, XTAL(16'000'000) / 4);
576 	m_audiocpu->set_addrmap(AS_PROGRAM, &topspeed_state::z80_prg);
577 	m_audiocpu->set_addrmap(AS_IO, &topspeed_state::z80_io);
578 
579 	z80ctc_device& ctc(Z80CTC(config, "ctc", XTAL(16'000'000) / 4));
580 	ctc.zc_callback<0>().set(FUNC(topspeed_state::z80ctc_to0));
581 
582 	PC080SN(config, m_pc080sn[0], 0);
583 	m_pc080sn[0]->set_gfx_region(1);
584 	m_pc080sn[0]->set_offsets(0, 8);
585 	m_pc080sn[0]->set_gfxdecode_tag(m_gfxdecode);
586 
587 	PC080SN(config, m_pc080sn[1], 0);
588 	m_pc080sn[1]->set_gfx_region(1);
589 	m_pc080sn[1]->set_offsets(0, 8);
590 	m_pc080sn[1]->set_gfxdecode_tag(m_gfxdecode);
591 
592 	pc060ha_device &ciu(PC060HA(config, "ciu", 0));
593 	ciu.set_master_tag(m_maincpu);
594 	ciu.set_slave_tag(m_audiocpu);
595 
596 	TC0040IOC(config, m_tc0040ioc, 0);
597 	m_tc0040ioc->read_0_callback().set_ioport("DSWA");
598 	m_tc0040ioc->read_1_callback().set_ioport("DSWB");
599 	m_tc0040ioc->read_2_callback().set_ioport("IN0");
600 	m_tc0040ioc->read_3_callback().set_ioport("IN1");
601 	m_tc0040ioc->write_4_callback().set(FUNC(topspeed_state::coins_w));
602 	m_tc0040ioc->read_7_callback().set_ioport("IN2");
603 
604 	// video hardware
605 	screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
606 	screen.set_refresh_hz(60.0532); // Measured on real hardware
607 	screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
608 	screen.set_size(40*8, 32*8);
609 	screen.set_visarea(0*8, 40*8-1, 2*8, 32*8-1);
610 	screen.set_screen_update(FUNC(topspeed_state::screen_update));
611 	screen.set_palette("palette");
612 
613 	GFXDECODE(config, m_gfxdecode, "palette", gfx_topspeed);
614 	PALETTE(config, "palette").set_format(palette_device::xBGR_555, 8192);
615 
616 	// sound hardware
617 	SPEAKER(config, "lspeaker").front_left();
618 	SPEAKER(config, "rspeaker").front_right();
619 
620 	ym2151_device &ymsnd(YM2151(config, "ymsnd", 16_MHz_XTAL / 4));
621 	ymsnd.irq_handler().set_inputline(m_audiocpu, 0);
622 	ymsnd.port_write_handler().set_membank(m_sndbank).mask(0x03);
623 	ymsnd.add_route(0, "filter1l", 1.0);
624 	ymsnd.add_route(1, "filter1r", 1.0);
625 
626 	MSM5205(config, m_msm[0], XTAL(384'000));
627 	m_msm[0]->vck_legacy_callback().set(FUNC(topspeed_state::msm5205_1_vck));
628 	m_msm[0]->set_prescaler_selector(msm5205_device::S48_4B);   // 8 kHz, 4-bit
629 	m_msm[0]->add_route(ALL_OUTPUTS, "filter2", 1.0);
630 
631 	MSM5205(config, m_msm[1], XTAL(384'000));
632 	m_msm[1]->set_prescaler_selector(msm5205_device::SEX_4B);   // Slave mode, 4-bit
633 	m_msm[1]->add_route(ALL_OUTPUTS, "filter3", 1.0);
634 
635 	FILTER_VOLUME(config, "filter1l").add_route(ALL_OUTPUTS, "lspeaker", 1.0);
636 	FILTER_VOLUME(config, "filter1r").add_route(ALL_OUTPUTS, "rspeaker", 1.0);
637 
638 	FILTER_VOLUME(config, "filter2").add_route(ALL_OUTPUTS, "lspeaker", 1.0).add_route(ALL_OUTPUTS, "rspeaker", 1.0);
639 
640 	FILTER_VOLUME(config, "filter3").add_route(ALL_OUTPUTS, "lspeaker", 1.0).add_route(ALL_OUTPUTS, "rspeaker", 1.0);
641 }
642 
643 
644 
645 /***************************************************************************
646                                 DRIVERS
647 
648 Note: driver does NOT make use of the zoom sprite tables rom.
649 ***************************************************************************/
650 
651 ROM_START( topspeed )
652 	ROM_REGION( 0x100000, "maincpu", 0 ) // 128K for 68000 code (CPU A)
653 	ROM_LOAD16_BYTE( "b14-67-1.9",  0x000000, 0x10000, CRC(23f17616) SHA1(653ab6537f2e5898a77060c82b776852ab1f2b51) )
654 	ROM_LOAD16_BYTE( "b14-68-1.11", 0x000001, 0x10000, CRC(835659d9) SHA1(e99967f795c3c6e14bad7a66315640ca5db43c72) )
655 	ROM_LOAD16_BYTE( "b14-54.24",   0x080000, 0x20000, CRC(172924d5) SHA1(4a963f2e816f4b1c5acc6d38e99a68d3baeee8c6) ) // 4 data ROMs
656 	ROM_LOAD16_BYTE( "b14-52.26",   0x080001, 0x20000, CRC(e1b5b2a1) SHA1(8e2b992dcd5dc2317594c0187a22767aa626edee) )
657 	ROM_LOAD16_BYTE( "b14-55.23",   0x0c0000, 0x20000, CRC(a1f15499) SHA1(72f99108713773782fc72aae5a3f6e9e2a1e347c) )
658 	ROM_LOAD16_BYTE( "b14-53.25",   0x0c0001, 0x20000, CRC(04a04f5f) SHA1(09c15c33967bb141cc504b70d01c154bedb7fa33) )
659 
660 	ROM_REGION( 0x20000, "subcpu", 0 ) // 128K for 68000 code (CPU B)
661 	ROM_LOAD16_BYTE( "b14-69.80",   0x000000, 0x10000, CRC(d652e300) SHA1(b559bdb564d96da4c656dc7b2c88dae84c4861ae) )
662 	ROM_LOAD16_BYTE( "b14-70.81",   0x000001, 0x10000, CRC(b720592b) SHA1(13298b498a198dcc1a56e533d106545dd77e1bbc) )
663 
664 	ROM_REGION( 0x14000, "audiocpu", ROMREGION_ERASE00 ) // Z80 sound CPU
665 	ROM_LOAD( "b14-25.67",          0x000000, 0x10000, CRC(9eab28ef) SHA1(9a90f2c1881f4664d6d6241f3bc57faeaf150ffc) )
666 
667 	ROM_REGION( 0x8000, "motorcpu", 0 )
668 	ROM_LOAD( "27c256.ic17",   0x0000, 0x8000, CRC(e52dfee1) SHA1(6e58e18eb2de3c899b950a4307ea21cd23683657) )
669 
670 	ROM_REGION( 0x40000, "pc080sn", 0 ) // SCR tiles
671 	ROM_LOAD16_BYTE( "b14-06.52",   0x000000, 0x20000, CRC(b4e2536e) SHA1(c1960ee25b37b1444ec99082521c4858edcf3484) )
672 	ROM_LOAD16_BYTE( "b14-07.54",   0x000001, 0x20000, CRC(c6025fff) SHA1(439ed85b0160bfd6c06fd42990124a292b2e3c14) )
673 
674 	ROM_REGION( 0x200000, "sprites", 0 )
675 	ROM_LOAD64_BYTE( "b14-48.16",   0x000007, 0x20000, CRC(30c7f265) SHA1(3e52e2aabf2c456d0b57d9414f99bd942bafc887) ) // OBJ, bitplane 3
676 	ROM_LOAD64_BYTE( "b14-49.12",   0x100007, 0x20000, CRC(32ba4265) SHA1(f468243d923726b7eff78d9bc55a3a092f211a24) )
677 	ROM_LOAD64_BYTE( "b14-50.8",    0x000006, 0x20000, CRC(ec1ef311) SHA1(4cfa06aec9535f2044b763b071f73d23ca8ba354) )
678 	ROM_LOAD64_BYTE( "b14-51.4",    0x100006, 0x20000, CRC(35041c5f) SHA1(71602267736396516366a8abf535db82acaa1c23) )
679 
680 	ROM_LOAD64_BYTE( "b14-44.15",   0x000005, 0x20000, CRC(9f6c030e) SHA1(bb278fdcc29530685aa2e76da0712195f6ab0f5f) ) // OBJ, bitplane 2
681 	ROM_LOAD64_BYTE( "b14-45.11",   0x100005, 0x20000, CRC(63e4ce03) SHA1(92e3f45754676dd15691e48c0d37490c1a3ec328) )
682 	ROM_LOAD64_BYTE( "b14-46.7",    0x000004, 0x20000, CRC(d489adf2) SHA1(9f77916594d5ed05b79d7e8d8f534eb39f65edae) )
683 	ROM_LOAD64_BYTE( "b14-47.3",    0x100004, 0x20000, CRC(b3a1f75b) SHA1(050dd3313b5392d131c5a62c544260b83af0b8ab) )
684 
685 	ROM_LOAD64_BYTE( "b14-40.14",   0x000003, 0x20000, CRC(fa2a3cb3) SHA1(1e102ae6e916fda046a154b89056a18b724d51a3) ) // OBJ, bitplane 1
686 	ROM_LOAD64_BYTE( "b14-41.10",   0x100003, 0x20000, CRC(09455a14) SHA1(dc703e1f9c4f16e330796e9945799e1038ce503b) )
687 	ROM_LOAD64_BYTE( "b14-42.6",    0x000002, 0x20000, CRC(ab51f53c) SHA1(0ed9a2e607b0bd2b43b47e3ed29b00a8d8a09f25) )
688 	ROM_LOAD64_BYTE( "b14-43.2",    0x100002, 0x20000, CRC(1e6d2b38) SHA1(453cd818a6cd8b238c72cc880c811227609767b8) )
689 
690 	ROM_LOAD64_BYTE( "b14-36.13",   0x000001, 0x20000, CRC(20a7c1b8) SHA1(053c6b733a5c33b9259dfc754ce30a880905bb11) ) // OBJ, bitplane 0
691 	ROM_LOAD64_BYTE( "b14-37.9",    0x100001, 0x20000, CRC(801b703b) SHA1(dfbe276bd484815a7e69589eb56d54bc6e12e301) )
692 	ROM_LOAD64_BYTE( "b14-38.5",    0x000000, 0x20000, CRC(de0c213e) SHA1(1313b2051e906d22edb55f4d45d3a424b31ca2a2) )
693 	ROM_LOAD64_BYTE( "b14-39.1",    0x100000, 0x20000, CRC(798c28c5) SHA1(d2a8b9f84b3760f3800c5760ecee7ddcbafa6d6e) )
694 
695 	ROM_REGION( 0x10000, "user1", 0 ) // Zoom tables for zoom sprite h/w
696 	ROM_LOAD( "b14-30.88",          0x000000, 0x10000, CRC(dccb0c7f) SHA1(42f0af72f559133b74912a4478e1323062be4b77) )
697 
698 	ROM_REGION( 0x2000, "user2", 0 ) // Unknown (Sharp LH763J-70 64kx8 OTP ROM)
699 	ROM_LOAD( "b14-31.90",          0x000000, 0x02000, CRC(5c6b013d) SHA1(6d02d4560076213b6fb6fe856143bb533090603e) )
700 
701 	ROM_REGION( 0x10000, "adpcm_0", 0 ) // ADPCM samples
702 	ROM_LOAD( "b14-28.103",         0x000000, 0x10000, CRC(df11d0ae) SHA1(259e1e6cc7ab100bfdb60e3d7a6bb46acb6fe2ea) )
703 
704 	ROM_REGION( 0x10000, "adpcm_1", 0 ) // ADPCM samples
705 	ROM_LOAD( "b14-29.109",         0x000000, 0x10000, CRC(7ad983e7) SHA1(a3515caf93d6dab86de06ee52d6a13a456507dbe) )
706 ROM_END
707 
708 ROM_START( topspeedu )
709 	ROM_REGION( 0x100000, "maincpu", 0 ) // 128K for 68000 code (CPU A)
710 	ROM_LOAD16_BYTE     ( "b14-23", 0x00000, 0x10000, CRC(dd0307fd) SHA1(63218a707c78b3c785d1741dabdc511a76f12af1) )
711 	ROM_LOAD16_BYTE     ( "b14-24", 0x00001, 0x10000, CRC(acdf08d4) SHA1(506d48d27fc26684a3f884919665cf65a1b3062f) )
712 	ROM_LOAD16_WORD_SWAP( "b14-05", 0x80000, 0x80000, CRC(6557e9d8) SHA1(ff528b27fcaef5c181f5f3a56d6a41b935cf07e1) ) // Data ROM
713 
714 	ROM_REGION( 0x20000, "subcpu", 0 ) // 128K for 68000 code (CPU B)
715 	ROM_LOAD16_BYTE( "b14-26",      0x00000, 0x10000, CRC(659dc872) SHA1(0a168122fe6324510c830e21a56eace9c8a2c189) )
716 	ROM_LOAD16_BYTE( "b14-56",      0x00001, 0x10000, CRC(d165cf1b) SHA1(bfbb8699c5671d3841d4057678ef4085c1927684) )
717 
718 	ROM_REGION( 0x14000, "audiocpu", ROMREGION_ERASE00 ) // Z80 sound CPU
719 	ROM_LOAD( "b14-25.67",          0x00000, 0x10000, CRC(9eab28ef) SHA1(9a90f2c1881f4664d6d6241f3bc57faeaf150ffc) )
720 
721 	ROM_REGION( 0x8000, "motorcpu", 0 )
722 	ROM_LOAD( "27c256.ic17",   0x0000, 0x8000, CRC(e52dfee1) SHA1(6e58e18eb2de3c899b950a4307ea21cd23683657) )
723 
724 	ROM_REGION( 0x40000, "pc080sn", 0 ) // SCR tiles
725 	ROM_LOAD16_BYTE( "b14-06.52",   0x00000, 0x20000, CRC(b4e2536e) SHA1(c1960ee25b37b1444ec99082521c4858edcf3484) )
726 	ROM_LOAD16_BYTE( "b14-07.54",   0x00001, 0x20000, CRC(c6025fff) SHA1(439ed85b0160bfd6c06fd42990124a292b2e3c14) )
727 
728 	ROM_REGION( 0x200000, "sprites", 0 ) // OBJ: each rom has 1 bitplane, forming 16x8 tiles
729 	ROM_LOAD64_WORD_SWAP( "b14-01", 0x00000, 0x80000, CRC(84a56f37) SHA1(926bcae5bd75a4172de2a2078718b2940c5c1966) )
730 	ROM_LOAD64_WORD_SWAP( "b14-02", 0x00002, 0x80000, CRC(6889186b) SHA1(3c38e281e8bf416a401c76ebb2d8ca95d09974b6) )
731 	ROM_LOAD64_WORD_SWAP( "b14-03", 0x00004, 0x80000, CRC(d1ed9e71) SHA1(26a6b2ca5bf6d70ad87f5c40c8e94ec542a2ec04) )
732 	ROM_LOAD64_WORD_SWAP( "b14-04", 0x00006, 0x80000, CRC(b63f0519) SHA1(e9a6b49effba0cae1ae3536a8584d3efa34ca8c3) )
733 
734 	ROM_REGION( 0x10000, "user1", 0 ) // Zoom tables for zoom sprite h/w
735 	ROM_LOAD( "b14-30.88",          0x00000, 0x10000, CRC(dccb0c7f) SHA1(42f0af72f559133b74912a4478e1323062be4b77) )
736 
737 	ROM_REGION( 0x2000, "user2", 0 ) // Unknown (Sharp LH763J-70 64kx8 OTP ROM)
738 	ROM_LOAD( "b14-31.90",          0x00000, 0x02000, CRC(5c6b013d) SHA1(6d02d4560076213b6fb6fe856143bb533090603e) )
739 
740 	ROM_REGION( 0x10000, "adpcm_0", 0 ) // ADPCM samples
741 	ROM_LOAD( "b14-28.103",         0x00000, 0x10000, CRC(df11d0ae) SHA1(259e1e6cc7ab100bfdb60e3d7a6bb46acb6fe2ea) )
742 
743 	ROM_REGION( 0x10000, "adpcm_1", 0 ) // ADPCM samples
744 	ROM_LOAD( "b14-29.109",         0x00000, 0x10000, CRC(7ad983e7) SHA1(a3515caf93d6dab86de06ee52d6a13a456507dbe) )
745 ROM_END
746 
747 ROM_START( fullthrl )
748 	ROM_REGION( 0x100000, "maincpu", 0 ) // 128K for 68000 code (CPU A) - Later revision?
749 	ROM_LOAD16_BYTE     ( "b14-67", 0x00000, 0x10000, CRC(284c943f) SHA1(e4720b138052d9cbf1290aeca8f9dd7fe2cffcc5) )
750 	ROM_LOAD16_BYTE     ( "b14-68", 0x00001, 0x10000, CRC(54cf6196) SHA1(0e86a7bf7d43526222160f4cd09f8d29fa9abdc4) )
751 	ROM_LOAD16_WORD_SWAP( "b14-05", 0x80000, 0x80000, CRC(6557e9d8) SHA1(ff528b27fcaef5c181f5f3a56d6a41b935cf07e1) ) // Data ROM
752 
753 	ROM_REGION( 0x20000, "subcpu", 0 ) // 128K for 68000 code (CPU B)
754 	ROM_LOAD16_BYTE( "b14-69.80",   0x00000, 0x10000, CRC(d652e300) SHA1(b559bdb564d96da4c656dc7b2c88dae84c4861ae) )
755 	ROM_LOAD16_BYTE( "b14-71",      0x00001, 0x10000, CRC(f7081727) SHA1(f0ab6ce9975dd7a1fadd439fd3dfd2f1bf88796c) )
756 
757 	ROM_REGION( 0x14000, "audiocpu", ROMREGION_ERASE00 ) // Z80 sound CPU
758 	ROM_LOAD( "b14-25.67",          0x00000, 0x10000, CRC(9eab28ef) SHA1(9a90f2c1881f4664d6d6241f3bc57faeaf150ffc) )
759 
760 	ROM_REGION( 0x8000, "motorcpu", 0 )
761 	ROM_LOAD( "27c256.ic17",   0x0000, 0x8000, CRC(e52dfee1) SHA1(6e58e18eb2de3c899b950a4307ea21cd23683657) )
762 
763 	ROM_REGION( 0x40000, "pc080sn", 0 ) // SCR tiles
764 	ROM_LOAD16_BYTE( "b14-06.52",   0x00000, 0x20000, CRC(b4e2536e) SHA1(c1960ee25b37b1444ec99082521c4858edcf3484) )
765 	ROM_LOAD16_BYTE( "b14-07.54",   0x00001, 0x20000, CRC(c6025fff) SHA1(439ed85b0160bfd6c06fd42990124a292b2e3c14) )
766 
767 	ROM_REGION( 0x200000, "sprites", 0 ) // OBJ: each rom has 1 bitplane, forming 16x8 tiles
768 	ROM_LOAD64_WORD_SWAP( "b14-01", 0x00000, 0x80000, CRC(84a56f37) SHA1(926bcae5bd75a4172de2a2078718b2940c5c1966) )
769 	ROM_LOAD64_WORD_SWAP( "b14-02", 0x00002, 0x80000, CRC(6889186b) SHA1(3c38e281e8bf416a401c76ebb2d8ca95d09974b6) )
770 	ROM_LOAD64_WORD_SWAP( "b14-03", 0x00004, 0x80000, CRC(d1ed9e71) SHA1(26a6b2ca5bf6d70ad87f5c40c8e94ec542a2ec04) )
771 	ROM_LOAD64_WORD_SWAP( "b14-04", 0x00006, 0x80000, CRC(b63f0519) SHA1(e9a6b49effba0cae1ae3536a8584d3efa34ca8c3) )
772 
773 	ROM_REGION( 0x10000, "user1", 0 ) // Zoom tables for zoom sprite h/w
774 	ROM_LOAD( "b14-30.88",          0x00000, 0x10000, CRC(dccb0c7f) SHA1(42f0af72f559133b74912a4478e1323062be4b77) )
775 
776 	ROM_REGION( 0x2000, "user2", 0 ) // Unknown (Sharp LH763J-70 64kx8 OTP ROM)
777 	ROM_LOAD( "b14-31.90",          0x00000, 0x02000, CRC(5c6b013d) SHA1(6d02d4560076213b6fb6fe856143bb533090603e) )
778 
779 	ROM_REGION( 0x10000, "adpcm_0", 0 ) // ADPCM samples
780 	ROM_LOAD( "b14-28.103",         0x00000, 0x10000, CRC(df11d0ae) SHA1(259e1e6cc7ab100bfdb60e3d7a6bb46acb6fe2ea) )
781 
782 	ROM_REGION( 0x10000, "adpcm_1", 0 ) // ADPCM samples
783 	ROM_LOAD( "b14-29.109",         0x00000, 0x10000, CRC(7ad983e7) SHA1(a3515caf93d6dab86de06ee52d6a13a456507dbe) )
784 ROM_END
785 
786 
787 GAMEL( 1987, topspeed,  0,        topspeed, topspeed, topspeed_state, empty_init, ROT0, "Taito Corporation Japan",                     "Top Speed (World)",     MACHINE_SUPPORTS_SAVE, layout_topspeed )
788 GAMEL( 1987, topspeedu, topspeed, topspeed, fullthrl, topspeed_state, empty_init, ROT0, "Taito America Corporation (Romstar license)", "Top Speed (US)",        MACHINE_SUPPORTS_SAVE, layout_topspeed )
789 GAMEL( 1987, fullthrl,  topspeed, topspeed, fullthrl, topspeed_state, empty_init, ROT0, "Taito Corporation",                           "Full Throttle (Japan)", MACHINE_SUPPORTS_SAVE, layout_topspeed )
790