diff options
Diffstat (limited to 'src/mame/drivers/shootout.c')
-rw-r--r-- | src/mame/drivers/shootout.c | 476 |
1 files changed, 476 insertions, 0 deletions
diff --git a/src/mame/drivers/shootout.c b/src/mame/drivers/shootout.c new file mode 100644 index 00000000000..113a5a91f72 --- /dev/null +++ b/src/mame/drivers/shootout.c @@ -0,0 +1,476 @@ +/******************************************************************************* + + Shoot Out (USA) (c) 1985 Data East USA DE-0219 + Shoot Out (Japan) (c) 1985 Data East USA DE-0203 + Shoot Out (Korean bootleg) (c) 1985 Data East USA DE-0203 bootleg + + Shoot Out (Japan) is an interesting board, it runs on an earlier PCB design + than the USA version, has no sound CPU, uses half as many sprites and + unusually for a Deco Japanese game it is credited to 'Data East USA'. + Perhaps the USA arm of Deco designed this game rather than the Japanese + arm? + + Shoot Out (Japan) uses the YM2203 ports for CPU bankswitching so it does + not work with sound turned off. + + Shoot Out (Korean bootleg) is based on the earlier DE-0203 board but + strangely features the same encryption as used on the DE-0219 board. It + also has some edited graphics. + + Driver by: + Ernesto Corvi (ernesto@imagina.com) + Phil Stroffolino + Shoot Out (Japan) and fixes added by Bryan McPhail (mish@tendril.co.uk) + + TODO: + + - Fix coin counter + - Lots of unmapped memory reads + +*******************************************************************************/ + +/* + + 2003-06-01 Added cocktail support to shootout + 2003-10-08 Added cocktail support to shootouj/shootoub + 2003-10-21 Removed input port hack + +*/ + +#include "driver.h" +#include "cpu/m6502/m6502.h" +#include "sound/2203intf.h" + +UINT8 *shootout_textram; + +extern WRITE8_HANDLER( shootout_videoram_w ); +extern WRITE8_HANDLER( shootout_textram_w ); + +extern PALETTE_INIT( shootout ); +extern VIDEO_START( shootout ); +extern VIDEO_UPDATE( shootout ); +extern VIDEO_UPDATE( shootouj ); + +/*******************************************************************************/ + +static WRITE8_HANDLER( shootout_bankswitch_w ) +{ + memory_set_bank(1, data & 0x0f); +} + +static WRITE8_HANDLER( sound_cpu_command_w ) +{ + soundlatch_w( offset, data ); + cpunum_set_input_line( 1, INPUT_LINE_NMI, PULSE_LINE ); +} + +static WRITE8_HANDLER( shootout_flipscreen_w ) +{ + flip_screen_set(data & 0x01); +} + +static WRITE8_HANDLER( shootout_coin_counter_w ) +{ + coin_counter_w(0, data); +} + +/*******************************************************************************/ + +static ADDRESS_MAP_START( readmem, ADDRESS_SPACE_PROGRAM, 8 ) + AM_RANGE(0x0000, 0x0fff) AM_READ(MRA8_RAM) + AM_RANGE(0x1000, 0x1000) AM_READ(input_port_0_r) + AM_RANGE(0x1001, 0x1001) AM_READ(input_port_1_r) + AM_RANGE(0x1002, 0x1002) AM_READ(input_port_2_r) + AM_RANGE(0x1003, 0x1003) AM_READ(input_port_3_r) + AM_RANGE(0x2000, 0x27ff) AM_READ(MRA8_RAM) /* foreground */ + AM_RANGE(0x2800, 0x2fff) AM_READ(MRA8_RAM) /* background */ + AM_RANGE(0x4000, 0x7fff) AM_READ(MRA8_BANK1) + AM_RANGE(0x8000, 0xffff) AM_READ(MRA8_ROM) +ADDRESS_MAP_END + +static ADDRESS_MAP_START( writemem, ADDRESS_SPACE_PROGRAM, 8 ) + AM_RANGE(0x0000, 0x0fff) AM_WRITE(MWA8_RAM) + AM_RANGE(0x1000, 0x1000) AM_WRITE(shootout_bankswitch_w) + AM_RANGE(0x1001, 0x1001) AM_WRITE(shootout_flipscreen_w) + AM_RANGE(0x1002, 0x1002) AM_WRITE(shootout_coin_counter_w) + AM_RANGE(0x1003, 0x1003) AM_WRITE(sound_cpu_command_w) + AM_RANGE(0x1004, 0x17ff) AM_WRITE(MWA8_RAM) + AM_RANGE(0x1800, 0x19ff) AM_WRITE(MWA8_RAM) AM_BASE(&spriteram) AM_SIZE(&spriteram_size) + AM_RANGE(0x2000, 0x27ff) AM_WRITE(shootout_textram_w) AM_BASE(&shootout_textram) + AM_RANGE(0x2800, 0x2fff) AM_WRITE(shootout_videoram_w) AM_BASE(&videoram) + AM_RANGE(0x4000, 0xffff) AM_WRITE(MWA8_ROM) +ADDRESS_MAP_END + +static ADDRESS_MAP_START( readmem_alt, ADDRESS_SPACE_PROGRAM, 8 ) + AM_RANGE(0x0000, 0x0fff) AM_READ(MRA8_RAM) + AM_RANGE(0x1000, 0x1000) AM_READ(input_port_0_r) + AM_RANGE(0x1001, 0x1001) AM_READ(input_port_1_r) + AM_RANGE(0x1002, 0x1002) AM_READ(input_port_2_r) + AM_RANGE(0x1003, 0x1003) AM_READ(input_port_3_r) + AM_RANGE(0x2000, 0x21ff) AM_READ(MRA8_RAM) + AM_RANGE(0x2800, 0x2800) AM_READ(YM2203_status_port_0_r) + AM_RANGE(0x3000, 0x37ff) AM_READ(MRA8_RAM) /* foreground */ + AM_RANGE(0x3800, 0x3fff) AM_READ(MRA8_RAM) /* background */ + AM_RANGE(0x4000, 0x7fff) AM_READ(MRA8_BANK1) + AM_RANGE(0x8000, 0xffff) AM_READ(MRA8_ROM) +ADDRESS_MAP_END + +static ADDRESS_MAP_START( writemem_alt, ADDRESS_SPACE_PROGRAM, 8 ) + AM_RANGE(0x0000, 0x0fff) AM_WRITE(MWA8_RAM) + AM_RANGE(0x1800, 0x1800) AM_WRITE(shootout_coin_counter_w) + AM_RANGE(0x2000, 0x21ff) AM_WRITE(MWA8_RAM) AM_BASE(&spriteram) AM_SIZE(&spriteram_size) + AM_RANGE(0x2800, 0x2800) AM_WRITE(YM2203_control_port_0_w) + AM_RANGE(0x2801, 0x2801) AM_WRITE(YM2203_write_port_0_w) + AM_RANGE(0x3000, 0x37ff) AM_WRITE(shootout_textram_w) AM_BASE(&shootout_textram) + AM_RANGE(0x3800, 0x3fff) AM_WRITE(shootout_videoram_w) AM_BASE(&videoram) + AM_RANGE(0x4000, 0xffff) AM_WRITE(MWA8_ROM) +ADDRESS_MAP_END + +/*******************************************************************************/ + +static ADDRESS_MAP_START( sound_readmem, ADDRESS_SPACE_PROGRAM, 8 ) + AM_RANGE(0x0000, 0x07ff) AM_READ(MRA8_RAM) + AM_RANGE(0x4000, 0x4000) AM_READ(YM2203_status_port_0_r) + AM_RANGE(0xa000, 0xa000) AM_READ(soundlatch_r) + AM_RANGE(0xc000, 0xffff) AM_READ(MRA8_ROM) +ADDRESS_MAP_END + +static ADDRESS_MAP_START( sound_writemem, ADDRESS_SPACE_PROGRAM, 8 ) + AM_RANGE(0x0000, 0x07ff) AM_WRITE(MWA8_RAM) + AM_RANGE(0x4000, 0x4000) AM_WRITE(YM2203_control_port_0_w) + AM_RANGE(0x4001, 0x4001) AM_WRITE(YM2203_write_port_0_w) + AM_RANGE(0xd000, 0xd000) AM_WRITE(interrupt_enable_w) + AM_RANGE(0xc000, 0xffff) AM_WRITE(MWA8_ROM) +ADDRESS_MAP_END + +/*******************************************************************************/ + +static INPUT_PORTS_START( shootout ) + PORT_START_TAG("DSW1") + PORT_DIPNAME( 0x03, 0x03, DEF_STR( Coin_A ) ) + PORT_DIPSETTING( 0x00, DEF_STR( 2C_1C ) ) + PORT_DIPSETTING( 0x03, DEF_STR( 1C_1C ) ) + PORT_DIPSETTING( 0x02, DEF_STR( 1C_2C ) ) + PORT_DIPSETTING( 0x01, DEF_STR( 1C_3C ) ) + PORT_DIPNAME( 0x0c, 0x0c, DEF_STR( Coin_B ) ) + PORT_DIPSETTING( 0x00, DEF_STR( 2C_1C ) ) + PORT_DIPSETTING( 0x0c, DEF_STR( 1C_1C ) ) + PORT_DIPSETTING( 0x08, DEF_STR( 1C_2C ) ) + PORT_DIPSETTING( 0x04, DEF_STR( 1C_3C ) ) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_DIPNAME( 0x20, 0x20, DEF_STR( Demo_Sounds ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x20, DEF_STR( On ) ) + PORT_DIPNAME( 0x40, 0x00, DEF_STR( Cabinet ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Upright ) ) + PORT_DIPSETTING( 0x40, DEF_STR( Cocktail ) ) + PORT_DIPNAME( 0x80, 0x80, "Freeze" ) + PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + + PORT_START_TAG("IN0") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_8WAY + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) 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 ) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 ) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_START1 ) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_START2 ) + + PORT_START_TAG("IN1") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_COCKTAIL + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) 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_HIGH, IPT_COIN2 ) + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_COIN1 ) + + PORT_START_TAG("DSW2") + PORT_DIPNAME( 0x03, 0x03, DEF_STR( Lives ) ) + PORT_DIPSETTING( 0x01, "1" ) + PORT_DIPSETTING( 0x03, "3" ) + PORT_DIPSETTING( 0x02, "5" ) + PORT_DIPSETTING( 0x00, DEF_STR( Infinite ) ) + PORT_DIPNAME( 0x0c, 0x0c, DEF_STR( Bonus_Life ) ) + PORT_DIPSETTING( 0x0c, "20.000 Every 70.000" ) + PORT_DIPSETTING( 0x08, "30.000 Every 80.000" ) + PORT_DIPSETTING( 0x04, "40.000 Every 90.000" ) + PORT_DIPSETTING( 0x00, "70.000" ) + PORT_DIPNAME( 0x30, 0x30, DEF_STR( Difficulty ) ) + PORT_DIPSETTING( 0x30, DEF_STR( Easy ) ) + PORT_DIPSETTING( 0x20, DEF_STR( Normal ) ) + PORT_DIPSETTING( 0x10, DEF_STR( Hard ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Very_Hard ) ) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_SPECIAL ) /* this is set when either coin is inserted */ + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_VBLANK ) +INPUT_PORTS_END + +static INPUT_PORTS_START( shootouj ) + PORT_INCLUDE(shootout) + + PORT_MODIFY("DSW1") + PORT_DIPNAME( 0x20, 0x20, "Company Copyright" ) + PORT_DIPSETTING( 0x20, "Data East Corp" ) + PORT_DIPSETTING( 0x00, "Data East USA Inc" ) + + PORT_MODIFY("DSW2") + PORT_DIPNAME( 0x0c, 0x0c, DEF_STR( Bonus_Life ) ) + PORT_DIPSETTING( 0x0c, "20K 50K" ) + PORT_DIPSETTING( 0x08, "30K 60K" ) + PORT_DIPSETTING( 0x04, "50K 70K" ) + PORT_DIPSETTING( 0x00, "70K" ) +INPUT_PORTS_END + + +static const gfx_layout char_layout = +{ + 8,8, /* 8*8 characters */ + 0x400, /* 1024 characters */ + 2, /* 2 bits per pixel */ + { 0,4 }, /* the bitplanes are packed in the same byte */ + { (0x2000*8)+0, (0x2000*8)+1, (0x2000*8)+2, (0x2000*8)+3, 0, 1, 2, 3 }, + { 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8 }, + 8*8 /* every char takes 8 consecutive bytes */ +}; +static const gfx_layout sprite_layout = +{ + 16,16, /* 16*16 sprites */ + 0x800, /* 2048 sprites */ + 3, /* 3 bits per pixel */ + { 0*0x10000*8, 1*0x10000*8, 2*0x10000*8 }, /* the bitplanes are separated */ + { 128+0, 128+1, 128+2, 128+3, 128+4, 128+5, 128+6, 128+7, 0, 1, 2, 3, 4, 5, 6, 7 }, + { 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8, 8*8, 9*8, 10*8, 11*8, 12*8, 13*8, 14*8, 15*8 }, + 32*8 /* every char takes 32 consecutive bytes */ +}; +static const gfx_layout tile_layout = +{ + 8,8, /* 8*8 characters */ + 0x800, /* 2048 characters */ + 2, /* 2 bits per pixel */ + { 0,4 }, /* the bitplanes are packed in the same byte */ + { (0x4000*8)+0, (0x4000*8)+1, (0x4000*8)+2, (0x4000*8)+3, 0, 1, 2, 3 }, + { 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8 }, + 8*8 /* every char takes 8 consecutive bytes */ +}; + +static GFXDECODE_START( shootout ) + GFXDECODE_ENTRY( REGION_GFX1, 0, char_layout, 16*4+8*8, 16 ) /* characters */ + GFXDECODE_ENTRY( REGION_GFX2, 0, sprite_layout, 16*4, 8 ) /* sprites */ + GFXDECODE_ENTRY( REGION_GFX3, 0, tile_layout, 0, 16 ) /* tiles */ +GFXDECODE_END + +static void shootout_snd_irq(int linestate) +{ + cpunum_set_input_line(1,0,linestate); +} + +static void shootout_snd2_irq(int linestate) +{ + cpunum_set_input_line(0,0,linestate); +} + +static struct YM2203interface ym2203_interface = +{ + 0,0,0,0,shootout_snd_irq +}; + +static struct YM2203interface ym2203_interface2 = +{ + 0, + 0, + shootout_bankswitch_w, + shootout_flipscreen_w, + shootout_snd2_irq +}; + +static INTERRUPT_GEN( shootout_interrupt ) +{ + static int coin = 0; + + if ( readinputport( 2 ) & 0xc0 ) { + if ( coin == 0 ) { + coin = 1; + nmi_line_pulse(); + } + } else + coin = 0; +} + +static MACHINE_DRIVER_START( shootout ) + + /* basic machine hardware */ + MDRV_CPU_ADD(M6502, 2000000) /* 2 MHz? */ + MDRV_CPU_PROGRAM_MAP(readmem,writemem) + MDRV_CPU_VBLANK_INT(shootout_interrupt,1) /* nmi's are triggered at coin up */ + + MDRV_CPU_ADD(M6502, 1500000) + /* audio CPU */ + MDRV_CPU_PROGRAM_MAP(sound_readmem,sound_writemem) + + MDRV_SCREEN_REFRESH_RATE(60) + MDRV_SCREEN_VBLANK_TIME(DEFAULT_REAL_60HZ_VBLANK_DURATION) + + /* video hardware */ + MDRV_VIDEO_ATTRIBUTES(VIDEO_TYPE_RASTER) + MDRV_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) + MDRV_SCREEN_SIZE(32*8, 32*8) + MDRV_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 1*8, 31*8-1) + MDRV_GFXDECODE(shootout) + MDRV_PALETTE_LENGTH(256) + + MDRV_PALETTE_INIT(shootout) + MDRV_VIDEO_START(shootout) + MDRV_VIDEO_UPDATE(shootout) + + /* sound hardware */ + MDRV_SPEAKER_STANDARD_MONO("mono") + + MDRV_SOUND_ADD(YM2203, 1500000) + MDRV_SOUND_CONFIG(ym2203_interface) + MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50) +MACHINE_DRIVER_END + + +static MACHINE_DRIVER_START( shootouj ) + + /* basic machine hardware */ + MDRV_CPU_ADD(M6502, 2000000) /* 2 MHz? */ + MDRV_CPU_PROGRAM_MAP(readmem_alt,writemem_alt) + MDRV_CPU_VBLANK_INT(shootout_interrupt,1) /* nmi's are triggered at coin up */ + + MDRV_SCREEN_REFRESH_RATE(60) + MDRV_SCREEN_VBLANK_TIME(DEFAULT_REAL_60HZ_VBLANK_DURATION) + + /* video hardware */ + MDRV_VIDEO_ATTRIBUTES(VIDEO_TYPE_RASTER) + MDRV_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) + MDRV_SCREEN_SIZE(32*8, 32*8) + MDRV_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 1*8, 31*8-1) + MDRV_GFXDECODE(shootout) + MDRV_PALETTE_LENGTH(256) + + MDRV_PALETTE_INIT(shootout) + MDRV_VIDEO_START(shootout) + MDRV_VIDEO_UPDATE(shootouj) + + /* sound hardware */ + MDRV_SPEAKER_STANDARD_MONO("mono") + + MDRV_SOUND_ADD(YM2203, 1500000) + MDRV_SOUND_CONFIG(ym2203_interface2) + MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50) +MACHINE_DRIVER_END + + +ROM_START( shootout ) + ROM_REGION( 2*0x20000, REGION_CPU1, 0 ) /* 128k for code + 128k for decrypted opcodes */ + ROM_LOAD( "cu00.b1", 0x08000, 0x8000, CRC(090edeb6) SHA1(ab849d123dacf3947b1ebd29b70a20e066911a60) ) /* opcodes encrypted */ + /* banked at 0x4000-0x8000 */ + ROM_LOAD( "cu02.c3", 0x10000, 0x8000, CRC(2a913730) SHA1(584488278d58c4d34a2eebeaf39518f87cf5eecd) ) /* opcodes encrypted */ + ROM_LOAD( "cu01.c1", 0x18000, 0x4000, CRC(8843c3ae) SHA1(c58ed4acac566f890cadf62bcbcced07a59243fc) ) /* opcodes encrypted */ + + ROM_REGION( 0x10000, REGION_CPU2, 0 ) + ROM_LOAD( "cu09.j1", 0x0c000, 0x4000, CRC(c4cbd558) SHA1(0e940ae99febc1161e5f35550aa75afca88cb5e9) ) /* Sound CPU */ + + ROM_REGION( 0x04000, REGION_GFX1, ROMREGION_DISPOSE ) + ROM_LOAD( "cu11.h19", 0x00000, 0x4000, CRC(eff00460) SHA1(15daaa3d3125a981a26f31d43283faa5be26e96b) ) /* foreground characters */ + + ROM_REGION( 0x30000, REGION_GFX2, ROMREGION_DISPOSE ) + ROM_LOAD( "cu04.c7", 0x00000, 0x8000, CRC(ceea6b20) SHA1(9fe363668db2e2759b3c531b4d7f23c65f2e8035) ) /* sprites */ + ROM_LOAD( "cu03.c5", 0x08000, 0x8000, CRC(b786bb3e) SHA1(5a209f01914ca4b206138d738a34640e0bcb3185) ) + ROM_LOAD( "cu06.c10", 0x10000, 0x8000, CRC(2ec1d17f) SHA1(74f0579a5ab3daf5d1290d3c15459f0f9b67bf79) ) + ROM_LOAD( "cu05.c9", 0x18000, 0x8000, CRC(dd038b85) SHA1(b1c3c1ab17c36a1c77726b5e485fc01581a4d97d) ) + ROM_LOAD( "cu08.c13", 0x20000, 0x8000, CRC(91290933) SHA1(60487f4eaf2e6c50b24c0f8fbd7abf92c04a342a) ) + ROM_LOAD( "cu07.c12", 0x28000, 0x8000, CRC(19b6b94f) SHA1(292264811206916af41d133f81dfd93c44f59a96) ) + + ROM_REGION( 0x08000, REGION_GFX3, ROMREGION_DISPOSE ) + ROM_LOAD( "cu10.h17", 0x00000, 0x2000, CRC(3854c877) SHA1(2c8fe4591553ce798c907849e3dbd410e4fe424c) ) /* background tiles */ + ROM_CONTINUE( 0x04000, 0x2000 ) + ROM_CONTINUE( 0x02000, 0x2000 ) + ROM_CONTINUE( 0x06000, 0x2000 ) + + ROM_REGION( 0x0200, REGION_PROMS, 0 ) + ROM_LOAD( "gb08.k10", 0x0000, 0x0100, CRC(509c65b6) SHA1(4cec37065a799ced4e7b6552f267aacc7f54ffe3) ) + ROM_LOAD( "gb09.k6", 0x0100, 0x0100, CRC(aa090565) SHA1(e289e77ec3402e86d93b873c0fa064f3e6277a62) ) /* priority encoder? (not used) */ +ROM_END + +ROM_START( shootouj ) + ROM_REGION( 0x20000, REGION_CPU1, 0 ) /* 128k for code */ + ROM_LOAD( "cg02.bin", 0x08000, 0x8000, CRC(8fc5d632) SHA1(809ac4eba09972229fe741c96fa8036d7139b6a8) ) + ROM_LOAD( "cg00.bin", 0x10000, 0x8000, CRC(ef6ced1e) SHA1(feea508c7a60fc6cde1efee52cba628accd26028) ) + ROM_LOAD( "cg01.bin", 0x18000, 0x4000, CRC(74cf11ca) SHA1(59edbc4633cd560e7b928b33e4c42d0125332a1b) ) + + ROM_REGION( 0x04000, REGION_GFX1, ROMREGION_DISPOSE ) + ROM_LOAD( "cu11.h19", 0x00000, 0x4000, CRC(eff00460) SHA1(15daaa3d3125a981a26f31d43283faa5be26e96b) ) /* foreground characters */ + + ROM_REGION( 0x30000, REGION_GFX2, ROMREGION_DISPOSE ) + ROM_LOAD( "cg03.bin", 0x00000, 0x8000, CRC(5252ec19) SHA1(c6848a815badd8845f91e898b0a52b7f12ed8a39) ) /* sprites */ + ROM_LOAD( "cg04.bin", 0x10000, 0x8000, CRC(db06cfe9) SHA1(e13c16232f54fe8467c21e0218c87606a19dd25c) ) + ROM_LOAD( "cg05.bin", 0x20000, 0x8000, CRC(d634d6b8) SHA1(e2ddd12b1b3fb0063104d414f0574b94dbfa0403) ) + + ROM_REGION( 0x08000, REGION_GFX3, ROMREGION_DISPOSE ) + ROM_LOAD( "cu10.h17", 0x00000, 0x2000, CRC(3854c877) SHA1(2c8fe4591553ce798c907849e3dbd410e4fe424c) ) /* background tiles */ + ROM_CONTINUE( 0x04000, 0x2000 ) + ROM_CONTINUE( 0x02000, 0x2000 ) + ROM_CONTINUE( 0x06000, 0x2000 ) + + ROM_REGION( 0x0200, REGION_PROMS, 0 ) + ROM_LOAD( "gb08.k10", 0x0000, 0x0100, CRC(509c65b6) SHA1(4cec37065a799ced4e7b6552f267aacc7f54ffe3) ) + ROM_LOAD( "gb09.k6", 0x0100, 0x0100, CRC(aa090565) SHA1(e289e77ec3402e86d93b873c0fa064f3e6277a62) ) /* priority encoder? (not used) */ +ROM_END + +ROM_START( shootoub ) + ROM_REGION( 2*0x20000, REGION_CPU1, 0 ) /* 128k for code + 128k for decrypted opcodes */ + ROM_LOAD( "shootout.006", 0x08000, 0x8000, CRC(2c054888) SHA1(cb0de2f7d743506789626304e6bcbbc292fbe8bc) ) + ROM_LOAD( "shootout.008", 0x10000, 0x8000, CRC(9651b656) SHA1(e90eddf2833ef36fa73b7b8d81d28443d2f60220) ) + ROM_LOAD( "cg01.bin", 0x18000, 0x4000, CRC(74cf11ca) SHA1(59edbc4633cd560e7b928b33e4c42d0125332a1b) ) + + ROM_REGION( 0x04000, REGION_GFX1, ROMREGION_DISPOSE ) + ROM_LOAD( "cu11.h19", 0x00000, 0x4000, CRC(eff00460) SHA1(15daaa3d3125a981a26f31d43283faa5be26e96b) ) /* foreground characters */ + + ROM_REGION( 0x30000, REGION_GFX2, ROMREGION_DISPOSE ) + ROM_LOAD( "shootout.005", 0x00000, 0x8000, CRC(e6357ba3) SHA1(1ceb46450a0c4f6f7f7109601ad6617f08364df5) ) /* sprites */ + ROM_LOAD( "shootout.004", 0x10000, 0x8000, CRC(7f422c93) SHA1(97d9a17956e838801c416461b020876c780bf260) ) + ROM_LOAD( "shootout.003", 0x20000, 0x8000, CRC(eea94535) SHA1(65819b7925ecd9ae6e62decb3b0164f627b73fe5) ) + + ROM_REGION( 0x08000, REGION_GFX3, ROMREGION_DISPOSE ) + ROM_LOAD( "cu10.h17", 0x00000, 0x2000, CRC(3854c877) SHA1(2c8fe4591553ce798c907849e3dbd410e4fe424c) ) /* background tiles */ + ROM_CONTINUE( 0x04000, 0x2000 ) + ROM_CONTINUE( 0x02000, 0x2000 ) + ROM_CONTINUE( 0x06000, 0x2000 ) + + ROM_REGION( 0x0220, REGION_PROMS, 0 ) + ROM_LOAD( "gb08.k10", 0x0000, 0x0100, CRC(509c65b6) SHA1(4cec37065a799ced4e7b6552f267aacc7f54ffe3) ) + ROM_LOAD( "gb09.k6", 0x0100, 0x0100, CRC(aa090565) SHA1(e289e77ec3402e86d93b873c0fa064f3e6277a62) ) /* priority encoder? (not used) */ + ROM_LOAD( "shootclr.003", 0x0200, 0x0020, CRC(6b0c2942) SHA1(7d25acc753923b265792fc78f8fc70175c0e0ec2) ) /* opcode decrypt table (bootleg only) */ +ROM_END + + +static DRIVER_INIT( shootout ) +{ + int length = memory_region_length(REGION_CPU1); + UINT8 *decrypt = auto_malloc(length - 0x8000); + UINT8 *rom = memory_region(REGION_CPU1); + int A; + + memory_set_decrypted_region(0, 0x8000, 0xffff, decrypt); + + for (A = 0x8000;A < length;A++) + decrypt[A-0x8000] = (rom[A] & 0x9f) | ((rom[A] & 0x40) >> 1) | ((rom[A] & 0x20) << 1); + + memory_configure_bank(1, 0, 16, memory_region(REGION_CPU1) + 0x10000, 0x4000); + memory_configure_bank_decrypted(1, 0, 16, decrypt + 0x8000, 0x4000); +} + +static DRIVER_INIT( shootouj ) +{ + memory_configure_bank(1, 0, 16, memory_region(REGION_CPU1) + 0x10000, 0x4000); +} + + +GAME( 1985, shootout, 0, shootout, shootout, shootout, ROT0, "Data East USA", "Shoot Out (US)", 0) +GAME( 1985, shootouj, shootout, shootouj, shootouj, shootouj, ROT0, "Data East USA", "Shoot Out (Japan)", 0 ) +GAME( 1985, shootoub, shootout, shootouj, shootout, shootout, ROT0, "bootleg", "Shoot Out (Korean Bootleg)", 0 ) |