This commit is contained in:
angelosa 2017-11-04 03:45:34 +01:00
parent cf9bfa7096
commit d3d3536436

View File

@ -7,9 +7,11 @@ Shanghai
driver by Nicola Salmoria
TODO:
- games are currently too fast (especially noticeable with kothello screen transitions), either irqs actually
fires every two frames or a HD63484 SR bit isn't behaving correctly;
- games are currently too fast (especially noticeable with kothello screen transitions), maybe unemulated HD63484 wait state penalties?
- minor glitch with gfx copy on shanghai stage info panel (garbage on right);
- irq ack, shanghai and shangha2 uses it, kothello auto acks, maybe latter really runs on NMI instead
(vector 2 matches same pattern as shanghai games);
- shanghai: IC37 returns bad in service mode;
* kothello
@ -20,11 +22,10 @@ displayed.
***************************************************************************/
#include "emu.h"
#include "audio/seibu.h"
#include "cpu/nec/nec.h"
#include "sound/2203intf.h"
#include "video/hd63484.h"
#include "audio/seibu.h"
#include "sound/2203intf.h"
#include "screen.h"
#include "speaker.h"
@ -34,15 +35,17 @@ class shanghai_state : public driver_device
public:
shanghai_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag),
m_maincpu(*this, "maincpu") { }
required_device<cpu_device> m_maincpu;
DECLARE_WRITE16_MEMBER(shanghai_coin_w);
m_maincpu(*this, "maincpu"),
m_screen(*this,"screen")
{ }
DECLARE_WRITE8_MEMBER(shanghai_coin_w);
DECLARE_PALETTE_INIT(shanghai);
INTERRUPT_GEN_MEMBER(half_vblank_irq);
INTERRUPT_GEN_MEMBER(interrupt);
private:
required_device<cpu_device> m_maincpu;
required_device<screen_device> m_screen;
};
@ -50,12 +53,10 @@ PALETTE_INIT_MEMBER(shanghai_state,shanghai)
{
int i;
for (i = 0;i < palette.entries();i++)
{
int bit0,bit1,bit2,r,g,b;
/* red component */
bit0 = (i >> 2) & 0x01;
bit1 = (i >> 3) & 0x01;
@ -76,19 +77,18 @@ PALETTE_INIT_MEMBER(shanghai_state,shanghai)
}
}
INTERRUPT_GEN_MEMBER(shanghai_state::interrupt)
INTERRUPT_GEN_MEMBER(shanghai_state::half_vblank_irq)
{
// definitely running at vblank / 2 (hd63484 irq mask not used)
if(m_screen->frame_number() & 1)
device.execute().set_input_line_and_vector(0,HOLD_LINE,0x80);
}
WRITE16_MEMBER(shanghai_state::shanghai_coin_w)
{
if (ACCESSING_BITS_0_7)
WRITE8_MEMBER(shanghai_state::shanghai_coin_w)
{
machine().bookkeeping().coin_counter_w(0,data & 1);
machine().bookkeeping().coin_counter_w(1,data & 2);
}
}
static ADDRESS_MAP_START( shanghai_map, AS_PROGRAM, 16, shanghai_state )
AM_RANGE(0x00000, 0x03fff) AM_RAM
@ -110,7 +110,7 @@ static ADDRESS_MAP_START( shanghai_portmap, AS_IO, 16, shanghai_state )
AM_RANGE(0x40, 0x41) AM_READ_PORT("P1")
AM_RANGE(0x44, 0x45) AM_READ_PORT("P2")
AM_RANGE(0x48, 0x49) AM_READ_PORT("SYSTEM")
AM_RANGE(0x4c, 0x4d) AM_WRITE(shanghai_coin_w)
AM_RANGE(0x4c, 0x4d) AM_WRITE8(shanghai_coin_w,0x00ff)
ADDRESS_MAP_END
@ -121,7 +121,7 @@ static ADDRESS_MAP_START( shangha2_portmap, AS_IO, 16, shanghai_state )
AM_RANGE(0x30, 0x31) AM_DEVREADWRITE("hd63484", hd63484_device, status_r, address_w)
AM_RANGE(0x32, 0x33) AM_DEVREADWRITE("hd63484", hd63484_device, data_r, data_w)
AM_RANGE(0x40, 0x43) AM_DEVREADWRITE8("ymsnd", ym2203_device, read, write, 0x00ff)
AM_RANGE(0x50, 0x51) AM_WRITE(shanghai_coin_w)
AM_RANGE(0x50, 0x51) AM_WRITE8(shanghai_coin_w,0x00ff)
ADDRESS_MAP_END
static ADDRESS_MAP_START( kothello_map, AS_PROGRAM, 16, shanghai_state )
@ -241,37 +241,40 @@ static INPUT_PORTS_START( kothello )
PORT_DIPSETTING( 0x00, "4" )
INPUT_PORTS_END
static INPUT_PORTS_START( shanghai )
static INPUT_PORTS_START( shanghai_common )
PORT_START("P1")
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_8WAY
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) 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_BUTTON3 )
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY PORT_PLAYER(1)
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_PLAYER(1)
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_PLAYER(1)
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_PLAYER(1)
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(1) PORT_NAME("P1 Select Button")
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(1) PORT_NAME("P1 Cancel Button")
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(1) PORT_NAME("P1 Help Button")
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_START("P2")
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY PORT_COCKTAIL
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_COCKTAIL
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_COCKTAIL
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) 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( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY PORT_PLAYER(2)
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_PLAYER(2)
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_PLAYER(2)
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_PLAYER(2)
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2) PORT_NAME("P2 Select Button")
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(2) PORT_NAME("P2 Cancel Button")
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(2) PORT_NAME("P2 Help Button")
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN )
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_COIN3 )
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_SERVICE1 )
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_UNKNOWN )
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN )
INPUT_PORTS_END
static INPUT_PORTS_START( shanghai )
PORT_INCLUDE( shanghai_common )
PORT_START("DSW1")
PORT_SERVICE_DIPLOC( 0x01, IP_ACTIVE_LOW, "SW1:8" )
@ -322,35 +325,7 @@ static INPUT_PORTS_START( shanghai )
INPUT_PORTS_END
static INPUT_PORTS_START( shangha2 )
PORT_START("P1")
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_8WAY
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) 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_BUTTON3 )
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_START("P2")
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY PORT_COCKTAIL
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_COCKTAIL
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_COCKTAIL
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) 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("SYSTEM")
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN1 )
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_COIN2 )
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_COIN3 )
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_UNKNOWN )
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_INCLUDE( shanghai_common )
PORT_START("DSW1")
PORT_SERVICE_DIPLOC( 0x01, IP_ACTIVE_LOW, "SW2:8" )
@ -409,7 +384,7 @@ static MACHINE_CONFIG_START( shanghai )
MCFG_CPU_ADD("maincpu", V30, XTAL_16MHz/2) /* NEC D70116C-8 */
MCFG_CPU_PROGRAM_MAP(shanghai_map)
MCFG_CPU_IO_MAP(shanghai_portmap)
MCFG_CPU_VBLANK_INT_DRIVER("screen", shanghai_state, interrupt)
MCFG_CPU_VBLANK_INT_DRIVER("screen", shanghai_state, half_vblank_irq)
/* video hardware */
MCFG_SCREEN_ADD("screen", RASTER)
@ -445,7 +420,7 @@ static MACHINE_CONFIG_START( shangha2 )
MCFG_CPU_ADD("maincpu", V30, XTAL_16MHz/2) /* ? */
MCFG_CPU_PROGRAM_MAP(shangha2_map)
MCFG_CPU_IO_MAP(shangha2_portmap)
MCFG_CPU_VBLANK_INT_DRIVER("screen", shanghai_state, interrupt)
MCFG_CPU_VBLANK_INT_DRIVER("screen", shanghai_state, half_vblank_irq)
/* video hardware */
MCFG_SCREEN_ADD("screen", RASTER)
@ -479,7 +454,7 @@ static MACHINE_CONFIG_START( kothello )
/* basic machine hardware */
MCFG_CPU_ADD("maincpu", V30, XTAL_16MHz)
MCFG_CPU_PROGRAM_MAP(kothello_map)
MCFG_CPU_VBLANK_INT_DRIVER("screen", shanghai_state, interrupt)
MCFG_CPU_VBLANK_INT_DRIVER("screen", shanghai_state, half_vblank_irq)
MCFG_CPU_ADD("audiocpu", Z80, XTAL_16MHz/4)
MCFG_CPU_PROGRAM_MAP(kothello_sound_map)
@ -573,7 +548,7 @@ ROM_START( shanghai )
ROM_LOAD16_BYTE( "shg-21a.ic21", 0xa0000, 0x10000, CRC(4ab06d32) SHA1(02667d1270b101386b947d5b9bfe64052e498041) )
ROM_LOAD16_BYTE( "shg-28a.ic28", 0xc0001, 0x10000, CRC(983ec112) SHA1(110e120e35815d055d6108a7603e83d2d990c666) )
ROM_LOAD16_BYTE( "shg-27a.ic27", 0xc0000, 0x10000, CRC(41af0945) SHA1(dfc4638a17f716ccc8e59f275571d6dc1093a745) )
ROM_LOAD16_BYTE( "shg-37b.ic37", 0xe0001, 0x10000, CRC(ead3d66c) SHA1(f9be9a4773ea6c9ba931f7aa8c79121caacc231c) ) /* Single byte difference from IC37 below 0xD58C == 0x01 */
ROM_LOAD16_BYTE( "shg-37b.ic37", 0xe0001, 0x10000, BAD_DUMP CRC(ead3d66c) SHA1(f9be9a4773ea6c9ba931f7aa8c79121caacc231c) ) /* Single byte difference from IC37 below 0xD58C == 0x01 */
ROM_LOAD16_BYTE( "shg-36b.ic36", 0xe0000, 0x10000, CRC(a1d6af96) SHA1(01c4c22bf03b3d260fffcbc6dfc5f2dd2bcba14a) )
ROM_END