diff options
Diffstat (limited to 'src/mame/drivers/gradius3.c')
-rw-r--r-- | src/mame/drivers/gradius3.c | 526 |
1 files changed, 526 insertions, 0 deletions
diff --git a/src/mame/drivers/gradius3.c b/src/mame/drivers/gradius3.c new file mode 100644 index 00000000000..0d4f329d8ad --- /dev/null +++ b/src/mame/drivers/gradius3.c @@ -0,0 +1,526 @@ +/*************************************************************************** + +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. + +***************************************************************************/ + +#include "driver.h" +#include "video/konamiic.h" +#include "cpu/m68000/m68000.h" +#include "cpu/z80/z80.h" +#include "sound/2151intf.h" +#include "sound/k007232.h" + + +extern UINT16 *gradius3_gfxram; +extern int gradius3_priority; +VIDEO_START( gradius3 ); +READ16_HANDLER( gradius3_gfxrom_r ); +WRITE16_HANDLER( gradius3_gfxram_w ); +VIDEO_UPDATE( gradius3 ); + + + +static READ16_HANDLER( K052109_halfword_r ) +{ + return K052109_r(offset); +} + +static WRITE16_HANDLER( K052109_halfword_w ) +{ + if (ACCESSING_LSB) + K052109_w(offset,data & 0xff); + + /* is this a bug in the game or something else? */ + if (!ACCESSING_LSB) + K052109_w(offset,(data >> 8) & 0xff); +// logerror("%06x half %04x = %04x\n",activecpu_get_pc(),offset,data); +} + +static READ16_HANDLER( K051937_halfword_r ) +{ + return K051937_r(offset); +} + +static WRITE16_HANDLER( K051937_halfword_w ) +{ + if (ACCESSING_LSB) + K051937_w(offset,data & 0xff); +} + +static READ16_HANDLER( K051960_halfword_r ) +{ + return K051960_r(offset); +} + +static WRITE16_HANDLER( K051960_halfword_w ) +{ + if (ACCESSING_LSB) + K051960_w(offset,data & 0xff); +} + + + +static int irqAen,irqBmask; + + +static MACHINE_RESET( gradius3 ) +{ + /* start with cpu B halted */ + cpunum_set_input_line(1, INPUT_LINE_RESET, ASSERT_LINE); + irqAen = 0; + irqBmask = 0; +} + +static WRITE16_HANDLER( cpuA_ctrl_w ) +{ + if (ACCESSING_MSB) + { + data >>= 8; + + /* bits 0-1 are coin counters */ + coin_counter_w(0,data & 0x01); + coin_counter_w(1,data & 0x02); + + /* bit 2 selects layer priority */ + gradius3_priority = data & 0x04; + + /* bit 3 enables cpu B */ + cpunum_set_input_line(1, INPUT_LINE_RESET, (data & 0x08) ? CLEAR_LINE : ASSERT_LINE); + + /* bit 5 enables irq */ + irqAen = data & 0x20; + + /* other bits unknown */ +//logerror("%06x: write %04x to c0000\n",activecpu_get_pc(),data); + } +} + +static WRITE16_HANDLER( cpuB_irqenable_w ) +{ + if (ACCESSING_MSB) + irqBmask = (data >> 8) & 0x07; +} + +static INTERRUPT_GEN( cpuA_interrupt ) +{ + if (irqAen) + cpunum_set_input_line(0, 2, HOLD_LINE); +} + +static INTERRUPT_GEN( cpuB_interrupt ) +{ + if (cpu_getiloops() & 1) /* ??? */ + { + if (irqBmask & 2) + cpunum_set_input_line(1, 2, HOLD_LINE); + } + else + { + if (irqBmask & 1) + cpunum_set_input_line(1, 1, HOLD_LINE); + } +} + +static WRITE16_HANDLER( cpuB_irqtrigger_w ) +{ + if (irqBmask & 4) + { +logerror("%04x trigger cpu B irq 4 %02x\n",activecpu_get_pc(),data); + cpunum_set_input_line(1,4,HOLD_LINE); + } + else +logerror("%04x MISSED cpu B irq 4 %02x\n",activecpu_get_pc(),data); +} + +static WRITE16_HANDLER( sound_command_w ) +{ + if (ACCESSING_MSB) + soundlatch_w(0,(data >> 8) & 0xff); +} + +static WRITE16_HANDLER( sound_irq_w ) +{ + cpunum_set_input_line_and_vector(2,0,HOLD_LINE,0xff); +} + +static WRITE8_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( 0, bank_A, bank_B ); +} + + + +static ADDRESS_MAP_START( gradius3_map, ADDRESS_SPACE_PROGRAM, 16 ) + AM_RANGE(0x000000, 0x03ffff) AM_ROM + AM_RANGE(0x040000, 0x043fff) AM_RAM + AM_RANGE(0x080000, 0x080fff) AM_READWRITE(MRA16_RAM, paletteram16_xRRRRRGGGGGBBBBB_word_w) AM_BASE(&paletteram16) + AM_RANGE(0x0c0000, 0x0c0001) AM_WRITE(cpuA_ctrl_w) /* halt cpu B, irq enable, priority, coin counters, other? */ + AM_RANGE(0x0c8000, 0x0c8001) AM_READ(input_port_0_word_r) + AM_RANGE(0x0c8002, 0x0c8003) AM_READ(input_port_1_word_r) + AM_RANGE(0x0c8004, 0x0c8005) AM_READ(input_port_2_word_r) + AM_RANGE(0x0c8006, 0x0c8007) AM_READ(input_port_5_word_r) + AM_RANGE(0x0d0000, 0x0d0001) AM_READ(input_port_3_word_r) + AM_RANGE(0x0d0002, 0x0d0003) AM_READ(input_port_4_word_r) + 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(1) + AM_RANGE(0x14c000, 0x153fff) AM_READWRITE(K052109_halfword_r, K052109_halfword_w) + AM_RANGE(0x180000, 0x19ffff) AM_READWRITE(MRA16_RAM, gradius3_gfxram_w) AM_BASE(&gradius3_gfxram) +ADDRESS_MAP_END + + +static ADDRESS_MAP_START( gradius3_map2, ADDRESS_SPACE_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(1) + AM_RANGE(0x24c000, 0x253fff) AM_READWRITE(K052109_halfword_r, K052109_halfword_w) + AM_RANGE(0x280000, 0x29ffff) AM_READWRITE(MRA16_RAM, gradius3_gfxram_w) + 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, ADDRESS_SPACE_PROGRAM, 8 ) + AM_RANGE(0x0000, 0xefff) AM_ROM + AM_RANGE(0xf000, 0xf000) AM_WRITE(sound_bank_w) /* 007232 bankswitch */ + AM_RANGE(0xf010, 0xf010) AM_READ(soundlatch_r) + AM_RANGE(0xf020, 0xf02d) AM_READWRITE(K007232_read_port_0_r, K007232_write_port_0_w) + AM_RANGE(0xf030, 0xf030) AM_WRITE(YM2151_register_port_0_w) + AM_RANGE(0xf031, 0xf031) AM_READWRITE(YM2151_status_port_0_r, YM2151_data_port_0_w) + AM_RANGE(0xf800, 0xffff) AM_RAM +ADDRESS_MAP_END + + + +static INPUT_PORTS_START( gradius3 ) + PORT_START /* COINS */ + 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 /* PLAYER 1 */ + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_8WAY + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_8WAY + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 ) // power-up + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 ) // shoot + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON3 ) // missile + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN ) + + PORT_START /* PLAYER 2 */ + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_COCKTAIL + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_COCKTAIL + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY PORT_COCKTAIL + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_COCKTAIL + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_COCKTAIL + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_COCKTAIL + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_COCKTAIL + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN ) + + PORT_START /* DSW1 */ + PORT_DIPNAME( 0x0f, 0x0f, DEF_STR( Coin_A ) ) + PORT_DIPSETTING( 0x02, DEF_STR( 4C_1C ) ) + PORT_DIPSETTING( 0x05, DEF_STR( 3C_1C ) ) + PORT_DIPSETTING( 0x08, DEF_STR( 2C_1C ) ) + PORT_DIPSETTING( 0x04, DEF_STR( 3C_2C ) ) + PORT_DIPSETTING( 0x01, DEF_STR( 4C_3C ) ) + PORT_DIPSETTING( 0x0f, DEF_STR( 1C_1C ) ) + PORT_DIPSETTING( 0x03, DEF_STR( 3C_4C ) ) + PORT_DIPSETTING( 0x07, DEF_STR( 2C_3C ) ) + PORT_DIPSETTING( 0x0e, DEF_STR( 1C_2C ) ) + PORT_DIPSETTING( 0x06, DEF_STR( 2C_5C ) ) + PORT_DIPSETTING( 0x0d, DEF_STR( 1C_3C ) ) + PORT_DIPSETTING( 0x0c, DEF_STR( 1C_4C ) ) + PORT_DIPSETTING( 0x0b, DEF_STR( 1C_5C ) ) + PORT_DIPSETTING( 0x0a, DEF_STR( 1C_6C ) ) + PORT_DIPSETTING( 0x09, DEF_STR( 1C_7C ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Free_Play ) ) + PORT_DIPNAME( 0xf0, 0xf0, DEF_STR( Coin_B ) ) + PORT_DIPSETTING( 0x20, DEF_STR( 4C_1C ) ) + PORT_DIPSETTING( 0x50, DEF_STR( 3C_1C ) ) + PORT_DIPSETTING( 0x80, DEF_STR( 2C_1C ) ) + PORT_DIPSETTING( 0x40, DEF_STR( 3C_2C ) ) + PORT_DIPSETTING( 0x10, DEF_STR( 4C_3C ) ) + PORT_DIPSETTING( 0xf0, DEF_STR( 1C_1C ) ) + PORT_DIPSETTING( 0x30, DEF_STR( 3C_4C ) ) + PORT_DIPSETTING( 0x70, DEF_STR( 2C_3C ) ) + PORT_DIPSETTING( 0xe0, DEF_STR( 1C_2C ) ) + PORT_DIPSETTING( 0x60, DEF_STR( 2C_5C ) ) + PORT_DIPSETTING( 0xd0, DEF_STR( 1C_3C ) ) + PORT_DIPSETTING( 0xc0, DEF_STR( 1C_4C ) ) + PORT_DIPSETTING( 0xb0, DEF_STR( 1C_5C ) ) + PORT_DIPSETTING( 0xa0, DEF_STR( 1C_6C ) ) + PORT_DIPSETTING( 0x90, DEF_STR( 1C_7C ) ) +// PORT_DIPSETTING( 0x00, "Invalid" ) + + PORT_START /* DSW2 */ + PORT_DIPNAME( 0x03, 0x02, DEF_STR( Lives ) ) + PORT_DIPSETTING( 0x03, "2" ) + PORT_DIPSETTING( 0x02, "3" ) + PORT_DIPSETTING( 0x01, "5" ) + PORT_DIPSETTING( 0x00, "7" ) + PORT_DIPNAME( 0x04, 0x00, DEF_STR( Cabinet ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Upright ) ) + PORT_DIPSETTING( 0x04, DEF_STR( Cocktail ) ) + PORT_DIPNAME( 0x18, 0x18, DEF_STR( Bonus_Life ) ) + PORT_DIPSETTING( 0x18, "20000 and every 70000" ) + PORT_DIPSETTING( 0x10, "100000 and every 100000" ) + PORT_DIPSETTING( 0x08, "50000" ) + PORT_DIPSETTING( 0x00, "100000" ) + PORT_DIPNAME( 0x60, 0x40, DEF_STR( Difficulty ) ) + 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_DIPSETTING( 0x80, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + + PORT_START /* DSW3 */ + PORT_DIPNAME( 0x01, 0x01, DEF_STR( Flip_Screen ) ) + PORT_DIPSETTING( 0x01, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x02, 0x02, "Upright Controls" ) + PORT_DIPSETTING( 0x02, DEF_STR( Single ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Dual ) ) + PORT_SERVICE( 0x04, IP_ACTIVE_LOW ) + PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x08, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_BIT( 0xf0, IP_ACTIVE_LOW, IPT_UNUSED ) +INPUT_PORTS_END + + + +static void volume_callback(int v) +{ + K007232_set_volume(0,0,(v >> 4) * 0x11,0); + K007232_set_volume(0,1,0,(v & 0x0f) * 0x11); +} + +static struct K007232_interface k007232_interface = +{ + REGION_SOUND1, /* memory regions */ + volume_callback /* external port callback */ +}; + + + +static MACHINE_DRIVER_START( gradius3 ) + + /* basic machine hardware */ + MDRV_CPU_ADD(M68000, 10000000) /* 10 MHz */ + MDRV_CPU_PROGRAM_MAP(gradius3_map,0) + MDRV_CPU_VBLANK_INT(cpuA_interrupt,1) + + MDRV_CPU_ADD(M68000, 10000000) /* 10 MHz */ + MDRV_CPU_PROGRAM_MAP(gradius3_map2,0) + MDRV_CPU_VBLANK_INT(cpuB_interrupt,2) /* 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. */ + MDRV_CPU_ADD(Z80, 3579545) + MDRV_CPU_PROGRAM_MAP(gradius3_s_map,0) + + MDRV_SCREEN_REFRESH_RATE(60) + MDRV_SCREEN_VBLANK_TIME(DEFAULT_60HZ_VBLANK_DURATION) + MDRV_INTERLEAVE(100) + + MDRV_MACHINE_RESET(gradius3) + + /* video hardware */ + MDRV_VIDEO_ATTRIBUTES(VIDEO_TYPE_RASTER | VIDEO_HAS_SHADOWS) + MDRV_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) + MDRV_SCREEN_SIZE(64*8, 32*8) + MDRV_SCREEN_VISIBLE_AREA(12*8, (64-12)*8-1, 2*8, 30*8-1 ) + MDRV_PALETTE_LENGTH(2048) + + MDRV_VIDEO_START(gradius3) + MDRV_VIDEO_UPDATE(gradius3) + + /* sound hardware */ + MDRV_SPEAKER_STANDARD_STEREO("left", "right") + + MDRV_SOUND_ADD(YM2151, 3579545) + MDRV_SOUND_ROUTE(0, "left", 1.0) + MDRV_SOUND_ROUTE(1, "right", 1.0) + + MDRV_SOUND_ADD(K007232, 3579545) + MDRV_SOUND_CONFIG(k007232_interface) + MDRV_SOUND_ROUTE(0, "left", 0.20) + MDRV_SOUND_ROUTE(0, "right", 0.20) + MDRV_SOUND_ROUTE(1, "left", 0.20) + MDRV_SOUND_ROUTE(1, "right", 0.20) +MACHINE_DRIVER_END + + + +/*************************************************************************** + + Game driver(s) + +***************************************************************************/ + +ROM_START( gradius3 ) + ROM_REGION( 0x40000, REGION_CPU1, 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, REGION_CPU2, 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, REGION_CPU3, 0 ) + ROM_LOAD( "945_m05.d9", 0x00000, 0x10000, CRC(c8c45365) SHA1(b9a7b736b52bca42c7b8c8ed64c8df73e0116158) ) + + ROM_REGION( 0x20000, REGION_GFX1, ROMREGION_ERASE00 ) /* fake */ + /* gfx data is dynamically generated in RAM */ + + ROM_REGION( 0x200000, REGION_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, REGION_PROMS, 0 ) + ROM_LOAD( "945l14.j28", 0x0000, 0x0100, CRC(c778c189) SHA1(847eaf379ba075c25911c6f83dd63ff390534f60) ) /* priority encoder (not used) */ + + ROM_REGION( 0x80000, REGION_SOUND1, 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( grdius3a ) + ROM_REGION( 0x40000, REGION_CPU1, 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, REGION_CPU2, 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, REGION_CPU3, 0 ) + ROM_LOAD( "945_m05.d9", 0x00000, 0x10000, CRC(c8c45365) SHA1(b9a7b736b52bca42c7b8c8ed64c8df73e0116158) ) + + ROM_REGION( 0x20000, REGION_GFX1, ROMREGION_ERASE00 ) /* fake */ + /* gfx data is dynamically generated in RAM */ + + ROM_REGION( 0x200000, REGION_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, REGION_PROMS, 0 ) + ROM_LOAD( "945l14.j28", 0x0000, 0x0100, CRC(c778c189) SHA1(847eaf379ba075c25911c6f83dd63ff390534f60) ) /* priority encoder (not used) */ + + ROM_REGION( 0x80000, REGION_SOUND1, 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( grdius3e ) + ROM_REGION( 0x40000, REGION_CPU1, 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, REGION_CPU2, 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, REGION_CPU3, 0 ) + ROM_LOAD( "945_m05.d9", 0x00000, 0x10000, CRC(c8c45365) SHA1(b9a7b736b52bca42c7b8c8ed64c8df73e0116158) ) /* 945_r05.d9 */ + + ROM_REGION( 0x20000, REGION_GFX1, ROMREGION_ERASE00 ) /* fake */ + /* gfx data is dynamically generated in RAM */ + + ROM_REGION( 0x200000, REGION_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, REGION_PROMS, 0 ) + ROM_LOAD( "945l14.j28", 0x0000, 0x0100, CRC(c778c189) SHA1(847eaf379ba075c25911c6f83dd63ff390534f60) ) /* priority encoder (not used) */ + + ROM_REGION( 0x80000, REGION_SOUND1, 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 + + +static DRIVER_INIT( gradius3 ) +{ + konami_rom_deinterleave_2(REGION_GFX2); +} + + + +GAME( 1989, gradius3, 0, gradius3, gradius3, gradius3, ROT0, "Konami", "Gradius III (Japan)", 0 ) +GAME( 1989, grdius3a, gradius3, gradius3, gradius3, gradius3, ROT0, "Konami", "Gradius III (Asia)", 0 ) +GAME( 1989, grdius3e, gradius3, gradius3, gradius3, gradius3, ROT0, "Konami", "Gradius III (World ?)", 0 ) |