Merge pull request #1812 from darq-/shootout

shootout: Fixed missing title screen music, fixed coin counter and simplified rom loading
This commit is contained in:
R. Belmont 2016-12-09 14:38:36 -05:00 committed by GitHub
commit 31987ea228
3 changed files with 92 additions and 51 deletions

View File

@ -16,6 +16,11 @@
strangely features the same encryption as used on the DE-0219 board. It
also has some edited graphics.
The DE-0219 PCB seems to have only one 12 MHz XTAL, some images with recognizable XTAL value can be found here:
- http://www.jammarcade.net/images/2016/04/Shootout.jpg
- http://thumbs.picclick.com/00/s/MTIwMFgxNjAw/z/7iIAAOSw5ClXxbrB/$/Data-East-Shootout-Arcade-Video-Game-Pcb-Circuit-_57.jpg
Driver by:
Ernesto Corvi (ernesto@imagina.com)
Phil Stroffolino
@ -23,8 +28,9 @@
TODO:
- Fix coin counter
- Lots of unmapped memory reads
- Lots of unmapped memory reads and writes (sprram or vram mirrors, perhaps...), bg_vram is also read.
- Does the korean bootleg really have the DECO 222 CPU? I think it should use the shootclr.003 prom to decrypt the opcodes.
Something like -> rom [addr] = (rom [addr] & 0x0F) | proms [rom [addr] >> 4]]);
*******************************************************************************/
@ -49,10 +55,19 @@ WRITE8_MEMBER(shootout_state::bankswitch_w)
membank("bank1")->set_entry(data & 0x0f);
}
READ8_MEMBER(shootout_state::sound_cpu_command_r)
{
m_audiocpu->set_input_line (INPUT_LINE_NMI, CLEAR_LINE);
return (m_soundlatch->read (space, 0));
}
WRITE8_MEMBER(shootout_state::sound_cpu_command_w)
{
m_soundlatch->write( space, offset, data );
m_audiocpu->set_input_line(INPUT_LINE_NMI, PULSE_LINE );
m_audiocpu->set_input_line(INPUT_LINE_NMI, ASSERT_LINE);
// Allow the other CPU to reply. This fixes the missing music on the title screen (parent set).
space.device ().execute ().spin_until_time (attotime :: from_usec (200));
}
WRITE8_MEMBER(shootout_state::flipscreen_w)
@ -60,9 +75,27 @@ WRITE8_MEMBER(shootout_state::flipscreen_w)
flip_screen_set(data & 0x01);
}
/*
This is actually a double BCD counter (2 BCD digits packet in a byte)...
The first write is always 0x40, then when a coin is inserted it starts to count from 0x01 up to 0x99.
When it reaches 99 credits, 0x99 is always written...
On the shootoutj and shootoutb sets, it works as above but it counts up to 0x09 instead of 0x99 (Single BCD digit).
Note:
This should be an input for a BCD to 7-segment decoder (e.g. a 74LS47), but all the PCBs I've seen don't have 'onboard'
display(s), so this was implemented as normal "coin counter" (after all, they both have the same goal: count credits ;))
*/
WRITE8_MEMBER(shootout_state::coincounter_w)
{
machine().bookkeeping().coin_counter_w(0, data);
if (data != m_ccnt_old_val)
{
// Do a coin pulse
machine().bookkeeping().coin_counter_w(0, 0);
machine().bookkeeping().coin_counter_w(0, 1);
m_ccnt_old_val = data;
}
}
/*******************************************************************************/
@ -78,7 +111,7 @@ static ADDRESS_MAP_START( shootout_map, AS_PROGRAM, 8, shootout_state )
AM_RANGE(0x2000, 0x27ff) AM_RAM_WRITE(textram_w) AM_SHARE("textram")
AM_RANGE(0x2800, 0x2fff) AM_RAM_WRITE(videoram_w) AM_SHARE("videoram")
AM_RANGE(0x4000, 0x7fff) AM_ROMBANK("bank1")
AM_RANGE(0x8000, 0xffff) AM_ROM
AM_RANGE(0x8000, 0xffff) AM_ROM AM_REGION("maincpu", 0x0000)
ADDRESS_MAP_END
static ADDRESS_MAP_START( shootouj_map, AS_PROGRAM, 8, shootout_state )
@ -87,13 +120,14 @@ static ADDRESS_MAP_START( shootouj_map, AS_PROGRAM, 8, shootout_state )
AM_RANGE(0x1001, 0x1001) AM_READ_PORT("P1")
AM_RANGE(0x1002, 0x1002) AM_READ_PORT("P2")
AM_RANGE(0x1003, 0x1003) AM_READ_PORT("DSW2")
AM_RANGE(0x1004, 0x17ff) AM_RAM
AM_RANGE(0x1800, 0x1800) AM_WRITE(coincounter_w)
AM_RANGE(0x2000, 0x21ff) AM_RAM AM_SHARE("spriteram")
AM_RANGE(0x2800, 0x2801) AM_DEVREADWRITE("ymsnd", ym2203_device, read, write)
AM_RANGE(0x3000, 0x37ff) AM_RAM_WRITE(textram_w) AM_SHARE("textram")
AM_RANGE(0x3800, 0x3fff) AM_RAM_WRITE(videoram_w) AM_SHARE("videoram")
AM_RANGE(0x4000, 0x7fff) AM_ROMBANK("bank1")
AM_RANGE(0x8000, 0xffff) AM_ROM
AM_RANGE(0x8000, 0xffff) AM_ROM AM_REGION("maincpu", 0x0000)
ADDRESS_MAP_END
/*******************************************************************************/
@ -102,9 +136,9 @@ ADDRESS_MAP_END
static ADDRESS_MAP_START( shootout_sound_map, AS_PROGRAM, 8, shootout_state )
AM_RANGE(0x0000, 0x07ff) AM_RAM
AM_RANGE(0x4000, 0x4001) AM_DEVREADWRITE("ymsnd", ym2203_device, read, write)
AM_RANGE(0xa000, 0xa000) AM_DEVREAD("soundlatch", generic_latch_8_device, read)
AM_RANGE(0xc000, 0xffff) AM_ROM
AM_RANGE(0xd000, 0xd000) AM_WRITENOP // unknown, NOT irq/nmi mask
AM_RANGE(0xa000, 0xa000) AM_READ(sound_cpu_command_r)
AM_RANGE(0xc000, 0xffff) AM_ROM AM_REGION("audiocpu", 0x0000)
AM_RANGE(0xd000, 0xd000) AM_WRITENOP // Unknown, NOT irq/nmi mask (Always 0x80 ???)
ADDRESS_MAP_END
/*******************************************************************************/
@ -173,8 +207,8 @@ static INPUT_PORTS_START( shootout )
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_CUSTOM ) PORT_VBLANK("screen")
PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_SPECIAL ) // This needs to be low to allows both coins to be accepted...
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_CUSTOM ) PORT_VBLANK("screen")
INPUT_PORTS_END
static INPUT_PORTS_START( shootouj )
@ -231,23 +265,26 @@ static GFXDECODE_START( shootout )
GFXDECODE_ENTRY( "gfx3", 0, tile_layout, 0, 16 ) /* tiles */
GFXDECODE_END
void shootout_state::machine_reset ()
{
m_ccnt_old_val = 0x40;
}
static MACHINE_CONFIG_START( shootout, shootout_state )
/* basic machine hardware */
MCFG_CPU_ADD("maincpu", DECO_222, 2000000) /* 2 MHz? */
MCFG_CPU_ADD("maincpu", DECO_222, XTAL_12MHz / 6) // 2 MHz?
MCFG_CPU_PROGRAM_MAP(shootout_map)
MCFG_CPU_ADD("audiocpu", M6502, 1500000)
MCFG_CPU_ADD("audiocpu", M6502, XTAL_12MHz / 8) // 1.5 MHz
MCFG_CPU_PROGRAM_MAP(shootout_sound_map)
/* video hardware */
MCFG_SCREEN_ADD("screen", RASTER)
MCFG_SCREEN_REFRESH_RATE(60)
MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */)
MCFG_SCREEN_SIZE(32*8, 32*8)
MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 1*8, 31*8-1)
// Guessed parameters based on the 12 MHz XTAL, but they seem resonable (TODO: Real PCB measurements)
MCFG_SCREEN_RAW_PARAMS (XTAL_12MHz / 2, 384, 0, 256, 262, 8, 248)
MCFG_SCREEN_UPDATE_DRIVER(shootout_state, screen_update_shootout)
MCFG_SCREEN_PALETTE("palette")
@ -260,24 +297,24 @@ static MACHINE_CONFIG_START( shootout, shootout_state )
MCFG_GENERIC_LATCH_8_ADD("soundlatch")
MCFG_SOUND_ADD("ymsnd", YM2203, 1500000)
MCFG_SOUND_ADD("ymsnd", YM2203, XTAL_12MHz / 8) // 1.5 MHz
MCFG_YM2203_IRQ_HANDLER(INPUTLINE("audiocpu", M6502_IRQ_LINE))
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50)
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00)
MACHINE_CONFIG_END
static MACHINE_CONFIG_START( shootouj, shootout_state )
/* basic machine hardware */
MCFG_CPU_ADD("maincpu", M6502, 2000000) /* 2 MHz? */
MCFG_CPU_ADD("maincpu", M6502, XTAL_12MHz / 6) // 2 MHz? (Assuming the same XTAL as DE-0219 pcb)
MCFG_CPU_PROGRAM_MAP(shootouj_map)
/* video hardware */
MCFG_SCREEN_ADD("screen", RASTER)
MCFG_SCREEN_REFRESH_RATE(60)
MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */)
MCFG_SCREEN_SIZE(32*8, 32*8)
MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 1*8, 31*8-1)
// Guessed parameters based on the 12 MHz XTAL, but they seem resonable (TODO: Real PCB measurements)
MCFG_SCREEN_RAW_PARAMS (XTAL_12MHz / 2, 384, 0, 256, 262, 8, 248)
MCFG_SCREEN_UPDATE_DRIVER(shootout_state, screen_update_shootouj)
MCFG_SCREEN_PALETTE("palette")
@ -290,31 +327,30 @@ static MACHINE_CONFIG_START( shootouj, shootout_state )
MCFG_GENERIC_LATCH_8_ADD("soundlatch")
MCFG_SOUND_ADD("ymsnd", YM2203, 1500000)
MCFG_SOUND_ADD("ymsnd", YM2203, XTAL_12MHz / 8) // 1.5 MHz (Assuming the same XTAL as DE-0219 pcb)
MCFG_YM2203_IRQ_HANDLER(INPUTLINE("maincpu", M6502_IRQ_LINE))
MCFG_AY8910_PORT_A_WRITE_CB(WRITE8(shootout_state, bankswitch_w))
MCFG_AY8910_PORT_B_WRITE_CB(WRITE8(shootout_state, flipscreen_w))
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50)
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00)
MACHINE_CONFIG_END
static MACHINE_CONFIG_DERIVED( shootouk, shootouj )
/* the Korean 'bootleg' has the usual DECO222 style encryption */
MCFG_DEVICE_REMOVE("maincpu")
MCFG_CPU_ADD("maincpu", DECO_222, 2000000) /* 2 MHz? */
MCFG_CPU_ADD("maincpu", DECO_222, XTAL_12MHz / 6) // 2 MHz? (Assuming the same XTAL as DE-0219 pcb)
MCFG_CPU_PROGRAM_MAP(shootouj_map)
MACHINE_CONFIG_END
ROM_START( shootout )
ROM_REGION( 2*0x20000, "maincpu", 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( 2 * 0x14000, "maincpu", 0 ) // 80k for code + 80k for decrypted opcodes
ROM_LOAD( "cu00.b1", 0x00000, 0x8000, CRC(090edeb6) SHA1(ab849d123dacf3947b1ebd29b70a20e066911a60) ) /* opcodes encrypted */
ROM_LOAD( "cu02.c3", 0x08000, 0x8000, CRC(2a913730) SHA1(584488278d58c4d34a2eebeaf39518f87cf5eecd) ) /* opcodes encrypted */
ROM_LOAD( "cu01.c1", 0x10000, 0x4000, CRC(8843c3ae) SHA1(c58ed4acac566f890cadf62bcbcced07a59243fc) ) /* opcodes encrypted */
ROM_REGION( 0x10000, "audiocpu", 0 )
ROM_LOAD( "cu09.j1", 0x0c000, 0x4000, CRC(c4cbd558) SHA1(0e940ae99febc1161e5f35550aa75afca88cb5e9) ) /* Sound CPU */
ROM_REGION( 0x4000, "audiocpu", 0 )
ROM_LOAD( "cu09.j1", 0x00000, 0x4000, CRC(c4cbd558) SHA1(0e940ae99febc1161e5f35550aa75afca88cb5e9) ) /* Sound CPU */
ROM_REGION( 0x04000, "gfx1", 0 )
ROM_LOAD( "cu11.h19", 0x00000, 0x4000, CRC(eff00460) SHA1(15daaa3d3125a981a26f31d43283faa5be26e96b) ) /* foreground characters */
@ -339,10 +375,10 @@ ROM_START( shootout )
ROM_END
ROM_START( shootoutj )
ROM_REGION( 0x20000, "maincpu", 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( 0x14000, "maincpu", 0 ) // 80k for code
ROM_LOAD( "cg02.bin", 0x00000, 0x8000, CRC(8fc5d632) SHA1(809ac4eba09972229fe741c96fa8036d7139b6a8) )
ROM_LOAD( "cg00.bin", 0x08000, 0x8000, CRC(ef6ced1e) SHA1(feea508c7a60fc6cde1efee52cba628accd26028) )
ROM_LOAD( "cg01.bin", 0x10000, 0x4000, CRC(74cf11ca) SHA1(59edbc4633cd560e7b928b33e4c42d0125332a1b) )
ROM_REGION( 0x04000, "gfx1", 0 )
ROM_LOAD( "cu11.h19", 0x00000, 0x4000, CRC(eff00460) SHA1(15daaa3d3125a981a26f31d43283faa5be26e96b) ) /* foreground characters */
@ -364,10 +400,10 @@ ROM_START( shootoutj )
ROM_END
ROM_START( shootoutb )
ROM_REGION( 2*0x20000, "maincpu", 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( 2 * 0x14000, "maincpu", 0 ) // 80k for code + 80k for decrypted opcodes
ROM_LOAD( "shootout.006", 0x00000, 0x8000, CRC(2c054888) SHA1(cb0de2f7d743506789626304e6bcbbc292fbe8bc) )
ROM_LOAD( "shootout.008", 0x08000, 0x8000, CRC(9651b656) SHA1(e90eddf2833ef36fa73b7b8d81d28443d2f60220) )
ROM_LOAD( "cg01.bin", 0x10000, 0x4000, CRC(74cf11ca) SHA1(59edbc4633cd560e7b928b33e4c42d0125332a1b) )
ROM_REGION( 0x04000, "gfx1", 0 )
ROM_LOAD( "cu11.h19", 0x00000, 0x4000, CRC(eff00460) SHA1(15daaa3d3125a981a26f31d43283faa5be26e96b) ) /* foreground characters */
@ -392,7 +428,7 @@ ROM_END
DRIVER_INIT_MEMBER(shootout_state,shootout)
{
membank("bank1")->configure_entries(0, 16, memregion("maincpu")->base() + 0x10000, 0x4000);
membank("bank1")->configure_entries(0, 16, memregion("maincpu")->base() + 0x8000, 0x4000);
}

View File

@ -29,9 +29,11 @@ public:
tilemap_t *m_background;
tilemap_t *m_foreground;
int m_bFlicker;
int m_ccnt_old_val;
DECLARE_WRITE8_MEMBER(bankswitch_w);
DECLARE_READ8_MEMBER(sound_cpu_command_r);
DECLARE_WRITE8_MEMBER(sound_cpu_command_w);
DECLARE_WRITE8_MEMBER(flipscreen_w);
DECLARE_WRITE8_MEMBER(coincounter_w);
@ -41,7 +43,10 @@ public:
DECLARE_INPUT_CHANGED_MEMBER(coin_inserted);
DECLARE_DRIVER_INIT(shootout);
virtual void machine_reset() override;
virtual void video_start() override;
DECLARE_PALETTE_INIT(shootout);
TILE_GET_INFO_MEMBER(get_bg_tile_info);

View File

@ -83,7 +83,7 @@ void shootout_state::video_start()
m_foreground = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(shootout_state::get_fg_tile_info),this), TILEMAP_SCAN_ROWS, 8, 8, 32, 32);
m_foreground->set_transparent_pen(0 );
save_item(NAME(m_bFlicker));
save_item(NAME(m_ccnt_old_val));
}
void shootout_state::draw_sprites(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int bank_bits )
@ -92,7 +92,7 @@ void shootout_state::draw_sprites(screen_device &screen, bitmap_ind16 &bitmap, c
const uint8_t *source = m_spriteram+127*4;
int count;
m_bFlicker = !m_bFlicker;
bool m_bFlicker = (screen.frame_number () & 1) != 0;
for( count=0; count<128; count++ )
{