1 /*******************************************************************************
2 
3 	Pro Soccer						(c) 1983 Data East Corporation
4 	Pro Sport						(c) 1983 Data East Corporation
5 	Boomer Rang'R / Genesis			(c) 1983 Data East Corporation
6 	Kamikaze Cabbie / Yellow Cab	(c) 1984 Data East Corporation
7 	Liberation						(c) 1984 Data East Corporation
8 
9 	Liberation was available on two pcbs - a dedicated twin pcb set and
10 	a version on the Genesis/Yellow Cab pcb that had an extra cpu pcb attached
11 	for the different protection.  The program is the same on both versions.
12 
13 	Emulation by Bryan McPhail, mish@tendril.co.uk
14 
15 *******************************************************************************/
16 
17 #include "driver.h"
18 #include "vidhrdw/generic.h"
19 #include "cpu/m6502/m6502.h"
20 
21 PALETTE_INIT( liberate );
22 VIDEO_UPDATE( prosoccr );
23 VIDEO_UPDATE( prosport );
24 VIDEO_UPDATE( liberate );
25 VIDEO_UPDATE( boomrang );
26 VIDEO_START( prosoccr );
27 VIDEO_START( prosport );
28 VIDEO_START( boomrang );
29 VIDEO_START( liberate );
30 
31 static int deco16_bank;
32 static data8_t *scratchram;
33 
34 WRITE_HANDLER( deco16_io_w );
35 WRITE_HANDLER( prosport_paletteram_w );
36 WRITE_HANDLER( liberate_videoram_w );
37 
38 /***************************************************************************/
39 
READ_HANDLER(deco16_bank_r)40 static READ_HANDLER( deco16_bank_r )
41 {
42 	const data8_t *ROM = memory_region(REGION_USER1);
43 
44 	/* The tilemap bank can be swapped into main memory */
45 	if (deco16_bank)
46 		return ROM[offset];
47 
48 	/* Else the handler falls through to read the usual address */
49 	if (offset<0x800) return videoram[offset];
50 	if (offset<0x1000) return spriteram[offset-0x800];
51 	if (offset<0x2200) { log_cb(RETRO_LOG_DEBUG, LOGPRE "%04x: Unmapped bank read %04x\n",activecpu_get_pc(),offset); return 0; }
52 	if (offset<0x2800) return scratchram[offset-0x2200];
53 
54 	log_cb(RETRO_LOG_DEBUG, LOGPRE "%04x: Unmapped bank read %04x\n",activecpu_get_pc(),offset);
55 	return 0;
56 }
57 
WRITE_HANDLER(deco16_bank_w)58 static WRITE_HANDLER( deco16_bank_w )
59 {
60 	deco16_bank=data;
61 }
62 
READ_HANDLER(deco16_io_r)63 static READ_HANDLER( deco16_io_r )
64 {
65 	const data8_t *ROM = memory_region(REGION_CPU1);
66 
67 	if (deco16_bank) {
68 		if (offset==0) return readinputport(1); /* Player 1 controls */
69 		if (offset==1) return readinputport(2); /* Player 2 controls */
70 		if (offset==2) return readinputport(3); /* Vblank, coins */
71 		if (offset==3) return readinputport(4); /* Dip 1 */
72 		if (offset==4) return readinputport(5); /* Dip 2 */
73 
74 		log_cb(RETRO_LOG_DEBUG, LOGPRE "%04x:  Read input %d\n",activecpu_get_pc(),offset);
75 		return 0xff;
76 	}
77 	return ROM[0x8000+offset];
78 }
79 
80 /***************************************************************************/
81 
MEMORY_READ_START(prosport_readmem)82 static MEMORY_READ_START( prosport_readmem )
83 	{ 0x0200, 0x021f, paletteram_r },
84 	{ 0x0000, 0x0fff, MRA_RAM },
85 	{ 0x1000, 0x2fff, MRA_RAM },
86 	{ 0x8000, 0x800f, deco16_io_r },
87 	{ 0x4000, 0xffff, MRA_ROM },
88 MEMORY_END
89 
90 static MEMORY_WRITE_START( prosport_writemem )
91 	{ 0x0200, 0x021f, prosport_paletteram_w, &paletteram },
92 	{ 0x0000, 0x0fff, MWA_RAM },
93 	{ 0x1200, 0x1fff, MWA_RAM },
94 	{ 0x3000, 0x37ff, liberate_videoram_w, &videoram },
95 	{ 0x3800, 0x3fff, MWA_RAM, &spriteram },
96 	{ 0x8000, 0x800f, deco16_io_w },
97 	{ 0x4000, 0xffff, MWA_ROM },
98 MEMORY_END
99 
100 static MEMORY_READ_START( liberate_readmem )
101 	{ 0x0000, 0x0fff, MRA_RAM },
102 	{ 0x1000, 0x3fff, MRA_ROM }, /* Mirror of main rom */
103 	{ 0x4000, 0x7fff, deco16_bank_r },
104 	{ 0x8000, 0x800f, deco16_io_r },
105 	{ 0x6200, 0x67ff, MRA_RAM },
106 	{ 0x8000, 0xffff, MRA_ROM },
107 MEMORY_END
108 
109 static MEMORY_WRITE_START( liberate_writemem )
110 	{ 0x0000, 0x0fff, MWA_RAM },
111 	{ 0x1000, 0x3fff, MWA_ROM }, /* Mirror of main rom */
112 	{ 0x4000, 0x47ff, liberate_videoram_w, &videoram },
113 	{ 0x4800, 0x4fff, MWA_RAM, &spriteram },
114 	{ 0x6200, 0x67ff, MWA_RAM, &scratchram },
115 	{ 0x8000, 0x800f, deco16_io_w },
116 	{ 0x8000, 0xffff, MWA_ROM },
117 MEMORY_END
118 
119 static PORT_READ_START( deco16_readport )
120 	{ 0x00, 0x00, input_port_0_r },
121 PORT_END
122 
123 static PORT_WRITE_START( deco16_writeport )
124 	{ 0x00, 0x00, deco16_bank_w },
125 PORT_END
126 
127 static MEMORY_READ_START( liberatb_readmem )
128 	{ 0x00fe, 0x00fe, input_port_0_r },
129 	{ 0x0000, 0x0fff, MRA_RAM },
130 	{ 0x1000, 0x3fff, MRA_ROM }, /* Mirror of main rom */
131 	{ 0x4000, 0x7fff, deco16_bank_r },
132 	{ 0xf000, 0xf00f, deco16_io_r },
133 	{ 0x8000, 0xffff, MRA_ROM },
134 MEMORY_END
135 
136 static MEMORY_WRITE_START( liberatb_writemem )
137 	{ 0x0000, 0x0fff, MWA_RAM },
138 	{ 0x1000, 0x3fff, MWA_ROM }, /* Mirror of main rom */
139 	{ 0x4000, 0x47ff, liberate_videoram_w, &videoram },
140 	{ 0x4800, 0x4fff, MWA_RAM, &spriteram },
141 	{ 0x6200, 0x67ff, MWA_RAM, &scratchram },
142 /*	{ 0xf000, 0xf00f, deco16_io_w },*/
143 	{ 0x8000, 0xffff, MWA_ROM },
144 MEMORY_END
145 
146 /***************************************************************************/
147 
148 static MEMORY_READ_START( prosoccr_sound_readmem )
149     { 0x0000, 0x01ff, MRA_RAM },
150 	{ 0xa000, 0xa000, soundlatch_r },
151     { 0xe000, 0xffff, MRA_RAM },
152 MEMORY_END
153 
154 static MEMORY_WRITE_START( prosoccr_sound_writemem )
155     { 0x0000, 0x01ff, MWA_RAM },
156 	{ 0x2000, 0x2000, AY8910_write_port_0_w },
157 	{ 0x4000, 0x4000, AY8910_control_port_0_w },
158 	{ 0x6000, 0x6000, AY8910_write_port_1_w },
159 	{ 0x8000, 0x8000, AY8910_control_port_1_w },
160     { 0xe000, 0xffff, MWA_ROM },
161 MEMORY_END
162 
163 static MEMORY_READ_START( sound_readmem )
164     { 0x0000, 0x01ff, MRA_RAM },
165 	{ 0xb000, 0xb000, soundlatch_r },
166     { 0xc000, 0xffff, MRA_RAM },
167 MEMORY_END
168 
169 static MEMORY_WRITE_START( sound_writemem )
170     { 0x0000, 0x01ff, MWA_RAM },
171 	{ 0x3000, 0x3000, AY8910_write_port_0_w },
172 	{ 0x4000, 0x4000, AY8910_control_port_0_w },
173 	{ 0x7000, 0x7000, AY8910_write_port_1_w },
174 	{ 0x8000, 0x8000, AY8910_control_port_1_w },
175     { 0xc000, 0xffff, MWA_ROM },
176 MEMORY_END
177 
178 /***************************************************************************/
179 
180 INPUT_PORTS_START( boomrang )
181 	PORT_START
182 	PORT_BIT( 0xff, IP_ACTIVE_HIGH, IPT_VBLANK )
183 
184 	PORT_START
185 	PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT | IPF_8WAY )
186 	PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT | IPF_8WAY )
187 	PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_UP | IPF_8WAY )
188 	PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN | IPF_8WAY )
189 	PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 )
190 	PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 )
191 	PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN )
192 	PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN )
193 
194 	PORT_START
195 	PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT | IPF_8WAY | IPF_COCKTAIL )
196 	PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT | IPF_8WAY | IPF_COCKTAIL )
197 	PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_UP  | IPF_8WAY | IPF_COCKTAIL )
198 	PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN | IPF_8WAY | IPF_COCKTAIL )
199 	PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 | IPF_COCKTAIL )
200 	PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 | IPF_COCKTAIL )
201 	PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN )
202 	PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_VBLANK )
203 
204 	PORT_START
205 	PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN1 )
206 	PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_COIN2 )
207 	PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_START1 )
208 	PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_START2 )
209 	PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_UNKNOWN )
210 	PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN )
211 	PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_SERVICE1 )
212 	PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN )
213 
214 	PORT_START
215 	PORT_DIPNAME( 0x03, 0x03, DEF_STR( Coin_A ) )
216 	PORT_DIPSETTING(    0x00, DEF_STR( 2C_1C ) )
217 	PORT_DIPSETTING(    0x03, DEF_STR( 1C_1C ) )
218 	PORT_DIPSETTING(    0x02, DEF_STR( 1C_2C ) )
219 	PORT_DIPSETTING(    0x01, DEF_STR( 1C_3C ) )
220 	PORT_DIPNAME( 0x0c, 0x0c, DEF_STR( Coin_B ) )
221 	PORT_DIPSETTING(    0x00, DEF_STR( 2C_1C ) )
222 	PORT_DIPSETTING(    0x0c, DEF_STR( 1C_1C ) )
223 	PORT_DIPSETTING(    0x08, DEF_STR( 1C_2C ) )
224 	PORT_DIPSETTING(    0x04, DEF_STR( 1C_3C ) )
225 	PORT_BITX(0x10, IP_ACTIVE_LOW, IPT_SERVICE, DEF_STR( Service_Mode ), KEYCODE_F2, IP_JOY_NONE )
226 	PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) )
227 	PORT_DIPSETTING(    0x20, DEF_STR( Off ) )
228 	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
229 	PORT_DIPNAME( 0x40, 0x00, DEF_STR( Cabinet ) )
230 	PORT_DIPSETTING(    0x00, DEF_STR( Upright ) )
231 	PORT_DIPSETTING(    0x40, DEF_STR( Cocktail ) )
232 	PORT_DIPNAME( 0x80, 0x00, "Manufacturer" )
233 	PORT_DIPSETTING(    0x00, "Data East USA" )
234 	PORT_DIPSETTING(    0x80, "Data East Corporation" )
235 
236 	PORT_START
237 	PORT_DIPNAME( 0x03, 0x03, DEF_STR( Lives ) )
238 	PORT_DIPSETTING(    0x00, "1" )
239 	PORT_DIPSETTING(    0x03, "3" )
240 	PORT_DIPSETTING(    0x02, "4" )
241 	PORT_DIPSETTING(    0x01, "5" )
242 	PORT_DIPNAME( 0x0c, 0x0c, DEF_STR( Difficulty ) )
243 	PORT_DIPSETTING(    0x04, "Easy" )
244 	PORT_DIPSETTING(    0x0c, "Normal" )
245 	PORT_DIPSETTING(    0x08, "Hard" )
246 	PORT_DIPSETTING(    0x00, "Hardest" )
247 	PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) ) /* Difficulty? */
248 	PORT_DIPSETTING(    0x10, DEF_STR( Off ) )
249 	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
250 	PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) ) /* Difficulty? */
251 	PORT_DIPSETTING(    0x20, DEF_STR( Off ) )
252 	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
253 	PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) )
254 	PORT_DIPSETTING(    0x40, DEF_STR( Off ) )
255 	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
256 	PORT_DIPNAME( 0x80, 0x80, "Invincibility" )
257 	PORT_DIPSETTING(    0x80, DEF_STR( Off ) )
258 	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
259 INPUT_PORTS_END
260 
261 INPUT_PORTS_START( kamikcab )
262 	PORT_START
263 	PORT_BIT( 0xff, IP_ACTIVE_HIGH, IPT_VBLANK )
264 
265 	PORT_START
266 	PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT | IPF_8WAY )
267 	PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT | IPF_8WAY )
268 	PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_UP | IPF_8WAY )
269 	PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN | IPF_8WAY )
270 	PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 )
271 	PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 )
272 	PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN )
273 	PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN )
274 
275 	PORT_START
276 	PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT | IPF_8WAY | IPF_COCKTAIL )
277 	PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT | IPF_8WAY | IPF_COCKTAIL )
278 	PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_UP  | IPF_8WAY | IPF_COCKTAIL )
279 	PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN | IPF_8WAY | IPF_COCKTAIL )
280 	PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 | IPF_COCKTAIL )
281 	PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 | IPF_COCKTAIL )
282 	PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN )
283 	PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_VBLANK )
284 
285 	PORT_START
286 	PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN1 )
287 	PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_COIN2 )
288 	PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_START1 )
289 	PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_START2 )
290 	PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_UNKNOWN )
291 	PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN )
292 	PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_SERVICE1 )
293 	PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN )
294 
295 	PORT_START
296 	PORT_DIPNAME( 0x03, 0x03, DEF_STR( Coin_A ) )
297 	PORT_DIPSETTING(    0x00, DEF_STR( 2C_1C ) )
298 	PORT_DIPSETTING(    0x03, DEF_STR( 1C_1C ) )
299 	PORT_DIPSETTING(    0x02, DEF_STR( 1C_2C ) )
300 	PORT_DIPSETTING(    0x01, DEF_STR( 1C_3C ) )
301 	PORT_DIPNAME( 0x0c, 0x0c, DEF_STR( Coin_B ) )
302 	PORT_DIPSETTING(    0x00, DEF_STR( 2C_1C ) )
303 	PORT_DIPSETTING(    0x0c, DEF_STR( 1C_1C ) )
304 	PORT_DIPSETTING(    0x08, DEF_STR( 1C_2C ) )
305 	PORT_DIPSETTING(    0x04, DEF_STR( 1C_3C ) )
306 	PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) )
307 	PORT_DIPSETTING(    0x10, DEF_STR( Off ) )
308 	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
309 	PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) )
310 	PORT_DIPSETTING(    0x20, DEF_STR( Off ) )
311 	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
312 	PORT_DIPNAME( 0x40, 0x00, DEF_STR( Cabinet ) )
313 	PORT_DIPSETTING(    0x00, DEF_STR( Upright ) )
314 	PORT_DIPSETTING(    0x40, DEF_STR( Cocktail ) )
315 	PORT_DIPNAME( 0x80, 0x00, "Manufacturer" )
316 	PORT_DIPSETTING(    0x00, "Data East USA" )
317 	PORT_DIPSETTING(    0x80, "Data East Corporation" )
318 
319 	PORT_START
320 	PORT_DIPNAME( 0x03, 0x03, DEF_STR( Lives ) )
321 	PORT_DIPSETTING(    0x02, "2" )
322 	PORT_DIPSETTING(    0x03, "3" )
323 	PORT_DIPSETTING(    0x01, "5" )
324 	PORT_DIPSETTING(    0x00, "Infinite" )
325 	PORT_DIPNAME( 0x0c, 0x0c, "Bonus" )
326 	PORT_DIPSETTING(    0x00, "20000" )
327 	PORT_DIPSETTING(    0x0c, "20000 30000" )
328 	PORT_DIPSETTING(    0x08, "30000 40000" )
329 	PORT_DIPSETTING(    0x04, "40000 50000" )
330 	PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) ) /* Difficulty? */
331 	PORT_DIPSETTING(    0x10, DEF_STR( Off ) )
332 	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
333 	PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) ) /* Difficulty? */
334 	PORT_DIPSETTING(    0x20, DEF_STR( Off ) )
335 	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
336 	PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) )
337 	PORT_DIPSETTING(    0x40, DEF_STR( Off ) )
338 	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
339 	PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) )
340 	PORT_DIPSETTING(    0x80, DEF_STR( Off ) )
341 	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
342 INPUT_PORTS_END
343 
344 INPUT_PORTS_START( liberate )
345 	PORT_START
346 	PORT_BIT( 0xff, IP_ACTIVE_HIGH, IPT_VBLANK )
347 
348 	PORT_START
349 	PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT | IPF_8WAY )
350 	PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT | IPF_8WAY )
351 	PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_UP | IPF_8WAY )
352 	PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN | IPF_8WAY )
353 	PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 )
354 	PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 )
355 	PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN )
356 	PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN )
357 
358 	PORT_START
359 	PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT | IPF_8WAY | IPF_COCKTAIL )
360 	PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT | IPF_8WAY | IPF_COCKTAIL )
361 	PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_UP  | IPF_8WAY | IPF_COCKTAIL )
362 	PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN | IPF_8WAY | IPF_COCKTAIL )
363 	PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 | IPF_COCKTAIL )
364 	PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 | IPF_COCKTAIL )
365 	PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN )
366 	PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_VBLANK )
367 
368 	PORT_START
369 	PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN1 )
370 	PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_COIN2 )
371 	PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_START1 )
372 	PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_START2 )
373 	PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_UNKNOWN )
374 	PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN )
375 	PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_SERVICE1 )
376 	PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN )
377 
378 	PORT_START
379 	PORT_DIPNAME( 0x03, 0x03, DEF_STR( Coin_A ) )
380 	PORT_DIPSETTING(    0x00, DEF_STR( 2C_1C ) )
381 	PORT_DIPSETTING(    0x03, DEF_STR( 1C_1C ) )
382 	PORT_DIPSETTING(    0x02, DEF_STR( 1C_2C ) )
383 	PORT_DIPSETTING(    0x01, DEF_STR( 1C_3C ) )
384 	PORT_DIPNAME( 0x0c, 0x0c, DEF_STR( Coin_B ) )
385 	PORT_DIPSETTING(    0x00, DEF_STR( 2C_1C ) )
386 	PORT_DIPSETTING(    0x0c, DEF_STR( 1C_1C ) )
387 	PORT_DIPSETTING(    0x08, DEF_STR( 1C_2C ) )
388 	PORT_DIPSETTING(    0x04, DEF_STR( 1C_3C ) )
389 	PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) )
390 	PORT_DIPSETTING(    0x10, DEF_STR( Off ) )
391 	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
392 	PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) )
393 	PORT_DIPSETTING(    0x20, DEF_STR( Off ) )
394 	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
395 	PORT_DIPNAME( 0x40, 0x00, DEF_STR( Cabinet ) )
396 	PORT_DIPSETTING(    0x00, DEF_STR( Upright ) )
397 	PORT_DIPSETTING(    0x40, DEF_STR( Cocktail ) )
398 	PORT_DIPNAME( 0x80, 0x80, "Manufacturer" )
399 	PORT_DIPSETTING(    0x00, "Data East USA" )
400 	PORT_DIPSETTING(    0x80, "Data East Corporation" )
401 
402 	PORT_START
403 	PORT_DIPNAME( 0x03, 0x03, DEF_STR( Lives ) )
404 	PORT_DIPSETTING(    0x03, "3" )
405 	PORT_DIPSETTING(    0x01, "4" )
406 	PORT_DIPSETTING(    0x02, "5" )
407 	PORT_DIPSETTING(    0x00, "Infinite" )
408 	PORT_DIPNAME( 0x0c, 0x0c, "Bonus" )
409 	PORT_DIPSETTING(    0x00, "20000" )
410 	PORT_DIPSETTING(    0x0c, "20000 30000" )
411 	PORT_DIPSETTING(    0x08, "30000 50000" )
412 	PORT_DIPSETTING(    0x04, "50000 70000" )
413 	PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) ) /* Difficulty? */
414 	PORT_DIPSETTING(    0x10, DEF_STR( Off ) )
415 	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
416 	PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) ) /* Difficulty? */
417 	PORT_DIPSETTING(    0x20, DEF_STR( Off ) )
418 	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
419 	PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) )
420 	PORT_DIPSETTING(    0x40, DEF_STR( Off ) )
421 	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
422 	PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) )
423 	PORT_DIPSETTING(    0x80, DEF_STR( Off ) )
424 	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
425 INPUT_PORTS_END
426 
427 /***************************************************************************/
428 
429 static struct GfxLayout charlayout =
430 {
431 	8,8,
432 	RGN_FRAC(1,3),
433 	3,
434  	{ RGN_FRAC(2,3), RGN_FRAC(1,3), RGN_FRAC(0,3) },
435 	{ 0,1,2,3,4,5,6,7 },
436 	{ 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8 },
437 	8*8
438 };
439 
440 static struct GfxLayout sprites =
441 {
442 	16,16,
443 	RGN_FRAC(1,3),
444 	3,
445  	{ RGN_FRAC(2,3), RGN_FRAC(1,3), RGN_FRAC(0,3) },
446 	{ 16*8, 1+(16*8), 2+(16*8), 3+(16*8), 4+(16*8), 5+(16*8), 6+(16*8), 7+(16*8),
447 		0,1,2,3,4,5,6,7 },
448 	{ 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8 ,8*8,9*8,10*8,11*8,12*8,13*8,14*8,15*8 },
449 	16*16
450 };
451 
452 static struct GfxLayout pro_tiles =
453 {
454 	16,16,
455 	16,
456 	2,
457 	{ 0, 4, 1024*8, 1024*8+4 },
458 	{
459  		24,25,26,27, 16,17,18,19, 8,9,10,11, 0,1,2,3
460 	},
461 	{
462 		0*32, 1*32, 2*32, 3*32, 4*32, 5*32, 6*32, 7*32,
463 			8*32, 9*32, 10*32, 11*32, 12*32, 13*32, 14*32, 15*32
464 	},
465 	64*8
466 };
467 
468 static struct GfxLayout tiles1 =
469 {
470 	16,16,
471 	128,
472 	3,
473 	{ 4, 0, 0x4000*8+4 },
474 	{
475 		24,25,26,27, 16,17,18,19, 8,9,10,11, 0,1,2,3
476 	},
477 	{
478 		0*32, 1*32, 2*32, 3*32, 4*32, 5*32, 6*32, 7*32,
479 			8*32, 9*32, 10*32, 11*32, 12*32, 13*32, 14*32, 15*32
480 	},
481 	64*8
482 };
483 
484 static struct GfxLayout tiles2 =
485 {
486 	16,16,
487 	128,
488 	3,
489 	{ 0x2000*8+4, 0x2000*8+0, 0x4000*8 },
490 	{
491 		24,25,26,27, 16,17,18,19, 8,9,10,11, 0,1,2,3
492 	},
493 	{ 0*32, 1*32, 2*32, 3*32, 4*32, 5*32, 6*32, 7*32,
494 			8*32, 9*32, 10*32, 11*32, 12*32, 13*32, 14*32, 15*32 },
495 	64*8
496 };
497 
498 static struct GfxDecodeInfo gfxdecodeinfo[] =
499 {
500 	{ REGION_GFX1, 0x00000, &charlayout,  0, 4 },
501 	{ REGION_GFX1, 0x00000, &sprites,     0, 4 },
502 	{ REGION_GFX2, 0x00000, &tiles1,      0, 4 },
503 	{ REGION_GFX2, 0x00000, &tiles2,      0, 4 },
504 	{ -1 } /* end of array */
505 };
506 
507 static struct GfxDecodeInfo prosport_gfxdecodeinfo[] =
508 {
509 	{ REGION_GFX1, 0x00000, &charlayout,  0, 4 },
510 	{ REGION_GFX1, 0x00000, &sprites,     0, 4 },
511 	{ REGION_GFX2, 0x00000, &pro_tiles,   0, 4 },
512 	{ REGION_GFX2, 0x00800, &pro_tiles,   0, 4 },
513 	{ -1 } /* end of array */
514 };
515 
516 /***************************************************************************/
517 
INTERRUPT_GEN(deco16_interrupt)518 static INTERRUPT_GEN( deco16_interrupt )
519 {
520 	static int latch=0;
521 	int p=~readinputport(3);
522 	if (p&0x43 && !latch) {
523 		cpu_set_irq_line(0,DECO16_IRQ_LINE,ASSERT_LINE);
524 		latch=1;
525 	} else {
526 		if (!(p&0x43))
527 			latch=0;
528 	}
529 }
530 
531 static struct AY8910interface ay8910_interface =
532 {
533 	2, /* 2 chips */
534 	1500000,     /* 12 Mhz / 8 = 1.5 Mhz */
535 	{ 30, 50 },
536 	{ 0 },
537 	{ 0 },
538 	{ 0 },
539 	{ 0 }
540 };
541 
542 static MACHINE_DRIVER_START( prosoccr )
543 
544 	/* basic machine hardware */
545 	MDRV_CPU_ADD(DECO16, 3000000)
MDRV_CPU_MEMORY(liberate_readmem,liberate_writemem)546 	MDRV_CPU_MEMORY(liberate_readmem,liberate_writemem)
547 	MDRV_CPU_PORTS(deco16_readport,deco16_writeport)
548 
549 	MDRV_CPU_ADD(M6502, 1500000)
550 	MDRV_CPU_FLAGS(CPU_AUDIO_CPU)
551 	MDRV_CPU_MEMORY(prosoccr_sound_readmem,prosoccr_sound_writemem)
552 	MDRV_CPU_VBLANK_INT(nmi_line_pulse,16)
553 
554 	MDRV_FRAMES_PER_SECOND(60)
555 	MDRV_VBLANK_DURATION(529) /* 529ms Vblank duration?? */
556 	MDRV_INTERLEAVE(200)
557 
558 	/* video hardware */
559 	MDRV_VIDEO_ATTRIBUTES(VIDEO_TYPE_RASTER)
560 	MDRV_SCREEN_SIZE(32*8, 32*8)
561 	MDRV_VISIBLE_AREA(0*8, 32*8-1, 1*8, 31*8-1)
562 	MDRV_GFXDECODE(gfxdecodeinfo)
563 	MDRV_PALETTE_LENGTH(33)
564 	MDRV_PALETTE_INIT(liberate)
565 
566 	MDRV_VIDEO_START(prosoccr)
567 	MDRV_VIDEO_UPDATE(prosoccr)
568 
569 	/* sound hardware */
570 	MDRV_SOUND_ADD(AY8910, ay8910_interface)
571 MACHINE_DRIVER_END
572 
573 static MACHINE_DRIVER_START( prosport )
574 
575 	/* basic machine hardware */
576 	MDRV_CPU_ADD(DECO16, 2000000)
577 	MDRV_CPU_MEMORY(prosport_readmem,prosport_writemem)
578 	MDRV_CPU_PORTS(deco16_readport,deco16_writeport)
579 
580 	MDRV_CPU_ADD(M6502, 1500000)
581 	MDRV_CPU_FLAGS(CPU_AUDIO_CPU)
582 	MDRV_CPU_MEMORY(sound_readmem,sound_writemem)
583 	MDRV_CPU_VBLANK_INT(nmi_line_pulse,16)
584 
585 	MDRV_FRAMES_PER_SECOND(60)
586 	MDRV_VBLANK_DURATION(529) /* 529ms Vblank duration?? */
587 	MDRV_INTERLEAVE(200)
588 
589 	/* video hardware */
590 	MDRV_VIDEO_ATTRIBUTES(VIDEO_TYPE_RASTER)
591 	MDRV_SCREEN_SIZE(32*8, 32*8)
592 	MDRV_VISIBLE_AREA(0*8, 32*8-1, 1*8, 31*8-1)
593 	MDRV_GFXDECODE(prosport_gfxdecodeinfo)
594 	MDRV_PALETTE_LENGTH(256)
595 
596 	MDRV_VIDEO_START(boomrang)
597 	MDRV_VIDEO_UPDATE(prosport)
598 
599 	/* sound hardware */
600 	MDRV_SOUND_ADD(AY8910, ay8910_interface)
601 MACHINE_DRIVER_END
602 
603 static MACHINE_DRIVER_START( boomrang )
604 
605 	/* basic machine hardware */
606 	MDRV_CPU_ADD(DECO16, 2000000)
607 	MDRV_CPU_MEMORY(liberate_readmem,liberate_writemem)
608 	MDRV_CPU_PORTS(deco16_readport,deco16_writeport)
609 	MDRV_CPU_VBLANK_INT(deco16_interrupt,1)
610 
611 	MDRV_CPU_ADD(M6502, 1500000)
612 	MDRV_CPU_FLAGS(CPU_AUDIO_CPU)
613 	MDRV_CPU_MEMORY(sound_readmem,sound_writemem)
614 	MDRV_CPU_VBLANK_INT(nmi_line_pulse,16)
615 
616 	MDRV_FRAMES_PER_SECOND(60)
617 	MDRV_VBLANK_DURATION(529) /* 529ms Vblank duration?? */
618 	MDRV_INTERLEAVE(200)
619 
620 	/* video hardware */
621 	MDRV_VIDEO_ATTRIBUTES(VIDEO_TYPE_RASTER)
622 	MDRV_SCREEN_SIZE(32*8, 32*8)
623 	MDRV_VISIBLE_AREA(0*8, 32*8-1, 1*8, 31*8-1)
624 	MDRV_GFXDECODE(gfxdecodeinfo)
625 	MDRV_PALETTE_LENGTH(33)
626 	MDRV_PALETTE_INIT(liberate)
627 
628 	MDRV_VIDEO_START(boomrang)
629 	MDRV_VIDEO_UPDATE(boomrang)
630 
631 	/* sound hardware */
632 	MDRV_SOUND_ADD(AY8910, ay8910_interface)
633 MACHINE_DRIVER_END
634 
635 static MACHINE_DRIVER_START( liberate )
636 
637 	/* basic machine hardware */
638 	MDRV_CPU_ADD(DECO16, 2000000)
639 	MDRV_CPU_MEMORY(liberate_readmem,liberate_writemem)
640 	MDRV_CPU_PORTS(deco16_readport,deco16_writeport)
641 	MDRV_CPU_VBLANK_INT(deco16_interrupt,1)
642 
643 	MDRV_CPU_ADD(M6502, 1500000)
644 	MDRV_CPU_FLAGS(CPU_AUDIO_CPU)
645 	MDRV_CPU_MEMORY(sound_readmem,sound_writemem)
646 	MDRV_CPU_VBLANK_INT(nmi_line_pulse,16)
647 
648 	MDRV_FRAMES_PER_SECOND(60)
649 	MDRV_VBLANK_DURATION(529) /* 529ms Vblank duration?? */
650 	MDRV_INTERLEAVE(200)
651 
652 	/* video hardware */
653 	MDRV_VIDEO_ATTRIBUTES(VIDEO_TYPE_RASTER)
654 	MDRV_SCREEN_SIZE(32*8, 32*8)
655 	MDRV_VISIBLE_AREA(0*8, 32*8-1, 1*8, 31*8-1)
656 	MDRV_GFXDECODE(gfxdecodeinfo)
657 	MDRV_PALETTE_LENGTH(33)
658 	MDRV_PALETTE_INIT(liberate)
659 
660 	MDRV_VIDEO_START(liberate)
661 	MDRV_VIDEO_UPDATE(liberate)
662 
663 	/* sound hardware */
664 	MDRV_SOUND_ADD(AY8910, ay8910_interface)
665 MACHINE_DRIVER_END
666 
667 static MACHINE_DRIVER_START( liberatb )
668 
669 	/* basic machine hardware */
670 	MDRV_CPU_ADD(M6502, 2000000)
671 	MDRV_CPU_MEMORY(liberatb_readmem,liberatb_writemem)
672 	MDRV_CPU_PORTS(deco16_readport,deco16_writeport)
673 	MDRV_CPU_VBLANK_INT(deco16_interrupt,1) /*todo*/
674 
675 	MDRV_CPU_ADD(M6502, 1500000)
676 	MDRV_CPU_FLAGS(CPU_AUDIO_CPU)
677 	MDRV_CPU_MEMORY(sound_readmem,sound_writemem)
678 	MDRV_CPU_VBLANK_INT(nmi_line_pulse,16)
679 
680 	MDRV_FRAMES_PER_SECOND(60)
681 	MDRV_VBLANK_DURATION(529) /* 529ms Vblank duration?? */
682 	MDRV_INTERLEAVE(200)
683 
684 	/* video hardware */
685 	MDRV_VIDEO_ATTRIBUTES(VIDEO_TYPE_RASTER)
686 	MDRV_SCREEN_SIZE(32*8, 32*8)
687 	MDRV_VISIBLE_AREA(0*8, 32*8-1, 1*8, 31*8-1)
688 	MDRV_GFXDECODE(gfxdecodeinfo)
689 	MDRV_PALETTE_LENGTH(33)
690 	MDRV_PALETTE_INIT(liberate)
691 
692 	MDRV_VIDEO_START(liberate)
693 	MDRV_VIDEO_UPDATE(liberate)
694 
695 	/* sound hardware */
696 	MDRV_SOUND_ADD(AY8910, ay8910_interface)
697 MACHINE_DRIVER_END
698 
699 /***************************************************************************/
700 
701 ROM_START( prosoccr )
702 	ROM_REGION(0x10000, REGION_CPU1, 0)
703 	ROM_LOAD( "am07.7e",  0x8000, 0x2000, CRC(55415fb5) SHA1(676feb07d4fbd76aae8349b46f7edc8f357f2ddf) )
704 	ROM_LOAD( "am08.9e",  0xa000, 0x2000, CRC(73d45d0d) SHA1(07736286087478af404bd9c6b279d631a01cf4e2) )
705 	ROM_LOAD( "am09.10e", 0xc000, 0x2000, CRC(a7ee0b3a) SHA1(87e487f863bd90c5b979c2d3c4317869ba1d71d9) )
706 	ROM_LOAD( "am10.11e", 0xe000, 0x2000, CRC(5571bdb8) SHA1(a3740650453c9e4f78dcc7826eb112d0d9f65b22) )
707 /*low reload??*/
708 	ROM_REGION( 0x10000 * 2, REGION_CPU2, 0 )
709 	ROM_LOAD( "am06.10a", 0xe000, 0x2000, CRC(37a0c74f) SHA1(5757b9eaf5b1129ee2d03b0ab6c3b15c120cf43c) )
710 
711 	ROM_REGION( 0x6000, REGION_GFX1, ROMREGION_DISPOSE )
712 	ROM_LOAD( "am00.2b",  0x0000, 0x2000, CRC(f3c8b649) SHA1(d2d42484e80d9241dac77a78c68314f88e0cbe5d) )
713 	ROM_LOAD( "am01.5b",  0x2000, 0x2000, CRC(24785bda) SHA1(536bdda766b46771223f01e463fa4c61e0dd545c) )
714 	ROM_LOAD( "am02.7b",  0x4000, 0x2000, CRC(c5af58ea) SHA1(a73d537b88befb76d67cc17d241e78c572c5b737) )
715 
716 	ROM_REGION( 0x8000, REGION_GFX2, ROMREGION_DISPOSE )
717 	ROM_LOAD( "am03.10b", 0x0000, 0x2000, CRC(47dc31dc) SHA1(7f492477e30a0353251a43e7e726551c3861b63f) )
718 	ROM_LOAD( "am04.c10", 0x2000, 0x2000, CRC(e057d827) SHA1(81ca4351777de5c32f4cf65547287c8169ba1494) )
719 
720 	ROM_REGION(0x04000, REGION_USER1, 0 )
721 	ROM_LOAD( "am05.d12", 0x0000, 0x2000,  CRC(f63e5a73) SHA1(50e7a1a0eb3bf8df3264bcba441c5fbd7dec52f4) )
722 
723 	ROM_REGION( 64, REGION_PROMS, 0 )
724 	ROM_LOAD( "k1",    0, 32,  CRC(ebdc8343) SHA1(c9ae04da662f40237de24f5f01e97051e99e8c15) ) /* Colour */
725 	ROM_LOAD( "e13",  32, 32,  CRC(6909a061) SHA1(b9b2c1a7fec46027bfcc2c744946e27681c82b40) ) /* Timing? */
726 ROM_END
727 
728 ROM_START( prosport )
729 	ROM_REGION(0x10000, REGION_CPU1, 0)
730 	ROM_LOAD( "ic21ar09.bin", 0x4000, 0x2000,  CRC(4faa8d12) SHA1(326216eb67d54ecd01701e4677f62b5c11b6763e) )
731 	ROM_LOAD( "ic22ar10.bin", 0x6000, 0x2000,  CRC(389e405b) SHA1(263088e49ab14a0017b2ad130bd78afcd0f13a4b) )
732 	ROM_LOAD( "ic23ar11.bin", 0x8000, 0x2000,  CRC(c0bc7f2a) SHA1(15d806bb8e28215178dbac0157d75e3ead42f6e9) )
733 	ROM_LOAD( "ic24ar12.bin", 0xa000, 0x2000,  CRC(4acd3f0d) SHA1(8bce597e4ba12d3cafa997653947e3aa6180b6c0) )
734 	ROM_LOAD( "ic25ar13.bin", 0xc000, 0x2000,  CRC(2bdabdf3) SHA1(530cd84dc7fbfdd6805bc555c0e9a5fa2175bc59) )
735 	ROM_LOAD( "ic26ar14.bin", 0xe000, 0x2000,  CRC(10ccfddb) SHA1(6c2d3cfd7be7cb4d3a217b1a70273ded5bd7e126) )
736 
737 	ROM_REGION( 0x10000 * 2, REGION_CPU2, 0 )
738 	ROM_LOAD( "ic43ar16.bin", 0xc000, 0x2000,  CRC(113a4f89) SHA1(abbc7f5ad543f3500c0194100d236ac942e4739f) )
739 	ROM_LOAD( "ic42ar15.bin", 0xe000, 0x2000,  CRC(635425a6) SHA1(2b95c3252046462f8886a309d02ea3a15b693780) )
740 
741 	ROM_REGION( 0x12000, REGION_GFX1, ROMREGION_DISPOSE )
742 	ROM_LOAD( "ic52ar00.bin",   0x00000, 0x2000, CRC(1e16adde) SHA1(229f68a687cbc9ac0d393e4db49d91f646eea7a6) )
743 	ROM_LOAD( "ic53ar01.bin",   0x02000, 0x2000, CRC(4b7a6431) SHA1(a8a23dffc3bf9fb3b806985272822904578e460e) )
744 	ROM_LOAD( "ic54ar02.bin",   0x04000, 0x2000, CRC(039eba80) SHA1(bd15f707f4d5dded8dd3373de5cb2a8d91a731d6) )
745 
746 	ROM_LOAD( "ic55ar03.bin",   0x06000, 0x2000, CRC(caecafcb) SHA1(74c0e5aad65c162b9e58c1c37ec481cf3aa99056) )
747 	ROM_LOAD( "ic56ar04.bin",   0x08000, 0x2000, CRC(d555835e) SHA1(4e3f1b6418aec948aaf27d05a4736995763dd1aa) )
748 	ROM_LOAD( "ic57ar05.bin",   0x0a000, 0x2000, CRC(9d05c4cc) SHA1(898e4971d850c5f26513c4aabd548a41fdcf2b4f) )
749 
750 	ROM_LOAD( "ic58ar06.bin",   0x0c000, 0x2000, CRC(903ea834) SHA1(93fc69a2b460ed4cc8945f34a761b9841eba15a3) )
751 	ROM_LOAD( "ic59ar07.bin",   0x0e000, 0x2000, CRC(e6527838) SHA1(e40acbcfda7d73ce4c1faa1c05e17d21bfc7f0d4) )
752 	ROM_LOAD( "ic60ar08.bin",   0x10000, 0x2000, CRC(ff1e6b01) SHA1(4561b718be41c67d713f6d7f10decc4d2eed9acc) )
753 
754 	ROM_REGION( 0x2000, REGION_GFX2, ROMREGION_DISPOSE )
755 	ROM_LOAD( "ic46ar18.bin",   0x00000, 0x1000, CRC(d23998d3) SHA1(4d3545a0e1df2eb7927ec6fa4a35abd21321016c) )
756 	ROM_LOAD( "ic45ar17.bin",   0x01000, 0x1000, CRC(5f1c621e) SHA1(29ce85d3d5da5ee16bb67644b0555ab9bce52d05) )
757 ROM_END
758 
759 ROM_START( boomrang )
760 	ROM_REGION(0x10000, REGION_CPU1, 0)
761 	ROM_LOAD( "bp13.9k",  0x8000, 0x4000,  CRC(b70439b1) SHA1(a020e9f6a71f72dfa72b8b202b4a08cca5e26ee0) )
762 	ROM_RELOAD(           0x0000, 0x4000 )
763 	ROM_LOAD( "bp14.11k", 0xc000, 0x4000,  CRC(98050e13) SHA1(2d936f95dc818883f735f92e9399470320e32a65) )
764 
765 	ROM_REGION(0x10000*2, REGION_CPU2, 0)
766 	ROM_LOAD( "bp11.11f", 0xc000, 0x4000,  CRC(d6106f00) SHA1(068117d68eaabceb2e5890caf3f1761d89434f6c) )
767 
768 	ROM_REGION(0xc000, REGION_GFX1, ROMREGION_DISPOSE )
769 	ROM_LOAD( "bp04.7b",  0x00000, 0x4000, CRC(5d4b12eb) SHA1(f46a40e8509717d20224a60c2121bdcd3f3eff5a) )
770 	ROM_LOAD( "bp06.10b", 0x04000, 0x4000, CRC(5a18296e) SHA1(435fcbf7418aa3bec0fc0e86a3c17d3f7dfb2666) )
771 	ROM_LOAD( "bp08.13b", 0x08000, 0x4000, CRC(4cdb30d9) SHA1(7584792834926ebb0388f552b2c930ee84631c77) )
772 
773 	ROM_REGION( 0x8000, REGION_GFX2, ROMREGION_DISPOSE )
774 	ROM_LOAD( "bp02.4b",  0x00000, 0x4000, CRC(f3c2b84f) SHA1(e5c8d631058b73652c522d76618097f7289c0523) )
775 	ROM_LOAD( "bp00.1b",  0x04000, 0x4000, CRC(3370cf6e) SHA1(60a94e40d960fac611e69ba96dfa78fe747574e6) )
776 
777 	ROM_REGION(0x04000, REGION_USER1, 0 )
778 	ROM_LOAD( "bp10.10a", 0x0000, 0x4000,  CRC(dd18a96f) SHA1(76ffa1bcf6377588c0b9b72508748c1cf2a0b303) )
779 
780 	ROM_REGION( 32, REGION_PROMS, 0 )
781 	ROM_LOAD( "82s123.5l",  0, 32,  CRC(a71e19ff) SHA1(fc7bf69f7971bf763aeeb1d9eb0861470acbf5d8) )
782 ROM_END
783 
784 ROM_START( kamikcab )
785 	ROM_REGION(0x10000, REGION_CPU1, 0)
786 	ROM_LOAD( "bp11", 0x0c000, 0x4000, CRC(a69e5580) SHA1(554e45a3f5a91864b62a2439c2277cd18dbe45a7) )
787 	ROM_RELOAD(       0x00000, 0x4000 )
788 
789 	ROM_REGION(0x10000*2, REGION_CPU2, 0)	/* 64K for CPU 2 */
790 	ROM_LOAD( "bp09", 0x0e000, 0x2000, CRC(16b13676) SHA1(f3cad959cbcde243db3ebc77a3692302a44beb09) )
791 
792 	ROM_REGION(0xc000, REGION_GFX1, ROMREGION_DISPOSE )
793 	ROM_LOAD( "bp04", 0x00000, 0x4000, CRC(b471542d) SHA1(aad323da7771c2ffdb04a60a4b4bbe032f5b1865) )
794 	ROM_LOAD( "bp06", 0x04000, 0x4000, CRC(4bf96d0d) SHA1(d7cd0e1da2d64e5b9318618b0ddd848ac405f28a) )
795 	ROM_LOAD( "bp08", 0x08000, 0x4000, CRC(b4756bed) SHA1(83c39ac5f4628f14a5f2ded6c9a9ed4874d2d8b6) )
796 
797 	ROM_REGION(0x8000, REGION_GFX2, ROMREGION_DISPOSE )
798 	ROM_LOAD( "bp02", 0x00000, 0x4000, CRC(77299e6e) SHA1(477a6f466f08fe99823dc55d246b4d732423663d) )
799 	ROM_LOAD( "bp00", 0x04000, 0x2000, CRC(c20ca7ca) SHA1(ca91af848ae38b296992bb21040ef22a325bbcdc) )
800 
801 	ROM_REGION(0x4000, REGION_USER1, 0 )
802 	ROM_LOAD( "bp12", 0x00000, 0x4000, CRC(8c8f5d35) SHA1(5b908d92786dae76aaf84de14f8847ee8ee350a1) )
803 
804 	ROM_REGION(32, REGION_PROMS, 0 )
805 	ROM_LOAD( "bp15", 0, 32,  CRC(30d3acce) SHA1(be88d74250edc2920fc0f95cfdd93468ac9c640e) )
806 ROM_END
807 
808 ROM_START( liberate )
809 	ROM_REGION( 0x10000*2, REGION_CPU1, 0 )
810  	ROM_LOAD( "bt12-2.bin", 0x8000, 0x4000, CRC(a0079ffd) SHA1(340398352500a33f01dca07dd9c86ad3a78f227e) )
811 	ROM_RELOAD(             0x0000, 0x4000 )
812  	ROM_LOAD( "bt13-2.bin", 0xc000, 0x4000, CRC(19f8485c) SHA1(1e2a68e4cf6b96c53832f7d020f14a45de19967d) )
813 
814 	ROM_REGION( 0x10000 * 2, REGION_CPU2, 0 )
815 	ROM_LOAD( "bt11.bin",  0xe000, 0x2000,  CRC(b549ccaa) SHA1(e4c8350fea61ed85d21037cbd4c3c50f9a9de09f) )
816 
817 	ROM_REGION( 0x12000, REGION_GFX1, ROMREGION_DISPOSE )
818 	ROM_LOAD( "bt04.bin", 0x00000, 0x4000, CRC(96e48d72) SHA1(c31a58d6f1a3354b234849bf7ee013fe59bf908e) )	/* Chars/Sprites */
819 	ROM_LOAD( "bt03.bin", 0x04000, 0x2000, CRC(29ad1b59) SHA1(4d5a385ccad4cdebe87300ef08e1220bc9303673) )
820 	ROM_LOAD( "bt06.bin", 0x06000, 0x4000, CRC(7bed1497) SHA1(ba309f468d98269014b2a757b8e98496d7e29120) )
821 	ROM_LOAD( "bt05.bin", 0x0a000, 0x2000, CRC(a8896c20) SHA1(c21412c8a6b10719d324ce7ecb01ec4e9d803932) )
822 	ROM_LOAD( "bt08.bin", 0x0c000, 0x4000, CRC(828ef78d) SHA1(79076b5552e6aff032839f2daca952305c863a64) )
823 	ROM_LOAD( "bt07.bin", 0x10000, 0x2000, CRC(f919e8e2) SHA1(e9eafa10f024aa522947f6098480bddf1fbe960f) )
824 
825 	ROM_REGION( 0x8000, REGION_GFX2, ROMREGION_DISPOSE )
826  	ROM_LOAD( "bt02.bin", 0x0000, 0x4000, CRC(7169f7bb) SHA1(06e45a15d7e878d0a6063c2fab55d065334935b2) )
827  	ROM_LOAD( "bt00.bin", 0x4000, 0x2000, CRC(b744454d) SHA1(664619c3907c538f353d8ac04d66086dcfbd53d4) )
828 	/* On early revision bt02 is split as BT01-A (0x2000) BT02-A (0x2000) */
829 
830 	ROM_REGION(0x4000, REGION_USER1, 0 )
831 	ROM_LOAD( "bt10.bin",  0x0000, 0x4000,  CRC(ee335397) SHA1(2d54f93d330357033b8ebc4bc052383c25156311) )
832 
833 	ROM_REGION( 32, REGION_PROMS, 0 )
834 	ROM_LOAD( "bt14.bin", 0x0000, 32,  CRC(20281d61) SHA1(905dd2744c148d50332fcad34a57dc573d41bb0a) )
835 ROM_END
836 
837 ROM_START( liberatb )
838 	ROM_REGION( 0x10000, REGION_CPU1, 0 )
839 	ROM_LOAD( "liber6.c17", 0x8000, 0x2000, CRC(c1811fe0) SHA1(1f857042ce00e489c2e73bb459b81a2461ea0b25) )
840 	ROM_RELOAD(             0x0000, 0x2000)
841 	ROM_LOAD( "liber4.c18", 0xa000, 0x2000, CRC(0e8db1ce) SHA1(bb7b77c31b3bb2c0d523f5cad4ef46d42a9dc857) )
842 	ROM_RELOAD(             0x2000, 0x2000)
843 	ROM_LOAD( "liber3.c20", 0xc000, 0x2000, CRC(16c423f3) SHA1(0cf3c46c9fc13eb0f61a3945d3db6ca2f9ab76fe) )
844  	ROM_LOAD( "liber5.c19", 0xe000, 0x2000, CRC(7738c194) SHA1(54fb094150481640f40d8a2066e43dc647980cda) )
845 
846 	ROM_REGION( 0x10000 * 2, REGION_CPU2, 0 )
847 	ROM_LOAD( "bt11.bin",  0xe000, 0x2000,  CRC(b549ccaa) SHA1(e4c8350fea61ed85d21037cbd4c3c50f9a9de09f) )
848 
849 	ROM_REGION( 0x12000, REGION_GFX1, ROMREGION_DISPOSE )
850 	ROM_LOAD( "bt04.bin", 0x00000, 0x4000, CRC(96e48d72) SHA1(c31a58d6f1a3354b234849bf7ee013fe59bf908e) )	/* Chars/Sprites */
851 	ROM_LOAD( "bt03.bin", 0x04000, 0x2000, CRC(29ad1b59) SHA1(4d5a385ccad4cdebe87300ef08e1220bc9303673) )
852 	ROM_LOAD( "bt06.bin", 0x06000, 0x4000, CRC(7bed1497) SHA1(ba309f468d98269014b2a757b8e98496d7e29120) )
853 	ROM_LOAD( "bt05.bin", 0x0a000, 0x2000, CRC(a8896c20) SHA1(c21412c8a6b10719d324ce7ecb01ec4e9d803932) )
854 	ROM_LOAD( "bt08.bin", 0x0c000, 0x4000, CRC(828ef78d) SHA1(79076b5552e6aff032839f2daca952305c863a64) )
855 	ROM_LOAD( "bt07.bin", 0x10000, 0x2000, CRC(f919e8e2) SHA1(e9eafa10f024aa522947f6098480bddf1fbe960f) )
856 
857 	ROM_REGION( 0x8000, REGION_GFX2, ROMREGION_DISPOSE )
858  	ROM_LOAD( "bt02.bin", 0x0000, 0x4000, CRC(7169f7bb) SHA1(06e45a15d7e878d0a6063c2fab55d065334935b2) )
859  	ROM_LOAD( "bt00.bin", 0x4000, 0x2000, CRC(b744454d) SHA1(664619c3907c538f353d8ac04d66086dcfbd53d4) )
860 
861 	ROM_REGION(0x4000, REGION_USER1, 0 )
862 	ROM_LOAD( "bt10.bin",  0x0000, 0x4000,  CRC(ee335397) SHA1(2d54f93d330357033b8ebc4bc052383c25156311) )
863 
864 	ROM_REGION( 32, REGION_PROMS, 0 )
865 	ROM_LOAD( "bt14.bin", 0x0000, 32,  CRC(20281d61) SHA1(905dd2744c148d50332fcad34a57dc573d41bb0a) )
866 ROM_END
867 
868 /***************************************************************************/
869 
870 static void sound_cpu_decrypt(void)
871 {
872 	data8_t *RAM = memory_region(REGION_CPU2);
873 	int i;
874 
875 	/* Bit swapping on sound cpu - Opcodes only */
876 	RAM = memory_region(REGION_CPU2);
877 	for (i=0xc000; i<0x10000; i++)
878 		RAM[i+0x10000]=((RAM[i] & 0x20) << 1) | ((RAM[i] & 0x40) >> 1) | (RAM[i] & 0x9f);
879 
880 	memory_set_opcode_base(1,RAM+0x10000);
881 }
882 
DRIVER_INIT(prosport)883 static DRIVER_INIT( prosport )
884 {
885 	unsigned char *RAM = memory_region(REGION_CPU1);
886 	int i;
887 
888 	/* Main cpu has the nibbles swapped */
889 	for (i=0; i<0x10000; i++)
890 		RAM[i]=((RAM[i] & 0x0f) << 4) | ((RAM[i] & 0xf0) >> 4);
891 
892 	sound_cpu_decrypt();
893 }
894 
DRIVER_INIT(liberate)895 static DRIVER_INIT( liberate )
896 {
897 	int A;
898 	unsigned char *ROM = memory_region(REGION_CPU1);
899 	int diff = memory_region_length(REGION_CPU1) / 2;
900 
901 	memory_set_opcode_base(0,ROM+diff);
902 
903 	/* Swap bits for opcodes only, not data */
904 	for (A = 0;A < diff;A++) {
905 		ROM[A+diff] = (ROM[A] & 0xd7) | ((ROM[A] & 0x08) << 2) | ((ROM[A] & 0x20) >> 2);
906 		ROM[A+diff] = (ROM[A+diff] & 0xbb) | ((ROM[A+diff] & 0x04) << 4) | ((ROM[A+diff] & 0x40) >> 4);
907 		ROM[A+diff] = (ROM[A+diff] & 0x7d) | ((ROM[A+diff] & 0x02) << 6) | ((ROM[A+diff] & 0x80) >> 6);
908 	}
909 
910 	sound_cpu_decrypt();
911 }
912 
913 /***************************************************************************/
914 
915 GAMEX(1983, prosoccr, 0,        prosoccr,  liberate, prosport, ROT270, "Data East Corporation", "Pro Soccer", GAME_NOT_WORKING )
916 GAMEX(1983, prosport, 0,        prosport,  liberate, prosport, ROT270, "Data East Corporation", "Prosport", GAME_NOT_WORKING )
917 GAME( 1983, boomrang, 0,        boomrang,  boomrang, prosport, ROT270, "Data East Corporation", "Boomer Rang'r - Genesis" )
918 GAME( 1984, kamikcab, 0,        boomrang,  kamikcab, prosport, ROT270, "Data East Corporation", "Kamikaze Cabbie" )
919 GAME( 1984, liberate, 0,        liberate,  liberate, liberate, ROT270, "Data East Corporation", "Liberation" )
920 GAMEX(1984, liberatb, liberate, liberatb,  liberate, prosport, ROT270, "bootleg",               "Liberation (bootleg)", GAME_NOT_WORKING )
921