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