1 /***************************************************************************
2 
3 Super Dodgeball / Nekketsu Koukou Dodgeball Bu
4 
5 briver by Paul Hampson and Nicola Salmoria
6 
7 TODO:
8 - sprite lag (the real game has quite a bit of lag too)
9 - rowscroll (not used expect for status display)
10 - double-tap tolerance
11 
12 Notes:
13 - there's probably a 63701 on the board, used for protection. It is checked
14   on startup and then just used to read the input ports. It doesn't return
15   the ports verbatim, it adds further processing, setting flags when the
16   player double-taps in one direction to run.(updated to edge-triggering)
17 
18 ***************************************************************************/
19 
20 #include "driver.h"
21 #include "vidhrdw/generic.h"
22 #include "cpu/m6809/m6809.h"
23 
24 
25 extern unsigned char *spdodgeb_videoram;
26 
27 PALETTE_INIT( spdodgeb );
28 VIDEO_START( spdodgeb );
29 VIDEO_UPDATE( spdodgeb );
30 INTERRUPT_GEN( spdodgeb_interrupt );
31 WRITE_HANDLER( spdodgeb_scrollx_lo_w );
32 WRITE_HANDLER( spdodgeb_ctrl_w );
33 WRITE_HANDLER( spdodgeb_videoram_w );
34 
35 
36 /* private globals */
37 static int toggle=0;/*, soundcode = 0;*/
38 static int adpcm_pos[2],adpcm_end[2],adpcm_idle[2];
39 /* end of private globals */
40 
41 
WRITE_HANDLER(sound_command_w)42 static WRITE_HANDLER( sound_command_w )
43 {
44 	soundlatch_w(offset,data);
45 	cpu_set_irq_line(1,M6809_IRQ_LINE,HOLD_LINE);
46 }
47 
WRITE_HANDLER(spd_adpcm_w)48 static WRITE_HANDLER( spd_adpcm_w )
49 {
50 	int chip = offset & 1;
51 
52 	switch (offset/2)
53 	{
54 		case 3:
55 			adpcm_idle[chip] = 1;
56 			MSM5205_reset_w(chip,1);
57 			break;
58 
59 		case 2:
60 			adpcm_pos[chip] = (data & 0x7f) * 0x200;
61 			break;
62 
63 		case 1:
64 			adpcm_end[chip] = (data & 0x7f) * 0x200;
65 			break;
66 
67 		case 0:
68 			adpcm_idle[chip] = 0;
69 			MSM5205_reset_w(chip,0);
70 			break;
71 	}
72 }
73 
spd_adpcm_int(int chip)74 static void spd_adpcm_int(int chip)
75 {
76 	static int adpcm_data[2] = { -1, -1 };
77 
78 	if (adpcm_pos[chip] >= adpcm_end[chip] || adpcm_pos[chip] >= 0x10000)
79 	{
80 		adpcm_idle[chip] = 1;
81 		MSM5205_reset_w(chip,1);
82 	}
83 	else if (adpcm_data[chip] != -1)
84 	{
85 		MSM5205_data_w(chip,adpcm_data[chip] & 0x0f);
86 		adpcm_data[chip] = -1;
87 	}
88 	else
89 	{
90 		unsigned char *ROM = memory_region(REGION_SOUND1) + 0x10000 * chip;
91 
92 		adpcm_data[chip] = ROM[adpcm_pos[chip]++];
93 		MSM5205_data_w(chip,adpcm_data[chip] >> 4);
94 	}
95 }
96 
97 
98 static int mcu63701_command;
99 static int inputs[4];
100 
101 #if 0	/* default - more sensitive (state change and timing measured on real board?)*/
102 static void mcu63705_update_inputs(void)
103 {
104 	static int running[2],jumped[2];
105 	int buttons[2];
106 	int p,j;
107 
108 	/* update running state */
109 	for (p = 0;p <= 1;p++)
110 	{
111 		static int prev[2][2],countup[2][2],countdown[2][2];
112 		int curr[2][2];
113 
114 		curr[p][0] = readinputport(2+p) & 0x01;
115 		curr[p][1] = readinputport(2+p) & 0x02;
116 
117 		for (j = 0;j <= 1;j++)
118 		{
119 			if (curr[p][j] == 0)
120 			{
121 				if (prev[p][j] != 0)
122 					countup[p][j] = 0;
123 				if (curr[p][j^1])
124 					countup[p][j] = 100;
125 				countup[p][j]++;
126 				running[p] &= ~(1 << j);
127 			}
128 			else
129 			{
130 				if (prev[p][j] == 0)
131 				{
132 					if (countup[p][j] < 10 && countdown[p][j] < 5)
133 						running[p] |= 1 << j;
134 					countdown[p][j] = 0;
135 				}
136 				countdown[p][j]++;
137 			}
138 		}
139 
140 		prev[p][0] = curr[p][0];
141 		prev[p][1] = curr[p][1];
142 	}
143 
144 	/* update jumping and buttons state */
145 	for (p = 0;p <= 1;p++)
146 	{
147 		static int prev[2];
148 		int curr[2];
149 
150 		curr[p] = readinputport(2+p) & 0x30;
151 
152 		if (jumped[p]) buttons[p] = 0;	/* jump only momentarily flips the buttons */
153 		else buttons[p] = curr[p];
154 
155 		if (buttons[p] == 0x30) jumped[p] = 1;
156 		if (curr[p] == 0x00) jumped[p] = 0;
157 
158 		prev[p] = curr[p];
159 	}
160 
161 	inputs[0] = readinputport(2) & 0xcf;
162 	inputs[1] = readinputport(3) & 0x0f;
163 	inputs[2] = running[0] | buttons[0];
164 	inputs[3] = running[1] | buttons[1];
165 }
166 #else	/* alternate - less sensitive*/
mcu63705_update_inputs(void)167 static void mcu63705_update_inputs(void)
168 {
169 #define DBLTAP_TOLERANCE 5
170 
171 #define R 0x01
172 #define L 0x02
173 #define A 0x10
174 #define D 0x20
175 
176 	static UINT8 tapc[4] = {0,0,0,0};	/* R1, R2, L1, L2*/
177 	static UINT8 last_port[2] = {0,0};
178 	static UINT8 last_dash[2] = {0,0};
179 	UINT8 curr_port[2];
180 	UINT8 curr_dash[2];
181 	int p;
182 
183 	for (p=0; p<=1; p++)
184 	{
185 		curr_port[p] = readinputport(p+2);
186 		curr_dash[p] = 0;
187 
188 		if (curr_port[p] & R)
189 		{
190 			if (!(last_port[p] & R))
191 			{
192 				if (tapc[p]) curr_dash[p] |= R; else tapc[p] = DBLTAP_TOLERANCE;
193 			}
194 			else if (last_dash[p] & R) curr_dash[p] |= R;
195 		}
196 		else if (curr_port[p] & L)
197 		{
198 			if (!(last_port[p] & L))
199 			{
200 				if (tapc[p+2]) curr_dash[p] |= L; else tapc[p+2] = DBLTAP_TOLERANCE;
201 			}
202 			else if (last_dash[p] & L) curr_dash[p] |= L;
203 		}
204 
205 		if (curr_port[p] & A && !(last_port[p] & A)) curr_dash[p] |= A;
206 		if (curr_port[p] & D && !(last_port[p] & D)) curr_dash[p] |= D;
207 
208 		last_port[p] = curr_port[p];
209 		last_dash[p] = curr_dash[p];
210 
211 		if (tapc[p  ]) tapc[p  ]--;
212 		if (tapc[p+2]) tapc[p+2]--;
213 	}
214 
215 	inputs[0] = curr_port[0] & 0xcf;
216 	inputs[1] = curr_port[1] & 0x0f;
217 	inputs[2] = curr_dash[0];
218 	inputs[3] = curr_dash[1];
219 
220 #undef DBLTAP_TOLERANCE
221 #undef R
222 #undef L
223 #undef A
224 #undef D
225 }
226 #endif
227 
READ_HANDLER(mcu63701_r)228 static READ_HANDLER( mcu63701_r )
229 {
230 /*	log_cb(RETRO_LOG_DEBUG, LOGPRE "CPU #0 PC %04x: read from port %02x of 63701 data address 3801\n",activecpu_get_pc(),offset);*/
231 
232 	if (mcu63701_command == 0) return 0x6a;
233 	else switch (offset)
234 	{
235 		default:
236 		case 0: return inputs[0];
237 		case 1: return inputs[1];
238 		case 2: return inputs[2];
239 		case 3: return inputs[3];
240 		case 4: return readinputport(4);
241 	}
242 }
243 
WRITE_HANDLER(mcu63701_w)244 static WRITE_HANDLER( mcu63701_w )
245 {
246 /*	log_cb(RETRO_LOG_DEBUG, LOGPRE "CPU #0 PC %04x: write %02x to 63701 control address 3800\n",activecpu_get_pc(),data);*/
247 	mcu63701_command = data;
248 	mcu63705_update_inputs();
249 }
250 
251 
READ_HANDLER(port_0_r)252 static READ_HANDLER( port_0_r )
253 {
254 	int port = readinputport(0);
255 
256 	toggle^=0x02;	/* mcu63701_busy flag */
257 
258 	return (port | toggle);
259 }
260 
261 
262 
MEMORY_READ_START(readmem)263 static MEMORY_READ_START( readmem )
264 	{ 0x0000, 0x0fff, MRA_RAM },
265 	{ 0x2000, 0x2fff, MRA_RAM },
266 	{ 0x3000, 0x3000, port_0_r },
267 	{ 0x3001, 0x3001, input_port_1_r },	/* DIPs */
268 	{ 0x3801, 0x3805, mcu63701_r },
269 	{ 0x4000, 0x7fff, MRA_BANK1 },
270 	{ 0x8000, 0xffff, MRA_ROM },
271 MEMORY_END
272 
273 static MEMORY_WRITE_START( writemem )
274 	{ 0x0000, 0x0fff, MWA_RAM },
275 	{ 0x1000, 0x10ff, MWA_RAM, &spriteram, &spriteram_size },
276 	{ 0x2000, 0x2fff, spdodgeb_videoram_w, &spdodgeb_videoram },
277 /*	{ 0x3000, 0x3000, MWA_RAM },*/
278 /*	{ 0x3001, 0x3001, MWA_RAM },*/
279 	{ 0x3002, 0x3002, sound_command_w },
280 /*	{ 0x3003, 0x3003, MWA_RAM },*/
281 	{ 0x3004, 0x3004, spdodgeb_scrollx_lo_w },
282 /*	{ 0x3005, 0x3005, MWA_RAM },  // mcu63701_output_w /*/
283 	{ 0x3006, 0x3006, spdodgeb_ctrl_w },	/* scroll hi, flip screen, bank switch, palette select */
284 	{ 0x3800, 0x3800, mcu63701_w },
285 	{ 0x4000, 0xffff, MWA_ROM },
286 MEMORY_END
287 
288 static MEMORY_READ_START( sound_readmem )
289 	{ 0x0000, 0x0fff, MRA_RAM },
290 	{ 0x1000, 0x1000, soundlatch_r },
291 	{ 0x8000, 0xffff, MRA_ROM },
292 MEMORY_END
293 
294 static MEMORY_WRITE_START( sound_writemem )
295 	{ 0x0000, 0x0fff, MWA_RAM },
296 	{ 0x2800, 0x2800, YM3812_control_port_0_w },
297 	{ 0x2801, 0x2801, YM3812_write_port_0_w },
298 	{ 0x3800, 0x3807, spd_adpcm_w },
299 	{ 0x8000, 0xffff, MWA_ROM },
300 MEMORY_END
301 
302 
303 INPUT_PORTS_START( spdodgeb )
304 	PORT_START
305 	PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_VBLANK )
306 	PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_SPECIAL )	/* mcu63701_busy flag */
307 	PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNKNOWN )
308 	PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_COIN1 )
309 	PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_COIN2 )
310 	PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_SERVICE1 )
311 	PORT_DIPNAME( 0xc0, 0xc0, DEF_STR( Difficulty ) )
312 	PORT_DIPSETTING(    0x80, "Easy")
313 	PORT_DIPSETTING(    0xc0, "Normal")
314 	PORT_DIPSETTING(    0x40, "Hard")
315 	PORT_DIPSETTING(    0x00, "Very Hard")
316 
317 	PORT_START
318 	PORT_DIPNAME( 0x07, 0x07, DEF_STR( Coin_A ) )
319 	PORT_DIPSETTING(    0x00, DEF_STR( 4C_1C ) )
320 	PORT_DIPSETTING(    0x01, DEF_STR( 3C_1C ) )
321 	PORT_DIPSETTING(    0x02, DEF_STR( 2C_1C ) )
322 	PORT_DIPSETTING(    0x07, DEF_STR( 1C_1C ) )
323 	PORT_DIPSETTING(    0x06, DEF_STR( 1C_2C ) )
324 	PORT_DIPSETTING(    0x05, DEF_STR( 1C_3C ) )
325 	PORT_DIPSETTING(    0x04, DEF_STR( 1C_4C ) )
326 	PORT_DIPSETTING(    0x03, DEF_STR( 1C_5C ) )
327 	PORT_DIPNAME( 0x38, 0x38, DEF_STR( Coin_B ) )
328 	PORT_DIPSETTING(    0x00, DEF_STR( 4C_1C ) )
329 	PORT_DIPSETTING(    0x08, DEF_STR( 3C_1C ) )
330 	PORT_DIPSETTING(    0x10, DEF_STR( 2C_1C ) )
331 	PORT_DIPSETTING(    0x38, DEF_STR( 1C_1C ) )
332 	PORT_DIPSETTING(    0x30, DEF_STR( 1C_2C ) )
333 	PORT_DIPSETTING(    0x28, DEF_STR( 1C_3C ) )
334 	PORT_DIPSETTING(    0x20, DEF_STR( 1C_4C ) )
335 	PORT_DIPSETTING(    0x18, DEF_STR( 1C_5C ) )
336 	PORT_DIPNAME( 0x40, 0x40, DEF_STR( Flip_Screen ) )
337 	PORT_DIPSETTING(    0x40, DEF_STR( Off ) )
338 	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
339 	PORT_DIPNAME( 0x80, 0x80, DEF_STR( Demo_Sounds ) )
340 	PORT_DIPSETTING(    0x00, DEF_STR( Off ) )
341 	PORT_DIPSETTING(    0x80, DEF_STR( On ) )
342 
343 	PORT_START
344 	PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT | IPF_8WAY | IPF_PLAYER1 )
345 	PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT  | IPF_8WAY | IPF_PLAYER1 )
346 	PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP    | IPF_8WAY | IPF_PLAYER1 )
347 	PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN  | IPF_8WAY | IPF_PLAYER1 )
348 	PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_BUTTON1 | IPF_PLAYER1 )
349 	PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_BUTTON2 | IPF_PLAYER1 )
350 	PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_START1 )
351 	PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_START2 )
352 
353 	PORT_START
354 	PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT | IPF_8WAY | IPF_PLAYER2 )
355 	PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT  | IPF_8WAY | IPF_PLAYER2 )
356 	PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP    | IPF_8WAY | IPF_PLAYER2 )
357 	PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN  | IPF_8WAY | IPF_PLAYER2 )
358 	PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_BUTTON1 | IPF_PLAYER2 )
359 	PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_BUTTON2 | IPF_PLAYER2 )
360 	PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_UNKNOWN )
361 	PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_UNKNOWN )
362 
363 	PORT_START
364 	PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNKNOWN )
365 	PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNKNOWN )
366 	PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNKNOWN )
367 	PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNKNOWN )
368 	PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_UNKNOWN )
369 	PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_UNKNOWN )
370 	PORT_DIPNAME( 0x40, 0x00, DEF_STR( Unknown ) )
371 	PORT_DIPSETTING(    0x00, DEF_STR( Off ) )
372 	PORT_DIPSETTING(    0x40, DEF_STR( On ) )
373 	PORT_DIPNAME( 0x80, 0x00, "Allow Continue" )
374 	PORT_DIPSETTING(    0x80, DEF_STR( No ) )
375 	PORT_DIPSETTING(    0x00, DEF_STR( Yes ) )
376 INPUT_PORTS_END
377 
378 
379 
380 static struct GfxLayout charlayout =
381 {
382 	8,8,
383 	RGN_FRAC(1,1),
384 	4,
385 	{ 0, 2, 4, 6 },
386 	{ 1, 0, 64+1, 64+0, 128+1, 128+0, 192+1, 192+0 },
387 	{ 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8 },
388 	32*8
389 };
390 
391 static struct GfxLayout spritelayout =
392 {
393 	16,16,
394 	RGN_FRAC(1,2),
395 	4,
396 	{ RGN_FRAC(1,2)+0, RGN_FRAC(1,2)+4, 0,4 },
397 	{ 3, 2, 1, 0, 16*8+3, 16*8+2, 16*8+1, 16*8+0,
398 		  32*8+3, 32*8+2, 32*8+1, 32*8+0, 48*8+3, 48*8+2, 48*8+1, 48*8+0 },
399 	{ 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8,
400 		  8*8, 9*8, 10*8, 11*8, 12*8, 13*8, 14*8, 15*8 },
401 	64*8
402 };
403 
404 static struct GfxDecodeInfo gfxdecodeinfo[] =
405 {
406 	{ REGION_GFX1, 0, &charlayout,   0x000, 32 },	/* colors 0x000-0x1ff */
407 	{ REGION_GFX2, 0, &spritelayout, 0x200, 32 },	/* colors 0x200-0x3ff */
408 	{ -1 } /* end of array */
409 };
410 
411 
irq_handler(int irq)412 static void irq_handler(int irq)
413 {
414 	cpu_set_irq_line(1,M6809_FIRQ_LINE,irq ? ASSERT_LINE : CLEAR_LINE);
415 }
416 
417 static struct YM3812interface ym3812_interface =
418 {
419 	1,			/* 1 chip */
420 	3000000, 	/* 3MHz ? */
421 	{ 100 },		/* volume */
422 	{ irq_handler }
423 };
424 
425 static struct MSM5205interface msm5205_interface =
426 {
427 	2,			/* 2 chips */
428 	384000,		/* 384KHz */
429 	{ spd_adpcm_int, spd_adpcm_int },	/* interrupt function */
430 	{ MSM5205_S48_4B, MSM5205_S48_4B },	/* 8kHz? */
431 	{ 50, 50 }	/* volume */
432 };
433 
434 
435 
436 static MACHINE_DRIVER_START( spdodgeb )
437 
438 	/* basic machine hardware */
439 	MDRV_CPU_ADD(M6502,12000000/6)	/* 2MHz ? */
440 	MDRV_CPU_MEMORY(readmem,writemem)
441 	MDRV_CPU_VBLANK_INT(spdodgeb_interrupt,33)	/* 1 IRQ every 8 visible scanlines, plus NMI for vblank */
442 
443 	MDRV_CPU_ADD(M6809,12000000/6)
444 	MDRV_CPU_FLAGS(CPU_AUDIO_CPU)	/* 2MHz ? */
445 	MDRV_CPU_MEMORY(sound_readmem,sound_writemem)
446 
447 	MDRV_FRAMES_PER_SECOND(60)
448 	MDRV_VBLANK_DURATION(DEFAULT_60HZ_VBLANK_DURATION)
449 
450 	/* video hardware */
451 	MDRV_VIDEO_ATTRIBUTES(VIDEO_TYPE_RASTER)
452 	MDRV_SCREEN_SIZE(32*8, 32*8)
453 	MDRV_VISIBLE_AREA(1*8, 31*8-1, 1*8, 31*8-1)
454 	MDRV_GFXDECODE(gfxdecodeinfo)
455 	MDRV_PALETTE_LENGTH(1024)
456 	MDRV_COLORTABLE_LENGTH(1024)
457 
458 	MDRV_PALETTE_INIT(spdodgeb)
459 	MDRV_VIDEO_START(spdodgeb)
460 	MDRV_VIDEO_UPDATE(spdodgeb)
461 
462 	/* sound hardware */
463 	MDRV_SOUND_ATTRIBUTES(SOUND_SUPPORTS_STEREO)
464 	MDRV_SOUND_ADD(YM3812, ym3812_interface)
465 	MDRV_SOUND_ADD(MSM5205, msm5205_interface)
466 MACHINE_DRIVER_END
467 
468 
469 
470 ROM_START( spdodgeb )
471 	ROM_REGION( 0x18000, REGION_CPU1, 0 )
472 	ROM_LOAD( "22a-04.139",	  0x10000, 0x08000, CRC(66071fda) SHA1(4a239295900e6234a2a693321ca821671747a58e) )  /* Two banks */
473 	ROM_CONTINUE(             0x08000, 0x08000 )		 /* Static code */
474 
475 	ROM_REGION( 0x10000, REGION_CPU2, 0 ) /* audio cpu */
476 	ROM_LOAD( "22j5-0.33",    0x08000, 0x08000, CRC(c31e264e) SHA1(0828a2094122e3934b784ec9ad7c2b89d91a83bb) )
477 
478 	ROM_REGION( 0x10000, REGION_CPU3, 0 ) /* I/O mcu */
479 	ROM_LOAD( "63701.bin",    0xc000, 0x4000, NO_DUMP )	/* missing */
480 
481 	ROM_REGION( 0x40000, REGION_GFX1, ROMREGION_DISPOSE ) /* text */
482 	ROM_LOAD( "22a-4.121",    0x00000, 0x20000, CRC(acc26051) SHA1(445224238cce420990894824d95447e3f63a9ef0) )
483 	ROM_LOAD( "22a-3.107",    0x20000, 0x20000, CRC(10bb800d) SHA1(265a3d67669034d17713b505ef55cd1c90f8d205) )
484 
485 	ROM_REGION( 0x40000, REGION_GFX2, ROMREGION_DISPOSE )
486 	ROM_LOAD( "22a-1.2",      0x00000, 0x20000, CRC(3bd1c3ec) SHA1(40f61552ea6f7a81915fe3e13f75dc1dc69da33e) )
487 	ROM_LOAD( "22a-2.35",     0x20000, 0x20000, CRC(409e1be1) SHA1(35a77fc8fe6fc212734e2f452dbde9b8cf696f61) )
488 
489 	ROM_REGION( 0x20000, REGION_SOUND1, 0 ) /* adpcm samples */
490 	ROM_LOAD( "22j6-0.83",    0x00000, 0x10000, CRC(744a26e3) SHA1(519f22f1e5cc417cb8f9ced97e959d23c711283b) )
491 	ROM_LOAD( "22j7-0.82",    0x10000, 0x10000, CRC(2fa1de21) SHA1(e8c7af6057b64ecadd3473b82abd8e9f873082fd) )
492 
493 	ROM_REGION( 0x0800, REGION_PROMS, 0 )	/* color PROMs */
494 	ROM_LOAD( "mb7132e.158",  0x0000, 0x0400, CRC(7e623722) SHA1(e1fe60533237bd0aba5c8de9775df620ed5227c0) )
495 	ROM_LOAD( "mb7122e.159",  0x0400, 0x0400, CRC(69706e8d) SHA1(778ee88ff566aa38c80e0e61bb3fe8458f0e9450) )
496 ROM_END
497 
498 ROM_START( nkdodgeb )
499 	ROM_REGION( 0x18000, REGION_CPU1, 0 )
500 	ROM_LOAD( "12.bin",	      0x10000, 0x08000, CRC(aa674fd8) SHA1(4e8d3e07b54d23b221cb39cf10389bc7a56c4021) )  /* Two banks */
501 	ROM_CONTINUE(             0x08000, 0x08000 )		 /* Static code */
502 
503 	ROM_REGION( 0x10000, REGION_CPU2, 0 ) /* audio cpu */
504 	ROM_LOAD( "22j5-0.33",    0x08000, 0x08000, CRC(c31e264e) SHA1(0828a2094122e3934b784ec9ad7c2b89d91a83bb) )
505 
506 	ROM_REGION( 0x10000, REGION_CPU3, 0 ) /* I/O mcu */
507 	ROM_LOAD( "63701.bin",    0xc000, 0x4000, NO_DUMP )	/* missing */
508 
509 	ROM_REGION( 0x40000, REGION_GFX1, ROMREGION_DISPOSE ) /* text */
510 	ROM_LOAD( "10.bin",       0x00000, 0x10000, CRC(442326fd) SHA1(e0e9e1dfdca3edd6e2522f55c191b40b81b8eaff) )
511 	ROM_LOAD( "11.bin",       0x10000, 0x10000, CRC(2140b070) SHA1(7a9d89eb6130b1dd21236fefaeb09a29c7f0d208) )
512 	ROM_LOAD( "9.bin",        0x20000, 0x10000, CRC(18660ac1) SHA1(be6a47eea9649d7b9ff8b30a4de643522c9869e6) )
513 	ROM_LOAD( "8.bin",        0x30000, 0x10000, CRC(5caae3c9) SHA1(f81a1c4ce2117d41e81542d417ff3573ea0f5313) )
514 
515 	ROM_REGION( 0x40000, REGION_GFX2, ROMREGION_DISPOSE )
516 	ROM_LOAD( "2.bin",        0x00000, 0x10000, CRC(1271583e) SHA1(98a597f2be1abdac6c4de811cfa8a53549bc6904) )
517 	ROM_LOAD( "1.bin",        0x10000, 0x10000, CRC(5ae6cccf) SHA1(6bd385d6559b54c681d05eed2e91bfc2aa3e6844) )
518 	ROM_LOAD( "4.bin",        0x20000, 0x10000, CRC(f5022822) SHA1(fa67b1f70da80365f14776b712df6f656e603fb0) )
519 	ROM_LOAD( "3.bin",        0x30000, 0x10000, CRC(05a71179) SHA1(7e5ed81b37ac458d7a40e89f83f1efb742e797a8) )
520 
521 	ROM_REGION( 0x20000, REGION_SOUND1, 0 ) /* adpcm samples */
522 	ROM_LOAD( "22j6-0.83",    0x00000, 0x10000, CRC(744a26e3) SHA1(519f22f1e5cc417cb8f9ced97e959d23c711283b) )
523 	ROM_LOAD( "22j7-0.82",    0x10000, 0x10000, CRC(2fa1de21) SHA1(e8c7af6057b64ecadd3473b82abd8e9f873082fd) )
524 
525 	ROM_REGION( 0x0800, REGION_PROMS, 0 )	/* color PROMs */
526 	ROM_LOAD( "27s191.bin",  0x0000, 0x0800, CRC(317e42ea) SHA1(59caacc02fb7fb11604bd177f790fd68830ca7c1) )
527 	ROM_LOAD( "82s137.bin",  0x0400, 0x0400, CRC(6059f401) SHA1(280b1bda3a55f2d8c2fd4552c4dcec7100f0170f) )
528 ROM_END
529 
530 
531 
532 GAME( 1987, spdodgeb, 0,        spdodgeb, spdodgeb, 0, ROT0, "Technos", "Super Dodge Ball (US)" )
533 GAME( 1987, nkdodgeb, spdodgeb, spdodgeb, spdodgeb, 0, ROT0, "Technos", "Nekketsu Koukou Dodgeball Bu (Japan bootleg)" )
534