1 /*
2 To Do:
3 - get sound working
4 - map and test any remaining input ports
5 
6 Looping
7 (C)1981 Venture Line
8 
9 	Main CPU
10 		TMS9995
11 
12 	COP420 Microcontroller
13 		manages CPU communnication?
14 
15 	Sound CPU
16 		TMS9980
17 		AY-3-8910
18 		TMS5220 (SPEECH)
19 
20 ---------------------------------------------------------------
21 
22 Sky Bumper
23 (C)1982 Venture Line
24 
25 	This is a ROM swap for Looping.  There are two 6116's on
26 	the CPU board, where there is only one on Looping.
27 
28 ---------------------------------------------------------------
29 
30 Super Tank
31 (C)19?? Venture Line
32 
33 Runs on simpler hardware; not yet emulated.
34 
35 ===============================================================
36 
37 LOOPING CHIP PLACEMENT
38 
39 THERE ARE AT LEAST TWO VERSIONS OF THIS GAME
40 VERSION NUMBERS FOR THIS PURPOSE ARE CHOSEN AT RANDOM
41 
42 IC NAME   POSITION   BOARD  TYPE   IC NAME  POSITION  TYPE
43 VER-1                         VER-2
44 ---------------------------------------------------------------
45 LOS-2-7   13A        I/O    2532    SAME    13A       2532
46 LOS-1-1-2 11A         "      "      SAME    11A        "
47 LOS-3-1   13C         "      "      I-O-V2  13C        "
48 
49 VLI1      2A         ROM    2764    VLI-7-1 2A         "
50 VLI3      5A          "      "      VLI-7-2 4A         "
51 VLI9-5    8A          "      "      VLI-4-3 5A         "
52 L056-6    9A          "      "      VLI-8-4 7A         "
53                       "             LO56-5  8A         "
54                       "             LO56-6  9A         "
55                       "             VLI-8-7 10A        "
56                   ON RIBBON CABLE   18S030  11B				color prom?
57                      REAR BD      LOG.1-9-3 6A        2716	tiles
58                                   LOG.3     8A         "	tiles
59 */
60 
61 #include "driver.h"
62 #include "vidhrdw/generic.h"
63 
64 static struct tilemap *tilemap;
65 
PALETTE_INIT(looping)66 PALETTE_INIT( looping )
67 {
68 	int i;
69 	for (i = 0;i < 0x20;i++)
70 	{
71 		int bit0,bit1,bit2,r,g,b;
72 
73 		/* red component */
74 		bit0 = (*color_prom >> 0) & 0x01;
75 		bit1 = (*color_prom >> 1) & 0x01;
76 		bit2 = (*color_prom >> 2) & 0x01;
77 		r = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2;
78 		/* green component */
79 		bit0 = (*color_prom >> 3) & 0x01;
80 		bit1 = (*color_prom >> 4) & 0x01;
81 		bit2 = (*color_prom >> 5) & 0x01;
82 		g = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2;
83 		/* blue component */
84 		bit0 = (*color_prom >> 6) & 0x01;
85 		bit1 = (*color_prom >> 7) & 0x01;
86 		b = 0x4f * bit0 + 0xa8 * bit1;
87 
88 		palette_set_color(i,r,g,b);
89 		color_prom++;
90 	}
91 }
92 
get_tile_info(int offset)93 static void get_tile_info( int offset )
94 {
95 	int tile_number = videoram[offset];
96 	int color = colorram[(offset&0x1f)*2+1]&0x7;
97 	SET_TILE_INFO(
98 			0,
99 			tile_number,
100 			color,
101 			0)
102 }
103 
WRITE_HANDLER(looping_flip_screen_x_w)104 WRITE_HANDLER( looping_flip_screen_x_w )
105 {
106 	flip_screen_x_set(~data & 0x01);
107 }
108 
WRITE_HANDLER(looping_flip_screen_y_w)109 WRITE_HANDLER( looping_flip_screen_y_w )
110 {
111 	flip_screen_y_set(~data & 0x01);
112 }
113 
WRITE_HANDLER(looping_colorram_w)114 WRITE_HANDLER( looping_colorram_w )
115 {
116 	int i,offs;
117 	if( colorram[offset]!=data )
118 	{
119 		colorram[offset] = data;
120 		if( offset&1 )
121 		{
122 			/* odd bytes are column color attribute */
123 			offs = (offset/2);
124 			/* mark the whole column dirty */
125 			for( i=0; i<0x20; i++ )
126 			{
127 				tilemap_mark_tile_dirty( tilemap, offs );
128 				offs += 0x20;
129 			}
130 		}
131 		else
132 		{
133 			/* even bytes are column scroll */
134 			tilemap_set_scrolly( tilemap,offset/2,data );
135 		}
136 	}
137 }
138 
VIDEO_START(looping)139 VIDEO_START( looping )
140 {
141 	tilemap = tilemap_create( get_tile_info,tilemap_scan_rows,TILEMAP_OPAQUE,8,8,32,32 );
142 	if( tilemap )
143 	{
144 		tilemap_set_scroll_cols( tilemap, 0x20 );
145 		return 0;
146 	}
147 	return -1;
148 }
149 
WRITE_HANDLER(looping_videoram_w)150 WRITE_HANDLER( looping_videoram_w )
151 {
152 	if( videoram[offset]!=data )
153 	{
154 		videoram[offset] = data;
155 		tilemap_mark_tile_dirty( tilemap, offset );
156 	}
157 }
158 
draw_sprites(struct mame_bitmap * bitmap,const struct rectangle * cliprect)159 static void draw_sprites( struct mame_bitmap *bitmap, const struct rectangle *cliprect )
160 {
161 	const UINT8 *source = spriteram;
162 	const UINT8 *finish = source + 0x10*4; /* ? */
163 
164 	UINT8 sx, sy;
165 	int flipx, flipy, code, color;
166 
167 	while( source < finish )
168 	{
169 		sx = source[3];
170 		sy = source[0];
171 		flipx = source[1] & 0x40;
172 		flipy = source[1] & 0x80;
173 		code  = source[1] & 0x3f;
174 		color = source[2];
175 
176 		if (flip_screen_x)
177 		{
178 			sx = 240 - sx;
179 			flipx = !flipx;
180 		}
181 
182 		if (flip_screen_y)
183 		{
184 			flipy = !flipy;
185 		}
186 		else
187 		{
188 			sy = 240 - sy;
189 		}
190 
191 		drawgfx( bitmap, Machine->gfx[1],
192 				code, color,
193 				flipx, flipy,
194 				sx, sy,
195 				&Machine->visible_area,
196 				TRANSPARENCY_PEN, 0 );
197 
198 		source += 4;
199 	}
200 }
201 
VIDEO_UPDATE(looping)202 VIDEO_UPDATE( looping )
203 {
204 	tilemap_draw( bitmap,cliprect,tilemap,0,0 );
205 	draw_sprites( bitmap,cliprect );
206 }
207 
WRITE_HANDLER(looping_intack)208 WRITE_HANDLER( looping_intack )
209 {
210 	if (data==0)
211 	{
212 		cpu_irq_line_vector_w(0, 0, 4);
213 		cpu_set_irq_line(0, 0, CLEAR_LINE);
214 	}
215 }
216 
INTERRUPT_GEN(looping_interrupt)217 INTERRUPT_GEN( looping_interrupt )
218 {
219 	cpu_irq_line_vector_w(0, 0, 4);
220 	cpu_set_irq_line(0, 0, ASSERT_LINE);
221 }
222 
223 /****** sound *******/
224 
WRITE_HANDLER(looping_soundlatch_w)225 WRITE_HANDLER( looping_soundlatch_w )
226 {
227 	soundlatch_w(offset, data);
228 	cpu_irq_line_vector_w(1, 0, 4);
229 	cpu_set_irq_line(1, 0, ASSERT_LINE);
230 }
231 
WRITE_HANDLER(looping_souint_clr)232 WRITE_HANDLER( looping_souint_clr )
233 {
234 	if (data==0)
235 	{
236 		cpu_irq_line_vector_w(1, 0, 4);
237 		cpu_set_irq_line(1, 0, CLEAR_LINE);
238 	}
239 }
240 
looping_spcint(int state)241 void looping_spcint(int state)
242 {
243 	cpu_irq_line_vector_w(1, 0, 6);
244 	cpu_set_irq_line(1, 0, state);
245 }
246 
WRITE_HANDLER(looping_sound_sw)247 WRITE_HANDLER( looping_sound_sw )
248 {
249 	/* this can be improved by adding the missing
250 	   signals for decay etc. (see schematics) */
251 	static int r[8];
252 	r[offset]=data^1;
253 	DAC_data_w(0, ((r[1]<<7) + (r[2]<<6))*r[6]);
254 }
255 
MEMORY_READ_START(looping_readmem)256 static MEMORY_READ_START( looping_readmem )
257 	{ 0x0000, 0x7fff, MRA_ROM },
258 /*	{ 0x9000, 0x9fff, MRA_RAM }, videoram is write only? */
259 	{ 0xe000, 0xefff, MRA_RAM },
260 	{ 0xf800, 0xf800, input_port_0_r },	/* inp */
261 	{ 0xf801, 0xf801, input_port_1_r },
262 	{ 0xf802, 0xf802, input_port_2_r },	/* dsw */
263 MEMORY_END
264 
265 static MEMORY_WRITE_START( looping_writemem )
266 	{ 0x0000, 0x7fff, MWA_ROM },
267 	{ 0x9000, 0x93ff, looping_videoram_w, &videoram },
268 	{ 0x9800, 0x983f, looping_colorram_w, &colorram },
269 	{ 0x9840, 0x987f, MWA_RAM, &spriteram },
270 	{ 0xe000, 0xefff, MWA_RAM },
271 	{ 0xb006, 0xb006, looping_flip_screen_x_w },
272 	{ 0xb007, 0xb007, looping_flip_screen_y_w },
273 	{ 0xf801, 0xf801, looping_soundlatch_w },
274 MEMORY_END
275 
276 static PORT_WRITE_START( looping_writeport)
277 	{ 0x000, 0x000, MWA_NOP },
278 	{ 0x406, 0x406, looping_intack },
279 	{ 0x407, 0x407, watchdog_reset_w },
280 PORT_END
281 
282 static MEMORY_READ_START( looping_io_readmem )
283 	{ 0x0000, 0x37ff, MRA_ROM },
284 	{ 0x3800, 0x3bff, MRA_RAM },
285 	{ 0x3c00, 0x3c00, AY8910_read_port_0_r },
286 	{ 0x3e02, 0x3e02, tms5220_status_r },
287 MEMORY_END
288 
289 static MEMORY_WRITE_START( looping_io_writemem )
290 	{ 0x0000, 0x37ff, MWA_ROM },
291 	{ 0x3800, 0x3bff, MWA_RAM },
292 	{ 0x3c00, 0x3c00, AY8910_control_port_0_w },
293 	{ 0x3c02, 0x3c02, AY8910_write_port_0_w },
294 	{ 0x3e00, 0x3e00, tms5220_data_w },
295 MEMORY_END
296 
297 static PORT_WRITE_START( looping_io_writeport)
298 	{ 0x000, 0x000, looping_souint_clr },
299 	{ 0x001, 0x007, looping_sound_sw },
300 PORT_END
301 
302 static struct GfxLayout tile_layout =
303 {
304 	8,8,		/* 8*8 characters */
305 	0x100,		/* number of characters */
306 	2,			/* 2 bits per pixel */
307 	{ 0,0x800*8 },
308 	{ 0, 1, 2, 3, 4, 5, 6, 7 },
309 	{ 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8 },
310 	8*8
311 };
312 
313 static struct GfxLayout sprite_layout =
314 {
315 	16,16,		/* 8*8 characters */
316 	0x40,		/* number of characters */
317 	2,			/* 2 bits per pixel */
318 	{ 0,0x800*8 },
319 	{
320 		0, 1, 2, 3, 4, 5, 6, 7,
321 		64+0, 64+1, 64+2, 64+3, 64+4, 64+5, 64+6, 64+7
322 	},
323 	{
324 		0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8,
325 		128+0*8, 128+1*8, 128+2*8, 128+3*8, 128+4*8, 128+5*8, 128+6*8, 128+7*8
326 	},
327 	8*8*4
328 };
329 
330 static struct GfxDecodeInfo looping_gfxdecodeinfo[] =
331 {
332 	{ REGION_GFX1, 0, &tile_layout,		0, 8 },
333 	{ REGION_GFX1, 0, &sprite_layout,	0, 8 },
334 	{ -1 }
335 };
336 
337 static struct TMS5220interface tms5220_interface =
338 {
339 	640000,         /* clock speed (80*samplerate) */
340 	50,             /* volume */
341 	looping_spcint  /* IRQ handler */
342 };
343 
344 static struct AY8910interface ay8910_interface =
345 {
346 	1,
347 	2000000,
348 	{ 20 },
349 	{ soundlatch_r },
350 	{ 0 },
351 	{ 0 },
352 	{ 0 }
353 };
354 
355 static struct DACinterface dac_interface =
356 {
357 	1,
358 	{ 30 }
359 };
360 
361 static MACHINE_DRIVER_START( looping )
362 
363 	/* basic machine hardware */
364 	MDRV_CPU_ADD(TMS9995, 3000000) /* ? */
MDRV_CPU_MEMORY(looping_readmem,looping_writemem)365 	MDRV_CPU_MEMORY(looping_readmem,looping_writemem)
366 	MDRV_CPU_PORTS(0,looping_writeport)
367 	MDRV_CPU_VBLANK_INT(looping_interrupt,1)
368 
369 	MDRV_CPU_ADD(TMS9980, 2000000) /* ?*/
370 	MDRV_CPU_MEMORY(looping_io_readmem,looping_io_writemem)
371 	MDRV_CPU_PORTS(0,looping_io_writeport)
372 
373 	MDRV_FRAMES_PER_SECOND(60)
374 	MDRV_VBLANK_DURATION(2500)
375 
376 	/* video hardware */
377 	MDRV_VIDEO_ATTRIBUTES(VIDEO_TYPE_RASTER)
378 	MDRV_SCREEN_SIZE(32*8, 32*8)
379 	MDRV_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1)
380 	MDRV_GFXDECODE(looping_gfxdecodeinfo)
381 	MDRV_PALETTE_LENGTH(32)
382 	MDRV_COLORTABLE_LENGTH(32)
383 
384 	MDRV_PALETTE_INIT(looping)
385 	MDRV_VIDEO_START(looping)
386 	MDRV_VIDEO_UPDATE(looping)
387 
388 	/* sound hardware */
389 	MDRV_SOUND_ADD(AY8910, ay8910_interface)
390 	MDRV_SOUND_ADD(TMS5220, tms5220_interface)
391 	MDRV_SOUND_ADD(DAC, dac_interface)
392 MACHINE_DRIVER_END
393 
394 
395 
396 INPUT_PORTS_START( looping )
397 	PORT_START
398 	PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_UP )
399 	PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN )
400 	PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON1 ) /* shoot */
401 	PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_START1 )
402 	PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_START2 )
403 	PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 ) /* accel? */
404 	PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_COIN1 )
405 	PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_COIN2 )
406 
407 	PORT_START /* cocktail? */
408 	PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_UP | IPF_COCKTAIL )
409 	PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN | IPF_COCKTAIL )
410 	PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON1 | IPF_COCKTAIL )
411 	PORT_BIT( 0x18, IP_ACTIVE_LOW, IPT_UNUSED )
412 	PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 | IPF_COCKTAIL )
413 	PORT_BIT( 0xc0, IP_ACTIVE_LOW, IPT_UNUSED )
414 
415 	PORT_START
416 	PORT_DIPNAME( 0x01, 0x01, DEF_STR( Coin_B ) )
417 	PORT_DIPSETTING(    0x00, DEF_STR( 2C_1C ) )
418 	PORT_DIPSETTING(    0x01, DEF_STR( 1C_1C ) )
419 	PORT_DIPNAME( 0x0e, 0x02, DEF_STR( Coin_A ) )
420 	PORT_DIPSETTING(    0x02, DEF_STR( 1C_1C ) )
421 	PORT_DIPSETTING(    0x04, DEF_STR( 1C_2C ) )
422 	PORT_DIPSETTING(    0x06, DEF_STR( 1C_3C ) )
423 	PORT_DIPSETTING(    0x08, DEF_STR( 1C_4C ) )
424 	PORT_DIPSETTING(    0x0a, DEF_STR( 1C_5C ) )
425 	PORT_DIPSETTING(    0x0c, DEF_STR( 1C_6C ) )
426 	PORT_DIPSETTING(    0x0e, DEF_STR( 1C_7C ) )
427 	PORT_DIPSETTING(    0x00, "1 Coin/10 Credits" )
428 	PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) )		/* Check code at 0x2c00*/
429 	PORT_DIPSETTING(	0x00, DEF_STR( No ) )
430 	PORT_DIPSETTING(	0x10, DEF_STR( Yes ) )
431 	PORT_DIPNAME( 0x20, 0x00, DEF_STR( Lives ) )
432 	PORT_DIPSETTING(    0x00, "3" )
433 	PORT_DIPSETTING(    0x20, "5" )
434 	PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNUSED )
435 	PORT_DIPNAME( 0x80, 0x80, DEF_STR( Cabinet ) )
436 	PORT_DIPSETTING(    0x80, DEF_STR( Upright ) )
437 	PORT_DIPSETTING(    0x00, DEF_STR( Cocktail ) )
438 INPUT_PORTS_END
439 
440 /* Same as 'looping' but additional "Infinite Lives" Dip Switch */
441 INPUT_PORTS_START( skybump )
442 	PORT_START
443 	PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_UP )
444 	PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN )
445 	PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON1 ) /* shoot */
446 	PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_START1 )
447 	PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_START2 )
448 	PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 ) /* accel? */
449 	PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_COIN1 )
450 	PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_COIN2 )
451 
452 	PORT_START /* cocktail? */
453 	PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_UP | IPF_COCKTAIL )
454 	PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN | IPF_COCKTAIL )
455 	PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON1 | IPF_COCKTAIL )
456 	PORT_BIT( 0x18, IP_ACTIVE_LOW, IPT_UNUSED )
457 	PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 | IPF_COCKTAIL )
458 	PORT_BIT( 0xc0, IP_ACTIVE_LOW, IPT_UNUSED )
459 
460 	PORT_START
461 	PORT_DIPNAME( 0x01, 0x01, DEF_STR( Coin_B ) )
462 	PORT_DIPSETTING(    0x00, DEF_STR( 2C_1C ) )
463 	PORT_DIPSETTING(    0x01, DEF_STR( 1C_1C ) )
464 	PORT_DIPNAME( 0x0e, 0x02, DEF_STR( Coin_A ) )
465 	PORT_DIPSETTING(    0x02, DEF_STR( 1C_1C ) )
466 	PORT_DIPSETTING(    0x04, DEF_STR( 1C_2C ) )
467 	PORT_DIPSETTING(    0x06, DEF_STR( 1C_3C ) )
468 	PORT_DIPSETTING(    0x08, DEF_STR( 1C_4C ) )
469 	PORT_DIPSETTING(    0x0a, DEF_STR( 1C_5C ) )
470 	PORT_DIPSETTING(    0x0c, DEF_STR( 1C_6C ) )
471 	PORT_DIPSETTING(    0x0e, DEF_STR( 1C_7C ) )
472 	PORT_DIPSETTING(    0x00, "1 Coin/10 Credits" )
473 	PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) )		/* Check code at 0x2c00*/
474 	PORT_DIPSETTING(	0x00, DEF_STR( No ) )
475 	PORT_DIPSETTING(	0x10, DEF_STR( Yes ) )
476 	PORT_DIPNAME( 0x60, 0x40, DEF_STR( Lives ) )
477 	PORT_DIPSETTING(    0x40, "3" )
478 	PORT_DIPSETTING(    0x60, "5" )
479 	PORT_BITX( 0,       0x00, IPT_DIPSWITCH_SETTING | IPF_CHEAT, "Infinite", IP_KEY_NONE, IP_JOY_NONE )
480 /*	PORT_BITX( 0,       0x20, IPT_DIPSWITCH_SETTING | IPF_CHEAT, "Infinite", IP_KEY_NONE, IP_JOY_NONE )*/
481 	PORT_DIPNAME( 0x80, 0x80, DEF_STR( Cabinet ) )
482 	PORT_DIPSETTING(    0x80, DEF_STR( Upright ) )
483 	PORT_DIPSETTING(    0x00, DEF_STR( Cocktail ) )
484 INPUT_PORTS_END
485 
486 ROM_START( loopinga )
487 	ROM_REGION( 0x10000, REGION_CPU1, 0 ) /* 64k for TMS9995 code */
488 	ROM_LOAD( "vli3.5a",		0x0000, 0x2000, CRC(1ac3ccdf) SHA1(9d1cde8bd4d0f12eaf06225b3ecc4a5c3e4f0c11) )
489 	ROM_LOAD( "vli-4-3",		0x2000, 0x1000, CRC(f32cae2b) SHA1(2c6ef82af438e588b56fd58b95cf969c97bb9a66) )
490 	ROM_LOAD( "vli-8-4",		0x3000, 0x1000, CRC(611e1dbf) SHA1(0ab6669f1dec30c3f7bca49e158e4790a78fa308) )
491 	ROM_LOAD( "l056-6.9a",		0x4000, 0x2000, CRC(548afa52) SHA1(0b88ac7394feede023519c585a4084591eb9661a) )
492 	ROM_LOAD( "vli9-5.8a",		0x6000, 0x2000, CRC(5d122f86) SHA1(d1c66b890142bb4d4648f3edec6567f58107dbf0) )
493 
494 	ROM_REGION( 0x10000, REGION_CPU2, 0 ) /* 64k for TMS9980 code */
495 	ROM_LOAD( "i-o-v2.13c",		0x0000, 0x0800, CRC(09765ebe) SHA1(93b035c3a94f2f6d5e463256e26b600a4dd5d3ea) )
496     ROM_LOAD( "i-o.13a",		0x0800, 0x1000, CRC(1de29f25) SHA1(535acb132266d6137b0610ee9a9b946459ae44af) ) /* speech */
497 	ROM_LOAD( "i-o.11a",		0x2800, 0x1000, CRC(61c74c79) SHA1(9f34d18a919446dd76857b851cea23fc1526f3c2) )
498 
499 	ROM_REGION( 0x1000, REGION_CPU3, 0 ) /* COP420 microcontroller code */
500 	ROM_LOAD( "cop.bin",		0x0000, 0x1000, CRC(bbfd26d5) SHA1(5f78b32b6e7c003841ef5b635084db2cdfebf0e1) )
501 
502 	ROM_REGION( 0x1000, REGION_GFX1, ROMREGION_DISPOSE )
503 	ROM_LOAD( "log1-9-3.6a",	0x0000, 0x800, CRC(c434c14c) SHA1(3669aaf7adc6b250378bcf62eb8e7058f55476ef) )
504 	ROM_LOAD( "log2.8a",		0x0800, 0x800, CRC(ef3284ac) SHA1(8719c9df8c972a56c306b3c707aaa53092ffa2d6) )
505 
506 	ROM_REGION( 0x0020, REGION_PROMS, 0 ) /* color prom */
507 	ROM_LOAD( "18s030.11b",		0x0000, 0x0020, CRC(6a0c7d87) SHA1(140335d85c67c75b65689d4e76d29863c209cf32) )
508 ROM_END
509 
510 ROM_START( looping )
511 	ROM_REGION( 0x10000, REGION_CPU1, 0 ) /* 64k for TMS9995 code */
512 	ROM_LOAD( "vli3.5a",		0x0000, 0x2000, CRC(1ac3ccdf) SHA1(9d1cde8bd4d0f12eaf06225b3ecc4a5c3e4f0c11) )
513 	ROM_LOAD( "vli1.2a",		0x2000, 0x2000, CRC(97755fd4) SHA1(4a6ef02b0128cd516ff95083a7caaad8f3756f09) )
514 	ROM_LOAD( "l056-6.9a",		0x4000, 0x2000, CRC(548afa52) SHA1(0b88ac7394feede023519c585a4084591eb9661a) )
515 	ROM_LOAD( "vli9-5.8a",		0x6000, 0x2000, CRC(5d122f86) SHA1(d1c66b890142bb4d4648f3edec6567f58107dbf0) )
516 
517 	ROM_REGION( 0x10000, REGION_CPU2, 0 ) /* 64k for TMS9980 code */
518 	ROM_LOAD( "i-o.13c",		0x0000, 0x0800, CRC(21e9350c) SHA1(f30a180309e373a17569351944f5e7982c3b3f9d) )
519 	ROM_LOAD( "i-o.13a",		0x0800, 0x1000, CRC(1de29f25) SHA1(535acb132266d6137b0610ee9a9b946459ae44af) )
520 	ROM_LOAD( "i-o.11a",		0x2800, 0x1000, CRC(61c74c79) SHA1(9f34d18a919446dd76857b851cea23fc1526f3c2) ) /* speech */
521 
522 	ROM_REGION( 0x1000, REGION_CPU3, 0 ) /* COP420 microcontroller code */
523 	ROM_LOAD( "cop.bin",		0x0000, 0x1000, CRC(bbfd26d5) SHA1(5f78b32b6e7c003841ef5b635084db2cdfebf0e1) )
524 
525 	ROM_REGION( 0x1000, REGION_GFX1, ROMREGION_DISPOSE )
526 	ROM_LOAD( "log1-9-3.6a",	0x0000, 0x800, CRC(c434c14c) SHA1(3669aaf7adc6b250378bcf62eb8e7058f55476ef) )
527 	ROM_LOAD( "log2.8a",		0x0800, 0x800, CRC(ef3284ac) SHA1(8719c9df8c972a56c306b3c707aaa53092ffa2d6) )
528 
529 	ROM_REGION( 0x0020, REGION_PROMS, 0 ) /* color prom */
530 	ROM_LOAD( "18s030.11b",		0x0000, 0x0020, CRC(6a0c7d87) SHA1(140335d85c67c75b65689d4e76d29863c209cf32) )
531 ROM_END
532 
533 ROM_START( skybump )
534 	ROM_REGION( 0x10000, REGION_CPU1, 0 ) /* 64k for TMS9995 code */
535 	ROM_LOAD( "cpu.5a",			0x0000, 0x2000, CRC(dca38df0) SHA1(86abe04cbabf81399f842f53668fe7a3f7ed3757) )
536 	ROM_LOAD( "cpu.2a",			0x2000, 0x2000, CRC(6bcc211a) SHA1(245ebae3934df9c3920743a941546d96bb2e7c03) )
537 	ROM_LOAD( "cpu.9a",			0x4000, 0x2000, CRC(c7a50797) SHA1(60aa0a28ba970f12d0a0e538ae1c6807d105855c) )
538 	ROM_LOAD( "cpu.8a",			0x6000, 0x2000, CRC(a718c6f2) SHA1(19afa8c353829232cb96c27b87f13b43166ab6fc) )
539 
540     ROM_REGION( 0x10000, REGION_CPU2, 0 ) /* 64k for TMS9980 code */
541 	ROM_LOAD( "snd.13c",		0x0000, 0x0800, CRC(21e9350c) SHA1(f30a180309e373a17569351944f5e7982c3b3f9d) )
542 	ROM_LOAD( "snd.13a",		0x0800, 0x1000, CRC(1de29f25) SHA1(535acb132266d6137b0610ee9a9b946459ae44af) )
543 	ROM_LOAD( "snd.11a",		0x2800, 0x1000, CRC(61c74c79) SHA1(9f34d18a919446dd76857b851cea23fc1526f3c2) )
544 
545 	ROM_REGION( 0x1000, REGION_CPU3, 0 ) /* COP420 microcontroller code */
546 	ROM_LOAD( "cop.bin",		0x0000, 0x1000, CRC(bbfd26d5) SHA1(5f78b32b6e7c003841ef5b635084db2cdfebf0e1) )
547 
548 	ROM_REGION( 0x1000, REGION_GFX1, ROMREGION_DISPOSE )
549 	ROM_LOAD( "vid.6a",			0x0000, 0x800, CRC(12ebbe74) SHA1(0f87c81a45d1bf3b8c6a70ee5e1a014069f67755) )
550 	ROM_LOAD( "vid.8a",			0x0800, 0x800, CRC(459ccc55) SHA1(747f6789605b48be9e22f779f9e3f6c98ad4e594) )
551 
552 	ROM_REGION( 0x0020, REGION_PROMS, 0 ) /* color prom */
553 	ROM_LOAD( "vid.clr",		0x0000, 0x0020, CRC(6a0c7d87) SHA1(140335d85c67c75b65689d4e76d29863c209cf32) )
554 ROM_END
555 
556 DRIVER_INIT( looping ){
557 	/* unscramble the TMS9995 ROMs */
558 	UINT8 *pMem = memory_region( REGION_CPU1 );
559 	UINT8 raw,code;
560 	int i;
561 	for( i=0; i<0x8000; i++ )
562 	{
563 		raw = pMem[i];
564 		code = 0;
565 		if( raw&0x01 ) code |= 0x80;
566 		if( raw&0x02 ) code |= 0x40;
567 		if( raw&0x04 ) code |= 0x20;
568 		if( raw&0x08 ) code |= 0x10;
569 		if( raw&0x10 ) code |= 0x08;
570 		if( raw&0x20 ) code |= 0x04;
571 		if( raw&0x40 ) code |= 0x02;
572 		if( raw&0x80 ) code |= 0x01;
573 		pMem[i] = code;
574 	}
575 }
576 
577 /*          rom       parent    machine   inp       init */
578 GAME( 1982, looping,  0,        looping, looping, looping, ROT90, "Venture Line", "Looping (set 1)" )
579 GAME( 1982, loopinga, looping,  looping, looping, looping, ROT90, "Venture Line", "Looping (set 2)" )
580 GAME( 1982, skybump,  0,        looping, skybump, looping, ROT90, "Venture Line", "Sky Bumper" )
581