summaryrefslogtreecommitdiffstatshomepage
path: root/trunk/src/mame/drivers/gradius3.c
diff options
context:
space:
mode:
Diffstat (limited to 'trunk/src/mame/drivers/gradius3.c')
-rw-r--r--trunk/src/mame/drivers/gradius3.c518
1 files changed, 518 insertions, 0 deletions
diff --git a/trunk/src/mame/drivers/gradius3.c b/trunk/src/mame/drivers/gradius3.c
new file mode 100644
index 00000000000..e42ccdb51ec
--- /dev/null
+++ b/trunk/src/mame/drivers/gradius3.c
@@ -0,0 +1,518 @@
+/***************************************************************************
+
+ Gradius 3 (GX945) (c) 1989 Konami
+
+ driver by Nicola Salmoria
+
+ This board uses the well known 052109 051962 custom gfx chips, however unlike
+ all other games they fetch gfx data from RAM. The gfx ROMs are memory mapped
+ on cpu B and the needed parts are copied to RAM at run time.
+ To handle this efficiently in MAME, some changes would be required to the
+ tilemap system and to video/konamiic.c. For the time being, I'm kludging
+ my way in.
+ There's also something wrong in the way tile banks are implemented in
+ konamiic.c. They don't seem to be used by this game.
+
+ 2009-03:
+ Added dsw locations and verified factory setting based on Guru's notes
+
+***************************************************************************/
+
+#include "emu.h"
+#include "video/konicdev.h"
+#include "cpu/m68000/m68000.h"
+#include "cpu/z80/z80.h"
+#include "sound/2151intf.h"
+#include "sound/k007232.h"
+#include "includes/konamipt.h"
+#include "includes/gradius3.h"
+
+static READ16_HANDLER( k052109_halfword_r )
+{
+ gradius3_state *state = space->machine().driver_data<gradius3_state>();
+ return k052109_r(state->m_k052109, offset);
+}
+
+static WRITE16_HANDLER( k052109_halfword_w )
+{
+ gradius3_state *state = space->machine().driver_data<gradius3_state>();
+
+ if (ACCESSING_BITS_0_7)
+ k052109_w(state->m_k052109, offset, data & 0xff);
+
+ /* is this a bug in the game or something else? */
+ if (!ACCESSING_BITS_0_7)
+ k052109_w(state->m_k052109, offset, (data >> 8) & 0xff);
+// logerror("%06x half %04x = %04x\n",cpu_get_pc(&space->device()),offset,data);
+}
+
+static READ16_HANDLER( k051937_halfword_r )
+{
+ gradius3_state *state = space->machine().driver_data<gradius3_state>();
+ return k051937_r(state->m_k051960, offset);
+}
+
+static WRITE16_HANDLER( k051937_halfword_w )
+{
+ gradius3_state *state = space->machine().driver_data<gradius3_state>();
+
+ if (ACCESSING_BITS_0_7)
+ k051937_w(state->m_k051960, offset, data & 0xff);
+}
+
+static READ16_HANDLER( k051960_halfword_r )
+{
+ gradius3_state *state = space->machine().driver_data<gradius3_state>();
+ return k051960_r(state->m_k051960, offset);
+}
+
+static WRITE16_HANDLER( k051960_halfword_w )
+{
+ gradius3_state *state = space->machine().driver_data<gradius3_state>();
+ if (ACCESSING_BITS_0_7)
+ k051960_w(state->m_k051960, offset, data & 0xff);
+}
+
+static WRITE16_HANDLER( cpuA_ctrl_w )
+{
+ gradius3_state *state = space->machine().driver_data<gradius3_state>();
+
+ if (ACCESSING_BITS_8_15)
+ {
+ data >>= 8;
+
+ /* bits 0-1 are coin counters */
+ coin_counter_w(space->machine(), 0, data & 0x01);
+ coin_counter_w(space->machine(), 1, data & 0x02);
+
+ /* bit 2 selects layer priority */
+ state->m_priority = data & 0x04;
+
+ /* bit 3 enables cpu B */
+ device_set_input_line(state->m_subcpu, INPUT_LINE_RESET, (data & 0x08) ? CLEAR_LINE : ASSERT_LINE);
+
+ /* bit 5 enables irq */
+ state->m_irqAen = data & 0x20;
+
+ /* other bits unknown */
+ //logerror("%06x: write %04x to c0000\n",cpu_get_pc(&space->device()),data);
+ }
+}
+
+static WRITE16_HANDLER( cpuB_irqenable_w )
+{
+ gradius3_state *state = space->machine().driver_data<gradius3_state>();
+
+ if (ACCESSING_BITS_8_15)
+ state->m_irqBmask = (data >> 8) & 0x07;
+}
+
+static INTERRUPT_GEN( cpuA_interrupt )
+{
+ gradius3_state *state = device->machine().driver_data<gradius3_state>();
+ if (state->m_irqAen)
+ device_set_input_line(device, 2, HOLD_LINE);
+}
+
+
+static TIMER_DEVICE_CALLBACK( gradius3_sub_scanline )
+{
+ gradius3_state *state = timer.machine().driver_data<gradius3_state>();
+ int scanline = param;
+
+ if(scanline == 240 && state->m_irqBmask & 1) // vblank-out irq
+ cputag_set_input_line(timer.machine(), "sub", 1, HOLD_LINE);
+
+ if(scanline == 16 && state->m_irqBmask & 2) // sprite end DMA irq
+ cputag_set_input_line(timer.machine(), "sub", 2, HOLD_LINE);
+}
+
+static WRITE16_HANDLER( cpuB_irqtrigger_w )
+{
+ gradius3_state *state = space->machine().driver_data<gradius3_state>();
+
+ if (state->m_irqBmask & 4)
+ {
+ logerror("%04x trigger cpu B irq 4 %02x\n",cpu_get_pc(&space->device()),data);
+ device_set_input_line(state->m_subcpu, 4, HOLD_LINE);
+ }
+ else
+ logerror("%04x MISSED cpu B irq 4 %02x\n",cpu_get_pc(&space->device()),data);
+}
+
+static WRITE16_HANDLER( sound_command_w )
+{
+ if (ACCESSING_BITS_8_15)
+ soundlatch_w(space, 0, (data >> 8) & 0xff);
+}
+
+static WRITE16_HANDLER( sound_irq_w )
+{
+ gradius3_state *state = space->machine().driver_data<gradius3_state>();
+ device_set_input_line_and_vector(state->m_audiocpu, 0, HOLD_LINE, 0xff);
+}
+
+static WRITE8_DEVICE_HANDLER( sound_bank_w )
+{
+ int bank_A, bank_B;
+
+ /* banks # for the 007232 (chip 1) */
+ bank_A = ((data >> 0) & 0x03);
+ bank_B = ((data >> 2) & 0x03);
+ k007232_set_bank(device, bank_A, bank_B);
+}
+
+
+
+static ADDRESS_MAP_START( gradius3_map, AS_PROGRAM, 16 )
+ AM_RANGE(0x000000, 0x03ffff) AM_ROM
+ AM_RANGE(0x040000, 0x043fff) AM_RAM
+ AM_RANGE(0x080000, 0x080fff) AM_RAM_WRITE(paletteram16_xRRRRRGGGGGBBBBB_word_w) AM_BASE_GENERIC(paletteram)
+ AM_RANGE(0x0c0000, 0x0c0001) AM_WRITE(cpuA_ctrl_w) /* halt cpu B, irq enable, priority, coin counters, other? */
+ AM_RANGE(0x0c8000, 0x0c8001) AM_READ_PORT("SYSTEM")
+ AM_RANGE(0x0c8002, 0x0c8003) AM_READ_PORT("P1")
+ AM_RANGE(0x0c8004, 0x0c8005) AM_READ_PORT("P2")
+ AM_RANGE(0x0c8006, 0x0c8007) AM_READ_PORT("DSW3")
+ AM_RANGE(0x0d0000, 0x0d0001) AM_READ_PORT("DSW1")
+ AM_RANGE(0x0d0002, 0x0d0003) AM_READ_PORT("DSW2")
+ AM_RANGE(0x0d8000, 0x0d8001) AM_WRITE(cpuB_irqtrigger_w)
+ AM_RANGE(0x0e0000, 0x0e0001) AM_WRITE(watchdog_reset16_w)
+ AM_RANGE(0x0e8000, 0x0e8001) AM_WRITE(sound_command_w)
+ AM_RANGE(0x0f0000, 0x0f0001) AM_WRITE(sound_irq_w)
+ AM_RANGE(0x100000, 0x103fff) AM_RAM AM_SHARE("share1")
+ AM_RANGE(0x14c000, 0x153fff) AM_READWRITE(k052109_halfword_r, k052109_halfword_w)
+ AM_RANGE(0x180000, 0x19ffff) AM_RAM_WRITE(gradius3_gfxram_w) AM_BASE_MEMBER(gradius3_state, m_gfxram) AM_SHARE("share2")
+ADDRESS_MAP_END
+
+
+static ADDRESS_MAP_START( gradius3_map2, AS_PROGRAM, 16 )
+ AM_RANGE(0x000000, 0x0fffff) AM_ROM
+ AM_RANGE(0x100000, 0x103fff) AM_RAM
+ AM_RANGE(0x140000, 0x140001) AM_WRITE(cpuB_irqenable_w)
+ AM_RANGE(0x200000, 0x203fff) AM_RAM AM_SHARE("share1")
+ AM_RANGE(0x24c000, 0x253fff) AM_READWRITE(k052109_halfword_r, k052109_halfword_w)
+ AM_RANGE(0x280000, 0x29ffff) AM_RAM_WRITE(gradius3_gfxram_w) AM_SHARE("share2")
+ AM_RANGE(0x2c0000, 0x2c000f) AM_READWRITE(k051937_halfword_r, k051937_halfword_w)
+ AM_RANGE(0x2c0800, 0x2c0fff) AM_READWRITE(k051960_halfword_r, k051960_halfword_w)
+ AM_RANGE(0x400000, 0x5fffff) AM_READ(gradius3_gfxrom_r) /* gfx ROMs are mapped here, and copied to RAM */
+ADDRESS_MAP_END
+
+
+static ADDRESS_MAP_START( gradius3_s_map, AS_PROGRAM, 8 )
+ AM_RANGE(0x0000, 0xefff) AM_ROM
+ AM_RANGE(0xf000, 0xf000) AM_DEVWRITE("k007232", sound_bank_w) /* 007232 bankswitch */
+ AM_RANGE(0xf010, 0xf010) AM_READ(soundlatch_r)
+ AM_RANGE(0xf020, 0xf02d) AM_DEVREADWRITE("k007232", k007232_r, k007232_w)
+ AM_RANGE(0xf030, 0xf031) AM_DEVREADWRITE("ymsnd", ym2151_r, ym2151_w)
+ AM_RANGE(0xf800, 0xffff) AM_RAM
+ADDRESS_MAP_END
+
+
+
+static INPUT_PORTS_START( gradius3 )
+ PORT_START("SYSTEM")
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN1 )
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_COIN2 )
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_START1 )
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_START2 )
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_COIN3 )
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN )
+
+ PORT_START("P1")
+ KONAMI8_MONO_B123_UNK // button1 = power-up, button2 = shoot, button3 = missile
+
+ PORT_START("P2")
+ KONAMI8_COCKTAIL_B123_UNK
+
+ PORT_START("DSW1")
+ KONAMI_COINAGE_LOC(DEF_STR( Free_Play ), "Invalid", SW1)
+ /* "Invalid" = both coin slots disabled */
+
+ PORT_START("DSW2")
+ PORT_DIPNAME( 0x03, 0x02, DEF_STR( Lives ) ) PORT_DIPLOCATION("SW2:1,2")
+ PORT_DIPSETTING( 0x03, "2" )
+ PORT_DIPSETTING( 0x02, "3" )
+ PORT_DIPSETTING( 0x01, "5" )
+ PORT_DIPSETTING( 0x00, "7" )
+ PORT_DIPNAME( 0x04, 0x00, DEF_STR( Cabinet ) ) PORT_DIPLOCATION("SW2:3")
+ PORT_DIPSETTING( 0x00, DEF_STR( Upright ) )
+ PORT_DIPSETTING( 0x04, DEF_STR( Cocktail ) )
+ PORT_DIPNAME( 0x18, 0x18, DEF_STR( Bonus_Life ) ) PORT_DIPLOCATION("SW2:4,5")
+ PORT_DIPSETTING( 0x18, "20k and every 70k" )
+ PORT_DIPSETTING( 0x10, "100k and every 100k" )
+ PORT_DIPSETTING( 0x08, "50k only" )
+ PORT_DIPSETTING( 0x00, "100k only" )
+ PORT_DIPNAME( 0x60, 0x40, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SW2:6,7")
+ PORT_DIPSETTING( 0x60, DEF_STR( Easy ) )
+ PORT_DIPSETTING( 0x40, DEF_STR( Normal ) )
+ PORT_DIPSETTING( 0x20, DEF_STR( Hard ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( Hardest ) )
+ PORT_DIPNAME( 0x80, 0x00, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("SW2:8")
+ PORT_DIPSETTING( 0x80, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+
+ PORT_START("DSW3")
+ PORT_DIPNAME( 0x01, 0x01, DEF_STR( Flip_Screen ) ) PORT_DIPLOCATION("SW3:1")
+ PORT_DIPSETTING( 0x01, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x02, 0x02, "Upright Controls" ) PORT_DIPLOCATION("SW3:2")
+ PORT_DIPSETTING( 0x02, DEF_STR( Single ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( Dual ) )
+ PORT_SERVICE_DIPLOC( 0x04, IP_ACTIVE_LOW, "SW3:3" )
+ PORT_DIPUNKNOWN_DIPLOC( 0x08, 0x08, "SW3:4" ) /* Manual says it's unused */
+ PORT_BIT( 0xf0, IP_ACTIVE_LOW, IPT_UNUSED )
+INPUT_PORTS_END
+
+
+static void volume_callback(device_t *device, int v)
+{
+ k007232_set_volume(device, 0, (v >> 4) * 0x11, 0);
+ k007232_set_volume(device, 1, 0, (v & 0x0f) * 0x11);
+}
+
+static const k007232_interface k007232_config =
+{
+ volume_callback /* external port callback */
+};
+
+
+
+static const k052109_interface gradius3_k052109_intf =
+{
+ "gfx1", 0,
+ GRADIUS3_PLANE_ORDER,
+ KONAMI_ROM_DEINTERLEAVE_NONE,
+ gradius3_tile_callback
+};
+
+static const k051960_interface gradius3_k051960_intf =
+{
+ "gfx2", 1,
+ GRADIUS3_PLANE_ORDER,
+ KONAMI_ROM_DEINTERLEAVE_2,
+ gradius3_sprite_callback
+};
+
+static MACHINE_START( gradius3 )
+{
+ gradius3_state *state = machine.driver_data<gradius3_state>();
+
+ state->m_maincpu = machine.device("maincpu");
+ state->m_audiocpu = machine.device("audiocpu");
+ state->m_subcpu = machine.device("sub");
+ state->m_k007232 = machine.device("k007232");
+ state->m_k052109 = machine.device("k052109");
+ state->m_k051960 = machine.device("k051960");
+
+ state->save_item(NAME(state->m_irqAen));
+ state->save_item(NAME(state->m_irqBmask));
+ state->save_item(NAME(state->m_priority));
+}
+
+static MACHINE_RESET( gradius3 )
+{
+ gradius3_state *state = machine.driver_data<gradius3_state>();
+
+ /* start with cpu B halted */
+ cputag_set_input_line(machine, "sub", INPUT_LINE_RESET, ASSERT_LINE);
+ state->m_irqAen = 0;
+ state->m_irqBmask = 0;
+ state->m_priority = 0;
+
+}
+
+static MACHINE_CONFIG_START( gradius3, gradius3_state )
+
+ /* basic machine hardware */
+ MCFG_CPU_ADD("maincpu", M68000, 10000000) /* 10 MHz */
+ MCFG_CPU_PROGRAM_MAP(gradius3_map)
+ MCFG_CPU_VBLANK_INT("screen", cpuA_interrupt)
+
+ MCFG_CPU_ADD("sub", M68000, 10000000) /* 10 MHz */
+ MCFG_CPU_PROGRAM_MAP(gradius3_map2)
+ MCFG_TIMER_ADD_SCANLINE("scantimer", gradius3_sub_scanline, "screen", 0, 1) /* has three interrupt vectors, 1 2 and 4 */
+ /* 4 is triggered by cpu A, the others are unknown but */
+ /* required for the game to run. */
+
+ MCFG_CPU_ADD("audiocpu", Z80, 3579545)
+ MCFG_CPU_PROGRAM_MAP(gradius3_s_map)
+
+ MCFG_QUANTUM_TIME(attotime::from_hz(6000))
+
+ MCFG_MACHINE_START(gradius3)
+ MCFG_MACHINE_RESET(gradius3)
+
+ /* video hardware */
+ MCFG_VIDEO_ATTRIBUTES(VIDEO_HAS_SHADOWS)
+
+ MCFG_SCREEN_ADD("screen", RASTER)
+ MCFG_SCREEN_REFRESH_RATE(60)
+ MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
+ MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16)
+ MCFG_SCREEN_SIZE(64*8, 32*8)
+ MCFG_SCREEN_VISIBLE_AREA(12*8, (64-12)*8-1, 2*8, 30*8-1 )
+ MCFG_SCREEN_UPDATE(gradius3)
+
+ MCFG_PALETTE_LENGTH(2048)
+
+ MCFG_VIDEO_START(gradius3)
+
+ MCFG_K052109_ADD("k052109", gradius3_k052109_intf)
+ MCFG_K051960_ADD("k051960", gradius3_k051960_intf)
+
+ /* sound hardware */
+ MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker")
+
+ MCFG_SOUND_ADD("ymsnd", YM2151, 3579545)
+ MCFG_SOUND_ROUTE(0, "lspeaker", 1.0)
+ MCFG_SOUND_ROUTE(1, "rspeaker", 1.0)
+
+ MCFG_SOUND_ADD("k007232", K007232, 3579545)
+ MCFG_SOUND_CONFIG(k007232_config)
+ MCFG_SOUND_ROUTE(0, "lspeaker", 0.20)
+ MCFG_SOUND_ROUTE(0, "rspeaker", 0.20)
+ MCFG_SOUND_ROUTE(1, "lspeaker", 0.20)
+ MCFG_SOUND_ROUTE(1, "rspeaker", 0.20)
+MACHINE_CONFIG_END
+
+
+
+/***************************************************************************
+
+ Game driver(s)
+
+***************************************************************************/
+
+ROM_START( gradius3 )
+ ROM_REGION( 0x40000, "maincpu", 0 )
+ ROM_LOAD16_BYTE( "945_s13.f15", 0x00000, 0x20000, CRC(70c240a2) SHA1(82dc391572e1f61b0182cb031654d71adcdd5f6e) )
+ ROM_LOAD16_BYTE( "945_s12.e15", 0x00001, 0x20000, CRC(bbc300d4) SHA1(e1ca98bc591575285d7bd2d4fefdf35fed10dcb6) )
+
+ ROM_REGION( 0x100000, "sub", 0 )
+ ROM_LOAD16_BYTE( "945_m09.r17", 0x000000, 0x20000, CRC(b4a6df25) SHA1(85533cf140d28f6f81c0b49b8061bda0924a613a) )
+ ROM_LOAD16_BYTE( "945_m08.n17", 0x000001, 0x20000, CRC(74e981d2) SHA1(e7b47a2da01ff73293d2100c48fdf00b33125af5) )
+ ROM_LOAD16_BYTE( "945_l06b.r11", 0x040000, 0x20000, CRC(83772304) SHA1(a90c75a3de670b6ec5e0fc201876d463b4a76766) )
+ ROM_LOAD16_BYTE( "945_l06a.n11", 0x040001, 0x20000, CRC(e1fd75b6) SHA1(6160d80a2f1bf550e85d6253cf521a96f5a644cc) )
+ ROM_LOAD16_BYTE( "945_l07c.r15", 0x080000, 0x20000, CRC(c1e399b6) SHA1(e95bd478dd3beea0175bf9ee4cededb111c4ace1) )
+ ROM_LOAD16_BYTE( "945_l07a.n15", 0x080001, 0x20000, CRC(96222d04) SHA1(b55700f683a556b0e73dbac9c7b4ce485420d21c) )
+ ROM_LOAD16_BYTE( "945_l07d.r13", 0x0c0000, 0x20000, CRC(4c16d4bd) SHA1(01dcf169b78a1e495214b10181401d1920b0c924) )
+ ROM_LOAD16_BYTE( "945_l07b.n13", 0x0c0001, 0x20000, CRC(5e209d01) SHA1(0efa1bbfdc7e2ba1e0bb96245e2bfe961258b446) )
+
+ ROM_REGION( 0x10000, "audiocpu", 0 )
+ ROM_LOAD( "945_m05.d9", 0x00000, 0x10000, CRC(c8c45365) SHA1(b9a7b736b52bca42c7b8c8ed64c8df73e0116158) )
+
+ ROM_REGION( 0x20000, "gfx1", ROMREGION_ERASE00 ) /* fake */
+ /* gfx data is dynamically generated in RAM */
+
+ ROM_REGION( 0x200000, "gfx2", 0 ) /* graphics (addressable by the main CPU) */
+ ROM_LOAD( "945_a02.l3", 0x000000, 0x80000, CRC(4dfffd74) SHA1(588210bac27448240ef08961f70b714b69cb3ffd) )
+ ROM_LOAD16_BYTE( "945_l04a.k6", 0x080000, 0x20000, CRC(884e21ee) SHA1(ce86dd3a06775e5b1aa09db010dcb674e67828e7) )
+ ROM_LOAD16_BYTE( "945_l04c.m6", 0x080001, 0x20000, CRC(45bcd921) SHA1(e51a8a71362a6fb55124aa1dce74519c0a3c6e3f) )
+ ROM_LOAD16_BYTE( "945_l04b.k8", 0x0c0000, 0x20000, CRC(843bc67d) SHA1(cdf8421083f24ab27867ed5d08d8949da192b2b9) )
+ ROM_LOAD16_BYTE( "945_l04d.m8", 0x0c0001, 0x20000, CRC(0a98d08e) SHA1(1e0ca51a2d45c01fa3f11950ddd387f41ddae691) )
+ ROM_LOAD( "945_a01.h3", 0x100000, 0x80000, CRC(339d6dd2) SHA1(6a52b826aba92c75fc6a5926184948735dc20812) )
+ ROM_LOAD16_BYTE( "945_l03a.e6", 0x180000, 0x20000, CRC(a67ef087) SHA1(fd63474f3bbde5dfc53ed4c1db25d6411a8b54d2) )
+ ROM_LOAD16_BYTE( "945_l03c.h6", 0x180001, 0x20000, CRC(a56be17a) SHA1(1d387736144c30fcb5de54235331ab1ff70c356e) )
+ ROM_LOAD16_BYTE( "945_l03b.e8", 0x1c0000, 0x20000, CRC(933e68b9) SHA1(f3a39446ca77d17fdbd938bd5f718ae9d5570879) )
+ ROM_LOAD16_BYTE( "945_l03d.h8", 0x1c0001, 0x20000, CRC(f375e87b) SHA1(6427b966795c907c8e516244872fe52217da62c4) )
+
+ ROM_REGION( 0x0100, "proms", 0 )
+ ROM_LOAD( "945l14.j28", 0x0000, 0x0100, CRC(c778c189) SHA1(847eaf379ba075c25911c6f83dd63ff390534f60) ) /* priority encoder (not used) */
+
+ ROM_REGION( 0x80000, "k007232", 0 ) /* 007232 samples */
+ ROM_LOAD( "945_a10.b15", 0x00000, 0x40000, CRC(1d083e10) SHA1(b116f133a7647ef7a6c373aff00e9622d9954b61) )
+ ROM_LOAD( "945_l11a.c18", 0x40000, 0x20000, CRC(6043f4eb) SHA1(1c2e9ace1cfdde504b7b6158e3c3f54dc5ae33d4) )
+ ROM_LOAD( "945_l11b.c20", 0x60000, 0x20000, CRC(89ea3baf) SHA1(8edcbaa7969185cfac48c02559826d1b8b081f3f) )
+ROM_END
+
+ROM_START( gradius3a )
+ ROM_REGION( 0x40000, "maincpu", 0 )
+ ROM_LOAD16_BYTE( "945_13.f15", 0x00000, 0x20000, CRC(9974fe6b) SHA1(c18ad8d7c93bf58d886715d8e210177cf49f220b) )
+ ROM_LOAD16_BYTE( "945_12.e15", 0x00001, 0x20000, CRC(e9771b91) SHA1(c9f4610b897c13742b44b546e2bed8ee21945f61) )
+
+ ROM_REGION( 0x100000, "sub", 0 )
+ ROM_LOAD16_BYTE( "945_m09.r17", 0x000000, 0x20000, CRC(b4a6df25) SHA1(85533cf140d28f6f81c0b49b8061bda0924a613a) )
+ ROM_LOAD16_BYTE( "945_m08.n17", 0x000001, 0x20000, CRC(74e981d2) SHA1(e7b47a2da01ff73293d2100c48fdf00b33125af5) )
+ ROM_LOAD16_BYTE( "945_l06b.r11", 0x040000, 0x20000, CRC(83772304) SHA1(a90c75a3de670b6ec5e0fc201876d463b4a76766) )
+ ROM_LOAD16_BYTE( "945_l06a.n11", 0x040001, 0x20000, CRC(e1fd75b6) SHA1(6160d80a2f1bf550e85d6253cf521a96f5a644cc) )
+ ROM_LOAD16_BYTE( "945_l07c.r15", 0x080000, 0x20000, CRC(c1e399b6) SHA1(e95bd478dd3beea0175bf9ee4cededb111c4ace1) )
+ ROM_LOAD16_BYTE( "945_l07a.n15", 0x080001, 0x20000, CRC(96222d04) SHA1(b55700f683a556b0e73dbac9c7b4ce485420d21c) )
+ ROM_LOAD16_BYTE( "945_l07d.r13", 0x0c0000, 0x20000, CRC(4c16d4bd) SHA1(01dcf169b78a1e495214b10181401d1920b0c924) )
+ ROM_LOAD16_BYTE( "945_l07b.n13", 0x0c0001, 0x20000, CRC(5e209d01) SHA1(0efa1bbfdc7e2ba1e0bb96245e2bfe961258b446) )
+
+ ROM_REGION( 0x10000, "audiocpu", 0 )
+ ROM_LOAD( "945_m05.d9", 0x00000, 0x10000, CRC(c8c45365) SHA1(b9a7b736b52bca42c7b8c8ed64c8df73e0116158) )
+
+ ROM_REGION( 0x20000, "gfx1", ROMREGION_ERASE00 ) /* fake */
+ /* gfx data is dynamically generated in RAM */
+
+ ROM_REGION( 0x200000, "gfx2", 0 ) /* graphics (addressable by the main CPU) */
+ ROM_LOAD( "945_a02.l3", 0x000000, 0x80000, CRC(4dfffd74) SHA1(588210bac27448240ef08961f70b714b69cb3ffd) )
+ ROM_LOAD16_BYTE( "945_l04a.k6", 0x080000, 0x20000, CRC(884e21ee) SHA1(ce86dd3a06775e5b1aa09db010dcb674e67828e7) )
+ ROM_LOAD16_BYTE( "945_l04c.m6", 0x080001, 0x20000, CRC(45bcd921) SHA1(e51a8a71362a6fb55124aa1dce74519c0a3c6e3f) )
+ ROM_LOAD16_BYTE( "945_l04b.k8", 0x0c0000, 0x20000, CRC(843bc67d) SHA1(cdf8421083f24ab27867ed5d08d8949da192b2b9) )
+ ROM_LOAD16_BYTE( "945_l04d.m8", 0x0c0001, 0x20000, CRC(0a98d08e) SHA1(1e0ca51a2d45c01fa3f11950ddd387f41ddae691) )
+ ROM_LOAD( "945_a01.h3", 0x100000, 0x80000, CRC(339d6dd2) SHA1(6a52b826aba92c75fc6a5926184948735dc20812) )
+ ROM_LOAD16_BYTE( "945_l03a.e6", 0x180000, 0x20000, CRC(a67ef087) SHA1(fd63474f3bbde5dfc53ed4c1db25d6411a8b54d2) )
+ ROM_LOAD16_BYTE( "945_l03c.h6", 0x180001, 0x20000, CRC(a56be17a) SHA1(1d387736144c30fcb5de54235331ab1ff70c356e) )
+ ROM_LOAD16_BYTE( "945_l03b.e8", 0x1c0000, 0x20000, CRC(933e68b9) SHA1(f3a39446ca77d17fdbd938bd5f718ae9d5570879) )
+ ROM_LOAD16_BYTE( "945_l03d.h8", 0x1c0001, 0x20000, CRC(f375e87b) SHA1(6427b966795c907c8e516244872fe52217da62c4) )
+
+ ROM_REGION( 0x0100, "proms", 0 )
+ ROM_LOAD( "945l14.j28", 0x0000, 0x0100, CRC(c778c189) SHA1(847eaf379ba075c25911c6f83dd63ff390534f60) ) /* priority encoder (not used) */
+
+ ROM_REGION( 0x80000, "k007232", 0 ) /* 007232 samples */
+ ROM_LOAD( "945_a10.b15", 0x00000, 0x40000, CRC(1d083e10) SHA1(b116f133a7647ef7a6c373aff00e9622d9954b61) )
+ ROM_LOAD( "945_l11a.c18", 0x40000, 0x20000, CRC(6043f4eb) SHA1(1c2e9ace1cfdde504b7b6158e3c3f54dc5ae33d4) )
+ ROM_LOAD( "945_l11b.c20", 0x60000, 0x20000, CRC(89ea3baf) SHA1(8edcbaa7969185cfac48c02559826d1b8b081f3f) )
+ROM_END
+
+ROM_START( gradius3e )
+ ROM_REGION( 0x40000, "maincpu", 0 )
+ ROM_LOAD16_BYTE( "945_r13.f15", 0x00000, 0x20000, CRC(cffd103f) SHA1(6bd15e8c2e6e5223d7de9b0b375f36f3e81f60ba) )
+ ROM_LOAD16_BYTE( "945_r12.e15", 0x00001, 0x20000, CRC(0b968ef6) SHA1(ba28d16d94b13aac791b11d3d91df26f78e2e477) )
+
+ ROM_REGION( 0x100000, "sub", 0 )
+ ROM_LOAD16_BYTE( "945_m09.r17", 0x000000, 0x20000, CRC(b4a6df25) SHA1(85533cf140d28f6f81c0b49b8061bda0924a613a) )
+ ROM_LOAD16_BYTE( "945_m08.n17", 0x000001, 0x20000, CRC(74e981d2) SHA1(e7b47a2da01ff73293d2100c48fdf00b33125af5) )
+ ROM_LOAD16_BYTE( "945_l06b.r11", 0x040000, 0x20000, CRC(83772304) SHA1(a90c75a3de670b6ec5e0fc201876d463b4a76766) )
+ ROM_LOAD16_BYTE( "945_l06a.n11", 0x040001, 0x20000, CRC(e1fd75b6) SHA1(6160d80a2f1bf550e85d6253cf521a96f5a644cc) )
+ ROM_LOAD16_BYTE( "945_l07c.r15", 0x080000, 0x20000, CRC(c1e399b6) SHA1(e95bd478dd3beea0175bf9ee4cededb111c4ace1) )
+ ROM_LOAD16_BYTE( "945_l07a.n15", 0x080001, 0x20000, CRC(96222d04) SHA1(b55700f683a556b0e73dbac9c7b4ce485420d21c) )
+ ROM_LOAD16_BYTE( "945_l07d.r13", 0x0c0000, 0x20000, CRC(4c16d4bd) SHA1(01dcf169b78a1e495214b10181401d1920b0c924) )
+ ROM_LOAD16_BYTE( "945_l07b.n13", 0x0c0001, 0x20000, CRC(5e209d01) SHA1(0efa1bbfdc7e2ba1e0bb96245e2bfe961258b446) )
+
+ ROM_REGION( 0x10000, "audiocpu", 0 )
+ ROM_LOAD( "945_m05.d9", 0x00000, 0x10000, CRC(c8c45365) SHA1(b9a7b736b52bca42c7b8c8ed64c8df73e0116158) ) /* 945_r05.d9 */
+
+ ROM_REGION( 0x20000, "gfx1", ROMREGION_ERASE00 ) /* fake */
+ /* gfx data is dynamically generated in RAM */
+
+ ROM_REGION( 0x200000, "gfx2", 0 ) /* graphics (addressable by the main CPU) */
+ ROM_LOAD( "945_a02.l3", 0x000000, 0x80000, CRC(4dfffd74) SHA1(588210bac27448240ef08961f70b714b69cb3ffd) )
+ ROM_LOAD16_BYTE( "945_l04a.k6", 0x080000, 0x20000, CRC(884e21ee) SHA1(ce86dd3a06775e5b1aa09db010dcb674e67828e7) )
+ ROM_LOAD16_BYTE( "945_l04c.m6", 0x080001, 0x20000, CRC(45bcd921) SHA1(e51a8a71362a6fb55124aa1dce74519c0a3c6e3f) )
+ ROM_LOAD16_BYTE( "945_l04b.k8", 0x0c0000, 0x20000, CRC(843bc67d) SHA1(cdf8421083f24ab27867ed5d08d8949da192b2b9) )
+ ROM_LOAD16_BYTE( "945_l04d.m8", 0x0c0001, 0x20000, CRC(0a98d08e) SHA1(1e0ca51a2d45c01fa3f11950ddd387f41ddae691) )
+ ROM_LOAD( "945_a01.h3", 0x100000, 0x80000, CRC(339d6dd2) SHA1(6a52b826aba92c75fc6a5926184948735dc20812) )
+ ROM_LOAD16_BYTE( "945_l03a.e6", 0x180000, 0x20000, CRC(a67ef087) SHA1(fd63474f3bbde5dfc53ed4c1db25d6411a8b54d2) )
+ ROM_LOAD16_BYTE( "945_l03c.h6", 0x180001, 0x20000, CRC(a56be17a) SHA1(1d387736144c30fcb5de54235331ab1ff70c356e) )
+ ROM_LOAD16_BYTE( "945_l03b.e8", 0x1c0000, 0x20000, CRC(933e68b9) SHA1(f3a39446ca77d17fdbd938bd5f718ae9d5570879) )
+ ROM_LOAD16_BYTE( "945_l03d.h8", 0x1c0001, 0x20000, CRC(f375e87b) SHA1(6427b966795c907c8e516244872fe52217da62c4) )
+
+ ROM_REGION( 0x0100, "proms", 0 )
+ ROM_LOAD( "945l14.j28", 0x0000, 0x0100, CRC(c778c189) SHA1(847eaf379ba075c25911c6f83dd63ff390534f60) ) /* priority encoder (not used) */
+
+ ROM_REGION( 0x80000, "k007232", 0 ) /* 007232 samples */
+ ROM_LOAD( "945_a10.b15", 0x00000, 0x40000, CRC(1d083e10) SHA1(b116f133a7647ef7a6c373aff00e9622d9954b61) )
+ ROM_LOAD( "945_l11a.c18", 0x40000, 0x20000, CRC(6043f4eb) SHA1(1c2e9ace1cfdde504b7b6158e3c3f54dc5ae33d4) )
+ ROM_LOAD( "945_l11b.c20", 0x60000, 0x20000, CRC(89ea3baf) SHA1(8edcbaa7969185cfac48c02559826d1b8b081f3f) )
+ROM_END
+
+
+
+GAME( 1989, gradius3, 0, gradius3, gradius3, 0, ROT0, "Konami", "Gradius III (Japan)", GAME_SUPPORTS_SAVE )
+GAME( 1989, gradius3a, gradius3, gradius3, gradius3, 0, ROT0, "Konami", "Gradius III (Asia)", GAME_SUPPORTS_SAVE )
+GAME( 1989, gradius3e, gradius3, gradius3, gradius3, 0, ROT0, "Konami", "Gradius III (World ?)", GAME_SUPPORTS_SAVE )