Merge pull request #903 from ajrhacker/nmistory

West Story improvements: the NMI story
This commit is contained in:
R. Belmont 2016-05-27 12:38:38 -04:00
commit c59746f038
4 changed files with 102 additions and 26 deletions

View File

@ -10,10 +10,8 @@ driver by Carlos A. Lozano Baides
TODO:
West Story:
- sound (program rom is close to the original)
- some bad sprites (2 bad sprite roms, should the actual decoded data match?, can they be reconstructed from the original?)
- tilemap scroll
- runs too fast? (vblank flag somewhere?)
- sound (still has IRQ problems)
- some bad sprites (2 bad sprite roms, should the actual decoded data match?)
Blood Bros (c) 1990 Nihon System [Seibu hardware]
@ -25,6 +23,12 @@ The manual states:
This works for all sets and the bootleg.
Fabtek licensed this game for the U.S. along with other games by Seibu and TAD.
Though no Fabtek-licensed set has been dumped yet, and the program code does
not appear to test a region byte, the TAD strings displayed on the title screen
are both space-justified to the same length as the unused string "U.S. LICENSEE
FABTEK, INC."
Sky Smasher (c) 1990 Nihon System [Seibu hardware]
-----------
@ -39,6 +43,12 @@ is undoubtedly capable of flipscreen and layer priority flipping
however.(which is why we have MACHINE_NO_COCKTAIL despite the games
being upright)
If the word at 0x488 in the maincpu ROM is set to any value other than 1, the
attract mode will include the "Winners Don't Use Drugs" screen. The only other
change this effects is reducing the first "NIHON SYSTEM INC." on the title
screen to the initials NSI. The string "US LICENSEE FABTEC INC" appears twice
in the program ROM, but no code that might display it is known to exist.
Dumpers Notes
=============
@ -121,7 +131,6 @@ DIP locations verified for Blood Bros. & Sky Smasher via manual & DIP-SW setting
#include "emu.h"
#include "cpu/m68000/m68000.h"
#include "audio/seibu.h"
#include "cpu/z80/z80.h"
#include "sound/3812intf.h"
#include "includes/bloodbro.h"
@ -161,22 +170,34 @@ static ADDRESS_MAP_START( skysmash_map, AS_PROGRAM, 16, bloodbro_state )
AM_RANGE(0xc0000, 0xc004f) AM_DEVREADWRITE("crtc", seibu_crtc_device, read_alt, write_alt)
ADDRESS_MAP_END
WRITE8_MEMBER(bloodbro_state::weststry_soundlatch_w)
{
m_seibu_sound->main_word_w(space, offset, data, mem_mask);
// Probably incorrect, but these interrupts must be triggered somehow
if (offset == 1)
m_audiocpu->set_input_line(INPUT_LINE_NMI, PULSE_LINE);
else
m_audiocpu->set_input_line(0, ASSERT_LINE);
}
static ADDRESS_MAP_START( weststry_map, AS_PROGRAM, 16, bloodbro_state )
AM_RANGE(0x000000, 0x07ffff) AM_ROM
AM_RANGE(0x080000, 0x08afff) AM_RAM
AM_RANGE(0x08b000, 0x08bfff) AM_RAM AM_SHARE("spriteram")
AM_RANGE(0x08c000, 0x08c3ff) AM_RAM_WRITE(bgvideoram_w) AM_SHARE("bgvideoram")
AM_RANGE(0x08c400, 0x08cfff) AM_RAM
AM_RANGE(0x08d000, 0x08d3ff) AM_RAM_WRITE(fgvideoram_w) AM_SHARE("fgvideoram")
AM_RANGE(0x08d400, 0x08d7ff) AM_RAM
AM_RANGE(0x08d800, 0x08dfff) AM_RAM_WRITE(txvideoram_w) AM_SHARE("txvideoram")
AM_RANGE(0x08e000, 0x08ffff) AM_RAM
AM_RANGE(0x080000, 0x08ffff) AM_RAM // old VRAM areas still used, but bootleg code copies them to higher addresses
AM_RANGE(0x0c1000, 0x0c1001) AM_READ_PORT("DSW")
AM_RANGE(0x0c1002, 0x0c1003) AM_READ_PORT("IN0")
AM_RANGE(0x0c1004, 0x0c1005) AM_READ_PORT("IN1")
AM_RANGE(0x0c1000, 0x0c17ff) AM_RAM
AM_RANGE(0x0c1000, 0x0c1003) AM_WRITE8(weststry_soundlatch_w, 0xff00)
AM_RANGE(0x0c1004, 0x0c100b) AM_WRITE(weststry_layer_scroll_w)
AM_RANGE(0x0e0002, 0x0e0003) AM_READNOP // remnant of old code
AM_RANGE(0x122800, 0x122bff) AM_RAM // cleared at startup
AM_RANGE(0x122c00, 0x122fff) AM_RAM_WRITE(fgvideoram_w) AM_SHARE("fgvideoram")
AM_RANGE(0x123000, 0x1233ff) AM_RAM_WRITE(bgvideoram_w) AM_SHARE("bgvideoram")
AM_RANGE(0x123400, 0x1237ff) AM_RAM // cleared at startup
AM_RANGE(0x123800, 0x123fff) AM_RAM_WRITE(txvideoram_w) AM_SHARE("txvideoram")
AM_RANGE(0x124000, 0x124005) AM_RAM
AM_RANGE(0x124006, 0x1247fd) AM_RAM AM_SHARE("spriteram")
AM_RANGE(0x128000, 0x1287ff) AM_RAM_DEVWRITE("palette", palette_device, write) AM_SHARE("palette")
AM_RANGE(0x120000, 0x128fff) AM_RAM
ADDRESS_MAP_END
/* Input Ports */
@ -295,8 +316,7 @@ INPUT_PORTS_END
static INPUT_PORTS_START( weststry )
PORT_INCLUDE( bloodbro_base )
PORT_START("COIN") /* referenced by seibu sound board */
PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNKNOWN )
SEIBU_COIN_INPUTS /* coin inputs read through sound cpu */
INPUT_PORTS_END
@ -451,6 +471,11 @@ WRITE16_MEMBER( bloodbro_state::layer_scroll_w )
COMBINE_DATA(&m_scrollram[offset]);
}
WRITE16_MEMBER( bloodbro_state::weststry_layer_scroll_w )
{
COMBINE_DATA(&m_scrollram[offset]);
}
/* Machine Drivers */
static MACHINE_CONFIG_START( bloodbro, bloodbro_state )
@ -495,8 +520,14 @@ static MACHINE_CONFIG_DERIVED( weststry, bloodbro )
MCFG_PALETTE_ENTRIES(1024)
MCFG_PALETTE_FORMAT(xxxxBBBBGGGGRRRR)
// Bootleg video hardware is non-Seibu
MCFG_SCREEN_MODIFY("screen")
MCFG_SCREEN_UPDATE_DRIVER(bloodbro_state, screen_update_weststry)
MCFG_DEVICE_REMOVE("crtc")
// Bootleg sound hardware is close copy of Seibu, but uses different interrupts
MCFG_SOUND_MODIFY("ymsnd")
MCFG_YM3812_IRQ_HANDLER(INPUTLINE("audiocpu", INPUT_LINE_NMI))
MACHINE_CONFIG_END
static MACHINE_CONFIG_DERIVED( skysmash, bloodbro )
@ -591,13 +622,13 @@ ROM_END
ROM_START( weststry )
ROM_REGION( 0x80000, "maincpu", 0 ) /* 64k for cpu code */
ROM_REGION( 0x80000, "maincpu", 0 ) /* 64k for cpu code; based on bloodbrob */
ROM_LOAD16_BYTE( "ws13.bin", 0x00001, 0x20000, CRC(158e302a) SHA1(52cc1bf526424ff025a6b79f3fc7bba4b9bbfcbb) )
ROM_LOAD16_BYTE( "ws15.bin", 0x00000, 0x20000, CRC(672e9027) SHA1(71cb9fcef04edb972ba88de45d605dcff539ea2d) )
ROM_LOAD16_BYTE( "bb_04.bin", 0x40001, 0x20000, CRC(fd951c2c) SHA1(f4031bf303c67c82f2f78f7456f78382d8c1ac85) )
ROM_LOAD16_BYTE( "bb_03.bin", 0x40000, 0x20000, CRC(18d3c460) SHA1(93b86af1199f0fedeaf1fe64d27ffede4b819e42) )
ROM_REGION( 0x20000, "audiocpu", 0 ) /* 64k for sound cpu code */
ROM_REGION( 0x20000, "audiocpu", 0 ) /* 64k for sound cpu code; based on different revision of original Seibu code */
ROM_LOAD( "ws17.bin", 0x000000, 0x08000, CRC(e00a8f09) SHA1(e7247ce0ab99d0726f31dee5de5ba33f4ebd183e) )
ROM_CONTINUE( 0x010000, 0x08000 )
ROM_COPY( "audiocpu", 0x000000, 0x018000, 0x08000 )
@ -663,10 +694,19 @@ ROM_START( skysmash )
ROM_END
DRIVER_INIT_MEMBER(bloodbro_state,weststry)
{
// Patch out jp nz,$3000; no code known to exist at that address
memory_region *z80_rom = memregion("audiocpu");
z80_rom->u8(0x160e) = 0x00;
z80_rom->u8(0x1610) = 0x00;
}
/* Game Drivers */
GAME( 1990, bloodbro, 0, bloodbro, bloodbro, driver_device, 0, ROT0, "TAD Corporation", "Blood Bros. (set 1)", MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE )
GAME( 1990, bloodbroa,bloodbro, bloodbro, bloodbro, driver_device, 0, ROT0, "TAD Corporation", "Blood Bros. (set 2)", MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE )
GAME( 1990, bloodbrob,bloodbro, bloodbro, bloodbro, driver_device, 0, ROT0, "TAD Corporation", "Blood Bros. (set 3)", MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE )
GAME( 1990, weststry, bloodbro, weststry, weststry, driver_device, 0, ROT0, "bootleg (Datsu)", "West Story (bootleg of Blood Bros.)", MACHINE_NO_COCKTAIL | MACHINE_NO_SOUND | MACHINE_SUPPORTS_SAVE )
GAME( 1990, weststry, bloodbro, weststry, weststry, bloodbro_state, weststry, ROT0, "bootleg (Datsu)", "West Story (bootleg of Blood Bros.)", MACHINE_NO_COCKTAIL | MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )
GAME( 1990, skysmash, 0, skysmash, skysmash, driver_device, 0, ROT270, "Nihon System", "Sky Smasher", MACHINE_SUPPORTS_SAVE )

View File

@ -1,5 +1,7 @@
// license:BSD-3-Clause
// copyright-holders:Carlos A. Lozano
#include "audio/seibu.h"
class bloodbro_state : public driver_device
{
public:
@ -8,6 +10,8 @@ public:
m_maincpu(*this, "maincpu"),
m_gfxdecode(*this, "gfxdecode"),
m_palette(*this, "palette"),
m_audiocpu(*this, "audiocpu"),
m_seibu_sound(*this, "seibu_sound"),
m_spriteram(*this, "spriteram"),
m_bgvideoram(*this, "bgvideoram"),
m_fgvideoram(*this, "fgvideoram"),
@ -16,6 +20,8 @@ public:
required_device<cpu_device> m_maincpu;
required_device<gfxdecode_device> m_gfxdecode;
required_device<palette_device> m_palette;
required_device<cpu_device> m_audiocpu;
required_device<seibu_sound_device> m_seibu_sound;
required_shared_ptr<UINT16> m_spriteram;
required_shared_ptr<UINT16> m_bgvideoram;
@ -34,6 +40,8 @@ public:
DECLARE_WRITE16_MEMBER(txvideoram_w);
DECLARE_WRITE16_MEMBER(layer_en_w);
DECLARE_WRITE16_MEMBER(layer_scroll_w);
DECLARE_WRITE16_MEMBER(weststry_layer_scroll_w);
DECLARE_WRITE8_MEMBER(weststry_soundlatch_w);
TILE_GET_INFO_MEMBER(get_bg_tile_info);
TILE_GET_INFO_MEMBER(get_fg_tile_info);
@ -46,4 +54,6 @@ public:
UINT32 screen_update_skysmash(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
void bloodbro_draw_sprites(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
void weststry_draw_sprites(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
DECLARE_DRIVER_INIT(weststry);
};

View File

@ -197,8 +197,7 @@ void bloodbro_state::weststry_draw_sprites(screen_device &screen, bitmap_ind16 &
UINT16 *spriteram16 = m_spriteram;
int offs;
/* TODO: the last two entries are not sprites - control registers? */
for (offs = 0;offs < m_spriteram.bytes()/2 - 8;offs += 4)
for (offs = m_spriteram.bytes()/2 - 4; offs >= 0; offs -= 4)
{
int data = spriteram16[offs+2];
int data0 = spriteram16[offs+0];
@ -251,10 +250,9 @@ UINT32 bloodbro_state::screen_update_bloodbro(screen_device &screen, bitmap_ind1
UINT32 bloodbro_state::screen_update_weststry(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
// m_bg_tilemap->set_scrollx(0,m_scroll[0x10]); /* ? */
// m_bg_tilemap->set_scrolly(0,m_scroll[0x11]); /* ? */
// m_fg_tilemap->set_scrollx(0,m_scroll[0x12]);
// m_fg_tilemap->set_scrolly(0,m_scroll[0x13]);
// The bootleg video hardware probably also allows BG scrolling, but weststry doesn't use it
m_fg_tilemap->set_scrollx(0, (INT8)m_scrollram[1] - 13);
m_fg_tilemap->set_scrolly(0, (INT8)m_scrollram[0] + 1);
screen.priority().fill(0, cliprect);

View File

@ -96,6 +96,34 @@ List of default vregs (title screen):
0x1ff - 0xfc = 259
0x1ff - 0xff = 256
*Blood Bros. (sets 1 and 2, init routine at $620)
0C0000: 000F 000F 00B2 00D7 00F9 000F 00F9 00FF
0C0010: 0076 0006 0001 0002 0000 0000 0004 ****
0C0020: **** **** **** **** **** **** 01D8 01FF
0C0030: 01DA 01FF **** **** 01D8 01FF 0034 003F
0C0040: 0000 A8A8 0005 1830 0009 **** **** ****
*Blood Bros. (set 3, init routine at $580)
0C0000: 000F 000F 00B7 00BF 00FA 000F 00FA 00FF
0C0010: 0076 0006 0001 0002 0000 0000 0004 ****
0C0020: **** **** **** **** **** **** 01C0 01FF
0C0030: 01C2 01FF **** **** 00C0 01FF 0034 003F
0C0040: 0000 A8A8 0004 1830 0009 **** **** ****
*Sky Smasher (init routine at $1f5d0)
0C0000: 000F 000F 00B2 00D7 00F9 000F 00F9 00FF
0C0020: 0076 0006 0000 0002 0000 0000 0004 ****
0C0010: **** **** **** **** **** **** 01D9 01FF
0C0030: 01DB 01FF **** **** 01D8 01FF 0034 003F
0C0040: 0000 A8A8 0005 1830 0009 **** **** ****
*Sky Smasher (unused init routine at $1f4ee)
0C0000: 000F 000F 00AF 00BF 00F8 000F 00F8 00FF
0C0020: 0076 0006 0000 0002 0000 0000 0004 ****
0C0010: **** **** **** **** **** **** 01C0 01FF
0C0030: 01C2 01FF **** **** 00C0 01FF 0034 003F
0C0040: 0000 A8A8 0006 1830 0009 **** **** ****
*SD Gundam Psycho Salamander no Kyoui (320 x 224 -> 0 - 224 v res)
0C0000: 000F 0013 009F 00BF 00FA 000F 00FA 00FF
0C0010: 0076 0006 0000 0002 0000 0000 0000 0000