- irem/travrusa.cpp: consolidated driver into single file

- midway/midyunit: dumped PLS153s for Narc [Domenico Cervini]
This commit is contained in:
Ivan Vangelista 2024-01-16 18:20:14 +01:00
parent a5af4e4ccb
commit 5e4a4ef4fd
5 changed files with 527 additions and 481 deletions

View File

@ -1,6 +1,7 @@
// license:BSD-3-Clause
// copyright-holders:Lee Taylor
// thanks-to:John Clegg,Tomasz Slanina
// copyright-holders: Lee Taylor
// thanks-to: John Clegg, Tomasz Slanina
/****************************************************************************
Traverse USA / Zippy Race (c) 1983 Irem
@ -16,7 +17,7 @@ Notes:
tunnels. I hacked it just by making the two needed colors opaque. They
don't seem to be used anywhere else. Even if it looks like a hack, it might
really be how the hardware works - see also notes regarding Kung Fu Master
at the beginning of m62.c.
at the beginning of m62.cpp.
- shtrider has some weird colors (pink cars, green "Seibu" truck, 'no'
on hiscore table) but there's no reason to think there's something wrong
with the driver.
@ -40,46 +41,418 @@ PCB layout:
--------------------------------------------------
C - connector
P - proms
E - connector for big black epoxy block
E - connector for big black epoxy block
D - dips
* - empty rom socket
* - empty ROM socket
x - 40 pin chip, surface scratched (6803)
Epoxy block contains main cpu (Z80)
and 2764 eprom (swapped D3/D4 and D5/D6 data lines)
Epoxy block contains main CPU (Z80)
and 2764 EPROM (swapped D3/D4 and D5/D6 data lines)
****************************************************************************/
#include "emu.h"
#include "travrusa.h"
#include "irem.h"
#include "cpu/z80/z80.h"
#include "emupal.h"
#include "screen.h"
#include "tilemap.h"
void travrusa_state::main_map(address_map &map)
namespace {
class travrusa_state : public driver_device
{
public:
travrusa_state(const machine_config &mconfig, device_type type, const char *tag) :
driver_device(mconfig, type, tag),
m_videoram(*this, "videoram"),
m_spriteram(*this, "spriteram"),
m_maincpu(*this, "maincpu"),
m_gfxdecode(*this, "gfxdecode"),
m_palette(*this, "palette"),
m_dsw2(*this, "DSW2")
{ }
void shtrider(machine_config &config);
void travrusa(machine_config &config);
void shtriderb(machine_config &config);
void init_shtridra();
void init_motorace();
void init_shtridrb();
protected:
virtual void machine_reset() override;
virtual void video_start() override;
private:
required_shared_ptr<uint8_t> m_videoram;
required_shared_ptr<uint8_t> m_spriteram;
required_device<cpu_device> m_maincpu;
required_device<gfxdecode_device> m_gfxdecode;
required_device<palette_device> m_palette;
required_ioport m_dsw2;
tilemap_t *m_bg_tilemap = nullptr;
uint8_t m_scrollx[2]{};
void videoram_w(offs_t offset, uint8_t data);
void scroll_x_low_w(uint8_t data);
void scroll_x_high_w(uint8_t data);
void flipscreen_w(uint8_t data);
uint8_t shtriderb_port11_r();
TILE_GET_INFO_MEMBER(get_tile_info);
void travrusa_palette(palette_device &palette) const;
void shtrider_palette(palette_device &palette) const;
uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
void set_scroll();
void draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect);
void program_map(address_map &map);
void shtriderb_io_map(address_map &map);
};
// video
/***************************************************************************
Convert the color PROMs into a more useable format.
Traverse USA has one 256x8 character palette PROM (some versions have two
256x4), one 32x8 sprite palette PROM, and one 256x4 sprite color lookup
table PROM.
I don't know for sure how the palette PROMs are connected to the RGB
output, but it's probably something like this; note that RED and BLUE
are swapped wrt the usual configuration.
bit 7 -- 220 ohm resistor -- RED
-- 470 ohm resistor -- RED
-- 220 ohm resistor -- GREEN
-- 470 ohm resistor -- GREEN
-- 1 kohm resistor -- GREEN
-- 220 ohm resistor -- BLUE
-- 470 ohm resistor -- BLUE
bit 0 -- 1 kohm resistor -- BLUE
***************************************************************************/
void travrusa_state::travrusa_palette(palette_device &palette) const
{
const uint8_t *color_prom = memregion("proms")->base();
// create a lookup table for the palette
for (int i = 0; i < 0x80; i++)
{
int bit0, bit1, bit2;
// red component
bit0 = 0;
bit1 = BIT(color_prom[i], 6);
bit2 = BIT(color_prom[i], 7);
int const r = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2;
// green component
bit0 = BIT(color_prom[i], 3);
bit1 = BIT(color_prom[i], 4);
bit2 = BIT(color_prom[i], 5);
int const g = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2;
// blue component
bit0 = BIT(color_prom[i], 0);
bit1 = BIT(color_prom[i], 1);
bit2 = BIT(color_prom[i], 2);
int const b = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2;
palette.set_indirect_color(i, rgb_t(r, g, b));
}
for (int i = 0x80; i < 0x90; i++)
{
int bit0, bit1, bit2;
// red component
bit0 = 0;
bit1 = BIT(color_prom[(i - 0x80) + 0x200], 6);
bit2 = BIT(color_prom[(i - 0x80) + 0x200], 7);
int const r = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2;
// green component
bit0 = BIT(color_prom[(i - 0x80) + 0x200], 3);
bit1 = BIT(color_prom[(i - 0x80) + 0x200], 4);
bit2 = BIT(color_prom[(i - 0x80) + 0x200], 5);
int const g = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2;
// blue component
bit0 = BIT(color_prom[(i - 0x80) + 0x200], 0);
bit1 = BIT(color_prom[(i - 0x80) + 0x200], 1);
bit2 = BIT(color_prom[(i - 0x80) + 0x200], 2);
int const b = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2;
palette.set_indirect_color(i, rgb_t(r, g, b));
}
// color_prom now points to the beginning of the lookup table
color_prom += 0x220;
// characters
for (int i = 0; i < 0x80; i++)
palette.set_pen_indirect(i, i);
// sprites
for (int i = 0x80; i < 0x100; i++)
{
uint8_t const ctabentry = (color_prom[i - 0x80] & 0x0f) | 0x80;
palette.set_pen_indirect(i, ctabentry);
}
}
void travrusa_state::shtrider_palette(palette_device &palette) const
{
const uint8_t *color_prom = memregion("proms")->base();
// create a lookup table for the palette
for (int i = 0; i < 0x80; i++)
{
int bit0, bit1, bit2;
// red component
bit0 = 0;
bit1 = BIT(color_prom[i + 0x000], 2);
bit2 = BIT(color_prom[i + 0x000], 3);
int const r = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2;
// green component
bit0 = BIT(color_prom[i + 0x100], 3);
bit1 = BIT(color_prom[i + 0x000], 0);
bit2 = BIT(color_prom[i + 0x000], 1);
int const g = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2;
// blue component
bit0 = BIT(color_prom[i + 0x100], 0);
bit1 = BIT(color_prom[i + 0x100], 1);
bit2 = BIT(color_prom[i + 0x100], 2);
int const b = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2;
palette.set_indirect_color(i, rgb_t(r, g, b));
}
for (int i = 0x80; i < 0x90; i++)
{
int bit0, bit1, bit2;
// red component
bit0 = 0;
bit1 = BIT(color_prom[(i - 0x80) + 0x200], 6);
bit2 = BIT(color_prom[(i - 0x80) + 0x200], 7);
int const r = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2;
// green component
bit0 = BIT(color_prom[(i - 0x80) + 0x200], 3);
bit1 = BIT(color_prom[(i - 0x80) + 0x200], 4);
bit2 = BIT(color_prom[(i - 0x80) + 0x200], 5);
int const g = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2;
// blue component
bit0 = BIT(color_prom[(i - 0x80) + 0x200], 0);
bit1 = BIT(color_prom[(i - 0x80) + 0x200], 1);
bit2 = BIT(color_prom[(i - 0x80) + 0x200], 2);
int const b = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2;
palette.set_indirect_color(i, rgb_t(r, g, b));
}
// color_prom now points to the beginning of the lookup table
color_prom += 0x220;
// characters
for (int i = 0; i < 0x80; i++)
palette.set_pen_indirect(i, i);
// sprites
for (int i = 0x80; i < 0x100; i++)
{
uint8_t const ctabentry = (color_prom[i - 0x80] & 0x0f) | 0x80;
palette.set_pen_indirect(i, ctabentry);
}
}
/***************************************************************************
Callbacks for the TileMap code
***************************************************************************/
TILE_GET_INFO_MEMBER(travrusa_state::get_tile_info)
{
uint8_t const attr = m_videoram[2 * tile_index + 1];
int const flags = TILE_FLIPXY((attr & 0x30) >> 4);
tileinfo.group = ((attr & 0x0f) == 0x0f) ? 1 : 0; // tunnels
tileinfo.set(0,
m_videoram[2 * tile_index] + ((attr & 0xc0) << 2),
attr & 0x0f,
flags);
}
/***************************************************************************
Start the video hardware emulation.
***************************************************************************/
void travrusa_state::video_start()
{
save_item(NAME(m_scrollx));
m_bg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(travrusa_state::get_tile_info)), TILEMAP_SCAN_ROWS, 8, 8, 64, 32);
m_bg_tilemap->set_transmask(0, 0xff, 0x00); // split type 0 is totally transparent in front half
m_bg_tilemap->set_transmask(1, 0x3f, 0xc0); // split type 1 has pens 6 and 7 opaque - tunnels
m_bg_tilemap->set_scroll_rows(4);
}
/***************************************************************************
Memory handlers
***************************************************************************/
void travrusa_state::videoram_w(offs_t offset, uint8_t data)
{
m_videoram[offset] = data;
m_bg_tilemap->mark_tile_dirty(offset / 2);
}
void travrusa_state::set_scroll()
{
for (int i = 0; i <= 2; i++)
m_bg_tilemap->set_scrollx(i, m_scrollx[0] + 256 * m_scrollx[1]);
m_bg_tilemap->set_scrollx(3, 0);
}
void travrusa_state::scroll_x_low_w(uint8_t data)
{
m_scrollx[0] = data;
set_scroll();
}
void travrusa_state::scroll_x_high_w(uint8_t data)
{
m_scrollx[1] = data;
set_scroll();
}
void travrusa_state::flipscreen_w(uint8_t data)
{
// screen flip is handled both by software and hardware
data ^= ~m_dsw2->read() & 1;
flip_screen_set(data & 1);
machine().bookkeeping().coin_counter_w(0, data & 0x02);
machine().bookkeeping().coin_counter_w(1, data & 0x20);
}
/***************************************************************************
Display refresh
***************************************************************************/
void travrusa_state::draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect)
{
const rectangle spritevisiblearea(1*8, 31*8-1, 0*8, 24*8-1);
const rectangle spritevisibleareaflip(1*8, 31*8-1, 8*8, 32*8-1);
rectangle clip = cliprect;
if (flip_screen())
clip &= spritevisibleareaflip;
else
clip &= spritevisiblearea;
for (int offs = m_spriteram.bytes() - 4; offs >= 0; offs -= 4)
{
int sx = ((m_spriteram[offs + 3] + 8) & 0xff) - 8;
int sy = 240 - m_spriteram[offs];
int const code = m_spriteram[offs + 2];
int const attr = m_spriteram[offs + 1];
int flipx = attr & 0x40;
int flipy = attr & 0x80;
if (flip_screen())
{
sx = 240 - sx;
sy = 240 - sy;
flipx = !flipx;
flipy = !flipy;
}
m_gfxdecode->gfx(1)->transpen(bitmap, clip,
code,
attr & 0x0f,
flipx, flipy,
sx, sy, 0);
}
}
uint32_t travrusa_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
m_bg_tilemap->draw(screen, bitmap, cliprect, TILEMAP_DRAW_LAYER1, 0);
draw_sprites(bitmap, cliprect);
m_bg_tilemap->draw(screen, bitmap, cliprect, TILEMAP_DRAW_LAYER0, 0);
return 0;
}
// machine
void travrusa_state::program_map(address_map &map)
{
map(0x0000, 0x7fff).rom();
map(0x8000, 0x8fff).ram().w(FUNC(travrusa_state::travrusa_videoram_w)).share("videoram");
map(0x9000, 0x9000).w(FUNC(travrusa_state::travrusa_scroll_x_low_w));
map(0xa000, 0xa000).w(FUNC(travrusa_state::travrusa_scroll_x_high_w));
map(0xc800, 0xc9ff).writeonly().share("spriteram");
map(0xd000, 0xd000).w("irem_audio", FUNC(irem_audio_device::cmd_w));
map(0xd001, 0xd001).w(FUNC(travrusa_state::travrusa_flipscreen_w)); /* + coin counters - not written by shtrider */
map(0xd000, 0xd000).portr("SYSTEM"); /* IN0 */
map(0xd001, 0xd001).portr("P1"); /* IN1 */
map(0xd002, 0xd002).portr("P2"); /* IN2 */
map(0xd003, 0xd003).portr("DSW1"); /* DSW1 */
map(0xd004, 0xd004).portr("DSW2"); /* DSW2 */
map(0x8000, 0x8fff).ram().w(FUNC(travrusa_state::videoram_w)).share(m_videoram);
map(0x9000, 0x9000).w(FUNC(travrusa_state::scroll_x_low_w));
map(0xa000, 0xa000).w(FUNC(travrusa_state::scroll_x_high_w));
map(0xc800, 0xc9ff).writeonly().share(m_spriteram);
map(0xd000, 0xd000).portr("SYSTEM").w("irem_audio", FUNC(irem_audio_device::cmd_w));
map(0xd001, 0xd001).portr("P1").w(FUNC(travrusa_state::flipscreen_w)); // + coin counters - not written by shtrider
map(0xd002, 0xd002).portr("P2");
map(0xd003, 0xd003).portr("DSW1");
map(0xd004, 0xd004).portr("DSW2");
map(0xe000, 0xefff).ram();
}
void travrusa_state::shtriderb_io_map(address_map &map)
{
map(0x0011, 0x0011).mirror(0xff00).r(FUNC(travrusa_state::shtriderb_port11_r));
}
static INPUT_PORTS_START( travrusa )
PORT_START("SYSTEM")
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_START1 )
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_START2 )
/* coin input must be active for 19 frames to be consistently recognized */
// coin input must be active for 19 frames to be consistently recognized
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_COIN3 ) PORT_IMPULSE(19)
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_COIN1 )
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_UNKNOWN )
@ -167,7 +540,7 @@ static INPUT_PORTS_START( travrusa )
PORT_DIPNAME( 0x08, 0x08, "Speed Type" ) PORT_DIPLOCATION("DSW2:4")
PORT_DIPSETTING( 0x08, "M/H" ) //mph ?
PORT_DIPSETTING( 0x00, "Km/H" )
/* In stop mode, press 2 to stop and 1 to restart */
// In stop mode, press 2 to stop and 1 to restart
PORT_DIPNAME( 0x10, 0x10, "Stop Mode (Cheat)") PORT_DIPLOCATION("DSW2:5")
PORT_DIPSETTING( 0x10, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
@ -180,7 +553,7 @@ static INPUT_PORTS_START( travrusa )
PORT_SERVICE_DIPLOC( 0x80, 0x80, "DSW2:8")
INPUT_PORTS_END
/* same as travrusa, no "Title" switch */
// same as travrusa, no "Title" switch
static INPUT_PORTS_START( motorace )
PORT_INCLUDE( travrusa )
@ -278,13 +651,13 @@ static const gfx_layout shtrider_spritelayout =
};
static GFXDECODE_START( gfx_travrusa )
GFXDECODE_ENTRY( "gfx1", 0, gfx_8x8x3_planar, 0, 16 )
GFXDECODE_ENTRY( "gfx2", 0, spritelayout, 16*8, 16 )
GFXDECODE_ENTRY( "tiles", 0, gfx_8x8x3_planar, 0, 16 )
GFXDECODE_ENTRY( "sprites", 0, spritelayout, 16*8, 16 )
GFXDECODE_END
static GFXDECODE_START( gfx_shtrider )
GFXDECODE_ENTRY( "gfx1", 0, gfx_8x8x3_planar, 0, 16 )
GFXDECODE_ENTRY( "gfx2", 0, shtrider_spritelayout, 16*8, 16 )
GFXDECODE_ENTRY( "tiles", 0, gfx_8x8x3_planar, 0, 16 )
GFXDECODE_ENTRY( "sprites", 0, shtrider_spritelayout, 16*8, 16 )
GFXDECODE_END
void travrusa_state::machine_reset()
@ -295,14 +668,14 @@ void travrusa_state::machine_reset()
void travrusa_state::travrusa(machine_config &config)
{
/* basic machine hardware */
// basic machine hardware
Z80(config, m_maincpu, 18.432_MHz_XTAL / 6);
m_maincpu->set_addrmap(AS_PROGRAM, &travrusa_state::main_map);
m_maincpu->set_addrmap(AS_PROGRAM, &travrusa_state::program_map);
/* video hardware */
// video hardware
screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
screen.set_raw(18.432_MHz_XTAL / 3, 384, 8, 248, 282, 0, 256); // verified from schematics; accurate frequency, measured on a Moon Patrol board, is 56.75Hz
screen.set_screen_update(FUNC(travrusa_state::screen_update_travrusa));
screen.set_screen_update(FUNC(travrusa_state::screen_update));
screen.set_palette(m_palette);
// Race start countdown in shtrider needs multiple interrupts per frame to sync, mustache.cpp has the same, and is also a Seibu game
screen.screen_vblank().set_inputline(m_maincpu, INPUT_LINE_IRQ0);
@ -310,8 +683,7 @@ void travrusa_state::travrusa(machine_config &config)
GFXDECODE(config, m_gfxdecode, m_palette, gfx_travrusa);
PALETTE(config, m_palette, FUNC(travrusa_state::travrusa_palette), 16*8+16*8, 128+16);
/* sound hardware */
//m52_sound_c_audio(config);
// sound hardware
IREM_M52_SOUNDC_AUDIO(config, "irem_audio", 0);
}
@ -319,7 +691,7 @@ void travrusa_state::shtrider(machine_config &config)
{
travrusa(config);
/* video hardware */
// video hardware
m_gfxdecode->set_info(gfx_shtrider);
m_palette->set_init(FUNC(travrusa_state::shtrider_palette));
}
@ -328,7 +700,9 @@ void travrusa_state::shtriderb(machine_config &config)
{
travrusa(config);
/* video hardware */
m_maincpu->set_addrmap(AS_IO, &travrusa_state::shtriderb_io_map);
// video hardware
m_gfxdecode->set_info(gfx_shtrider);
}
@ -349,23 +723,23 @@ ROM_START( travrusa )
ROM_REGION( 0x8000, "irem_audio:iremsound", 0 )
ROM_LOAD( "mr10.1a", 0x7000, 0x1000, CRC(a02ad8a0) SHA1(aff80b506dbecabed2a36eb743693940f6a22d16) )
ROM_REGION( 0x06000, "gfx1", 0 )
ROM_REGION( 0x06000, "tiles", 0 )
ROM_LOAD( "zippyrac.001", 0x0000, 0x2000, CRC(aa8994dd) SHA1(9b326ce52a03d723e5c3c1b5fd4aa8fa7f70f904) )
ROM_LOAD( "mr8.3c", 0x2000, 0x2000, CRC(3a046dd1) SHA1(65c1dd1c0b5fb72ac5c04e11a577308245e4b312) )
ROM_LOAD( "mr9.3a", 0x4000, 0x2000, CRC(1cc3d3f4) SHA1(e7ee365d43d783cb6b7df37c6edeadbed35318d9) )
ROM_REGION( 0x06000, "gfx2", 0 )
ROM_REGION( 0x06000, "sprites", 0 )
ROM_LOAD( "zr1-8.n3", 0x0000, 0x2000, CRC(3e2c7a6b) SHA1(abc9eeb656ab6ed5f14e10fc988f75f21ccf037a) )
ROM_LOAD( "zr1-9.l3", 0x2000, 0x2000, CRC(13be6a14) SHA1(47861910fe4c46cd72634cf7d834be2da2a0a4f9) )
ROM_LOAD( "zr1-10.k3", 0x4000, 0x2000, CRC(6fcc9fdb) SHA1(88f878b9ebf07c5a16f8cb742016cac971ed3f10) )
ROM_REGION( 0x0320, "proms", 0 )
ROM_LOAD( "mmi6349.ij", 0x0000, 0x0200, CRC(c9724350) SHA1(1fac20cdc0a53d94e8f67b49d7dd71d1b9f1f7ef) ) /* character palette - last $100 are unused */
ROM_LOAD( "tbp18s.2", 0x0200, 0x0020, CRC(a1130007) SHA1(9deb0eed75dd06e86f83c819a3393158be7c9dce) ) /* sprite palette */
ROM_LOAD( "tbp24s10.3", 0x0220, 0x0100, CRC(76062638) SHA1(7378a26cf455d9d3df90929dc665870514c34b54) ) /* sprite lookup table */
ROM_LOAD( "mmi6349.ij", 0x0000, 0x0200, CRC(c9724350) SHA1(1fac20cdc0a53d94e8f67b49d7dd71d1b9f1f7ef) ) // character palette - last $100 are unused
ROM_LOAD( "tbp18s.2", 0x0200, 0x0020, CRC(a1130007) SHA1(9deb0eed75dd06e86f83c819a3393158be7c9dce) ) // sprite palette
ROM_LOAD( "tbp24s10.3", 0x0220, 0x0100, CRC(76062638) SHA1(7378a26cf455d9d3df90929dc665870514c34b54) ) // sprite lookup table
ROM_END
/* Bootleg - "American Top" printed on title - (c) 1983 I.P. - Zippy Race graphic logo is blanked out - Main ROM0-ROM3 test NG */
// Bootleg - "American Top" printed on title - (c) 1983 I.P. - Zippy Race graphic logo is blanked out - Main ROM0-ROM3 test NG
ROM_START( travrusab )
ROM_REGION( 0x10000, "maincpu", 0 )
ROM_LOAD( "at4.m3", 0x0000, 0x2000, CRC(704ce6e4) SHA1(77385d853e3d5085c6ab155417e2b42212aff6fc) )
@ -376,20 +750,20 @@ ROM_START( travrusab )
ROM_REGION( 0x8000, "irem_audio:iremsound", 0 )
ROM_LOAD( "11.a1", 0x7000, 0x1000, CRC(d2c0bc33) SHA1(3a52ae514daf985d297416301dac0ac6cbe671d7) )
ROM_REGION( 0x06000, "gfx1", 0 )
ROM_LOAD( "zippyrac.001", 0x0000, 0x2000, CRC(aa8994dd) SHA1(9b326ce52a03d723e5c3c1b5fd4aa8fa7f70f904) ) /* at1.e3 */
ROM_LOAD( "mr8.3c", 0x2000, 0x2000, CRC(3a046dd1) SHA1(65c1dd1c0b5fb72ac5c04e11a577308245e4b312) ) /* at2.c3 */
ROM_LOAD( "mr9.3a", 0x4000, 0x2000, CRC(1cc3d3f4) SHA1(e7ee365d43d783cb6b7df37c6edeadbed35318d9) ) /* at3.a3 */
ROM_REGION( 0x06000, "tiles", 0 )
ROM_LOAD( "zippyrac.001", 0x0000, 0x2000, CRC(aa8994dd) SHA1(9b326ce52a03d723e5c3c1b5fd4aa8fa7f70f904) ) // at1.e3
ROM_LOAD( "mr8.3c", 0x2000, 0x2000, CRC(3a046dd1) SHA1(65c1dd1c0b5fb72ac5c04e11a577308245e4b312) ) // at2.c3
ROM_LOAD( "mr9.3a", 0x4000, 0x2000, CRC(1cc3d3f4) SHA1(e7ee365d43d783cb6b7df37c6edeadbed35318d9) ) // at3.a3
ROM_REGION( 0x06000, "gfx2", 0 )
ROM_REGION( 0x06000, "sprites", 0 )
ROM_LOAD( "8.n3", 0x0000, 0x2000, CRC(00c0f46b) SHA1(5fccc188af653785f3fc0f9d36dbbbab472f6fdc) )
ROM_LOAD( "9.m3", 0x2000, 0x2000, CRC(73ade73b) SHA1(4da012d71e7c1f46407343cc8d4fbe0397b7db71) )
ROM_LOAD( "10.k3", 0x4000, 0x2000, CRC(fcfeaa69) SHA1(a958caf70d2dc4a80298a395cb48db210e6ca16b) )
ROM_REGION( 0x0320, "proms", 0 )
ROM_LOAD( "mmi6349.ij", 0x0000, 0x0200, CRC(c9724350) SHA1(1fac20cdc0a53d94e8f67b49d7dd71d1b9f1f7ef) ) /* character palette - last $100 are unused */
ROM_LOAD( "tbp18s.2", 0x0200, 0x0020, CRC(a1130007) SHA1(9deb0eed75dd06e86f83c819a3393158be7c9dce) ) /* sprite palette */
ROM_LOAD( "tbp24s10.3", 0x0220, 0x0100, CRC(76062638) SHA1(7378a26cf455d9d3df90929dc665870514c34b54) ) /* sprite lookup table */
ROM_LOAD( "mmi6349.ij", 0x0000, 0x0200, CRC(c9724350) SHA1(1fac20cdc0a53d94e8f67b49d7dd71d1b9f1f7ef) ) // character palette - last $100 are unused
ROM_LOAD( "tbp18s.2", 0x0200, 0x0020, CRC(a1130007) SHA1(9deb0eed75dd06e86f83c819a3393158be7c9dce) ) // sprite palette
ROM_LOAD( "tbp24s10.3", 0x0220, 0x0100, CRC(76062638) SHA1(7378a26cf455d9d3df90929dc665870514c34b54) ) // sprite lookup table
ROM_END
ROM_START( travrusab2 ) // all ROMs match travrusa but the ones where differently stated
@ -402,12 +776,12 @@ ROM_START( travrusab2 ) // all ROMs match travrusa but the ones where differentl
ROM_REGION( 0x8000, "irem_audio:iremsound", 0 )
ROM_LOAD( "4.1a1", 0x7000, 0x1000, CRC(a02ad8a0) SHA1(aff80b506dbecabed2a36eb743693940f6a22d16) )
ROM_REGION( 0x06000, "gfx1", 0 )
ROM_REGION( 0x06000, "tiles", 0 )
ROM_LOAD( "1.1e3", 0x0000, 0x2000, CRC(aa8994dd) SHA1(9b326ce52a03d723e5c3c1b5fd4aa8fa7f70f904) )
ROM_LOAD( "2.1c3", 0x2000, 0x2000, CRC(3a046dd1) SHA1(65c1dd1c0b5fb72ac5c04e11a577308245e4b312) )
ROM_LOAD( "3.1a3", 0x4000, 0x2000, CRC(1cc3d3f4) SHA1(e7ee365d43d783cb6b7df37c6edeadbed35318d9) )
ROM_REGION( 0x06000, "gfx2", 0 )
ROM_REGION( 0x06000, "sprites", 0 )
ROM_LOAD( "8.3n3", 0x0000, 0x2000, CRC(3e2c7a6b) SHA1(abc9eeb656ab6ed5f14e10fc988f75f21ccf037a) )
ROM_LOAD( "9.3m3", 0x2000, 0x2000, CRC(13be6a14) SHA1(47861910fe4c46cd72634cf7d834be2da2a0a4f9) )
ROM_LOAD( "10.3k3", 0x4000, 0x2000, CRC(6fcc9fdb) SHA1(88f878b9ebf07c5a16f8cb742016cac971ed3f10) )
@ -420,7 +794,7 @@ ROM_END
ROM_START( motorace )
ROM_REGION( 0x12000, "maincpu", 0 )
ROM_LOAD( "mr.cpu", 0x0000, 0x2000, CRC(89030b0c) SHA1(dec4209385bbccff4a3c0d93d6507110ef841331) ) /* encrypted */
ROM_LOAD( "mr.cpu", 0x0000, 0x2000, CRC(89030b0c) SHA1(dec4209385bbccff4a3c0d93d6507110ef841331) ) // encrypted
ROM_LOAD( "mr1.3l", 0x2000, 0x2000, CRC(0904ed58) SHA1(2776e031cb58f99103bc35299bffd7612d954608) )
ROM_LOAD( "mr2.3k", 0x4000, 0x2000, CRC(8a2374ec) SHA1(7159731f5ef2485e3c822e3e8e51e9583dd1c6bc) )
ROM_LOAD( "mr3.3j", 0x6000, 0x2000, CRC(2f04c341) SHA1(ae990d9d4abdd7d6ef9d21aa62125fe2e0067623) )
@ -428,20 +802,20 @@ ROM_START( motorace )
ROM_REGION( 0x8000, "irem_audio:iremsound", 0 )
ROM_LOAD( "mr10.1a", 0x7000, 0x1000, CRC(a02ad8a0) SHA1(aff80b506dbecabed2a36eb743693940f6a22d16) )
ROM_REGION( 0x06000, "gfx1", 0 )
ROM_REGION( 0x06000, "tiles", 0 )
ROM_LOAD( "mr7.3e", 0x0000, 0x2000, CRC(492a60be) SHA1(9a3d6407b834eb7c3e3c8bb292ff124550a2787c) )
ROM_LOAD( "mr8.3c", 0x2000, 0x2000, CRC(3a046dd1) SHA1(65c1dd1c0b5fb72ac5c04e11a577308245e4b312) )
ROM_LOAD( "mr9.3a", 0x4000, 0x2000, CRC(1cc3d3f4) SHA1(e7ee365d43d783cb6b7df37c6edeadbed35318d9) )
ROM_REGION( 0x06000, "gfx2", 0 )
ROM_REGION( 0x06000, "sprites", 0 )
ROM_LOAD( "mr4.3n", 0x0000, 0x2000, CRC(5cf1a0d6) SHA1(ef0883e71ee1e9c38cf3f444d9d8e79a08076b78) )
ROM_LOAD( "mr5.3m", 0x2000, 0x2000, CRC(f75f2aad) SHA1(e4a8a3da56cbc04f0c9041afac182d1bfceb1d0d) )
ROM_LOAD( "mr6.3k", 0x4000, 0x2000, CRC(518889a0) SHA1(70b417104ce86132cb5542813c1e0509b2260756) )
ROM_REGION( 0x0320, "proms", 0 )
ROM_LOAD( "mmi6349.ij", 0x0000, 0x0200, CRC(c9724350) SHA1(1fac20cdc0a53d94e8f67b49d7dd71d1b9f1f7ef) ) /* character palette - last $100 are unused */
ROM_LOAD( "tbp18s.2", 0x0200, 0x0020, CRC(a1130007) SHA1(9deb0eed75dd06e86f83c819a3393158be7c9dce) ) /* sprite palette */
ROM_LOAD( "tbp24s10.3", 0x0220, 0x0100, CRC(76062638) SHA1(7378a26cf455d9d3df90929dc665870514c34b54) ) /* sprite lookup table */
ROM_LOAD( "mmi6349.ij", 0x0000, 0x0200, CRC(c9724350) SHA1(1fac20cdc0a53d94e8f67b49d7dd71d1b9f1f7ef) ) // character palette - last $100 are unused
ROM_LOAD( "tbp18s.2", 0x0200, 0x0020, CRC(a1130007) SHA1(9deb0eed75dd06e86f83c819a3393158be7c9dce) ) // sprite palette
ROM_LOAD( "tbp24s10.3", 0x0220, 0x0100, CRC(76062638) SHA1(7378a26cf455d9d3df90929dc665870514c34b54) ) // sprite lookup table
ROM_END
/*
@ -450,7 +824,7 @@ Moto Tour is a Tecfri licensed version of Traverse USA/Zippy Race from Irem
This version doesn't have the MSM5202 but still has the sounds produced by the 5202 with a lower quality, I guess it converts the sound data to analog in some way, also this version is unprotected, doesn't have the epoxy block.
Unfortunately the eprom's labels have disappeared, so I name it similar to Traverse USA but with the letters mt (Moto Tour)
Unfortunately the EPROMs' labels have disappeared, so I name it similar to Traverse USA but with the letters mt (Moto Tour)
Rom Info
@ -462,7 +836,7 @@ mt1-3.a3 /
mt1-4.m3 \
mt1-5.l3 ==
mt1-6.k3 == Main cpu. Different from the other sets
mt1-6.k3 == Main CPU. Different from the other sets
mt1-7.j3 /
@ -471,7 +845,7 @@ mt1-9.m3 -- Sprites. Apparently all different from the other sets
mt1-10.k3 /
mm6349.k2 \
prom1.f1 -- color proms, identical to other versions
prom1.f1 -- color PROMs, identical to other versions
prom2.h2 /
Ricky2001
@ -488,24 +862,24 @@ ROM_START( mototour )
ROM_REGION( 0x8000, "irem_audio:iremsound", 0 )
ROM_LOAD( "snd.a1", 0x7000, 0x1000, CRC(a02ad8a0) SHA1(aff80b506dbecabed2a36eb743693940f6a22d16) ) // == mr10.1a
ROM_REGION( 0x06000, "gfx1", 0 )
ROM_REGION( 0x06000, "tiles", 0 )
ROM_LOAD( "mt1-1.e3", 0x0000, 0x2000, CRC(aa8994dd) SHA1(9b326ce52a03d723e5c3c1b5fd4aa8fa7f70f904) ) // == zippyrac.001
ROM_LOAD( "mt1-2.c3", 0x2000, 0x2000, CRC(3a046dd1) SHA1(65c1dd1c0b5fb72ac5c04e11a577308245e4b312) ) // == mr8.3c
ROM_LOAD( "mt1-3.a3", 0x4000, 0x2000, CRC(1cc3d3f4) SHA1(e7ee365d43d783cb6b7df37c6edeadbed35318d9) ) // == mr9.3a
ROM_REGION( 0x06000, "gfx2", 0 )
ROM_LOAD( "mt1-8..n3", 0x0000, 0x2000, CRC(600a57f5) SHA1(86c2b2efb9392b7eca44510587d2459388c40435) )
ROM_LOAD( "mt1-9..m3", 0x2000, 0x2000, CRC(6f9f2a4e) SHA1(8ebdd69895a4dd5de7fe84505359cccaa0aca6f8) )
ROM_LOAD( "mt1-10..k3", 0x4000, 0x2000, CRC(d958def5) SHA1(198adf7e87804bd018b8cfa8bbc68623255698a2) )
ROM_REGION( 0x06000, "sprites", 0 )
ROM_LOAD( "mt1-8.n3", 0x0000, 0x2000, CRC(600a57f5) SHA1(86c2b2efb9392b7eca44510587d2459388c40435) )
ROM_LOAD( "mt1-9.m3", 0x2000, 0x2000, CRC(6f9f2a4e) SHA1(8ebdd69895a4dd5de7fe84505359cccaa0aca6f8) )
ROM_LOAD( "mt1-10.k3", 0x4000, 0x2000, CRC(d958def5) SHA1(198adf7e87804bd018b8cfa8bbc68623255698a2) )
ROM_REGION( 0x0320, "proms", 0 )
ROM_LOAD( "mmi6349.k2", 0x0000, 0x0200, CRC(c9724350) SHA1(1fac20cdc0a53d94e8f67b49d7dd71d1b9f1f7ef) ) /* character palette - last $100 are unused */ // == mmi6349.ij
ROM_LOAD( "prom1.f1", 0x0200, 0x0020, CRC(a1130007) SHA1(9deb0eed75dd06e86f83c819a3393158be7c9dce) ) /* sprite palette */ // == tbp18s.2
ROM_LOAD( "prom2.h2", 0x0220, 0x0100, CRC(76062638) SHA1(7378a26cf455d9d3df90929dc665870514c34b54) ) /* sprite lookup table */ // == tbp24s10.3
ROM_LOAD( "mmi6349.k2", 0x0000, 0x0200, CRC(c9724350) SHA1(1fac20cdc0a53d94e8f67b49d7dd71d1b9f1f7ef) ) // character palette - last $100 are unused // == mmi6349.ij
ROM_LOAD( "prom1.f1", 0x0200, 0x0020, CRC(a1130007) SHA1(9deb0eed75dd06e86f83c819a3393158be7c9dce) ) // sprite palette // == tbp18s.2
ROM_LOAD( "prom2.h2", 0x0220, 0x0100, CRC(76062638) SHA1(7378a26cf455d9d3df90929dc665870514c34b54) ) // sprite lookup table // == tbp24s10.3
ROM_END
/* it's probably a bootleg of the original Seibu version with the roms decrypted (no epoxy block) */
// it's probably a bootleg of the original Seibu version with the ROMs decrypted (no epoxy block)
ROM_START( shtrider )
ROM_REGION( 0x10000, "maincpu", 0 )
ROM_LOAD( "sr01a.bin", 0x0000, 0x2000, CRC(de76d537) SHA1(5ad90571c451b0d7b7a569556cfe075ead00fa2b) )
@ -516,12 +890,12 @@ ROM_START( shtrider )
ROM_REGION( 0x8000, "irem_audio:iremsound", 0 )
ROM_LOAD( "sr11a.bin", 0x6000, 0x2000, CRC(a8396b76) SHA1(614151fb1d25930e9fee4ab290a63f8fe97adbe6) )
ROM_REGION( 0x06000, "gfx1", 0 )
ROM_REGION( 0x06000, "tiles", 0 )
ROM_LOAD( "sr05a.bin", 0x0000, 0x2000, CRC(34449f79) SHA1(30aa9da07bf32282d213f63e50c564a336fd0102) )
ROM_LOAD( "sr06a.bin", 0x2000, 0x2000, CRC(de43653d) SHA1(a9fae236ee8e32d576123a4871ba3c46ca78ec3b) )
ROM_LOAD( "sr07a.bin", 0x4000, 0x2000, CRC(3445b81c) SHA1(6768d411f8c3a347b10908e757a701d5b71ca2bc) )
ROM_REGION( 0x06000, "gfx2", 0 )
ROM_REGION( 0x06000, "sprites", 0 )
ROM_LOAD( "sr08a.bin", 0x0000, 0x2000, CRC(4072b096) SHA1(e43482ac916a0fa259f74f99dc6ef72e86c23d9d) )
ROM_LOAD( "sr09a.bin", 0x2000, 0x2000, CRC(fd4cc7e6) SHA1(3852883d32354e8c90c6cf701581ebc57d830c8b) )
ROM_LOAD( "sr10b.bin", 0x4000, 0x2000, CRC(0a117925) SHA1(e061254428874b6153c2e9e514122373395f4da1) )
@ -535,7 +909,7 @@ ROM_END
ROM_START( shtridera )
ROM_REGION( 0x10000, "maincpu", 0 )
ROM_LOAD( "1.bin", 0x0000, 0x2000, CRC(eb51315c) SHA1(0101c008b6731cd8ec796fee645113e2be79bd08) ) /* was inside epoxy block with cpu, encrypted */
ROM_LOAD( "1.bin", 0x0000, 0x2000, CRC(eb51315c) SHA1(0101c008b6731cd8ec796fee645113e2be79bd08) ) // was inside epoxy block with CPU, encrypted
ROM_LOAD( "2.bin", 0x2000, 0x2000, CRC(97675d19) SHA1(774ce4d370fcbbd8a4109df023bf21db92d2e839) )
ROM_LOAD( "3.bin", 0x4000, 0x2000, CRC(78d051cd) SHA1(e1dc2dcfc4af35bdd5245d23977e8640d81a43f1) )
ROM_LOAD( "4.bin", 0x6000, 0x2000, CRC(02b96eaa) SHA1(ba4d61cf57142192684c45dd22720234d3521241) )
@ -543,12 +917,12 @@ ROM_START( shtridera )
ROM_REGION( 0x8000, "irem_audio:iremsound", 0 )
ROM_LOAD( "11.bin", 0x6000, 0x2000, CRC(a8396b76) SHA1(614151fb1d25930e9fee4ab290a63f8fe97adbe6) )
ROM_REGION( 0x06000, "gfx1", 0 )
ROM_REGION( 0x06000, "tiles", 0 )
ROM_LOAD( "5.bin", 0x0000, 0x2000, CRC(34449f79) SHA1(30aa9da07bf32282d213f63e50c564a336fd0102) )
ROM_LOAD( "6.bin", 0x2000, 0x2000, CRC(de43653d) SHA1(a9fae236ee8e32d576123a4871ba3c46ca78ec3b) )
ROM_LOAD( "7.bin", 0x4000, 0x2000, CRC(3445b81c) SHA1(6768d411f8c3a347b10908e757a701d5b71ca2bc) )
ROM_REGION( 0x06000, "gfx2", 0 )
ROM_REGION( 0x06000, "sprites", 0 )
ROM_LOAD( "8.bin", 0x0000, 0x2000, CRC(4072b096) SHA1(e43482ac916a0fa259f74f99dc6ef72e86c23d9d) )
ROM_LOAD( "9.bin", 0x2000, 0x2000, CRC(fd4cc7e6) SHA1(3852883d32354e8c90c6cf701581ebc57d830c8b) )
ROM_LOAD( "10.bin", 0x4000, 0x2000, CRC(0a117925) SHA1(e061254428874b6153c2e9e514122373395f4da1) )
@ -570,12 +944,12 @@ ROM_START( shtriderb )
ROM_REGION( 0x8000, "irem_audio:iremsound", 0 )
ROM_LOAD( "sr11.7.a1", 0x6000, 0x2000, CRC(a8396b76) SHA1(614151fb1d25930e9fee4ab290a63f8fe97adbe6) )
ROM_REGION( 0x06000, "gfx1", 0 )
ROM_REGION( 0x06000, "tiles", 0 )
ROM_LOAD( "sr5.f3", 0x0000, 0x2000, CRC(34449f79) SHA1(30aa9da07bf32282d213f63e50c564a336fd0102) )
ROM_LOAD( "sr6.c3", 0x2000, 0x2000, CRC(de43653d) SHA1(a9fae236ee8e32d576123a4871ba3c46ca78ec3b) )
ROM_LOAD( "sr7.a3", 0x4000, 0x2000, CRC(3445b81c) SHA1(6768d411f8c3a347b10908e757a701d5b71ca2bc) )
ROM_REGION( 0x06000, "gfx2", 0 )
ROM_REGION( 0x06000, "sprites", 0 )
ROM_LOAD( "sr8.17.n3", 0x0000, 0x2000, CRC(4072b096) SHA1(e43482ac916a0fa259f74f99dc6ef72e86c23d9d) )
ROM_LOAD( "sr9.18.m3", 0x2000, 0x2000, CRC(fd4cc7e6) SHA1(3852883d32354e8c90c6cf701581ebc57d830c8b))
ROM_LOAD( "sr10.19.k3",0x4000, 0x2000, CRC(0a117925) SHA1(e061254428874b6153c2e9e514122373395f4da1) )
@ -592,11 +966,11 @@ void travrusa_state::init_motorace()
uint8_t buffer[0x2000];
memcpy(&buffer[0], rom, 0x2000);
/* The first CPU ROM has the address and data lines scrambled */
// The first CPU ROM has the address and data lines scrambled
for (int A = 0; A < 0x2000; A++)
{
int j = bitswap<16>(A,15,14,13,9,7,5,3,1,12,10,8,6,4,2,0,11);
rom[j] = bitswap<8>(buffer[A],2,7,4,1,6,3,0,5);
int j = bitswap<16>(A, 15, 14, 13, 9, 7, 5, 3, 1, 12, 10, 8, 6, 4, 2, 0, 11);
rom[j] = bitswap<8>(buffer[A], 2, 7, 4, 1, 6, 3, 0, 5);
}
}
@ -604,31 +978,27 @@ void travrusa_state::init_shtridra()
{
uint8_t *rom = memregion("maincpu")->base();
/* D3/D4 and D5/D6 swapped */
// D3/D4 and D5/D6 swapped
for (int A = 0; A < 0x2000; A++)
rom[A] = bitswap<8>(rom[A],7,5,6,3,4,2,1,0);
rom[A] = bitswap<8>(rom[A],7 ,5, 6, 3, 4, 2, 1, 0);
}
uint8_t travrusa_state::shtridrb_port11_r()
uint8_t travrusa_state::shtriderb_port11_r()
{
printf("shtridrb_port11_r %04x\n", m_maincpu->pc());
logerror("shtriderb_port11_r %04x\n", m_maincpu->pc());
// reads, masks with 0xa8, checks for 0x88, resets game if not happy with value?
return 0x88;
}
void travrusa_state::init_shtridrb()
{
m_maincpu->space(AS_IO).install_read_handler(0x11, 0x11, 0, 0xff00, 0, read8smo_delegate(*this, FUNC(travrusa_state::shtridrb_port11_r)));
}
} // anonymous namespace
GAME( 1983, travrusa, 0, travrusa, travrusa, travrusa_state, empty_init, ROT270, "Irem", "Traverse USA / Zippy Race", MACHINE_SUPPORTS_SAVE )
GAME( 1983, travrusab, travrusa, travrusa, travrusa, travrusa_state, empty_init, ROT270, "bootleg (I.P.)", "Traverse USA (bootleg, set 1)", MACHINE_SUPPORTS_SAVE )
GAME( 1983, travrusab2, travrusa, travrusa, travrusa, travrusa_state, empty_init, ROT270, "bootleg", "Traverse USA (bootleg, set 2)", MACHINE_SUPPORTS_SAVE ) // still shows both Irem and Tecfri
GAME( 1983, mototour, travrusa, travrusa, travrusa, travrusa_state, empty_init, ROT270, "Irem (Tecfri license)", "MotoTour / Zippy Race (Tecfri license)", MACHINE_SUPPORTS_SAVE )
GAME( 1983, motorace, travrusa, travrusa, motorace, travrusa_state, init_motorace, ROT270, "Irem (Williams license)", "MotoRace USA", MACHINE_SUPPORTS_SAVE )
GAME( 1983, travrusa, 0, travrusa, travrusa, travrusa_state, empty_init, ROT270, "Irem", "Traverse USA / Zippy Race", MACHINE_SUPPORTS_SAVE )
GAME( 1983, travrusab, travrusa, travrusa, travrusa, travrusa_state, empty_init, ROT270, "bootleg (I.P.)", "Traverse USA (bootleg, set 1)", MACHINE_SUPPORTS_SAVE )
GAME( 1983, travrusab2, travrusa, travrusa, travrusa, travrusa_state, empty_init, ROT270, "bootleg", "Traverse USA (bootleg, set 2)", MACHINE_SUPPORTS_SAVE ) // still shows both Irem and Tecfri
GAME( 1983, mototour, travrusa, travrusa, travrusa, travrusa_state, empty_init, ROT270, "Irem (Tecfri license)", "MotoTour / Zippy Race (Tecfri license)", MACHINE_SUPPORTS_SAVE )
GAME( 1983, motorace, travrusa, travrusa, motorace, travrusa_state, init_motorace, ROT270, "Irem (Williams license)", "MotoRace USA", MACHINE_SUPPORTS_SAVE )
GAME( 1985, shtrider, 0, shtrider, shtrider, travrusa_state, empty_init, ROT270|ORIENTATION_FLIP_X, "Seibu Kaihatsu", "Shot Rider", MACHINE_SUPPORTS_SAVE ) // possible bootleg
GAME( 1984, shtridera, shtrider, shtrider, shtrider, travrusa_state, init_shtridra, ROT270|ORIENTATION_FLIP_X, "Seibu Kaihatsu (Sigma license)", "Shot Rider (Sigma license)", MACHINE_SUPPORTS_SAVE )
GAME( 1985, shtriderb, shtrider, shtriderb,shtrider, travrusa_state, init_shtridrb, ROT270|ORIENTATION_FLIP_X, "bootleg", "Shot Rider (bootleg)", MACHINE_SUPPORTS_SAVE ) // resets when you attempt to start a game?
GAME( 1985, shtrider, 0, shtrider, shtrider, travrusa_state, empty_init, ROT270 | ORIENTATION_FLIP_X, "Seibu Kaihatsu", "Shot Rider", MACHINE_SUPPORTS_SAVE ) // possible bootleg
GAME( 1984, shtridera, shtrider, shtrider, shtrider, travrusa_state, init_shtridra, ROT270 | ORIENTATION_FLIP_X, "Seibu Kaihatsu (Sigma license)", "Shot Rider (Sigma license)", MACHINE_SUPPORTS_SAVE )
GAME( 1985, shtriderb, shtrider, shtriderb, shtrider, travrusa_state, empty_init, ROT270 | ORIENTATION_FLIP_X, "bootleg", "Shot Rider (bootleg)", MACHINE_SUPPORTS_SAVE )

View File

@ -1,60 +0,0 @@
// license:BSD-3-Clause
// copyright-holders:Lee Taylor
// thanks-to:John Clegg,Tomasz Slanina
#ifndef MAME_IREM_TRAVRUSA_H
#define MAME_IREM_TRAVRUSA_H
#pragma once
#include "emupal.h"
#include "tilemap.h"
class travrusa_state : public driver_device
{
public:
travrusa_state(const machine_config &mconfig, device_type type, const char *tag) :
driver_device(mconfig, type, tag),
m_videoram(*this, "videoram"),
m_spriteram(*this, "spriteram"),
m_maincpu(*this, "maincpu"),
m_gfxdecode(*this, "gfxdecode"),
m_palette(*this, "palette")
{ }
void shtrider(machine_config &config);
void travrusa(machine_config &config);
void shtriderb(machine_config &config);
void init_shtridra();
void init_motorace();
void init_shtridrb();
private:
/* memory pointers */
required_shared_ptr<uint8_t> m_videoram;
required_shared_ptr<uint8_t> m_spriteram;
/* video-related */
tilemap_t* m_bg_tilemap = nullptr;
int m_scrollx[2]{};
void travrusa_videoram_w(offs_t offset, uint8_t data);
void travrusa_scroll_x_low_w(uint8_t data);
void travrusa_scroll_x_high_w(uint8_t data);
void travrusa_flipscreen_w(uint8_t data);
uint8_t shtridrb_port11_r();
TILE_GET_INFO_MEMBER(get_tile_info);
virtual void machine_reset() override;
virtual void video_start() override;
void travrusa_palette(palette_device &palette) const;
void shtrider_palette(palette_device &palette) const;
uint32_t screen_update_travrusa(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
void set_scroll();
void draw_sprites(bitmap_ind16 &bitmap,const rectangle &cliprect);
required_device<cpu_device> m_maincpu;
required_device<gfxdecode_device> m_gfxdecode;
required_device<palette_device> m_palette;
void main_map(address_map &map);
};
#endif // MAME_IREM_TRAVRUSA_H

View File

@ -1,325 +0,0 @@
// license:BSD-3-Clause
// copyright-holders:Lee Taylor
// thanks-to:John Clegg,Tomasz Slanina
/***************************************************************************
video.c
Traverse USA
L Taylor
J Clegg
Functions to emulate the video hardware of the machine.
***************************************************************************/
#include "emu.h"
#include "travrusa.h"
/***************************************************************************
Convert the color PROMs into a more useable format.
Traverse USA has one 256x8 character palette PROM (some versions have two
256x4), one 32x8 sprite palette PROM, and one 256x4 sprite color lookup
table PROM.
I don't know for sure how the palette PROMs are connected to the RGB
output, but it's probably something like this; note that RED and BLUE
are swapped wrt the usual configuration.
bit 7 -- 220 ohm resistor -- RED
-- 470 ohm resistor -- RED
-- 220 ohm resistor -- GREEN
-- 470 ohm resistor -- GREEN
-- 1 kohm resistor -- GREEN
-- 220 ohm resistor -- BLUE
-- 470 ohm resistor -- BLUE
bit 0 -- 1 kohm resistor -- BLUE
***************************************************************************/
void travrusa_state::travrusa_palette(palette_device &palette) const
{
const uint8_t *color_prom = memregion("proms")->base();
// create a lookup table for the palette
for (int i = 0; i < 0x80; i++)
{
int bit0, bit1, bit2;
// red component
bit0 = 0;
bit1 = BIT(color_prom[i], 6);
bit2 = BIT(color_prom[i], 7);
int const r = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2;
// green component
bit0 = BIT(color_prom[i], 3);
bit1 = BIT(color_prom[i], 4);
bit2 = BIT(color_prom[i], 5);
int const g = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2;
// blue component
bit0 = BIT(color_prom[i], 0);
bit1 = BIT(color_prom[i], 1);
bit2 = BIT(color_prom[i], 2);
int const b = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2;
palette.set_indirect_color(i, rgb_t(r, g, b));
}
for (int i = 0x80; i < 0x90; i++)
{
int bit0, bit1, bit2;
// red component
bit0 = 0;
bit1 = BIT(color_prom[(i - 0x80) + 0x200], 6);
bit2 = BIT(color_prom[(i - 0x80) + 0x200], 7);
int const r = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2;
// green component
bit0 = BIT(color_prom[(i - 0x80) + 0x200], 3);
bit1 = BIT(color_prom[(i - 0x80) + 0x200], 4);
bit2 = BIT(color_prom[(i - 0x80) + 0x200], 5);
int const g = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2;
// blue component
bit0 = BIT(color_prom[(i - 0x80) + 0x200], 0);
bit1 = BIT(color_prom[(i - 0x80) + 0x200], 1);
bit2 = BIT(color_prom[(i - 0x80) + 0x200], 2);
int const b = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2;
palette.set_indirect_color(i, rgb_t(r, g, b));
}
// color_prom now points to the beginning of the lookup table
color_prom += 0x220;
// characters
for (int i = 0; i < 0x80; i++)
palette.set_pen_indirect(i, i);
// sprites
for (int i = 0x80; i < 0x100; i++)
{
uint8_t const ctabentry = (color_prom[i - 0x80] & 0x0f) | 0x80;
palette.set_pen_indirect(i, ctabentry);
}
}
void travrusa_state::shtrider_palette(palette_device &palette) const
{
const uint8_t *color_prom = memregion("proms")->base();
// create a lookup table for the palette
for (int i = 0; i < 0x80; i++)
{
int bit0, bit1, bit2;
// red component
bit0 = 0;
bit1 = BIT(color_prom[i + 0x000], 2);
bit2 = BIT(color_prom[i + 0x000], 3);
int const r = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2;
// green component
bit0 = BIT(color_prom[i + 0x100], 3);
bit1 = BIT(color_prom[i + 0x000], 0);
bit2 = BIT(color_prom[i + 0x000], 1);
int const g = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2;
// blue component
bit0 = BIT(color_prom[i + 0x100], 0);
bit1 = BIT(color_prom[i + 0x100], 1);
bit2 = BIT(color_prom[i + 0x100], 2);
int const b = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2;
palette.set_indirect_color(i, rgb_t(r, g, b));
}
for (int i = 0x80; i < 0x90; i++)
{
int bit0, bit1, bit2;
// red component
bit0 = 0;
bit1 = BIT(color_prom[(i - 0x80) + 0x200], 6);
bit2 = BIT(color_prom[(i - 0x80) + 0x200], 7);
int const r = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2;
// green component
bit0 = BIT(color_prom[(i - 0x80) + 0x200], 3);
bit1 = BIT(color_prom[(i - 0x80) + 0x200], 4);
bit2 = BIT(color_prom[(i - 0x80) + 0x200], 5);
int const g = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2;
// blue component
bit0 = BIT(color_prom[(i - 0x80) + 0x200], 0);
bit1 = BIT(color_prom[(i - 0x80) + 0x200], 1);
bit2 = BIT(color_prom[(i - 0x80) + 0x200], 2);
int const b = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2;
palette.set_indirect_color(i, rgb_t(r, g, b));
}
// color_prom now points to the beginning of the lookup table
color_prom += 0x220;
// characters
for (int i = 0; i < 0x80; i++)
palette.set_pen_indirect(i, i);
// sprites
for (int i = 0x80; i < 0x100; i++)
{
uint8_t const ctabentry = (color_prom[i - 0x80] & 0x0f) | 0x80;
palette.set_pen_indirect(i, ctabentry);
}
}
/***************************************************************************
Callbacks for the TileMap code
***************************************************************************/
TILE_GET_INFO_MEMBER(travrusa_state::get_tile_info)
{
uint8_t attr = m_videoram[2 * tile_index + 1];
int flags = TILE_FLIPXY((attr & 0x30) >> 4);
tileinfo.group = ((attr & 0x0f) == 0x0f) ? 1 : 0; /* tunnels */
tileinfo.set(0,
m_videoram[2 * tile_index] + ((attr & 0xc0) << 2),
attr & 0x0f,
flags);
}
/***************************************************************************
Start the video hardware emulation.
***************************************************************************/
void travrusa_state::video_start()
{
save_item(NAME(m_scrollx));
m_bg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(travrusa_state::get_tile_info)), TILEMAP_SCAN_ROWS, 8, 8, 64, 32);
m_bg_tilemap->set_transmask(0, 0xff, 0x00); /* split type 0 is totally transparent in front half */
m_bg_tilemap->set_transmask(1, 0x3f, 0xc0); /* split type 1 has pens 6 and 7 opaque - tunnels */
m_bg_tilemap->set_scroll_rows(4);
}
/***************************************************************************
Memory handlers
***************************************************************************/
void travrusa_state::travrusa_videoram_w(offs_t offset, uint8_t data)
{
m_videoram[offset] = data;
m_bg_tilemap->mark_tile_dirty(offset / 2);
}
void travrusa_state::set_scroll( )
{
int i;
for (i = 0; i <= 2; i++)
m_bg_tilemap->set_scrollx(i, m_scrollx[0] + 256 * m_scrollx[1]);
m_bg_tilemap->set_scrollx(3, 0);
}
void travrusa_state::travrusa_scroll_x_low_w(uint8_t data)
{
m_scrollx[0] = data;
set_scroll();
}
void travrusa_state::travrusa_scroll_x_high_w(uint8_t data)
{
m_scrollx[1] = data;
set_scroll();
}
void travrusa_state::travrusa_flipscreen_w(uint8_t data)
{
/* screen flip is handled both by software and hardware */
data ^= ~ioport("DSW2")->read() & 1;
flip_screen_set(data & 1);
machine().bookkeeping().coin_counter_w(0, data & 0x02);
machine().bookkeeping().coin_counter_w(1, data & 0x20);
}
/***************************************************************************
Display refresh
***************************************************************************/
void travrusa_state::draw_sprites(bitmap_ind16 &bitmap,const rectangle &cliprect)
{
int offs;
const rectangle spritevisiblearea(1*8, 31*8-1, 0*8, 24*8-1);
const rectangle spritevisibleareaflip(1*8, 31*8-1, 8*8, 32*8-1);
rectangle clip = cliprect;
if (flip_screen())
clip &= spritevisibleareaflip;
else
clip &= spritevisiblearea;
for (offs = m_spriteram.bytes() - 4; offs >= 0; offs -= 4)
{
int sx = ((m_spriteram[offs + 3] + 8) & 0xff) - 8;
int sy = 240 - m_spriteram[offs];
int code = m_spriteram[offs + 2];
int attr = m_spriteram[offs + 1];
int flipx = attr & 0x40;
int flipy = attr & 0x80;
if (flip_screen())
{
sx = 240 - sx;
sy = 240 - sy;
flipx = !flipx;
flipy = !flipy;
}
m_gfxdecode->gfx(1)->transpen(bitmap,clip,
code,
attr & 0x0f,
flipx, flipy,
sx, sy, 0);
}
}
uint32_t travrusa_state::screen_update_travrusa(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
m_bg_tilemap->draw(screen, bitmap, cliprect, TILEMAP_DRAW_LAYER1, 0);
draw_sprites(bitmap,cliprect);
m_bg_tilemap->draw(screen, bitmap, cliprect, TILEMAP_DRAW_LAYER0, 0);
return 0;
}

View File

@ -1394,6 +1394,13 @@ ROM_START( narc )
ROM_LOAD( "rev2_narc_image_rom_u27.u27", 0x6d0000, 0x10000, CRC(4d33bbec) SHA1(05a3bd66ff91c824e841ca3943585f6aa383c5c2) )
ROM_LOAD( "rev2_narc_image_rom_u26.u26", 0x6e0000, 0x10000, CRC(cb19f784) SHA1(1e4d85603c940e247fdc45f0366dfb484285e588) )
// U25 socket not populated
ROM_REGION( 0x500, "plds", ROMREGION_ERASE00 )
ROM_LOAD( "a-5346-3036-1_narc_pls153.u28", 0x000, 0x0eb, CRC(4db36615) SHA1(781d13af2735ad3da0c7594487e7f4e19b5f459f) )
ROM_LOAD( "a-5346-3036-2_narc_pls153.u78", 0x100, 0x0eb, CRC(4b151863) SHA1(0740c5fba978b9bb68a50472b57c0801c7591d6f) )
ROM_LOAD( "a-5346-3036-3_narc_pls153.u79", 0x200, 0x0eb, CRC(35bd6ed8) SHA1(98b4ad4f61d2f2013815fa79c3428a2d610c8a6f) )
ROM_LOAD( "a-5346-3036-4_narc_pls153.u80", 0x300, 0x0eb, CRC(9c10e4cf) SHA1(77d0a6a6e19e2f5b17e9356459215e5452247be3) )
ROM_LOAD( "a-5346-3036-5_narc_pls153.u83", 0x400, 0x0eb, CRC(3a2f21b2) SHA1(bafc45b8b0e83d044bc4963abbdbbf4b6da1694b) )
ROM_END
@ -1500,6 +1507,13 @@ ROM_START( narc6 )
ROM_LOAD( "rev2_narc_image_rom_u27.u27", 0x6d0000, 0x10000, CRC(4d33bbec) SHA1(05a3bd66ff91c824e841ca3943585f6aa383c5c2) )
ROM_LOAD( "rev2_narc_image_rom_u26.u26", 0x6e0000, 0x10000, CRC(cb19f784) SHA1(1e4d85603c940e247fdc45f0366dfb484285e588) )
// U25 socket not populated
ROM_REGION( 0x500, "plds", ROMREGION_ERASE00 )
ROM_LOAD( "a-5346-3036-1_narc_pls153.u28", 0x000, 0x0eb, CRC(4db36615) SHA1(781d13af2735ad3da0c7594487e7f4e19b5f459f) )
ROM_LOAD( "a-5346-3036-2_narc_pls153.u78", 0x100, 0x0eb, CRC(4b151863) SHA1(0740c5fba978b9bb68a50472b57c0801c7591d6f) )
ROM_LOAD( "a-5346-3036-3_narc_pls153.u79", 0x200, 0x0eb, CRC(35bd6ed8) SHA1(98b4ad4f61d2f2013815fa79c3428a2d610c8a6f) )
ROM_LOAD( "a-5346-3036-4_narc_pls153.u80", 0x300, 0x0eb, CRC(9c10e4cf) SHA1(77d0a6a6e19e2f5b17e9356459215e5452247be3) )
ROM_LOAD( "a-5346-3036-5_narc_pls153.u83", 0x400, 0x0eb, CRC(3a2f21b2) SHA1(bafc45b8b0e83d044bc4963abbdbbf4b6da1694b) )
ROM_END
@ -1606,6 +1620,13 @@ ROM_START( narc4 )
ROM_LOAD( "rev2_narc_image_rom_u27.u27", 0x6d0000, 0x10000, CRC(4d33bbec) SHA1(05a3bd66ff91c824e841ca3943585f6aa383c5c2) )
ROM_LOAD( "rev2_narc_image_rom_u26.u26", 0x6e0000, 0x10000, CRC(cb19f784) SHA1(1e4d85603c940e247fdc45f0366dfb484285e588) )
// U25 socket not populated
ROM_REGION( 0x500, "plds", ROMREGION_ERASE00 )
ROM_LOAD( "a-5346-3036-1_narc_pls153.u28", 0x000, 0x0eb, CRC(4db36615) SHA1(781d13af2735ad3da0c7594487e7f4e19b5f459f) )
ROM_LOAD( "a-5346-3036-2_narc_pls153.u78", 0x100, 0x0eb, CRC(4b151863) SHA1(0740c5fba978b9bb68a50472b57c0801c7591d6f) )
ROM_LOAD( "a-5346-3036-3_narc_pls153.u79", 0x200, 0x0eb, CRC(35bd6ed8) SHA1(98b4ad4f61d2f2013815fa79c3428a2d610c8a6f) )
ROM_LOAD( "a-5346-3036-4_narc_pls153.u80", 0x300, 0x0eb, CRC(9c10e4cf) SHA1(77d0a6a6e19e2f5b17e9356459215e5452247be3) )
ROM_LOAD( "a-5346-3036-5_narc_pls153.u83", 0x400, 0x0eb, CRC(3a2f21b2) SHA1(bafc45b8b0e83d044bc4963abbdbbf4b6da1694b) )
ROM_END
@ -1712,6 +1733,13 @@ ROM_START( narc3 )
ROM_LOAD( "rev2_narc_image_rom_u27.u27", 0x6d0000, 0x10000, CRC(4d33bbec) SHA1(05a3bd66ff91c824e841ca3943585f6aa383c5c2) )
ROM_LOAD( "rev2_narc_image_rom_u26.u26", 0x6e0000, 0x10000, CRC(cb19f784) SHA1(1e4d85603c940e247fdc45f0366dfb484285e588) )
// U25 socket not populated
ROM_REGION( 0x500, "plds", ROMREGION_ERASE00 )
ROM_LOAD( "a-5346-3036-1_narc_pls153.u28", 0x000, 0x0eb, CRC(4db36615) SHA1(781d13af2735ad3da0c7594487e7f4e19b5f459f) )
ROM_LOAD( "a-5346-3036-2_narc_pls153.u78", 0x100, 0x0eb, CRC(4b151863) SHA1(0740c5fba978b9bb68a50472b57c0801c7591d6f) )
ROM_LOAD( "a-5346-3036-3_narc_pls153.u79", 0x200, 0x0eb, CRC(35bd6ed8) SHA1(98b4ad4f61d2f2013815fa79c3428a2d610c8a6f) )
ROM_LOAD( "a-5346-3036-4_narc_pls153.u80", 0x300, 0x0eb, CRC(9c10e4cf) SHA1(77d0a6a6e19e2f5b17e9356459215e5452247be3) )
ROM_LOAD( "a-5346-3036-5_narc_pls153.u83", 0x400, 0x0eb, CRC(3a2f21b2) SHA1(bafc45b8b0e83d044bc4963abbdbbf4b6da1694b) )
ROM_END
@ -1818,6 +1846,13 @@ ROM_START( narc2 )
ROM_LOAD( "rev2_narc_image_rom_u27.u27", 0x6d0000, 0x10000, CRC(4d33bbec) SHA1(05a3bd66ff91c824e841ca3943585f6aa383c5c2) )
ROM_LOAD( "rev2_narc_image_rom_u26.u26", 0x6e0000, 0x10000, CRC(cb19f784) SHA1(1e4d85603c940e247fdc45f0366dfb484285e588) )
// U25 socket not populated
ROM_REGION( 0x500, "plds", ROMREGION_ERASE00 )
ROM_LOAD( "a-5346-3036-1_narc_pls153.u28", 0x000, 0x0eb, CRC(4db36615) SHA1(781d13af2735ad3da0c7594487e7f4e19b5f459f) )
ROM_LOAD( "a-5346-3036-2_narc_pls153.u78", 0x100, 0x0eb, CRC(4b151863) SHA1(0740c5fba978b9bb68a50472b57c0801c7591d6f) )
ROM_LOAD( "a-5346-3036-3_narc_pls153.u79", 0x200, 0x0eb, CRC(35bd6ed8) SHA1(98b4ad4f61d2f2013815fa79c3428a2d610c8a6f) )
ROM_LOAD( "a-5346-3036-4_narc_pls153.u80", 0x300, 0x0eb, CRC(9c10e4cf) SHA1(77d0a6a6e19e2f5b17e9356459215e5452247be3) )
ROM_LOAD( "a-5346-3036-5_narc_pls153.u83", 0x400, 0x0eb, CRC(3a2f21b2) SHA1(bafc45b8b0e83d044bc4963abbdbbf4b6da1694b) )
ROM_END
@ -1909,6 +1944,13 @@ ROM_START( narc1 )
ROM_LOAD( "rev1_narc_image_rom_u28.u28", 0x6c0000, 0x10000, CRC(3012cd6e) SHA1(670ade7b46b3232a0d3c5fea2ab25f8af7664a4e) )
ROM_LOAD( "rev1_narc_image_rom_u27.u27", 0x6d0000, 0x10000, CRC(e631fe7d) SHA1(e952418f23939e169dd8aa666ad3564e810c9554) )
// U26 & U25 sockets not populated
ROM_REGION( 0x500, "plds", ROMREGION_ERASE00 )
ROM_LOAD( "a-5346-3036-1_narc_pls153.u28", 0x000, 0x0eb, CRC(4db36615) SHA1(781d13af2735ad3da0c7594487e7f4e19b5f459f) )
ROM_LOAD( "a-5346-3036-2_narc_pls153.u78", 0x100, 0x0eb, CRC(4b151863) SHA1(0740c5fba978b9bb68a50472b57c0801c7591d6f) )
ROM_LOAD( "a-5346-3036-3_narc_pls153.u79", 0x200, 0x0eb, CRC(35bd6ed8) SHA1(98b4ad4f61d2f2013815fa79c3428a2d610c8a6f) )
ROM_LOAD( "a-5346-3036-4_narc_pls153.u80", 0x300, 0x0eb, CRC(9c10e4cf) SHA1(77d0a6a6e19e2f5b17e9356459215e5452247be3) )
ROM_LOAD( "a-5346-3036-5_narc_pls153.u83", 0x400, 0x0eb, CRC(3a2f21b2) SHA1(bafc45b8b0e83d044bc4963abbdbbf4b6da1694b) )
ROM_END

View File

@ -635,6 +635,24 @@ ROM_START(bguns_p1)
ROM_RELOAD(0x38000,0x8000)
ROM_END
ROM_START(bguns_p1a)
ROM_REGION(0x10000, "maincpu", 0)
ROM_LOAD("bigguns_u26_rom-2_lgx.bin", 0x4000, 0x4000, CRC(d75ca79d) SHA1(6d185cda4c62bf1cae0448c89b4f93a90aed855c))
ROM_LOAD("bigguns_u27_rom-1_lgx.bin", 0x8000, 0x8000, CRC(2fba9a0d) SHA1(16629a5f009865825207378118a147e3135c51cf))
ROM_REGION(0x10000, "audiocpu", ROMREGION_ERASEFF)
ROM_LOAD("guns_u21.l1", 0x8000, 0x8000, CRC(35c6bfe4) SHA1(83dbd10311add75f56046de58d315f8a87389703))
ROM_LOAD("guns_u22.l1", 0x0000, 0x8000, CRC(091a5cb8) SHA1(db77314241eb6ed7f4385f99312a49b7caad1283))
ROM_REGION(0x80000, "bg:cpu", ROMREGION_ERASEFF)
ROM_LOAD("gund_u4.l1", 0x00000, 0x8000, CRC(d4a430a3) SHA1(5b44e3f313cc7cb75f51c239013d46e5eb986f9d))
ROM_RELOAD(0x08000,0x8000)
ROM_RELOAD(0x10000,0x8000)
ROM_RELOAD(0x18000,0x8000)
ROM_LOAD("guns_u19.l1", 0x20000, 0x8000, CRC(ec1a6c23) SHA1(45bb4f78b89de9e690b5f9741d17f97766e702d6))
ROM_RELOAD(0x28000,0x8000)
ROM_RELOAD(0x30000,0x8000)
ROM_RELOAD(0x38000,0x8000)
ROM_END
/*------------------------------
/ Black Knight 2000 6/89 (#563)
/------------------------------*/
@ -1621,6 +1639,7 @@ GAME(1987, bguns_l8, 0, s11b, s11b, s11b_state, init_s11bnn, R
GAME(1987, bguns_l7, bguns_l8, s11b, s11b, s11b_state, init_s11bnn, ROT0, "Williams", "Big Guns (L-7)", MACHINE_MECHANICAL | MACHINE_SUPPORTS_SAVE )
GAME(1987, bguns_la, bguns_l8, s11b, s11b, s11b_state, init_s11bnn, ROT0, "Williams", "Big Guns (L-A)", MACHINE_MECHANICAL | MACHINE_SUPPORTS_SAVE )
GAME(1987, bguns_p1, bguns_l8, s11b, s11b, s11b_state, init_s11bnn, ROT0, "Williams", "Big Guns (P-1)", MACHINE_MECHANICAL | MACHINE_SUPPORTS_SAVE )
GAME(1987, bguns_p1a, bguns_l8, s11b, s11b, s11b_state, init_s11bnn, ROT0, "Williams", "Big Guns (P-1, alternate set)", MACHINE_MECHANICAL | MACHINE_SUPPORTS_SAVE )
GAME(1989, bk2k_l4, 0, s11b, s11b, s11b_state, init_s11bin, ROT0, "Williams", "Black Knight 2000 (L-4)", MACHINE_IS_SKELETON_MECHANICAL | MACHINE_SUPPORTS_SAVE )
GAME(1989, bk2k_lg1, bk2k_l4, s11b, s11b, s11b_state, init_s11bin, ROT0, "Williams", "Black Knight 2000 (LG-1)", MACHINE_IS_SKELETON_MECHANICAL | MACHINE_SUPPORTS_SAVE )
GAME(1989, bk2k_lg3, bk2k_l4, s11b, s11b, s11b_state, init_s11bin, ROT0, "Williams", "Black Knight 2000 (LG-3)", MACHINE_IS_SKELETON_MECHANICAL | MACHINE_SUPPORTS_SAVE )