1 #include "../vidhrdw/frogger.c"
2 #include "../sndhrdw/frogger.c"
3 
4 /***************************************************************************
5 
6 Frogger memory map (preliminary)
7 
8 0000-3fff ROM
9 8000-87ff RAM
10 a800-abff Video RAM
11 b000-b0ff Object RAM
12 b000-b03f screen attributes
13 b040-b05f sprites
14 b060-b0ff unused?
15 
16 read:
17 8800      Watchdog Reset
18 e000      IN0
19 e002      IN1
20 e004      IN2
21 
22 *
23  * IN0 (all bits are inverted)
24  * bit 7 : COIN 1
25  * bit 6 : COIN 2
26  * bit 5 : LEFT player 1
27  * bit 4 : RIGHT player 1
28  * bit 3 : SHOOT 1 player 1
29  * bit 2 : CREDIT
30  * bit 1 : SHOOT 2 player 1
31  * bit 0 : UP player 2 (TABLE only)
32  *
33 *
34  * IN1 (all bits are inverted)
35  * bit 7 : START 1
36  * bit 6 : START 2
37  * bit 5 : LEFT player 2 (TABLE only)
38  * bit 4 : RIGHT player 2 (TABLE only)
39  * bit 3 : SHOOT 1 player 2 (TABLE only)
40  * bit 2 : SHOOT 2 player 2 (TABLE only)
41  * bit 1 :\ nr of lives
42  * bit 0 :/ 00 = 3  01 = 5  10 = 7  11 = 256
43 *
44  * IN2 (all bits are inverted)
45  * bit 7 : unused
46  * bit 6 : DOWN player 1
47  * bit 5 : unused
48  * bit 4 : UP player 1
49  * bit 3 : COCKTAIL or UPRIGHT cabinet (0 = UPRIGHT)
50  * bit 2 :\ coins per play
51  * bit 1 :/
52  * bit 0 : DOWN player 2 (TABLE only)
53  *
54 
55 write:
56 b808      interrupt enable
57 b80c      screen horizontal flip
58 b810      screen vertical flip
59 b818      coin counter 1
60 b81c      coin counter 2
61 d000      To AY-3-8910 port A (commands for the second Z80)
62 d002      trigger interrupt on sound CPU
63 
64 
65 SOUND BOARD:
66 0000-17ff ROM
67 4000-43ff RAM
68 
69 I/0 ports:
70 read:
71 40      8910 #1  read
72 
73 write
74 40      8910 #1  write
75 80      8910 #1  control
76 
77 interrupts:
78 interrupt mode 1 triggered by the main CPU
79 
80 ***************************************************************************/
81 
82 #include "driver.h"
83 #include "vidhrdw/generic.h"
84 
85 
86 
87 extern unsigned char *frogger_attributesram;
88 void frogger_vh_convert_color_prom(unsigned char *palette, unsigned short *colortable,const unsigned char *color_prom);
89 WRITE_HANDLER( frogger_attributes_w );
90 WRITE_HANDLER( frogger_flipscreen_w );
91 void frogger_vh_screenrefresh(struct osd_bitmap *bitmap,int full_refresh);
92 void frogger2_vh_screenrefresh(struct osd_bitmap *bitmap,int full_refresh);
93 
94 READ_HANDLER( frogger_portB_r );
95 WRITE_HANDLER( frogger_sh_irqtrigger_w );
96 WRITE_HANDLER( frogger2_sh_irqtrigger_w );
97 
WRITE_HANDLER(frogger_counterb_w)98 static WRITE_HANDLER( frogger_counterb_w )
99 {
100 	coin_counter_w (1, data);
101 }
102 
103 static struct MemoryReadAddress readmem[] =
104 {
105 	{ 0x0000, 0x3fff, MRA_ROM },
106 	{ 0x8000, 0x87ff, MRA_RAM },
107 	{ 0x8800, 0x8800, watchdog_reset_r },
108 	{ 0xa800, 0xabff, MRA_RAM },	/* video RAM */
109 	{ 0xb000, 0xb05f, MRA_RAM },	/* screen attributes, sprites */
110 	{ 0xe000, 0xe000, input_port_0_r },	/* IN0 */
111 	{ 0xe002, 0xe002, input_port_1_r },	/* IN1 */
112 	{ 0xe004, 0xe004, input_port_2_r },	/* IN2 */
113 	{ -1 }	/* end of table */
114 };
115 
116 static struct MemoryWriteAddress writemem[] =
117 {
118 	{ 0x0000, 0x3fff, MWA_ROM },
119 	{ 0x8000, 0x87ff, MWA_RAM },
120 	{ 0xa800, 0xabff, videoram_w, &videoram, &videoram_size },
121 	{ 0xb000, 0xb03f, frogger_attributes_w, &frogger_attributesram },
122 	{ 0xb040, 0xb05f, MWA_RAM, &spriteram, &spriteram_size },
123 	{ 0xb808, 0xb808, interrupt_enable_w },
124 	{ 0xb80c, 0xb80c, frogger_flipscreen_w },
125 	{ 0xb818, 0xb818, coin_counter_w },
126 	{ 0xb81c, 0xb81c, frogger_counterb_w },
127 	{ 0xd000, 0xd000, soundlatch_w },
128 	{ 0xd002, 0xd002, frogger_sh_irqtrigger_w },
129 	{ -1 }	/* end of table */
130 };
131 
132 static struct MemoryReadAddress froggrmc_readmem[] =
133 {
134 	{ 0x0000, 0x3fff, MRA_ROM },
135 	{ 0x8000, 0x87ff, MRA_RAM },
136 	{ 0x9000, 0x93ff, MRA_RAM },	/* video RAM */
137 	{ 0x9800, 0x985f, MRA_RAM },	/* screen attributes, sprites */
138 	{ 0xa000, 0xa000, input_port_0_r },	/* IN0 */
139 	{ 0xa800, 0xa800, input_port_1_r },	/* IN1 */
140 	{ 0xb000, 0xb000, input_port_2_r },	/* IN2 */
141 	{ 0xb800, 0xb800, watchdog_reset_r },
142 	{ -1 }	/* end of table */
143 };
144 
145 static struct MemoryWriteAddress froggrmc_writemem[] =
146 {
147 	{ 0x0000, 0x3fff, MWA_ROM },
148 	{ 0x8000, 0x87ff, MWA_RAM },
149 	{ 0x9000, 0x93ff, videoram_w, &videoram, &videoram_size },
150 	{ 0x9800, 0x983f, frogger_attributes_w, &frogger_attributesram },
151 	{ 0x9840, 0x985f, MWA_RAM, &spriteram, &spriteram_size },
152 	{ 0xa800, 0xa800, soundlatch_w },
153 	{ 0xb000, 0xb000, interrupt_enable_w },
154 	{ 0xb001, 0xb001, frogger2_sh_irqtrigger_w },
155 	{ 0xb006, 0xb006, frogger_flipscreen_w },
156 	{ -1 }	/* end of table */
157 };
158 
159 
160 
161 static struct MemoryReadAddress sound_readmem[] =
162 {
163 	{ 0x0000, 0x17ff, MRA_ROM },
164 	{ 0x4000, 0x43ff, MRA_RAM },
165 	{ -1 }	/* end of table */
166 };
167 
168 static struct MemoryWriteAddress sound_writemem[] =
169 {
170 	{ 0x0000, 0x17ff, MWA_ROM },
171 	{ 0x4000, 0x43ff, MWA_RAM },
172 	{ -1 }	/* end of table */
173 };
174 
175 
176 
177 static struct IOReadPort sound_readport[] =
178 {
179 	{ 0x40, 0x40, AY8910_read_port_0_r },
180 	{ -1 }	/* end of table */
181 };
182 
183 static struct IOWritePort sound_writeport[] =
184 {
185 	{ 0x80, 0x80, AY8910_control_port_0_w },
186 	{ 0x40, 0x40, AY8910_write_port_0_w },
187 	{ -1 }	/* end of table */
188 };
189 
190 
191 
192 INPUT_PORTS_START( frogger )
193 	PORT_START	/* IN0 */
194 	PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_UP | IPF_4WAY | IPF_COCKTAIL )
195 	PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* 1P shoot2 - unused */
196 	PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_COIN3 )
197 	PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* 1P shoot1 - unused */
198 	PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT | IPF_4WAY )
199 	PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT | IPF_4WAY )
200 	PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_COIN2 )
201 	PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_COIN1 )
202 
203 	PORT_START	/* IN1 */
204 	PORT_DIPNAME( 0x03, 0x00, DEF_STR( Lives ) )
205 	PORT_DIPSETTING(    0x00, "3" )
206 	PORT_DIPSETTING(    0x01, "5" )
207 	PORT_DIPSETTING(    0x02, "7" )
208 	PORT_BITX( 0,       0x03, IPT_DIPSWITCH_SETTING | IPF_CHEAT, "256", IP_KEY_NONE, IP_JOY_NONE )
209 	PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* 2P shoot2 - unused */
210 	PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* 2P shoot1 - unused */
211 	PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT | IPF_4WAY | IPF_COCKTAIL )
212 	PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT | IPF_4WAY | IPF_COCKTAIL )
213 	PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_START2 )
214 	PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_START1 )
215 
216 	PORT_START	/* IN2 */
217 	PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN | IPF_4WAY | IPF_COCKTAIL )
218 	PORT_DIPNAME( 0x06, 0x00, DEF_STR( Coinage ) )
219 	PORT_DIPSETTING(    0x02, "A 2/1 B 2/1 C 2/1" )
220 	PORT_DIPSETTING(    0x04, "A 2/1 B 1/3 C 2/1" )
221 	PORT_DIPSETTING(    0x00, "A 1/1 B 1/1 C 1/1" )
222 	PORT_DIPSETTING(    0x06, "A 1/1 B 1/6 C 1/1" )
223 	PORT_DIPNAME( 0x08, 0x00, DEF_STR( Cabinet ) )
224 	PORT_DIPSETTING(    0x00, DEF_STR( Upright ) )
225 	PORT_DIPSETTING(    0x08, DEF_STR( Cocktail ) )
226 	PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_JOYSTICK_UP | IPF_4WAY )
227 	PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNUSED )
228 	PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN | IPF_4WAY )
229 	PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED )
230 INPUT_PORTS_END
231 
232 INPUT_PORTS_START( froggrmc )
233 	PORT_START	/* IN0 */
234 	PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_COIN1 )
235 	PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_COIN2 )
236 	PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT | IPF_4WAY )
237 	PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT | IPF_4WAY )
238 	PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP | IPF_4WAY )
239 	PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN | IPF_4WAY )
240 	PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_UNKNOWN )
241 	PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_COIN3 )
242 
243 	PORT_START	/* IN1 */
244 	PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_START1 )
245 	PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 )
246 	PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT | IPF_4WAY | IPF_COCKTAIL )
247 	PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT | IPF_4WAY | IPF_COCKTAIL )
248 	PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP | IPF_4WAY | IPF_COCKTAIL )
249 	PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN | IPF_4WAY | IPF_COCKTAIL )
250 	PORT_DIPNAME( 0xc0, 0xc0, DEF_STR( Lives ) )
251 	PORT_DIPSETTING(    0xc0, "3" )
252 	PORT_DIPSETTING(    0x80, "5" )
253 	PORT_DIPSETTING(    0x40, "7" )
254 	PORT_BITX( 0,       0x00, IPT_DIPSWITCH_SETTING | IPF_CHEAT, "256", IP_KEY_NONE, IP_JOY_NONE )
255 
256 	PORT_START	/* IN2 */
257 	PORT_DIPNAME( 0x01, 0x01, DEF_STR( Cabinet ) )
258 	PORT_DIPSETTING(    0x01, DEF_STR( Upright ) )
259 	PORT_DIPSETTING(    0x00, DEF_STR( Cocktail ) )
260 	PORT_DIPNAME( 0x06, 0x06, DEF_STR( Coinage ) )
261 	PORT_DIPSETTING(    0x02, "A 2/1 B 2/1 C 2/1" )
262 	PORT_DIPSETTING(    0x04, "A 2/1 B 1/3 C 2/1" )
263 	PORT_DIPSETTING(    0x06, "A 1/1 B 1/1 C 1/1" )
264 	PORT_DIPSETTING(    0x00, "A 1/1 B 1/6 C 1/1" )
265 	PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNKNOWN )
266 	PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_UNKNOWN )
267 	PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_UNKNOWN )
268 	PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_UNKNOWN )
269 	PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_UNKNOWN )
270 INPUT_PORTS_END
271 
272 
273 
274 static struct GfxLayout charlayout =
275 {
276 	8,8,	/* 8*8 characters */
277 	256,	/* 256 characters */
278 	2,	/* 2 bits per pixel */
279 	{ 256*8*8, 0 },	/* the two bitplanes are separated */
280 	{ 0, 1, 2, 3, 4, 5, 6, 7 },
281 	{ 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8 },
282 	8*8	/* every char takes 8 consecutive bytes */
283 };
284 static struct GfxLayout spritelayout =
285 {
286 	16,16,	/* 16*16 sprites */
287 	64,	/* 64 sprites */
288 	2,	/* 2 bits per pixel */
289 	{ 64*16*16, 0 },	/* the two bitplanes are separated */
290 	{ 0, 1, 2, 3, 4, 5, 6, 7,
291 			8*8+0, 8*8+1, 8*8+2, 8*8+3, 8*8+4, 8*8+5, 8*8+6, 8*8+7 },
292 	{ 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8,
293 			16*8, 17*8, 18*8, 19*8, 20*8, 21*8, 22*8, 23*8 },
294 	32*8	/* every sprite takes 32 consecutive bytes */
295 };
296 
297 
298 
299 static struct GfxDecodeInfo gfxdecodeinfo[] =
300 {
301 	{ REGION_GFX1, 0, &charlayout,     0, 16 },
302 	{ REGION_GFX1, 0, &spritelayout,   0,  8 },
303 	{ -1 } /* end of array */
304 };
305 
306 
307 
308 static struct AY8910interface ay8910_interface =
309 {
310 	1,	/* 1 chip */
311 	14318000/8,	/* 1.78975 Mhz */
312 	{ MIXERG(80,MIXER_GAIN_2x,MIXER_PAN_CENTER) },
313 	{ soundlatch_r },
314 	{ frogger_portB_r },
315 	{ 0 },
316 	{ 0 }
317 };
318 
319 
320 
321 static struct MachineDriver machine_driver_frogger =
322 {
323 	/* basic machine hardware */
324 	{
325 		{
326 			CPU_Z80,
327 			18432000/6,	/* 3.072 Mhz */
328 			readmem,writemem,0,0,
329 			nmi_interrupt,1
330 		},
331 		{
332 			CPU_Z80 | CPU_AUDIO_CPU,
333 			14318000/8,	/* 1.78975 Mhz */
334 			sound_readmem,sound_writemem,sound_readport,sound_writeport,
335 			ignore_interrupt,1	/* interrupts are triggered by the main CPU */
336 		}
337 	},
338 	60, 2500,	/* frames per second, vblank duration */
339 	1,	/* 1 CPU slice per frame - interleaving is forced when a sound command is written */
340 	0,
341 
342 	/* video hardware */
343 	32*8, 32*8, { 0*8, 32*8-1, 2*8, 30*8-1 },
344 	gfxdecodeinfo,
345 	32,64,
346 	frogger_vh_convert_color_prom,
347 
348 	VIDEO_TYPE_RASTER,
349 	0,
350 	generic_vh_start,
351 	generic_vh_stop,
352 	frogger_vh_screenrefresh,
353 
354 	/* sound hardware */
355 	0,0,0,0,
356 	{
357 		{
358 			SOUND_AY8910,
359 			&ay8910_interface
360 		}
361 	}
362 };
363 
364 static struct MachineDriver machine_driver_froggrmc =
365 {
366 	/* basic machine hardware */
367 	{
368 		{
369 			CPU_Z80,
370 			18432000/6,	/* 3.072 Mhz */
371 			froggrmc_readmem,froggrmc_writemem,0,0,
372 			nmi_interrupt,1
373 		},
374 		{
375 			CPU_Z80 | CPU_AUDIO_CPU,
376 			14318000/8,	/* 1.78975 Mhz */
377 			sound_readmem,sound_writemem,sound_readport,sound_writeport,
378 			ignore_interrupt,1	/* interrupts are triggered by the main CPU */
379 		}
380 	},
381 	60, 2500,	/* frames per second, vblank duration */
382 	1,	/* 1 CPU slice per frame - interleaving is forced when a sound command is written */
383 	0,
384 
385 	/* video hardware */
386 	32*8, 32*8, { 0*8, 32*8-1, 2*8, 30*8-1 },
387 	gfxdecodeinfo,
388 	32,64,
389 	frogger_vh_convert_color_prom,
390 
391 	VIDEO_TYPE_RASTER,
392 	0,
393 	generic_vh_start,
394 	generic_vh_stop,
395 	frogger2_vh_screenrefresh,
396 
397 	/* sound hardware */
398 	0,0,0,0,
399 	{
400 		{
401 			SOUND_AY8910,
402 			&ay8910_interface
403 		}
404 	}
405 };
406 
407 
408 
409 /***************************************************************************
410 
411   Game driver(s)
412 
413 ***************************************************************************/
414 
415 
416 ROM_START( frogger )
417 	ROM_REGION( 0x10000, REGION_CPU1 )	/* 64k for code */
418 	ROM_LOAD( "frogger.26",   0x0000, 0x1000, 0x597696d6 )
419 	ROM_LOAD( "frogger.27",   0x1000, 0x1000, 0xb6e6fcc3 )
420 	ROM_LOAD( "frsm3.7",      0x2000, 0x1000, 0xaca22ae0 )
421 
422 	ROM_REGION( 0x10000, REGION_CPU2 )	/* 64k for the audio CPU */
423 	ROM_LOAD( "frogger.608",  0x0000, 0x0800, 0xe8ab0256 )
424 	ROM_LOAD( "frogger.609",  0x0800, 0x0800, 0x7380a48f )
425 	ROM_LOAD( "frogger.610",  0x1000, 0x0800, 0x31d7eb27 )
426 
427 	ROM_REGION( 0x1000, REGION_GFX1 | REGIONFLAG_DISPOSE )
428 	ROM_LOAD( "frogger.606",  0x0000, 0x0800, 0xf524ee30 )
429 	ROM_LOAD( "frogger.607",  0x0800, 0x0800, 0x05f7d883 )
430 
431 	ROM_REGION( 0x0020, REGION_PROMS )
432 	ROM_LOAD( "pr-91.6l",     0x0000, 0x0020, 0x413703bf )
433 ROM_END
434 
ROM_START(frogseg1)435 ROM_START( frogseg1 )
436 	ROM_REGION( 0x10000, REGION_CPU1 )	/* 64k for code */
437 	ROM_LOAD( "frogger.26",   0x0000, 0x1000, 0x597696d6 )
438 	ROM_LOAD( "frogger.27",   0x1000, 0x1000, 0xb6e6fcc3 )
439 	ROM_LOAD( "frogger.34",   0x2000, 0x1000, 0xed866bab )
440 
441 	ROM_REGION( 0x10000, REGION_CPU2 )	/* 64k for the audio CPU */
442 	ROM_LOAD( "frogger.608",  0x0000, 0x0800, 0xe8ab0256 )
443 	ROM_LOAD( "frogger.609",  0x0800, 0x0800, 0x7380a48f )
444 	ROM_LOAD( "frogger.610",  0x1000, 0x0800, 0x31d7eb27 )
445 
446 	ROM_REGION( 0x1000, REGION_GFX1 | REGIONFLAG_DISPOSE )
447 	ROM_LOAD( "frogger.606",  0x0000, 0x0800, 0xf524ee30 )
448 	ROM_LOAD( "frogger.607",  0x0800, 0x0800, 0x05f7d883 )
449 
450 	ROM_REGION( 0x0020, REGION_PROMS )
451 	ROM_LOAD( "pr-91.6l",     0x0000, 0x0020, 0x413703bf )
452 ROM_END
453 
454 ROM_START( frogseg2 )
455 	ROM_REGION( 0x10000, REGION_CPU1 )	/* 64k for code */
456 	ROM_LOAD( "frogger.ic5",  0x0000, 0x1000, 0xefab0c79 )
457 	ROM_LOAD( "frogger.ic6",  0x1000, 0x1000, 0xaeca9c13 )
458 	ROM_LOAD( "frogger.ic7",  0x2000, 0x1000, 0xdd251066 )
459 	ROM_LOAD( "frogger.ic8",  0x3000, 0x1000, 0xbf293a02 )
460 
461 	ROM_REGION( 0x10000, REGION_CPU2 )	/* 64k for the audio CPU */
462 	ROM_LOAD( "frogger.608",  0x0000, 0x0800, 0xe8ab0256 )
463 	ROM_LOAD( "frogger.609",  0x0800, 0x0800, 0x7380a48f )
464 	ROM_LOAD( "frogger.610",  0x1000, 0x0800, 0x31d7eb27 )
465 
466 	ROM_REGION( 0x1000, REGION_GFX1 | REGIONFLAG_DISPOSE )
467 	ROM_LOAD( "frogger.606",  0x0000, 0x0800, 0xf524ee30 )
468 	ROM_LOAD( "frogger.607",  0x0800, 0x0800, 0x05f7d883 )
469 
470 	ROM_REGION( 0x0020, REGION_PROMS )
471 	ROM_LOAD( "pr-91.6l",     0x0000, 0x0020, 0x413703bf )
472 ROM_END
473 
474 ROM_START( froggrmc )
475 	ROM_REGION( 0x10000, REGION_CPU1 )	/* 64k for code */
476 	ROM_LOAD( "epr-1031.15",  0x0000, 0x1000, 0x4b7c8d11 )
477 	ROM_LOAD( "epr-1032.16",  0x1000, 0x1000, 0xac00b9d9 )
478 	ROM_LOAD( "epr-1033.33",  0x2000, 0x1000, 0xbc1d6fbc )
479 	ROM_LOAD( "epr-1034.34",  0x3000, 0x1000, 0x9efe7399 )
480 
481 	ROM_REGION( 0x10000, REGION_CPU2 )	/* 64k for the audio CPU */
482 	ROM_LOAD( "epr-1082.42",  0x0000, 0x1000, 0x802843c2 )
483 	ROM_LOAD( "epr-1035.43",  0x1000, 0x0800, 0x14e74148 )
484 
485 	ROM_REGION( 0x1000, REGION_GFX1 | REGIONFLAG_DISPOSE )
486 	ROM_LOAD( "epr-1036.1k",  0x0000, 0x0800, 0x658745f8 )
487 	ROM_LOAD( "frogger.607",  0x0800, 0x0800, 0x05f7d883 )
488 
489 	ROM_REGION( 0x0020, REGION_PROMS )
490 	ROM_LOAD( "pr-91.6l",     0x0000, 0x0020, 0x413703bf )
491 ROM_END
492 
493 
494 
495 static void init_frogger(void)
496 {
497 	int A;
498 	unsigned char *RAM;
499 
500 
501 	/* the first ROM of the second CPU has data lines D0 and D1 swapped. Decode it. */
502 	RAM = memory_region(REGION_CPU2);
503 	for (A = 0;A < 0x0800;A++)
504 		RAM[A] = (RAM[A] & 0xfc) | ((RAM[A] & 1) << 1) | ((RAM[A] & 2) >> 1);
505 
506 	/* likewise, the first gfx ROM has data lines D0 and D1 swapped. Decode it. */
507 	RAM = memory_region(REGION_GFX1);
508 	for (A = 0;A < 0x0800;A++)
509 		RAM[A] = (RAM[A] & 0xfc) | ((RAM[A] & 1) << 1) | ((RAM[A] & 2) >> 1);
510 }
511 
init_froggrmc(void)512 static void init_froggrmc(void)
513 {
514 	int A;
515 	unsigned char *RAM;
516 
517 
518 	/* the first ROM of the second CPU has data lines D0 and D1 swapped. Decode it. */
519 	RAM = memory_region(REGION_CPU2);
520 	for (A = 0;A < 0x1000;A++)
521 		RAM[A] = (RAM[A] & 0xfc) | ((RAM[A] & 1) << 1) | ((RAM[A] & 2) >> 1);
522 }
523 
524 
525 
526 GAME( 1981, frogger,  0,       frogger,  frogger,  frogger,  ROT90, "Konami", "Frogger" )
527 GAME( 1981, frogseg1, frogger, frogger,  frogger,  frogger,  ROT90, "[Konami] (Sega license)", "Frogger (Sega set 1)" )
528 GAME( 1981, frogseg2, frogger, frogger,  frogger,  frogger,  ROT90, "[Konami] (Sega license)", "Frogger (Sega set 2)" )
529 
530 /* this version runs on modified Moon Cresta hardware */
531 GAME( 1981, froggrmc, frogger, froggrmc, froggrmc, froggrmc, ROT90, "bootleg?", "Frogger (modified Moon Cresta hardware)" )
532