diff --git a/src/mame/drivers/shangha3.c b/src/mame/drivers/shangha3.c index 70f5ceef0e0..82a64796cac 100644 --- a/src/mame/drivers/shangha3.c +++ b/src/mame/drivers/shangha3.c @@ -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 ) diff --git a/src/mame/includes/shangha3.h b/src/mame/includes/shangha3.h index e3422c73a9f..9733214fb98 100644 --- a/src/mame/includes/shangha3.h +++ b/src/mame/includes/shangha3.h @@ -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();