Added irq ack to Shanghai 3 HW [Angelo Salese]

Fixed M68K and hooked up SCREEN_RAW_PARAMS for Blocken. Game was definitely running at erratic speeds before [Angelo Salese, Tafoid]
This commit is contained in:
Angelo Salese 2012-10-03 03:00:41 +00:00
parent 5fa84af912
commit 956bcb9c48
2 changed files with 32 additions and 19 deletions

View File

@ -9,6 +9,8 @@ These games use the custom blitter GA9201 KA01-0249 (120pin IC)
driver by Nicola Salmoria
TODO:
all games:
- Blitter needs to be device-ized
shangha3:
- The zoom used for the "100" floating score when you remove tiles is very
rough.
@ -16,6 +18,10 @@ heberpop:
- Unknown writes to sound ports 40/41
blocken:
- incomplete zoom support, and missing rotation support.
- attract mode tries to read at 0x80000-0xfffff area, returning 0 in there
freezes the demo play for some frames (MT #00985). For now I've returned $ff,
but needs HW tests to check out what lies in there (maybe a ROM mirror).
- how to play screen is bogus, it basically doesn't follow the ball at all.
***************************************************************************/
@ -50,6 +56,7 @@ READ16_MEMBER(shangha3_state::shangha3_prot_r)
return result[m_prot_count++ % 9];
}
WRITE16_MEMBER(shangha3_state::shangha3_prot_w)
{
logerror("PC %04x: write %02x to 20004e\n",space.device().safe_pc(),data);
@ -114,7 +121,10 @@ WRITE16_MEMBER(shangha3_state::heberpop_sound_command_w)
}
}
WRITE16_MEMBER(shangha3_state::shangha3_irq_ack_w)
{
machine().device("maincpu")->execute().set_input_line(4, CLEAR_LINE);
}
static ADDRESS_MAP_START( shangha3_map, AS_PROGRAM, 16, shangha3_state )
AM_RANGE(0x000000, 0x07ffff) AM_ROM
@ -122,7 +132,7 @@ static ADDRESS_MAP_START( shangha3_map, AS_PROGRAM, 16, shangha3_state )
AM_RANGE(0x200000, 0x200001) AM_READ_PORT("INPUTS")
AM_RANGE(0x200002, 0x200003) AM_READ_PORT("SYSTEM")
AM_RANGE(0x200008, 0x200009) AM_WRITE(shangha3_blitter_go_w)
AM_RANGE(0x20000a, 0x20000b) AM_WRITENOP /* irq ack? */
AM_RANGE(0x20000a, 0x20000b) AM_WRITE(shangha3_irq_ack_w)
AM_RANGE(0x20000c, 0x20000d) AM_WRITE(shangha3_coinctrl_w)
AM_RANGE(0x20001e, 0x20001f) AM_DEVREAD8_LEGACY("aysnd", ay8910_r, 0x00ff)
AM_RANGE(0x20002e, 0x20002f) AM_DEVWRITE8_LEGACY("aysnd", ay8910_data_w, 0x00ff)
@ -141,7 +151,7 @@ static ADDRESS_MAP_START( heberpop_map, AS_PROGRAM, 16, shangha3_state )
AM_RANGE(0x200002, 0x200003) AM_READ_PORT("SYSTEM")
AM_RANGE(0x200004, 0x200005) AM_READ_PORT("DSW")
AM_RANGE(0x200008, 0x200009) AM_WRITE(shangha3_blitter_go_w)
AM_RANGE(0x20000a, 0x20000b) AM_WRITENOP /* irq ack? */
AM_RANGE(0x20000a, 0x20000b) AM_WRITE(shangha3_irq_ack_w)
AM_RANGE(0x20000c, 0x20000d) AM_WRITE(heberpop_coinctrl_w)
AM_RANGE(0x20000e, 0x20000f) AM_WRITE(heberpop_sound_command_w)
AM_RANGE(0x300000, 0x30ffff) AM_RAM AM_SHARE("ram") /* gfx & work ram */
@ -153,10 +163,10 @@ ADDRESS_MAP_END
static ADDRESS_MAP_START( blocken_map, AS_PROGRAM, 16, shangha3_state )
AM_RANGE(0x000000, 0x0fffff) AM_ROM
AM_RANGE(0x100000, 0x100001) AM_READ_PORT("INPUTS")
AM_RANGE(0x100002, 0x100003) AM_READ_PORT("SYSTEM")
AM_RANGE(0x100002, 0x100003) AM_READ_PORT("SYSTEM") AM_WRITENOP // w -> unknown purpose
AM_RANGE(0x100004, 0x100005) AM_READ_PORT("DSW")
AM_RANGE(0x100008, 0x100009) AM_WRITE(shangha3_blitter_go_w)
AM_RANGE(0x10000a, 0x10000b) AM_WRITENOP /* irq ack? */
AM_RANGE(0x10000a, 0x10000b) AM_READNOP AM_WRITE(shangha3_irq_ack_w) // r -> unknown purpose (value doesn't matter, left-over?)
AM_RANGE(0x10000c, 0x10000d) AM_WRITE(blocken_coinctrl_w)
AM_RANGE(0x10000e, 0x10000f) AM_WRITE(heberpop_sound_command_w)
AM_RANGE(0x200000, 0x200fff) AM_RAM_WRITE(paletteram_RRRRRGGGGGBBBBBx_word_w) AM_SHARE("paletteram")
@ -471,7 +481,7 @@ static MACHINE_CONFIG_START( shangha3, shangha3_state )
/* basic machine hardware */
MCFG_CPU_ADD("maincpu", M68000, 8000000)
MCFG_CPU_PROGRAM_MAP(shangha3_map)
MCFG_CPU_VBLANK_INT_DRIVER("screen", shangha3_state, irq4_line_hold)
MCFG_CPU_VBLANK_INT_DRIVER("screen", shangha3_state, irq4_line_assert)
/* video hardware */
MCFG_VIDEO_ATTRIBUTES(VIDEO_HAS_SHADOWS)
@ -504,7 +514,7 @@ static MACHINE_CONFIG_START( heberpop, shangha3_state )
/* basic machine hardware */
MCFG_CPU_ADD("maincpu", M68000, 8000000)
MCFG_CPU_PROGRAM_MAP(heberpop_map)
MCFG_CPU_VBLANK_INT_DRIVER("screen", shangha3_state, irq4_line_hold)
MCFG_CPU_VBLANK_INT_DRIVER("screen", shangha3_state, irq4_line_assert)
MCFG_CPU_ADD("audiocpu", Z80, 6000000) /* 6 MHz ??? */
MCFG_CPU_PROGRAM_MAP(heberpop_sound_map)
@ -536,15 +546,17 @@ static MACHINE_CONFIG_START( heberpop, shangha3_state )
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
MACHINE_CONFIG_END
/* a Blocken PCB shot barely shows a 48 MHz xtal, game is definitely too slow at 8 MHz (noticeable thru colour cycling effects) */
#define BLOCKEN_MASTER_CLOCK XTAL_48MHz
static MACHINE_CONFIG_START( blocken, shangha3_state )
/* basic machine hardware */
MCFG_CPU_ADD("maincpu", M68000, 8000000)
MCFG_CPU_ADD("maincpu", M68000, BLOCKEN_MASTER_CLOCK/4) // TMP68HC000N-16
MCFG_CPU_PROGRAM_MAP(blocken_map)
MCFG_CPU_VBLANK_INT_DRIVER("screen", shangha3_state, irq4_line_hold)
MCFG_CPU_VBLANK_INT_DRIVER("screen", shangha3_state, irq4_line_assert)
MCFG_CPU_ADD("audiocpu", Z80, 6000000) /* 6 MHz ??? */
MCFG_CPU_ADD("audiocpu", Z80, BLOCKEN_MASTER_CLOCK/8) /* 6 MHz? */
MCFG_CPU_PROGRAM_MAP(heberpop_sound_map)
MCFG_CPU_IO_MAP(heberpop_sound_io_map) /* NMI triggered by YM3438 */
@ -552,10 +564,12 @@ static MACHINE_CONFIG_START( blocken, shangha3_state )
MCFG_VIDEO_ATTRIBUTES(VIDEO_HAS_SHADOWS)
MCFG_SCREEN_ADD("screen", RASTER)
MCFG_SCREEN_REFRESH_RATE(60)
MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */)
MCFG_SCREEN_SIZE(24*16, 16*16)
MCFG_SCREEN_VISIBLE_AREA(0*16, 24*16-1, 1*16, 15*16-1)
// MCFG_SCREEN_REFRESH_RATE(60)
// MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */)
// MCFG_SCREEN_SIZE(24*16, 16*16)
// MCFG_SCREEN_VISIBLE_AREA(0*16, 24*16-1, 1*16, 15*16-1)
MCFG_SCREEN_RAW_PARAMS(BLOCKEN_MASTER_CLOCK/6,512,0,24*16,263,1*16,15*16) /* refresh rate is unknown */
MCFG_SCREEN_UPDATE_DRIVER(shangha3_state, screen_update_shangha3)
MCFG_GFXDECODE(shangha3)
@ -565,7 +579,7 @@ static MACHINE_CONFIG_START( blocken, shangha3_state )
/* sound hardware */
MCFG_SPEAKER_STANDARD_MONO("mono")
MCFG_SOUND_ADD("ymsnd", YM3438, 8000000)
MCFG_SOUND_ADD("ymsnd", YM3438, BLOCKEN_MASTER_CLOCK/6) /* 8 MHz? */
MCFG_SOUND_CONFIG(ym3438_config)
MCFG_SOUND_ROUTE(0, "mono", 0.40)
MCFG_SOUND_ROUTE(1, "mono", 0.40)
@ -616,7 +630,7 @@ ROM_START( heberpop )
ROM_END
ROM_START( blocken )
ROM_REGION( 0x100000, "maincpu", 0 )
ROM_REGION( 0x100000, "maincpu", ROMREGION_ERASEFF )
ROM_LOAD16_BYTE( "ic31j.bin", 0x0000, 0x20000, CRC(ec8de2a3) SHA1(09a6b8c1b656b17ab3d1fc057902487e4f94cf02) )
ROM_LOAD16_BYTE( "ic32j.bin", 0x0001, 0x20000, CRC(79b96240) SHA1(c1246bd4b91fa45c581a8fdf90cc6beb85adf8ec) )
@ -650,16 +664,14 @@ ROM_END
DRIVER_INIT_MEMBER(shangha3_state,shangha3)
{
m_do_shadows = 1;
}
DRIVER_INIT_MEMBER(shangha3_state,heberpop)
{
m_do_shadows = 0;
}
GAME( 1993, shangha3, 0, shangha3, shangha3, shangha3_state, shangha3, ROT0, "Sunsoft", "Shanghai III (Japan)", 0 )
GAME( 1994, heberpop, 0, heberpop, heberpop, shangha3_state, heberpop, ROT0, "Sunsoft / Atlus", "Hebereke no Popoon (Japan)", 0 )
GAME( 1994, blocken, 0, blocken, blocken, shangha3_state, heberpop, ROT0, "KID / Visco", "Blocken (Japan)", 0 )
GAME( 1994, blocken, 0, blocken, blocken, shangha3_state, heberpop, ROT0, "KID / Visco", "Blocken (Japan)", GAME_IMPERFECT_GRAPHICS )

View File

@ -24,6 +24,7 @@ public:
DECLARE_WRITE16_MEMBER(shangha3_flipscreen_w);
DECLARE_WRITE16_MEMBER(shangha3_gfxlist_addr_w);
DECLARE_WRITE16_MEMBER(shangha3_blitter_go_w);
DECLARE_WRITE16_MEMBER(shangha3_irq_ack_w);
DECLARE_DRIVER_INIT(shangha3);
DECLARE_DRIVER_INIT(heberpop);
virtual void video_start();