1 /***************************************************************************
2 
3 Gradius 3 (GX945) (c) 1989 Konami
4 
5 driver by Nicola Salmoria
6 
7 This board uses the well known 052109 051962 custom gfx chips, however unlike
8 all other games they fetch gfx data from RAM. The gfx ROMs are memory mapped
9 on cpu B and the needed parts are copied to RAM at run time.
10 To handle this efficiently in MAME, some changes would be required to the
11 tilemap system and to vidhrdw/konamiic.c. For the time being, I'm kludging
12 my way in.
13 There's also something wrong in the way tile banks are implemented in
14 konamiic.c. They don't seem to be used by this game.
15 
16 The visible area is dubious. It looks like it is supposed to be asymmetrical,
17 I've set it that way however this will break cocktail flip (since it expects
18 a symmetrical visible area).
19 
20 ***************************************************************************/
21 
22 #include "driver.h"
23 #include "vidhrdw/generic.h"
24 #include "vidhrdw/konamiic.h"
25 #include "cpu/m68000/m68000.h"
26 #include "cpu/z80/z80.h"
27 
28 
29 extern data16_t *gradius3_gfxram;
30 extern int gradius3_priority;
31 VIDEO_START( gradius3 );
32 READ16_HANDLER( gradius3_gfxrom_r );
33 READ16_HANDLER( gradius3_gfxram_r );
34 WRITE16_HANDLER( gradius3_gfxram_w );
35 VIDEO_UPDATE( gradius3 );
36 
37 
38 
READ16_HANDLER(K052109_halfword_r)39 static READ16_HANDLER( K052109_halfword_r )
40 {
41 	return K052109_r(offset);
42 }
43 
WRITE16_HANDLER(K052109_halfword_w)44 static WRITE16_HANDLER( K052109_halfword_w )
45 {
46 	if (ACCESSING_LSB)
47 		K052109_w(offset,data & 0xff);
48 
49 	/* is this a bug in the game or something else? */
50 	if (!ACCESSING_LSB)
51 		K052109_w(offset,(data >> 8) & 0xff);
52 /*		log_cb(RETRO_LOG_DEBUG, LOGPRE "%06x half %04x = %04x\n",activecpu_get_pc(),offset,data);*/
53 }
54 
READ16_HANDLER(K051937_halfword_r)55 static READ16_HANDLER( K051937_halfword_r )
56 {
57 	return K051937_r(offset);
58 }
59 
WRITE16_HANDLER(K051937_halfword_w)60 static WRITE16_HANDLER( K051937_halfword_w )
61 {
62 	if (ACCESSING_LSB)
63 		K051937_w(offset,data & 0xff);
64 }
65 
READ16_HANDLER(K051960_halfword_r)66 static READ16_HANDLER( K051960_halfword_r )
67 {
68 	return K051960_r(offset);
69 }
70 
WRITE16_HANDLER(K051960_halfword_w)71 static WRITE16_HANDLER( K051960_halfword_w )
72 {
73 	if (ACCESSING_LSB)
74 		K051960_w(offset,data & 0xff);
75 }
76 
77 
78 
79 static int irqAen,irqBmask;
80 
81 
MACHINE_INIT(gradius3)82 static MACHINE_INIT( gradius3 )
83 {
84 	/* start with cpu B halted */
85 	cpu_set_reset_line(1,ASSERT_LINE);
86 	irqAen = 0;
87 	irqBmask = 0;
88 }
89 
90 static data16_t *sharedram;
91 
READ16_HANDLER(sharedram_r)92 static READ16_HANDLER( sharedram_r )
93 {
94 	return sharedram[offset];
95 }
96 
WRITE16_HANDLER(sharedram_w)97 static WRITE16_HANDLER( sharedram_w )
98 {
99 	COMBINE_DATA(&sharedram[offset]);
100 }
101 
WRITE16_HANDLER(cpuA_ctrl_w)102 static WRITE16_HANDLER( cpuA_ctrl_w )
103 {
104 	if (ACCESSING_MSB)
105 	{
106 		data >>= 8;
107 
108 		/* bits 0-1 are coin counters */
109 		coin_counter_w(0,data & 0x01);
110 		coin_counter_w(1,data & 0x02);
111 
112 		/* bit 2 selects layer priority */
113 		gradius3_priority = data & 0x04;
114 
115 		/* bit 3 enables cpu B */
116 		cpu_set_reset_line(1,(data & 0x08) ? CLEAR_LINE : ASSERT_LINE);
117 
118 		/* bit 5 enables irq */
119 		irqAen = data & 0x20;
120 
121 		/* other bits unknown */
122 /*logerror("%06x: write %04x to c0000\n",activecpu_get_pc(),data);*/
123 	}
124 }
125 
WRITE16_HANDLER(cpuB_irqenable_w)126 static WRITE16_HANDLER( cpuB_irqenable_w )
127 {
128 	if (ACCESSING_MSB)
129 		irqBmask = (data >> 8) & 0x07;
130 }
131 
INTERRUPT_GEN(cpuA_interrupt)132 static INTERRUPT_GEN( cpuA_interrupt )
133 {
134 	if (irqAen)
135 		cpu_set_irq_line(0, 2, HOLD_LINE);
136 }
137 
INTERRUPT_GEN(cpuB_interrupt)138 static INTERRUPT_GEN( cpuB_interrupt )
139 {
140 	if (cpu_getiloops() & 1)	/* ??? */
141 	{
142 		if (irqBmask & 2)
143 			cpu_set_irq_line(1, 2, HOLD_LINE);
144 	}
145 	else
146 	{
147 		if (irqBmask & 1)
148 			cpu_set_irq_line(1, 1, HOLD_LINE);
149 	}
150 }
151 
WRITE16_HANDLER(cpuB_irqtrigger_w)152 static WRITE16_HANDLER( cpuB_irqtrigger_w )
153 {
154 	if (irqBmask & 4)
155 	{
156 log_cb(RETRO_LOG_DEBUG, LOGPRE "%04x trigger cpu B irq 4 %02x\n",activecpu_get_pc(),data);
157 		cpu_set_irq_line(1,4,HOLD_LINE);
158 	}
159 	else
160 log_cb(RETRO_LOG_DEBUG, LOGPRE "%04x MISSED cpu B irq 4 %02x\n",activecpu_get_pc(),data);
161 }
162 
WRITE16_HANDLER(sound_command_w)163 static WRITE16_HANDLER( sound_command_w )
164 {
165 	if (ACCESSING_MSB)
166 		soundlatch_w(0,(data >> 8) & 0xff);
167 }
168 
WRITE16_HANDLER(sound_irq_w)169 static WRITE16_HANDLER( sound_irq_w )
170 {
171 	cpu_set_irq_line_and_vector(2,0,HOLD_LINE,0xff);
172 }
173 
WRITE_HANDLER(sound_bank_w)174 static WRITE_HANDLER( sound_bank_w )
175 {
176 	int bank_A, bank_B;
177 
178 	/* banks # for the 007232 (chip 1) */
179 	bank_A = ((data >> 0) & 0x03);
180 	bank_B = ((data >> 2) & 0x03);
181 	K007232_set_bank( 0, bank_A, bank_B );
182 }
183 
184 
185 
MEMORY_READ16_START(gradius3_readmem)186 static MEMORY_READ16_START( gradius3_readmem )
187 	{ 0x000000, 0x03ffff, MRA16_ROM },
188 	{ 0x040000, 0x043fff, MRA16_RAM },
189 	{ 0x080000, 0x080fff, MRA16_RAM },
190 	{ 0x0c8000, 0x0c8001, input_port_0_word_r },
191 	{ 0x0c8002, 0x0c8003, input_port_1_word_r },
192 	{ 0x0c8004, 0x0c8005, input_port_2_word_r },
193 	{ 0x0c8006, 0x0c8007, input_port_5_word_r },
194 	{ 0x0d0000, 0x0d0001, input_port_3_word_r },
195 	{ 0x0d0002, 0x0d0003, input_port_4_word_r },
196 	{ 0x100000, 0x103fff, sharedram_r },
197 	{ 0x14c000, 0x153fff, K052109_halfword_r },
198 	{ 0x180000, 0x19ffff, gradius3_gfxram_r },
199 MEMORY_END
200 
201 static MEMORY_WRITE16_START( gradius3_writemem )
202 	{ 0x000000, 0x03ffff, MWA16_ROM },
203 	{ 0x040000, 0x043fff, MWA16_RAM },
204 	{ 0x080000, 0x080fff, paletteram16_xRRRRRGGGGGBBBBB_word_w, &paletteram16 },
205 	{ 0x0c0000, 0x0c0001, cpuA_ctrl_w },	/* halt cpu B, irq enable, priority, coin counters, other? */
206 	{ 0x0d8000, 0x0d8001, cpuB_irqtrigger_w },
207 	{ 0x0e0000, 0x0e0001, watchdog_reset16_w },
208 	{ 0x0e8000, 0x0e8001, sound_command_w },
209 	{ 0x0f0000, 0x0f0001, sound_irq_w },
210 	{ 0x100000, 0x103fff, sharedram_w, &sharedram },
211 	{ 0x14c000, 0x153fff, K052109_halfword_w },
212 	{ 0x180000, 0x19ffff, gradius3_gfxram_w, &gradius3_gfxram },
213 MEMORY_END
214 
215 
216 static MEMORY_READ16_START( gradius3_readmem2 )
217 	{ 0x000000, 0x0fffff, MRA16_ROM },
218 	{ 0x100000, 0x103fff, MRA16_RAM },
219 	{ 0x200000, 0x203fff, sharedram_r },
220 	{ 0x24c000, 0x253fff, K052109_halfword_r },
221 	{ 0x280000, 0x29ffff, gradius3_gfxram_r },
222 	{ 0x2c0000, 0x2c000f, K051937_halfword_r },
223 	{ 0x2c0800, 0x2c0fff, K051960_halfword_r },
224 	{ 0x400000, 0x5fffff, gradius3_gfxrom_r },		/* gfx ROMs are mapped here, and copied to RAM */
225 MEMORY_END
226 
227 static MEMORY_WRITE16_START( gradius3_writemem2 )
228 	{ 0x000000, 0x0fffff, MWA16_ROM },
229 	{ 0x100000, 0x103fff, MWA16_RAM },
230 	{ 0x140000, 0x140001, cpuB_irqenable_w },
231 	{ 0x200000, 0x203fff, sharedram_w },
232 	{ 0x24c000, 0x253fff, K052109_halfword_w },
233 	{ 0x280000, 0x29ffff, gradius3_gfxram_w },
234 	{ 0x2c0000, 0x2c000f, K051937_halfword_w },
235 	{ 0x2c0800, 0x2c0fff, K051960_halfword_w },
236 MEMORY_END
237 
238 
239 static MEMORY_READ_START( gradius3_s_readmem )
240 	{ 0x0000, 0xefff, MRA_ROM },
241 	{ 0xf010, 0xf010, soundlatch_r },
242 	{ 0xf020, 0xf02d, K007232_read_port_0_r },
243 	{ 0xf031, 0xf031, YM2151_status_port_0_r },
244 	{ 0xf800, 0xffff, MRA_RAM },
245 MEMORY_END
246 
247 static MEMORY_WRITE_START( gradius3_s_writemem )
248 	{ 0x0000, 0xefff, MWA_ROM },
249 	{ 0xf000, 0xf000, sound_bank_w },				/* 007232 bankswitch */
250 	{ 0xf020, 0xf02d, K007232_write_port_0_w },
251 	{ 0xf030, 0xf030, YM2151_register_port_0_w },
252 	{ 0xf031, 0xf031, YM2151_data_port_0_w },
253 	{ 0xf800, 0xffff, MWA_RAM },
254 MEMORY_END
255 
256 
257 
258 INPUT_PORTS_START( gradius3 )
259 	PORT_START      /* COINS */
260 	PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN1 )
261 	PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_COIN2 )
262 	PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNKNOWN )
263 	PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_START1 )
264 	PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_START2 )
265 	PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN )
266 	PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_COIN3 )
267 	PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN )
268 
269 	PORT_START      /* PLAYER 1 */
270 	PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT  | IPF_8WAY )
271 	PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT | IPF_8WAY )
272 	PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_UP    | IPF_8WAY )
273 	PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN  | IPF_8WAY )
274 	PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON3 )
275 	PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON1 )
276 	PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON2 )
277 	PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN )
278 
279 	PORT_START      /* PLAYER 2 */
280 	PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT  | IPF_COCKTAIL | IPF_8WAY )
281 	PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT | IPF_COCKTAIL | IPF_8WAY )
282 	PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_UP    | IPF_COCKTAIL | IPF_8WAY )
283 	PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN  | IPF_COCKTAIL | IPF_8WAY )
284 	PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON3 | IPF_COCKTAIL )
285 	PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON1 | IPF_COCKTAIL )
286 	PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON2 | IPF_COCKTAIL )
287 	PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN )
288 
289 	PORT_START	/* DSW1 */
290 	PORT_DIPNAME( 0x0f, 0x0f, DEF_STR( Coin_A ) )
291 	PORT_DIPSETTING(    0x02, DEF_STR( 4C_1C ) )
292 	PORT_DIPSETTING(    0x05, DEF_STR( 3C_1C ) )
293 	PORT_DIPSETTING(    0x08, DEF_STR( 2C_1C ) )
294 	PORT_DIPSETTING(    0x04, DEF_STR( 3C_2C ) )
295 	PORT_DIPSETTING(    0x01, DEF_STR( 4C_3C ) )
296 	PORT_DIPSETTING(    0x0f, DEF_STR( 1C_1C ) )
297 	PORT_DIPSETTING(    0x03, DEF_STR( 3C_4C ) )
298 	PORT_DIPSETTING(    0x07, DEF_STR( 2C_3C ) )
299 	PORT_DIPSETTING(    0x0e, DEF_STR( 1C_2C ) )
300 	PORT_DIPSETTING(    0x06, DEF_STR( 2C_5C ) )
301 	PORT_DIPSETTING(    0x0d, DEF_STR( 1C_3C ) )
302 	PORT_DIPSETTING(    0x0c, DEF_STR( 1C_4C ) )
303 	PORT_DIPSETTING(    0x0b, DEF_STR( 1C_5C ) )
304 	PORT_DIPSETTING(    0x0a, DEF_STR( 1C_6C ) )
305 	PORT_DIPSETTING(    0x09, DEF_STR( 1C_7C ) )
306 	PORT_DIPSETTING(    0x00, DEF_STR( Free_Play ) )
307 	PORT_DIPNAME( 0xf0, 0xf0, DEF_STR( Coin_B ) )
308 	PORT_DIPSETTING(    0x20, DEF_STR( 4C_1C ) )
309 	PORT_DIPSETTING(    0x50, DEF_STR( 3C_1C ) )
310 	PORT_DIPSETTING(    0x80, DEF_STR( 2C_1C ) )
311 	PORT_DIPSETTING(    0x40, DEF_STR( 3C_2C ) )
312 	PORT_DIPSETTING(    0x10, DEF_STR( 4C_3C ) )
313 	PORT_DIPSETTING(    0xf0, DEF_STR( 1C_1C ) )
314 	PORT_DIPSETTING(    0x30, DEF_STR( 3C_4C ) )
315 	PORT_DIPSETTING(    0x70, DEF_STR( 2C_3C ) )
316 	PORT_DIPSETTING(    0xe0, DEF_STR( 1C_2C ) )
317 	PORT_DIPSETTING(    0x60, DEF_STR( 2C_5C ) )
318 	PORT_DIPSETTING(    0xd0, DEF_STR( 1C_3C ) )
319 	PORT_DIPSETTING(    0xc0, DEF_STR( 1C_4C ) )
320 	PORT_DIPSETTING(    0xb0, DEF_STR( 1C_5C ) )
321 	PORT_DIPSETTING(    0xa0, DEF_STR( 1C_6C ) )
322 	PORT_DIPSETTING(    0x90, DEF_STR( 1C_7C ) )
323 /*	PORT_DIPSETTING(    0x00, "Invalid" )*/
324 
325 	PORT_START	/* DSW2 */
326 	PORT_DIPNAME( 0x03, 0x02, DEF_STR( Lives ) )
327 	PORT_DIPSETTING(    0x03, "2" )
328 	PORT_DIPSETTING(    0x02, "3" )
329 	PORT_DIPSETTING(    0x01, "5" )
330 	PORT_DIPSETTING(    0x00, "7" )
331 	PORT_DIPNAME( 0x04, 0x00, DEF_STR( Cabinet ) )
332 	PORT_DIPSETTING(    0x00, DEF_STR( Upright ) )
333 	PORT_DIPSETTING(    0x04, DEF_STR( Cocktail ) )
334 	PORT_DIPNAME( 0x18, 0x18, DEF_STR( Bonus_Life ) )
335 	PORT_DIPSETTING(    0x18, "20000 and every 70000" )
336 	PORT_DIPSETTING(    0x10, "100000 and every 100000" )
337 	PORT_DIPSETTING(    0x08, "50000" )
338 	PORT_DIPSETTING(    0x00, "100000" )
339 	PORT_DIPNAME( 0x60, 0x40, DEF_STR( Difficulty ) )
340 	PORT_DIPSETTING(    0x60, "Easy" )
341 	PORT_DIPSETTING(    0x40, "Normal" )
342 	PORT_DIPSETTING(    0x20, "Hard" )
343 	PORT_DIPSETTING(    0x00, "Hardest" )
344 	PORT_DIPNAME( 0x80, 0x00, DEF_STR( Demo_Sounds ) )
345 	PORT_DIPSETTING(    0x80, DEF_STR( Off ) )
346 	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
347 
348 	PORT_START	/* DSW3 */
349 	PORT_DIPNAME( 0x01, 0x01, DEF_STR( Flip_Screen ) )
350 	PORT_DIPSETTING(    0x01, DEF_STR( Off ) )
351 	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
352 	PORT_DIPNAME( 0x02, 0x02, "Upright Controls" )
353 	PORT_DIPSETTING(    0x02, "Single" )
354 	PORT_DIPSETTING(    0x00, "Dual" )
355 	PORT_SERVICE( 0x04, IP_ACTIVE_LOW )
356 	PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) )
357 	PORT_DIPSETTING(    0x08, DEF_STR( Off ) )
358 	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
359 	PORT_BIT( 0xf0, IP_ACTIVE_LOW, IPT_UNUSED )
360 INPUT_PORTS_END
361 
362 
363 
364 static struct YM2151interface ym2151_interface =
365 {
366 	1,			/* 1 chip */
367 	3579545,	/* 3.579545 MHz */
368 	{ YM3012_VOL(100,MIXER_PAN_LEFT,100,MIXER_PAN_RIGHT) },
369 	{ 0 }
370 };
371 
volume_callback(int v)372 static void volume_callback(int v)
373 {
374 	K007232_set_volume(0,0,(v >> 4) * 0x11,0);
375 	K007232_set_volume(0,1,0,(v & 0x0f) * 0x11);
376 }
377 
378 static struct K007232_interface k007232_interface =
379 {
380 	1,		/* number of chips */
381 	3579545,	/* clock */
382 	{ REGION_SOUND1 },	/* memory regions */
383 	{ K007232_VOL(20,MIXER_PAN_CENTER,20,MIXER_PAN_CENTER) },	/* volume */
384 	{ volume_callback }	/* external port callback */
385 };
386 
387 
388 
389 static MACHINE_DRIVER_START( gradius3 )
390 
391 	/* basic machine hardware */
392 	MDRV_CPU_ADD(M68000, 10000000)	/* 10 MHz */
MDRV_CPU_MEMORY(gradius3_readmem,gradius3_writemem)393 	MDRV_CPU_MEMORY(gradius3_readmem,gradius3_writemem)
394 	MDRV_CPU_VBLANK_INT(cpuA_interrupt,1)
395 
396 	MDRV_CPU_ADD(M68000, 10000000)	/* 10 MHz */
397 	MDRV_CPU_MEMORY(gradius3_readmem2,gradius3_writemem2)
398 	MDRV_CPU_VBLANK_INT(cpuB_interrupt,2)	/* has three interrupt vectors, 1 2 and 4 */
399 								/* 4 is triggered by cpu A, the others are unknown but */
400 								/* required for the game to run. */
401 	MDRV_CPU_ADD(Z80, 3579545)
402 	MDRV_CPU_FLAGS(CPU_AUDIO_CPU)	/* 3.579545 MHz */
403 	MDRV_CPU_MEMORY(gradius3_s_readmem,gradius3_s_writemem)
404 
405 	MDRV_FRAMES_PER_SECOND(60)
406 	MDRV_VBLANK_DURATION(DEFAULT_60HZ_VBLANK_DURATION)
407 	MDRV_INTERLEAVE(100)
408 
409 	MDRV_MACHINE_INIT(gradius3)
410 
411 	/* video hardware */
412 	MDRV_VIDEO_ATTRIBUTES(VIDEO_TYPE_RASTER | VIDEO_HAS_SHADOWS)
413 	MDRV_SCREEN_SIZE(64*8, 32*8)
414 	MDRV_VISIBLE_AREA(12*8, (64-14)*8-1, 2*8, 30*8-1 )	/* asymmetrical! */
415 	MDRV_PALETTE_LENGTH(2048)
416 
417 	MDRV_VIDEO_START(gradius3)
418 	MDRV_VIDEO_UPDATE(gradius3)
419 
420 	/* sound hardware */
421 	MDRV_SOUND_ATTRIBUTES(SOUND_SUPPORTS_STEREO)
422 	MDRV_SOUND_ADD(YM2151, ym2151_interface)
423 	MDRV_SOUND_ADD(K007232, k007232_interface)
424 MACHINE_DRIVER_END
425 
426 
427 
428 /***************************************************************************
429 
430   Game driver(s)
431 
432 ***************************************************************************/
433 
434 ROM_START( gradius3 )
435 	ROM_REGION( 0x40000, REGION_CPU1, 0 )
436 	ROM_LOAD16_BYTE( "945_s13.f15",		0x00000, 0x20000, CRC(70c240a2) SHA1(82dc391572e1f61b0182cb031654d71adcdd5f6e) )
437 	ROM_LOAD16_BYTE( "945_s12.e15",		0x00001, 0x20000, CRC(bbc300d4) SHA1(e1ca98bc591575285d7bd2d4fefdf35fed10dcb6) )
438 
439 	ROM_REGION( 0x100000, REGION_CPU2, 0 )
440 	ROM_LOAD16_BYTE( "945_m09.r17",		0x000000, 0x20000, CRC(b4a6df25) SHA1(85533cf140d28f6f81c0b49b8061bda0924a613a) )
441 	ROM_LOAD16_BYTE( "945_m08.n17",		0x000001, 0x20000, CRC(74e981d2) SHA1(e7b47a2da01ff73293d2100c48fdf00b33125af5) )
442 	ROM_LOAD16_BYTE( "945_l06b.r11",	0x040000, 0x20000, CRC(83772304) SHA1(a90c75a3de670b6ec5e0fc201876d463b4a76766) )
443 	ROM_LOAD16_BYTE( "945_l06a.n11",	0x040001, 0x20000, CRC(e1fd75b6) SHA1(6160d80a2f1bf550e85d6253cf521a96f5a644cc) )
444 	ROM_LOAD16_BYTE( "945_l07c.r15",	0x080000, 0x20000, CRC(c1e399b6) SHA1(e95bd478dd3beea0175bf9ee4cededb111c4ace1) )
445 	ROM_LOAD16_BYTE( "945_l07a.n15",	0x080001, 0x20000, CRC(96222d04) SHA1(b55700f683a556b0e73dbac9c7b4ce485420d21c) )
446 	ROM_LOAD16_BYTE( "945_l07d.r13",	0x0c0000, 0x20000, CRC(4c16d4bd) SHA1(01dcf169b78a1e495214b10181401d1920b0c924) )
447 	ROM_LOAD16_BYTE( "945_l07b.n13",	0x0c0001, 0x20000, CRC(5e209d01) SHA1(0efa1bbfdc7e2ba1e0bb96245e2bfe961258b446) )
448 
449 	ROM_REGION( 0x10000, REGION_CPU3, 0 )	/* 64k for the audio CPU */
450 	ROM_LOAD( "945_m05.d9",				0x00000, 0x10000, CRC(c8c45365) SHA1(b9a7b736b52bca42c7b8c8ed64c8df73e0116158) )
451 
452 	ROM_REGION( 0x20000, REGION_GFX1, 0 )	/* fake */
453 	/* gfx data is dynamically generated in RAM */
454 
455 	ROM_REGION( 0x200000, REGION_GFX2, 0 )	/* graphics (addressable by the main CPU) */
456 	ROM_LOAD( "945_a02.l3",				0x000000, 0x80000, CRC(4dfffd74) SHA1(588210bac27448240ef08961f70b714b69cb3ffd) )
457 	ROM_LOAD16_BYTE( "945_l04a.k6",		0x080000, 0x20000, CRC(884e21ee) SHA1(ce86dd3a06775e5b1aa09db010dcb674e67828e7) )
458 	ROM_LOAD16_BYTE( "945_l04c.m6",		0x080001, 0x20000, CRC(45bcd921) SHA1(e51a8a71362a6fb55124aa1dce74519c0a3c6e3f) )
459 	ROM_LOAD16_BYTE( "945_l04b.k8",		0x0c0000, 0x20000, CRC(843bc67d) SHA1(cdf8421083f24ab27867ed5d08d8949da192b2b9) )
460 	ROM_LOAD16_BYTE( "945_l04d.m8",		0x0c0001, 0x20000, CRC(0a98d08e) SHA1(1e0ca51a2d45c01fa3f11950ddd387f41ddae691) )
461 	ROM_LOAD( "945_a01.h3",				0x100000, 0x80000, CRC(339d6dd2) SHA1(6a52b826aba92c75fc6a5926184948735dc20812) )
462 	ROM_LOAD16_BYTE( "945_l03a.e6",		0x180000, 0x20000, CRC(a67ef087) SHA1(fd63474f3bbde5dfc53ed4c1db25d6411a8b54d2) )
463 	ROM_LOAD16_BYTE( "945_l03c.h6",		0x180001, 0x20000, CRC(a56be17a) SHA1(1d387736144c30fcb5de54235331ab1ff70c356e) )
464 	ROM_LOAD16_BYTE( "945_l03b.e8",		0x1c0000, 0x20000, CRC(933e68b9) SHA1(f3a39446ca77d17fdbd938bd5f718ae9d5570879) )
465 	ROM_LOAD16_BYTE( "945_l03d.h8",		0x1c0001, 0x20000, CRC(f375e87b) SHA1(6427b966795c907c8e516244872fe52217da62c4) )
466 
467 	ROM_REGION( 0x0100, REGION_PROMS, 0 )
468 	ROM_LOAD( "945l14.j28",				0x0000, 0x0100, CRC(c778c189) SHA1(847eaf379ba075c25911c6f83dd63ff390534f60) )	/* priority encoder (not used) */
469 
470 	ROM_REGION( 0x80000, REGION_SOUND1, 0 )	/* 007232 samples */
471 	ROM_LOAD( "945_a10.b15",			0x00000, 0x40000, CRC(1d083e10) SHA1(b116f133a7647ef7a6c373aff00e9622d9954b61) )
472 	ROM_LOAD( "945_l11a.c18",			0x40000, 0x20000, CRC(6043f4eb) SHA1(1c2e9ace1cfdde504b7b6158e3c3f54dc5ae33d4) )
473 	ROM_LOAD( "945_l11b.c20",			0x60000, 0x20000, CRC(89ea3baf) SHA1(8edcbaa7969185cfac48c02559826d1b8b081f3f) )
474 ROM_END
475 
476 ROM_START( grdius3a )
477 	ROM_REGION( 0x40000, REGION_CPU1, 0 )
478 	ROM_LOAD16_BYTE( "945_13.f15",		0x00000, 0x20000, CRC(9974fe6b) SHA1(c18ad8d7c93bf58d886715d8e210177cf49f220b) )
479 	ROM_LOAD16_BYTE( "945_12.e15",		0x00001, 0x20000, CRC(e9771b91) SHA1(c9f4610b897c13742b44b546e2bed8ee21945f61) )
480 
481 	ROM_REGION( 0x100000, REGION_CPU2, 0 )
482 	ROM_LOAD16_BYTE( "945_m09.r17",		0x000000, 0x20000, CRC(b4a6df25) SHA1(85533cf140d28f6f81c0b49b8061bda0924a613a) )
483 	ROM_LOAD16_BYTE( "945_m08.n17",		0x000001, 0x20000, CRC(74e981d2) SHA1(e7b47a2da01ff73293d2100c48fdf00b33125af5) )
484 	ROM_LOAD16_BYTE( "945_l06b.r11",	0x040000, 0x20000, CRC(83772304) SHA1(a90c75a3de670b6ec5e0fc201876d463b4a76766) )
485 	ROM_LOAD16_BYTE( "945_l06a.n11",	0x040001, 0x20000, CRC(e1fd75b6) SHA1(6160d80a2f1bf550e85d6253cf521a96f5a644cc) )
486 	ROM_LOAD16_BYTE( "945_l07c.r15",	0x080000, 0x20000, CRC(c1e399b6) SHA1(e95bd478dd3beea0175bf9ee4cededb111c4ace1) )
487 	ROM_LOAD16_BYTE( "945_l07a.n15",	0x080001, 0x20000, CRC(96222d04) SHA1(b55700f683a556b0e73dbac9c7b4ce485420d21c) )
488 	ROM_LOAD16_BYTE( "945_l07d.r13",	0x0c0000, 0x20000, CRC(4c16d4bd) SHA1(01dcf169b78a1e495214b10181401d1920b0c924) )
489 	ROM_LOAD16_BYTE( "945_l07b.n13",	0x0c0001, 0x20000, CRC(5e209d01) SHA1(0efa1bbfdc7e2ba1e0bb96245e2bfe961258b446) )
490 
491 	ROM_REGION( 0x10000, REGION_CPU3, 0 )	/* 64k for the audio CPU */
492 	ROM_LOAD( "945_m05.d9",				0x00000, 0x10000, CRC(c8c45365) SHA1(b9a7b736b52bca42c7b8c8ed64c8df73e0116158) )
493 
494 	ROM_REGION( 0x20000, REGION_GFX1, 0 )	/* fake */
495 	/* gfx data is dynamically generated in RAM */
496 
497 	ROM_REGION( 0x200000, REGION_GFX2, 0 )	/* graphics (addressable by the main CPU) */
498 	ROM_LOAD( "945_a02.l3",				0x000000, 0x80000, CRC(4dfffd74) SHA1(588210bac27448240ef08961f70b714b69cb3ffd) )
499 	ROM_LOAD16_BYTE( "945_l04a.k6",		0x080000, 0x20000, CRC(884e21ee) SHA1(ce86dd3a06775e5b1aa09db010dcb674e67828e7) )
500 	ROM_LOAD16_BYTE( "945_l04c.m6",		0x080001, 0x20000, CRC(45bcd921) SHA1(e51a8a71362a6fb55124aa1dce74519c0a3c6e3f) )
501 	ROM_LOAD16_BYTE( "945_l04b.k8",		0x0c0000, 0x20000, CRC(843bc67d) SHA1(cdf8421083f24ab27867ed5d08d8949da192b2b9) )
502 	ROM_LOAD16_BYTE( "945_l04d.m8",		0x0c0001, 0x20000, CRC(0a98d08e) SHA1(1e0ca51a2d45c01fa3f11950ddd387f41ddae691) )
503 	ROM_LOAD( "945_a01.h3",				0x100000, 0x80000, CRC(339d6dd2) SHA1(6a52b826aba92c75fc6a5926184948735dc20812) )
504 	ROM_LOAD16_BYTE( "945_l03a.e6",		0x180000, 0x20000, CRC(a67ef087) SHA1(fd63474f3bbde5dfc53ed4c1db25d6411a8b54d2) )
505 	ROM_LOAD16_BYTE( "945_l03c.h6",		0x180001, 0x20000, CRC(a56be17a) SHA1(1d387736144c30fcb5de54235331ab1ff70c356e) )
506 	ROM_LOAD16_BYTE( "945_l03b.e8",		0x1c0000, 0x20000, CRC(933e68b9) SHA1(f3a39446ca77d17fdbd938bd5f718ae9d5570879) )
507 	ROM_LOAD16_BYTE( "945_l03d.h8",		0x1c0001, 0x20000, CRC(f375e87b) SHA1(6427b966795c907c8e516244872fe52217da62c4) )
508 
509 	ROM_REGION( 0x0100, REGION_PROMS, 0 )
510 	ROM_LOAD( "945l14.j28",				0x0000, 0x0100, CRC(c778c189) SHA1(847eaf379ba075c25911c6f83dd63ff390534f60) )	/* priority encoder (not used) */
511 
512 	ROM_REGION( 0x80000, REGION_SOUND1, 0 )	/* 007232 samples */
513 	ROM_LOAD( "945_a10.b15",			0x00000, 0x40000, CRC(1d083e10) SHA1(b116f133a7647ef7a6c373aff00e9622d9954b61) )
514 	ROM_LOAD( "945_l11a.c18",			0x40000, 0x20000, CRC(6043f4eb) SHA1(1c2e9ace1cfdde504b7b6158e3c3f54dc5ae33d4) )
515 	ROM_LOAD( "945_l11b.c20",			0x60000, 0x20000, CRC(89ea3baf) SHA1(8edcbaa7969185cfac48c02559826d1b8b081f3f) )
516 ROM_END
517 
518 ROM_START( grdius3e )
519 	ROM_REGION( 0x40000, REGION_CPU1, 0 )
520 	ROM_LOAD16_BYTE( "945_r13.f15",		0x00000, 0x20000, CRC(cffd103f) SHA1(6bd15e8c2e6e5223d7de9b0b375f36f3e81f60ba) )
521 	ROM_LOAD16_BYTE( "945_r12.e15",		0x00001, 0x20000, CRC(0b968ef6) SHA1(ba28d16d94b13aac791b11d3d91df26f78e2e477) )
522 
523 	ROM_REGION( 0x100000, REGION_CPU2, 0 )
524 	ROM_LOAD16_BYTE( "945_m09.r17",		0x000000, 0x20000, CRC(b4a6df25) SHA1(85533cf140d28f6f81c0b49b8061bda0924a613a) )
525 	ROM_LOAD16_BYTE( "945_m08.n17",		0x000001, 0x20000, CRC(74e981d2) SHA1(e7b47a2da01ff73293d2100c48fdf00b33125af5) )
526 	ROM_LOAD16_BYTE( "945_l06b.r11",	0x040000, 0x20000, CRC(83772304) SHA1(a90c75a3de670b6ec5e0fc201876d463b4a76766) )
527 	ROM_LOAD16_BYTE( "945_l06a.n11",	0x040001, 0x20000, CRC(e1fd75b6) SHA1(6160d80a2f1bf550e85d6253cf521a96f5a644cc) )
528 	ROM_LOAD16_BYTE( "945_l07c.r15",	0x080000, 0x20000, CRC(c1e399b6) SHA1(e95bd478dd3beea0175bf9ee4cededb111c4ace1) )
529 	ROM_LOAD16_BYTE( "945_l07a.n15",	0x080001, 0x20000, CRC(96222d04) SHA1(b55700f683a556b0e73dbac9c7b4ce485420d21c) )
530 	ROM_LOAD16_BYTE( "945_l07d.r13",	0x0c0000, 0x20000, CRC(4c16d4bd) SHA1(01dcf169b78a1e495214b10181401d1920b0c924) )
531 	ROM_LOAD16_BYTE( "945_l07b.n13",	0x0c0001, 0x20000, CRC(5e209d01) SHA1(0efa1bbfdc7e2ba1e0bb96245e2bfe961258b446) )
532 
533 	ROM_REGION( 0x10000, REGION_CPU3, 0 )	/* 64k for the audio CPU */
534 	ROM_LOAD( "945_m05.d9",				0x00000, 0x10000, CRC(c8c45365) SHA1(b9a7b736b52bca42c7b8c8ed64c8df73e0116158) ) /* 945_r05.d9 */
535 
536 	ROM_REGION( 0x20000, REGION_GFX1, 0 )	/* fake */
537 	/* gfx data is dynamically generated in RAM */
538 
539 	ROM_REGION( 0x200000, REGION_GFX2, 0 )	/* graphics (addressable by the main CPU) */
540 	ROM_LOAD( "945_a02.l3",				0x000000, 0x80000, CRC(4dfffd74) SHA1(588210bac27448240ef08961f70b714b69cb3ffd) )
541 	ROM_LOAD16_BYTE( "945_l04a.k6",		0x080000, 0x20000, CRC(884e21ee) SHA1(ce86dd3a06775e5b1aa09db010dcb674e67828e7) )
542 	ROM_LOAD16_BYTE( "945_l04c.m6",		0x080001, 0x20000, CRC(45bcd921) SHA1(e51a8a71362a6fb55124aa1dce74519c0a3c6e3f) )
543 	ROM_LOAD16_BYTE( "945_l04b.k8",		0x0c0000, 0x20000, CRC(843bc67d) SHA1(cdf8421083f24ab27867ed5d08d8949da192b2b9) )
544 	ROM_LOAD16_BYTE( "945_l04d.m8",		0x0c0001, 0x20000, CRC(0a98d08e) SHA1(1e0ca51a2d45c01fa3f11950ddd387f41ddae691) )
545 	ROM_LOAD( "945_a01.h3",				0x100000, 0x80000, CRC(339d6dd2) SHA1(6a52b826aba92c75fc6a5926184948735dc20812) )
546 	ROM_LOAD16_BYTE( "945_l03a.e6",		0x180000, 0x20000, CRC(a67ef087) SHA1(fd63474f3bbde5dfc53ed4c1db25d6411a8b54d2) )
547 	ROM_LOAD16_BYTE( "945_l03c.h6",		0x180001, 0x20000, CRC(a56be17a) SHA1(1d387736144c30fcb5de54235331ab1ff70c356e) )
548 	ROM_LOAD16_BYTE( "945_l03b.e8",		0x1c0000, 0x20000, CRC(933e68b9) SHA1(f3a39446ca77d17fdbd938bd5f718ae9d5570879) )
549 	ROM_LOAD16_BYTE( "945_l03d.h8",		0x1c0001, 0x20000, CRC(f375e87b) SHA1(6427b966795c907c8e516244872fe52217da62c4) )
550 
551 	ROM_REGION( 0x0100, REGION_PROMS, 0 )
552 	ROM_LOAD( "945l14.j28",				0x0000, 0x0100, CRC(c778c189) SHA1(847eaf379ba075c25911c6f83dd63ff390534f60) )	/* priority encoder (not used) */
553 
554 	ROM_REGION( 0x80000, REGION_SOUND1, 0 )	/* 007232 samples */
555 	ROM_LOAD( "945_a10.b15",			0x00000, 0x40000, CRC(1d083e10) SHA1(b116f133a7647ef7a6c373aff00e9622d9954b61) )
556 	ROM_LOAD( "945_l11a.c18",			0x40000, 0x20000, CRC(6043f4eb) SHA1(1c2e9ace1cfdde504b7b6158e3c3f54dc5ae33d4) )
557 	ROM_LOAD( "945_l11b.c20",			0x60000, 0x20000, CRC(89ea3baf) SHA1(8edcbaa7969185cfac48c02559826d1b8b081f3f) )
558 ROM_END
559 
560 
561 static DRIVER_INIT( gradius3 )
562 {
563 	konami_rom_deinterleave_2(REGION_GFX2);
564 }
565 
566 
567 
568 GAME( 1989, gradius3, 0,        gradius3, gradius3, gradius3, ROT0, "Konami", "Gradius III (Japan)" )
569 GAME( 1989, grdius3a, gradius3, gradius3, gradius3, gradius3, ROT0, "Konami", "Gradius III (Asia)" )
570 GAME( 1989, grdius3e, gradius3, gradius3, gradius3, gradius3, ROT0, "Konami", "Gradius III (World [Q])" )
571