Re-worked System 18 Alien Storm bootlegs, put in their own driver to study. (#8212)

This renders the tile strip backgrounds, making them a lot more playable.
This commit is contained in:
David Haywood 2021-06-23 14:31:30 +01:00 committed by GitHub
parent d032a81a3d
commit b0628a92ec
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 774 additions and 209 deletions

View File

@ -3616,6 +3616,7 @@ files {
MAME_DIR .. "src/mame/drivers/segas18.cpp",
MAME_DIR .. "src/mame/includes/segas18.h",
MAME_DIR .. "src/mame/video/segas18.cpp",
MAME_DIR .. "src/mame/drivers/segas18_astormbl.cpp",
MAME_DIR .. "src/mame/drivers/segas24.cpp",
MAME_DIR .. "src/mame/includes/segas24.h",
MAME_DIR .. "src/mame/video/segas24.cpp",

View File

@ -1124,6 +1124,7 @@ segaorun.cpp
segas16a.cpp
segas16b.cpp
segas18.cpp
segas18_astormbl.cpp
segas24.cpp
segas32.cpp
segasp.cpp

View File

@ -0,0 +1,760 @@
// license:BSD-3-Clause
// copyright-holders:David Haywood
/*
Alien Storm 'System 18' bootlegs
these have extensively reworked 68000 code to handle the modified hardware
Noteworthy features
- no VDP
(so no backgrounds in gallary stages, some enemies removed from first stage)
- completely reworked background 'tilemaps'
(regular page registers not used, instead there's a new 'row list' defining page and scroll per row)
- less capable sound system
(only hooked up for astormb2 set, astormbl set is using original sound, which might not be correct)
Issues
- title screen vanishes as soon as it appears (it's in the wrong half of 'tilemap' pages?)
does this happen on hardware? swapping them causes issues ingame instead, currently a kludge is used to only swap one layer
- some stuck parts in the gallery stages
again, does this happen on hardware? fixed with same kludge as above?
- there are 'bad' pixels near the shadows on some player sprites, but these differences in the GFX ROMs have been found on
more than 1 PCB, does the bootleg hardware need them for some purpose?
- the 'Action' 'Destroy' and 'Run' screens don't display properly in attract, this also seems to be related to how
the bootleg is remapping the tilemap pages and needs checking against the bootleg hardware.
- "Press Start" doesn't flash after inserting a credit, nor does the number of credits display
again this should be verified against the bootleg hardware
Currently the modified background tilemaps are not handled with the tilemap system, as some of the changes make them much more
difficult to fit into the tilemap system. This might be reconsidered later.
TODO:
tidy up + optimized video code, decide if using tilemaps is cleaner or not
verify glitches etc. against bootleg hardware
convert system18 / bootleg OKI sound system to devices to share with other drivers
*/
#include "emu.h"
#include "video/segaic16.h"
#include "video/sega16sp.h"
#include "cpu/m68000/m68000.h"
#include "cpu/z80/z80.h"
#include "machine/gen_latch.h"
#include "sound/okim6295.h"
#include "sound/rf5c68.h"
#include "sound/ymopn.h"
#include "screen.h"
#include "speaker.h"
namespace {
class segas18_astormbl_state : public sega_16bit_common_base
{
protected:
segas18_astormbl_state(const machine_config &mconfig, device_type type, const char *tag)
: sega_16bit_common_base(mconfig, type, tag)
, m_maincpu(*this, "maincpu")
, m_screen(*this, "screen")
, m_gfxdecode(*this, "gfxdecode")
, m_sprites(*this, "sprites")
, m_textram(*this, "textram")
, m_tileram(*this, "tileram")
, m_tilestripconfig(*this, "tilestripconfig")
, m_tileenable(*this, "tileenable")
, m_tileyscroll1(*this, "tileyscroll1")
, m_tileyscroll0(*this, "tileyscroll0")
{ }
uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
virtual void video_start() override;
virtual void sound_w(offs_t offset, uint16_t data, uint16_t mem_mask) = 0;
void astormbl_video(machine_config &config);
void astormbl_map(address_map &map);
required_device<cpu_device> m_maincpu;
private:
void draw_tile(screen_device& screen, bitmap_ind16& bitmap, const rectangle &cliprect, int tilenum, int colour, int xpos, int ypos, uint8_t pri, int transpen, bool opaque);
void draw_layer(screen_device& screen, bitmap_ind16& bitmap, const rectangle &cliprect, int layer, bool opaque, int pri0, int pri1);
void sys16_textram_w(offs_t offset, uint16_t data, uint16_t mem_mask);
TILE_GET_INFO_MEMBER(get_text_tile_info);
tilemap_t *m_text_layer = nullptr;
required_device<screen_device> m_screen;
required_device<gfxdecode_device> m_gfxdecode;
required_device<sega_sys16b_sprite_device> m_sprites;
required_shared_ptr<uint16_t> m_textram;
required_shared_ptr<uint16_t> m_tileram;
required_shared_ptr<uint16_t> m_tilestripconfig;
required_shared_ptr<uint16_t> m_tileenable;
required_shared_ptr<uint16_t> m_tileyscroll1;
required_shared_ptr<uint16_t> m_tileyscroll0;
};
class segas18_astormbl_s18snd_state : public segas18_astormbl_state
{
public:
segas18_astormbl_s18snd_state(const machine_config &mconfig, device_type type, const char *tag)
: segas18_astormbl_state(mconfig, type, tag)
, m_soundcpu(*this, "soundcpu")
, m_soundbank(*this, "soundbank")
, m_soundlatch(*this, "soundlatch")
{ }
void astormbl(machine_config &config);
protected:
virtual void machine_start() override;
virtual void sound_w(offs_t offset, uint16_t data, uint16_t mem_mask) override;
private:
void sound_map(address_map &map);
void sound_portmap(address_map &map);
void pcm_map(address_map &map);
void soundbank_w(uint8_t data);
void astormbl_sound(machine_config &config);
required_device<cpu_device> m_soundcpu;
required_memory_bank m_soundbank;
required_device<generic_latch_8_device> m_soundlatch;
};
class segas18_astormbl_bootsnd_state : public segas18_astormbl_state
{
public:
segas18_astormbl_bootsnd_state(const machine_config &mconfig, device_type type, const char *tag)
: segas18_astormbl_state(mconfig, type, tag)
, m_soundcpu(*this, "soundcpu")
, m_soundlatch(*this, "soundlatch")
, m_okibank(*this, "okibank")
{ }
void astormb2(machine_config &config);
protected:
virtual void machine_start() override;
virtual void sound_w(offs_t offset, uint16_t data, uint16_t mem_mask) override;
private:
void sys18bl_okibank_w(uint8_t data);
void sys18bl_sound_map(address_map &map);
void sys18bl_oki_map(address_map &map);
void astormb2_sound(machine_config &config);
required_device<cpu_device> m_soundcpu;
required_device<generic_latch_8_device> m_soundlatch;
required_memory_bank m_okibank;
};
static INPUT_PORTS_START( astormbl )
PORT_START("P1")
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON1 )
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON2 )
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON3 )
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_SERVICE2 )
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_8WAY
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_8WAY
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY
PORT_START("P2")
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2)
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(2)
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(2)
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_SERVICE3 )
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_PLAYER(2)
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY PORT_PLAYER(2)
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_PLAYER(2)
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_PLAYER(2)
PORT_START("P3")
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(3)
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(3)
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(3)
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_SERVICE4 )
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_PLAYER(3)
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY PORT_PLAYER(3)
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_PLAYER(3)
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_PLAYER(3)
PORT_START("SERVICE")
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN3 )
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_COIN2 )
PORT_SERVICE_NO_TOGGLE(0x04, IP_ACTIVE_LOW)
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_SERVICE1 )
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_START1 )
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_START2 )
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_START3 )
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_COIN1 )
PORT_START("COINAGE")
PORT_DIPNAME( 0x0f, 0x0f, DEF_STR( Coin_A ) ) PORT_DIPLOCATION("SW1:1,2,3,4")
PORT_DIPSETTING( 0x07, DEF_STR( 4C_1C ) )
PORT_DIPSETTING( 0x08, DEF_STR( 3C_1C ) )
PORT_DIPSETTING( 0x09, DEF_STR( 2C_1C ) )
PORT_DIPSETTING( 0x05, "2 Coins/1 Credit 5/3 6/4" )
PORT_DIPSETTING( 0x04, "2 Coins/1 Credit 4/3" )
PORT_DIPSETTING( 0x0f, DEF_STR( 1C_1C ) )
PORT_DIPSETTING( 0x01, "1 Coin/1 Credit 2/3" )
PORT_DIPSETTING( 0x02, "1 Coin/1 Credit 4/5" )
PORT_DIPSETTING( 0x03, "1 Coin/1 Credit 5/6" )
PORT_DIPSETTING( 0x06, DEF_STR( 2C_3C ) )
PORT_DIPSETTING( 0x0e, DEF_STR( 1C_2C ) )
PORT_DIPSETTING( 0x0d, DEF_STR( 1C_3C ) )
PORT_DIPSETTING( 0x0c, DEF_STR( 1C_4C ) )
PORT_DIPSETTING( 0x0b, DEF_STR( 1C_5C ) )
PORT_DIPSETTING( 0x0a, DEF_STR( 1C_6C ) )
PORT_DIPSETTING( 0x00, "Free Play (if Coin B too) or 1/1" )
/* 2nd Coin Slot listed as "Not Used" in Test Mode for Alien Storm Bootlegs */
PORT_DIPUNUSED_DIPLOC( 0x10, 0x10, "SW1:5" )
PORT_DIPUNUSED_DIPLOC( 0x20, 0x20, "SW1:6" )
PORT_DIPUNUSED_DIPLOC( 0x40, 0x40, "SW1:7" )
PORT_DIPUNUSED_DIPLOC( 0x80, 0x80, "SW1:8" )
PORT_START("DSW1")
PORT_DIPNAME( 0x01, 0x01, "Start Credit" ) PORT_DIPLOCATION("SW2:1")
PORT_DIPSETTING( 0x01, "1" )
PORT_DIPSETTING( 0x00, "2" )
PORT_DIPNAME( 0x02, 0x00, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("SW2:2")
PORT_DIPSETTING( 0x02, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_DIPNAME( 0x1c, 0x1c, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SW2:3,4,5")
PORT_DIPSETTING( 0x04, DEF_STR( Easiest ) )
PORT_DIPSETTING( 0x08, DEF_STR( Easier ) )
PORT_DIPSETTING( 0x0c, DEF_STR( Easy ) )
PORT_DIPSETTING( 0x1c, DEF_STR( Normal ) )
PORT_DIPSETTING( 0x10, DEF_STR( Hard ) )
PORT_DIPSETTING( 0x14, DEF_STR( Harder ) )
PORT_DIPSETTING( 0x18, DEF_STR( Hardest ) )
PORT_DIPSETTING( 0x00, "Special" )
PORT_DIPNAME( 0x20, 0x20, "Coin Chutes" ) PORT_DIPLOCATION("SW2:6")
PORT_DIPSETTING( 0x20, "3" )
PORT_DIPSETTING( 0x00, "1" )
PORT_DIPUNUSED_DIPLOC( 0x40, IP_ACTIVE_LOW, "SW2:7" )
PORT_DIPUNUSED_DIPLOC( 0x80, IP_ACTIVE_LOW, "SW2:8" )
INPUT_PORTS_END
TILE_GET_INFO_MEMBER(segas18_astormbl_state::get_text_tile_info)
{
int tile_number = m_textram[tile_index];
tileinfo.set(0,
(tile_number & 0x1ff),
(tile_number >> 9) & 0x7,
0);
tileinfo.category = (tile_number >> 15) & 1;
}
void segas18_astormbl_state::sys16_textram_w(offs_t offset, uint16_t data, uint16_t mem_mask)
{
COMBINE_DATA(&m_textram[offset]);
m_text_layer->mark_tile_dirty(offset);
}
void segas18_astormbl_state::video_start()
{
m_text_layer = &machine().tilemap().create(
*m_gfxdecode,
tilemap_get_info_delegate(*this, FUNC(segas18_astormbl_state::get_text_tile_info)),
TILEMAP_SCAN_ROWS,
8, 8,
64, 28);
m_text_layer->set_transparent_pen(0);
m_text_layer->set_scrollx(512 - 320);
}
void segas18_astormbl_state::draw_tile(screen_device& screen, bitmap_ind16& bitmap, const rectangle &cliprect, int tilenum, int colour, int xpos, int ypos, uint8_t pri, int transpen, bool opaque)
{
gfx_element* gfx = m_gfxdecode->gfx(0);
bitmap_ind8 &priority_bitmap = screen.priority();
const uint8_t* gfxdat = gfx->get_data(tilenum);
for (int y = 0; y < 8; y++)
{
int realypos = ypos + y;
for (int x = 0; x < 8; x++)
{
int realxpos = xpos + x;
if ((realypos >= cliprect.min_y) && (realypos <= cliprect.max_y) && (realxpos >= cliprect.min_x) && (realxpos <= cliprect.max_x))
{
uint16_t* dst = &bitmap.pix(realypos);
uint8_t* pridst = &priority_bitmap.pix(realypos);
uint8_t pix = gfxdat[(y*8) + x];
if (pix || opaque)
{
dst[realxpos] = pix | (colour * 8);
pridst[realxpos] = pri;
}
}
}
}
}
void segas18_astormbl_state::draw_layer(screen_device& screen, bitmap_ind16& bitmap, const rectangle &cliprect, int layer, bool opaque, int pri0, int pri1)
{
for (int quadrant = 0; quadrant < 4; quadrant++)
{
int xbase = 0, ybase = 0;
if (quadrant & 2)
xbase = 0;
else
xbase = 512;
xbase += 0x140;
if (quadrant & 1)
ybase = 256;
else
ybase = 0;
if (layer == 0)
ybase ^= 256;
int yscroll = layer & 1 ? m_tileyscroll0[0] : m_tileyscroll1[0];
for (int y = 0; y < 0x20; y++)
{
const uint16_t rowconf = m_tilestripconfig[(layer * 0x80) + (quadrant * 0x20) + y];
uint8_t pagesource = (rowconf & 0xf000) >> 12;
uint8_t rowtilebank = (rowconf & 0x0e00) >> 9;
uint16_t rowscroll = (rowconf & 0x01ff);
int yposn = (y * 8) + ybase - yscroll;
yposn &= 0x1ff;
if (yposn & 0x100) yposn -= 0x200;
for (int x = 0; x < 0x40; x++)
{
uint16_t tiledat = m_tileram[(pagesource * 0x800) + x + (y * 0x40)];
int tilenum = tiledat & 0x0fff;
if (tiledat & 0x1000) tilenum |= (rowtilebank * 0x1000);
int xposn = ((x * 8) - rowscroll) + xbase + 8;
xposn &= 0x3ff;
if (xposn & 0x200) xposn -= 0x400;
int pri;
if (tiledat & 0x8000)
pri = pri1;
else
pri = pri0;
draw_tile(screen, bitmap, cliprect, tilenum, (tiledat & 0x1fc0) >> 6, xposn, yposn, pri, 0, opaque);
}
}
}
}
uint32_t segas18_astormbl_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
// if no drawing is happening, fill with black and get out
bitmap.fill(m_palette->black_pen(), cliprect);
// whole video enable, or just tiles?
if (!m_tileenable[0])
return 0;
// start the sprites drawing
m_sprites->draw_async(cliprect);
// reset priorities
screen.priority().fill(0, cliprect);
draw_layer(screen, bitmap, cliprect, 1, true, 0x01, 0x02);
draw_layer(screen, bitmap, cliprect, 0, false, 0x02, 0x04);
m_text_layer->draw(screen, bitmap, cliprect, 0, 0x04);
m_text_layer->draw(screen, bitmap, cliprect, 1, 0x08);
// mix in sprites
bitmap_ind16 &sprites = m_sprites->bitmap();
for (const sparse_dirty_rect *rect = m_sprites->first_dirty_rect(cliprect); rect != nullptr; rect = rect->next())
{
for (int y = rect->min_y; y <= rect->max_y; y++)
{
uint16_t *dest = &bitmap.pix(y);
uint16_t *src = &sprites.pix(y);
uint8_t *pri = &screen.priority().pix(y);
for (int x = rect->min_x; x <= rect->max_x; x++)
{
// only process written pixels
uint16_t pix = src[x];
if (pix != 0xffff)
{
// compare sprite priority against tilemap priority
int priority = (pix >> 10) & 3;
if ((1 << priority) > pri[x])
{
// if the color is set to maximum, shadow pixels underneath us
if ((pix & 0x03f0) == 0x03f0)
dest[x] += m_palette_entries;
// otherwise, just add in sprite palette base
else
dest[x] = 0x400 | (pix & 0x3ff);
}
}
}
}
}
return 0;
}
static GFXDECODE_START( gfx_segas16b )
GFXDECODE_ENTRY( "gfx1", 0, gfx_8x8x3_planar, 0, 1024 )
GFXDECODE_END
void segas18_astormbl_state::astormbl_map(address_map &map)
{
map(0x000000, 0x07ffff).rom();
map(0x100000, 0x10ffff).ram().share("tileram");
map(0x110000, 0x110fff).ram().w(FUNC(segas18_astormbl_state::sys16_textram_w)).share("textram");
map(0x140000, 0x140fff).ram().w(FUNC(segas18_astormbl_state::paletteram_w)).share("paletteram");
map(0x200000, 0x200fff).ram().share("sprites");
map(0xa00000, 0xa00001).portr("COINAGE");
map(0xa00002, 0xa00003).portr("DSW1");
map(0xa00006, 0xa00007).w(FUNC(segas18_astormbl_state::sound_w));
map(0xa0000e, 0xa0000f).nopw();// was tilebank, unused here? as tilebank is copied in the code per-row to the tilestripconfig area
map(0xa01000, 0xa01001).portr("SERVICE");
map(0xa01002, 0xa01003).portr("P1");
map(0xa01004, 0xa01005).portr("P2");
map(0xa01006, 0xa01007).portr("P3");
map(0xa02100, 0xa02101).noprw();
map(0xa03000, 0xa03001).noprw();
map(0xc00000, 0xc00003).noprw(); // leftover reads/writes from the Genesis VDP - bootlegs don't have this
map(0xc00004, 0xc00007).ram();
map(0xc44000, 0xc44001).ram(); // probably a new video register
map(0xc46000, 0xc46001).ram().share("tileyscroll1"); // y scroll?
map(0xc46200, 0xc46201).ram().share("tileyscroll0");
map(0xc46400, 0xc465ff).ram().share("tilestripconfig"); // per row page select, xscroll, tilebank
map(0xc46600, 0xc46601).ram().share("tileenable");
map(0xfe0020, 0xfe003f).nopw(); // leftover writes from memory mapped config registers - bootlegs don't have this
map(0xffc000, 0xffffff).ram();
}
void segas18_astormbl_state::astormbl_video(machine_config &config)
{
// video hardware
GFXDECODE(config, m_gfxdecode, m_palette, gfx_segas16b);
PALETTE(config, m_palette).set_entries(2048*2);
SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
m_screen->set_raw(XTAL(25'174'800)/4, 400, 0, 320, 262, 0, 224);
m_screen->set_screen_update(FUNC(segas18_astormbl_state::screen_update));
m_screen->set_palette(m_palette);
// see note in segas16a.cpp, also used here for consistency
m_screen->set_video_attributes(VIDEO_UPDATE_AFTER_VBLANK);
SEGA_SYS16B_SPRITES(config, m_sprites, 0);
m_sprites->set_local_originx(64);
}
void segas18_astormbl_s18snd_state::sound_map(address_map &map)
{
map.unmap_value_high();
map(0x0000, 0x9fff).rom().region("soundcpu", 0);
map(0xa000, 0xbfff).bankr("soundbank");
map(0xc000, 0xdfff).m("rfsnd", FUNC(rf5c68_device::map));
map(0xe000, 0xffff).ram();
}
void segas18_astormbl_s18snd_state::sound_portmap(address_map &map)
{
map.unmap_value_high();
map.global_mask(0xff);
map(0x80, 0x83).mirror(0x0c).rw("ym1", FUNC(ym3438_device::read), FUNC(ym3438_device::write));
map(0x90, 0x93).mirror(0x0c).rw("ym2", FUNC(ym3438_device::read), FUNC(ym3438_device::write));
map(0xa0, 0xa0).mirror(0x1f).w(FUNC(segas18_astormbl_s18snd_state::soundbank_w));
//map(0xc0, 0xc0).mirror(0x1f).rw(m_mapper, FUNC(sega_315_5195_mapper_device::pread), FUNC(sega_315_5195_mapper_device::pwrite)); // no memory mapper on bootleg
map(0xc0, 0xc0).r(m_soundlatch, FUNC(generic_latch_8_device::read));
}
void segas18_astormbl_s18snd_state::pcm_map(address_map &map)
{
map.unmap_value_high();
map(0x0000, 0xffff).ram();
}
void segas18_astormbl_s18snd_state::machine_start()
{
segas18_astormbl_state::machine_start();
m_soundbank->configure_entries(0, 256, memregion("soundcpu")->base(), 0x2000);
}
void segas18_astormbl_s18snd_state::soundbank_w(uint8_t data)
{
m_soundbank->set_entry(data);
}
void segas18_astormbl_s18snd_state::sound_w(offs_t offset, uint16_t data, uint16_t mem_mask)
{
if (ACCESSING_BITS_0_7)
{
m_soundlatch->write(data & 0xff);
m_soundcpu->pulse_input_line(INPUT_LINE_NMI, attotime::zero);
}
}
void segas18_astormbl_s18snd_state::astormbl_sound(machine_config &config)
{
Z80(config, m_soundcpu, 8'000'000);
m_soundcpu->set_addrmap(AS_PROGRAM, &segas18_astormbl_s18snd_state::sound_map);
m_soundcpu->set_addrmap(AS_IO, &segas18_astormbl_s18snd_state::sound_portmap);
GENERIC_LATCH_8(config, m_soundlatch);
// sound hardware
SPEAKER(config, "mono").front_center();
ym3438_device &ym1(YM3438(config, "ym1", 8'000'000));
ym1.add_route(ALL_OUTPUTS, "mono", 0.40);
ym1.irq_handler().set_inputline("soundcpu", INPUT_LINE_IRQ0);
ym3438_device &ym2(YM3438(config, "ym2", 8'000'000));
ym2.add_route(ALL_OUTPUTS, "mono", 0.40);
rf5c68_device &rfsnd(RF5C68(config, "rfsnd", 10'000'000)); // ASSP (RF)5C68A
rfsnd.add_route(ALL_OUTPUTS, "mono", 1.0);
rfsnd.set_addrmap(0, &segas18_astormbl_s18snd_state::pcm_map);
}
void segas18_astormbl_s18snd_state::astormbl(machine_config &config)
{
// basic machine hardware
M68000(config, m_maincpu, 10000000);
m_maincpu->set_addrmap(AS_PROGRAM, &segas18_astormbl_s18snd_state::astormbl_map);
m_maincpu->set_vblank_int("screen", FUNC(segas18_astormbl_s18snd_state::irq4_line_hold));
astormbl_video(config);
astormbl_sound(config);
}
// --------------------
void segas18_astormbl_bootsnd_state::sound_w(offs_t offset, uint16_t data, uint16_t mem_mask)
{
m_soundlatch->write(data & 0xff);
}
void segas18_astormbl_bootsnd_state::sys18bl_okibank_w(uint8_t data) // TODO: verify correctness
{
m_okibank->set_entry(data & 0x07);
}
void segas18_astormbl_bootsnd_state::machine_start()
{
segas18_astormbl_state::machine_start();
m_okibank->configure_entries(0, 8, memregion("oki")->base() + 0x30000, 0x10000);
}
void segas18_astormbl_bootsnd_state::sys18bl_sound_map(address_map &map)
{
map(0x0000, 0x7fff).rom();
map(0x9000, 0x9000).w(FUNC(segas18_astormbl_bootsnd_state::sys18bl_okibank_w));
map(0x9800, 0x9800).rw("oki", FUNC(okim6295_device::read), FUNC(okim6295_device::write));
map(0xa000, 0xa000).r(m_soundlatch, FUNC(generic_latch_8_device::read));
map(0x8000, 0x87ff).ram();
}
void segas18_astormbl_bootsnd_state::sys18bl_oki_map(address_map &map)
{
map(0x00000, 0x2ffff).rom();
map(0x30000, 0x3ffff).bankr("okibank");
}
void segas18_astormbl_bootsnd_state::astormb2_sound(machine_config &config)
{
GENERIC_LATCH_8(config, m_soundlatch);
m_soundlatch->data_pending_callback().set_inputline(m_soundcpu, 0);
Z80(config, m_soundcpu, 8_MHz_XTAL/2); // 4MHz
m_soundcpu->set_addrmap(AS_PROGRAM, &segas18_astormbl_bootsnd_state::sys18bl_sound_map);
// 1 OKI M6295 instead of original sound hardware
SPEAKER(config, "mono").front_center();
okim6295_device &oki(OKIM6295(config, "oki", XTAL(8'000'000)/8, okim6295_device::PIN7_HIGH)); // 1MHz clock and pin verified
oki.set_addrmap(0, &segas18_astormbl_bootsnd_state::sys18bl_oki_map);
oki.add_route(ALL_OUTPUTS, "mono", 1.0);
}
void segas18_astormbl_bootsnd_state::astormb2(machine_config &config)
{
// basic machine hardware
M68000(config, m_maincpu, 24_MHz_XTAL/2); // 12MHz
m_maincpu->set_addrmap(AS_PROGRAM, &segas18_astormbl_bootsnd_state::astormbl_map);
m_maincpu->set_vblank_int("screen", FUNC(segas18_astormbl_bootsnd_state::irq4_line_hold));
astormbl_video(config);
astormb2_sound(config);
}
ROM_START( astormbl )
ROM_REGION( 0x080000, "maincpu", 0 ) // 68000 code
ROM_LOAD16_BYTE( "astorm.a6", 0x000000, 0x40000, CRC(7682ed3e) SHA1(b857352ad9c66488e91f60989472638c483e4ae8) )
ROM_LOAD16_BYTE( "astorm.a5", 0x000001, 0x40000, CRC(efe9711e) SHA1(496fd9e30941fde1658fab7292a669ef7964cecb) )
ROM_REGION( 0xc0000, "gfx1", 0 ) // tiles
ROM_LOAD( "epr13073.bin", 0x00000, 0x40000, CRC(df5d0a61) SHA1(79ad71de348f280bad847566c507b7a31f022292) )
ROM_LOAD( "epr13074.bin", 0x40000, 0x40000, CRC(787afab8) SHA1(a119042bb2dad54e9733bfba4eaab0ac5fc0f9e7) )
ROM_LOAD( "epr13075.bin", 0x80000, 0x40000, CRC(4e01b477) SHA1(4178ce4a87ea427c3b0195e64acef6cddfb3485f) )
ROM_REGION16_BE( 0x200000, "sprites", 0 ) // sprites
ROM_LOAD16_BYTE( "mpr13082.bin", 0x000001, 0x40000, CRC(a782b704) SHA1(ba15bdfbc267b8d86f03e5310ce60846ff846de3) )
ROM_LOAD16_BYTE( "astorm.a11", 0x000000, 0x40000, CRC(7829c4f3) SHA1(3adb7aa7f70163d3848c98316e18b9783c41d663) )
ROM_LOAD16_BYTE( "mpr13081.bin", 0x080001, 0x40000, CRC(eb510228) SHA1(4cd387b160ec7050e1300ebe708853742169e643) )
ROM_LOAD16_BYTE( "mpr13088.bin", 0x080000, 0x40000, CRC(3b6b4c55) SHA1(970495c54b3e1893ee8060f6ca1338c2cbbd1074) )
ROM_LOAD16_BYTE( "mpr13080.bin", 0x100001, 0x40000, CRC(e668eefb) SHA1(d4a087a238b4d3ac2d23fe148d6a73018e348a89) )
ROM_LOAD16_BYTE( "mpr13087.bin", 0x100000, 0x40000, CRC(2293427d) SHA1(4fd07763ff060afd594e3f64fa4750577f56c80e) )
ROM_LOAD16_BYTE( "epr13079.bin", 0x180001, 0x40000, CRC(de9221ed) SHA1(5e2e434d1aa547be1e5652fc906d2e18c5122023) )
ROM_LOAD16_BYTE( "epr13086.bin", 0x180000, 0x40000, CRC(8c9a71c4) SHA1(40b774765ac888792aad46b6351a24b7ef40d2dc) )
// is this REALLY meant to be using the original system18 sound system?
ROM_REGION( 0x200000, "soundcpu", ROMREGION_ERASEFF ) // sound CPU
ROM_LOAD( "epr-13083.bin", 0x000000, 0x20000, CRC(5df3af20) SHA1(e49105fcfd5bf37d14bd760f6adca5ce2412883d) )
ROM_LOAD( "epr-13076.bin", 0x080000, 0x40000, CRC(94e6c76e) SHA1(f99e58a9bf372c41af211bd9b9ea3ac5b924c6ed) )
ROM_LOAD( "epr-13077.bin", 0x100000, 0x40000, CRC(e2ec0d8d) SHA1(225b0d223b7282cba7710300a877fb4a2c6dbabb) )
ROM_LOAD( "epr-13078.bin", 0x180000, 0x40000, CRC(15684dc5) SHA1(595051006de24f791dae937584e502ff2fa31d9c) )
ROM_END
/*
CPUs:
on main board:
1x MC68000P10 (main)
1x Z8400BB1-Z80BCPU (sound)
1x OKI M6295 (sound)
1x oscillator 24.000MHz (close to main)
1x oscillator 8.000MHz (close to sound)
ROMs
on main board:
9x M27C512 (1,2,3,4,5,6,7,8,10)
1x TMS27C256 (9)
21x NM27C010Q (11-31)
----------------------
on roms board:
6x NM27C010Q (32-37)
2x N82S123N
*/
ROM_START( astormb2 )
ROM_REGION( 0x080000, "maincpu", 0 ) // 68000 code
ROM_LOAD16_BYTE( "1.a4", 0x000000, 0x10000, CRC(cca0d0af) SHA1(26fdbbeb8444d05f0ca2056a7c7fb81b0f1f2b5a) )
ROM_LOAD16_BYTE( "2.a3", 0x020000, 0x10000, CRC(f95eb883) SHA1(b25d9c0fd46a534e7612f4a3ffa708b73654ae2b) )
ROM_LOAD16_BYTE( "3.a2", 0x040000, 0x10000, CRC(4206ecd4) SHA1(45c65d7727cfaf215a7081159f6931185e92b39a) ) // epr13182.bin [3/4] IDENTICAL
ROM_LOAD16_BYTE( "4.a1", 0x060000, 0x10000, CRC(23247c95) SHA1(e4d78c453d2cb77946dd1b5266de823968eade77) ) // epr13182.bin [4/4] 98.648071%
ROM_LOAD16_BYTE( "5.a9", 0x000001, 0x10000, CRC(6143039e) SHA1(8a5143c1e2c637149e988c423fa30b31e29a1193) )
ROM_LOAD16_BYTE( "6.a8", 0x020001, 0x10000, CRC(0fd17bec) SHA1(e9a5dd93394fdf1561a925e4111dfce51b717b14) )
ROM_LOAD16_BYTE( "7.a7", 0x040001, 0x10000, CRC(c901e228) SHA1(f459ba819a4e5f5174ff1b3957fb648c93beed53) ) // epr13181.bin [3/4] IDENTICAL
ROM_LOAD16_BYTE( "8.a6", 0x060001, 0x10000, CRC(bfb9d607) SHA1(8c3e10c1397fa0807d8df4715c9eb1945c774924) ) // epr13181.bin [4/4] 98.587036%
ROM_REGION( 0xc0000, "gfx1", 0 ) // tiles
ROM_LOAD( "32.01", 0x00000, 0x20000, CRC(d2aeb4ab) SHA1(9338ec5dc48f5d2b20511628a281236fe4646ef4) ) // epr13073.bin [1/2] IDENTICAL
ROM_LOAD( "33.011", 0x20000, 0x20000, CRC(2193f0ae) SHA1(84070f74693699c1ffc1a47517a97b5d058d08ec) ) // epr13073.bin [2/2] IDENTICAL
ROM_LOAD( "34.02", 0x40000, 0x20000, CRC(849aa725) SHA1(0f949dfe8a6c5796edc86a05339da80a158a95ae) ) // epr13074.bin [1/2] IDENTICAL
ROM_LOAD( "35.021", 0x60000, 0x20000, CRC(3f190347) SHA1(131953ccefb95eeef1ea90499ce521c3749f95c1) ) // epr13074.bin [2/2] IDENTICAL
ROM_LOAD( "36.03", 0x80000, 0x20000, CRC(c0f9628d) SHA1(aeacf5e409adfa0b9c28c90d4e89eb1f56cd5f4d) ) // epr13075.bin [1/2] IDENTICAL
ROM_LOAD( "37.031", 0xa0000, 0x20000, CRC(95af904e) SHA1(6574fa874c355c368109b417aab7d0b05c9d215d) ) // epr13075.bin [2/2] IDENTICAL
ROM_REGION16_BE( 0x200000, "sprites", 0 ) // sprites
ROM_LOAD16_BYTE( "17.042", 0x000001, 0x20000, CRC(db08beb5) SHA1(c154d22c69b77637d6a9d0f2bffcfb47e6901ec8) ) // mpr13082.bin [1/2] IDENTICAL
ROM_LOAD16_BYTE( "16.043", 0x040001, 0x20000, CRC(41f78977) SHA1(9cf9fcf96722d148c4b2cf7aa33425b6efcd0379) ) // mpr13082.bin [2/2] IDENTICAL
ROM_LOAD16_BYTE( "29.012", 0x000000, 0x20000, CRC(22acf675) SHA1(80fd0d96017bf36d964a79f7e13e73fee7ed370a) ) // mpr13089.bin [1/2] 99.941254%
ROM_LOAD16_BYTE( "28.013", 0x040000, 0x20000, CRC(32b37a3a) SHA1(70f268aa99a17739fd9d832b5f1d9e37247747e6) ) // mpr13089.bin [2/2] IDENTICAL
ROM_LOAD16_BYTE( "19.040", 0x080001, 0x20000, CRC(10c359ac) SHA1(9087cb824242ce5fc8eba45b61cca8b329c576e5) ) // mpr13081.bin [1/2] IDENTICAL
ROM_LOAD16_BYTE( "18.041", 0x0c0001, 0x20000, CRC(47146c1d) SHA1(cd5d92136f86128a9f304c4f8850f1efd652dd5c) ) // mpr13081.bin [2/2] IDENTICAL
ROM_LOAD16_BYTE( "31.010", 0x080000, 0x20000, CRC(e88fc39c) SHA1(f19c55c49771625a76e65b639a3b23969db8031d) ) // mpr13088.bin [1/2] IDENTICAL
ROM_LOAD16_BYTE( "30.011", 0x0c0000, 0x20000, CRC(6fe7e2a2) SHA1(94e5852377f72fd00daae302db4a5f93301213e4) ) // mpr13088.bin [2/2] IDENTICAL
ROM_LOAD16_BYTE( "21.032", 0x100001, 0x20000, CRC(c9e5a258) SHA1(809a3a3f88efe9c7a9dd9f6439ccb48fffb84df0) ) // mpr13080.bin [1/2] IDENTICAL
ROM_LOAD16_BYTE( "20.033", 0x140001, 0x20000, CRC(ddf8d00e) SHA1(0a9031063921bb03e7fd57eea369a1ddcfa85431) ) // mpr13080.bin [2/2] IDENTICAL
ROM_LOAD16_BYTE( "25.022", 0x100000, 0x20000, CRC(af8f3700) SHA1(3787f732eee5c6c9b6550bd4ce5387aff2c4072e) ) // mpr13087.bin [1/2] IDENTICAL
ROM_LOAD16_BYTE( "24.023", 0x140000, 0x20000, CRC(a092ecb6) SHA1(d7cc85eaea70c7947c497bc1d9743ab12a6fb43e) ) // mpr13087.bin [2/2] IDENTICAL
ROM_LOAD16_BYTE( "23.030", 0x180001, 0x20000, CRC(adc1b625) SHA1(496a1e92a833dbde37a0426165ff4250848b6ef4) ) // epr13079.bin [1/2] IDENTICAL
ROM_LOAD16_BYTE( "22.031", 0x1c0001, 0x20000, CRC(27c27f38) SHA1(439502250da4e376d2aa4bd9122455c6991e334d) ) // epr13079.bin [2/2] IDENTICAL
ROM_LOAD16_BYTE( "27.020", 0x180000, 0x20000, CRC(6c5312aa) SHA1(94b74c78f318fcc1881a2926cebc98033a7e535d) ) // epr13086.bin [1/2] IDENTICAL
ROM_LOAD16_BYTE( "26.021", 0x1c0000, 0x20000, CRC(c67fc986) SHA1(5fac826f9dde45201e3b93582dbe29c584a10229) ) // epr13086.bin [2/2] 99.987030%
// Sound HW is very different to the originals
ROM_REGION( 0x08000, "soundcpu", 0 ) // Z80 sound CPU
ROM_LOAD( "9.a5", 0x00000, 0x08000, CRC(0a4638e9) SHA1(0470e03a194464ff53c7583637193b585f5fd79f) )
ROM_REGION( 0xb0000, "oki", 0 ) // Oki6295 Samples
ROM_LOAD( "11.a10", 0x00000, 0x20000, CRC(7e0f752c) SHA1(a4070c3fa4848b5be223f9b927de4b6926dbb4e6) ) // contains sample table
ROM_LOAD( "10.a11", 0x20000, 0x10000, CRC(722e5969) SHA1(9cf891c6533b2e2a5c4741aa4e405038a7bf4e97) ) // sound effects
// BGM (banked 0x30000-0x3ffff)
ROM_LOAD( "15.a12", 0x30000, 0x20000, CRC(dffde929) SHA1(037b32470747d155385e532ee574b1234b3c2b26) )
ROM_LOAD( "14.a13", 0x50000, 0x20000, CRC(07e6b3a5) SHA1(32da2a9aeb840b76e6f0117ac342ff5d612762b4) )
ROM_LOAD( "13.a14", 0x70000, 0x20000, CRC(c60d6f18) SHA1(c9610729f19ae8414efd785948a1e6fb079bfe8d) )
ROM_LOAD( "12.a15", 0x90000, 0x20000, CRC(cb4517db) SHA1(4c93376c2b3e70001bbc283d4485bb55514f6ef9) )
ROM_REGION( 0x0120, "proms", 0 )
ROM_LOAD( "n82s129n.129", 0x0000, 0x0100, CRC(a7c22d96) SHA1(160deae8053b09c09328325246598b3518c7e20b) )
ROM_LOAD( "n82s123n.123", 0x0100, 0x0020, CRC(58bcf8bd) SHA1(e4d3d179b08c0f3424a6bec0f15058fb1b56f8d8) )
ROM_REGION( 0x600, "plds", 0 )
ROM_LOAD("pal1.bin", 0x000, 0x117, CRC(9b362047) SHA1(1e6db7d6b8a6e4c321e3245f36f5b794f22e880e) ) // GAL16V8S-20HB1 on main PCB
ROM_LOAD("pal2.bin", 0x200, 0x117, CRC(b7eecbd4) SHA1(2ba89ec54a628abe08750ff6ba6eff5845fe0d30) ) // GAL16V8S-20HB1 on video PCB
ROM_LOAD("pal3.bin", 0x400, 0x117, NO_DUMP ) // GAL16V8S-20HB1 on video PCB
ROM_END
} // anonymous namespace
GAME( 1990, astormbl, astorm, astormbl, astormbl, segas18_astormbl_s18snd_state, empty_init, ROT0, "bootleg", "Alien Storm (bootleg, set 1)", MACHINE_IMPERFECT_GRAPHICS )
GAME( 1990, astormb2, astorm, astormb2, astormbl, segas18_astormbl_bootsnd_state, empty_init, ROT0, "bootleg", "Alien Storm (bootleg, set 2)", MACHINE_IMPERFECT_GRAPHICS ) // sound verified on real hardware

View File

@ -1346,41 +1346,6 @@ void segas1x_bootleg_state::sys18bl_okibank_w(uint8_t data) // TODO: verify corr
m_okibank->set_entry(data & 0x07);
}
/* bootleg doesn't have real vdp or i/o */
void segas1x_bootleg_state::astormbl_map(address_map &map)
{
map(0x000000, 0x07ffff).rom();
map(0x100000, 0x10ffff).ram().w(FUNC(segas1x_bootleg_state::sys16_tileram_w)).share("tileram");
map(0x110000, 0x110fff).ram().w(FUNC(segas1x_bootleg_state::sys16_textram_w)).share("textram");
map(0x140000, 0x140fff).ram().w(FUNC(segas1x_bootleg_state::paletteram_w)).share("paletteram");
map(0x200000, 0x200fff).ram().share("sprites");
map(0xa00000, 0xa00001).portr("COINAGE");
map(0xa00002, 0xa00003).portr("DSW1");
map(0xa00006, 0xa00007).w(FUNC(segas1x_bootleg_state::sound_command_nmi_w));
map(0xa0000e, 0xa0000f).w(FUNC(segas1x_bootleg_state::sys18_tilebank_w));
map(0xa01000, 0xa01001).portr("SERVICE");
map(0xa01002, 0xa01003).portr("P1");
map(0xa01004, 0xa01005).portr("P2");
map(0xa01006, 0xa01007).portr("P3");
map(0xa02100, 0xa02101).noprw();
map(0xa03000, 0xa03001).noprw();
map(0xa03034, 0xa03035).noprw();
/* bootleg video regs */
map(0xc00000, 0xc00001).noprw();
map(0xc00002, 0xc00003).noprw();
map(0xc00004, 0xc00005).noprw(); // tile bank?
map(0xc00006, 0xc00007).noprw();
map(0xc44000, 0xc44001).noprw();
map(0xc46000, 0xc46001).noprw();
map(0xc46200, 0xc46201).noprw();
map(0xc46400, 0xc464ff).noprw(); // scroll?
map(0xc46500, 0xc465ff).noprw(); // scroll?
map(0xc46600, 0xc46601).w(FUNC(segas1x_bootleg_state::sys18_refreshenable_w));
map(0xfe0020, 0xfe003f).nopw();
map(0xffc000, 0xffffff).ram();
}
void segas1x_bootleg_state::sys18bl_sound_map(address_map &map)
{
@ -1834,7 +1799,7 @@ static INPUT_PORTS_START( tetris )
INPUT_PORTS_END
/* System 18 Bootlegs */
static INPUT_PORTS_START( astormbl )
static INPUT_PORTS_START( base18 )
PORT_START("P1")
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON1 )
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON2 )
@ -1925,7 +1890,7 @@ static INPUT_PORTS_START( astormbl )
INPUT_PORTS_END
static INPUT_PORTS_START( ddcrewbl )
PORT_INCLUDE( astormbl )
PORT_INCLUDE( base18 )
PORT_MODIFY("SERVICE")
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN4 )
@ -1969,7 +1934,7 @@ static INPUT_PORTS_START( ddcrewbl )
INPUT_PORTS_END
static INPUT_PORTS_START( mwalkbl )
PORT_INCLUDE( astormbl )
PORT_INCLUDE( base18 )
PORT_MODIFY("P3")
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_START3 )
@ -2017,7 +1982,7 @@ static INPUT_PORTS_START( mwalkbl )
INPUT_PORTS_END
static INPUT_PORTS_START( shdancbl )
PORT_INCLUDE( astormbl )
PORT_INCLUDE( base18 )
PORT_MODIFY("P2")
PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNKNOWN )
@ -2480,7 +2445,7 @@ void segas1x_bootleg_state::system18(machine_config &config)
MCFG_VIDEO_START_OVERRIDE(segas1x_bootleg_state,system18old)
SEGA_SYS16B_SPRITES(config, m_sprites, 0);
m_sprites->set_local_originx(189-107);
m_sprites->set_local_originx(64);
/* sound hardware */
SPEAKER(config, "lspeaker").front_left();
@ -2502,19 +2467,11 @@ void segas1x_bootleg_state::system18(machine_config &config)
rf5c68.set_addrmap(0, &segas1x_bootleg_state::pcm_map);
}
void segas1x_bootleg_state::astormbl(machine_config &config)
{
system18(config);
/* basic machine hardware */
m_maincpu->set_addrmap(AS_PROGRAM, &segas1x_bootleg_state::astormbl_map);
}
void segas1x_bootleg_state::astormb2(machine_config &config)
void segas1x_bootleg_state::mwalkbl(machine_config &config)
{
/* basic machine hardware */
M68000(config, m_maincpu, XTAL(24'000'000)/2); /* 12MHz */
m_maincpu->set_addrmap(AS_PROGRAM, &segas1x_bootleg_state::astormbl_map);
m_maincpu->set_addrmap(AS_PROGRAM, &segas1x_bootleg_state::mwalkbl_map);
m_maincpu->set_vblank_int("screen", FUNC(segas1x_bootleg_state::irq4_line_hold));
Z80(config, m_soundcpu, XTAL(8'000'000)/2); /* 4MHz */
@ -2535,7 +2492,7 @@ void segas1x_bootleg_state::astormb2(machine_config &config)
MCFG_VIDEO_START_OVERRIDE(segas1x_bootleg_state,system18old)
SEGA_SYS16B_SPRITES(config, m_sprites, 0);
m_sprites->set_local_originx(189-107);
m_sprites->set_local_originx(64);
GENERIC_LATCH_8(config, m_soundlatch);
m_soundlatch->data_pending_callback().set_inputline(m_soundcpu, 0);
@ -2548,14 +2505,6 @@ void segas1x_bootleg_state::astormb2(machine_config &config)
oki.add_route(ALL_OUTPUTS, "mono", 1.0);
}
void segas1x_bootleg_state::mwalkbl(machine_config &config)
{
astormb2(config);
/* basic machine hardware */
m_maincpu->set_addrmap(AS_PROGRAM, &segas1x_bootleg_state::mwalkbl_map);
}
void segas1x_bootleg_state::shdancbl(machine_config &config)
{
system18(config);
@ -3494,119 +3443,6 @@ ROM_END
System 18 Bootlegs
******************************/
ROM_START( astormbl )
ROM_REGION( 0x080000, "maincpu", 0 ) /* 68000 code */
ROM_LOAD16_BYTE( "astorm.a6", 0x000000, 0x40000, CRC(7682ed3e) SHA1(b857352ad9c66488e91f60989472638c483e4ae8) )
ROM_LOAD16_BYTE( "astorm.a5", 0x000001, 0x40000, CRC(efe9711e) SHA1(496fd9e30941fde1658fab7292a669ef7964cecb) )
ROM_REGION( 0xc0000, "gfx1", 0 ) /* tiles */
ROM_LOAD( "epr13073.bin", 0x00000, 0x40000, CRC(df5d0a61) SHA1(79ad71de348f280bad847566c507b7a31f022292) )
ROM_LOAD( "epr13074.bin", 0x40000, 0x40000, CRC(787afab8) SHA1(a119042bb2dad54e9733bfba4eaab0ac5fc0f9e7) )
ROM_LOAD( "epr13075.bin", 0x80000, 0x40000, CRC(4e01b477) SHA1(4178ce4a87ea427c3b0195e64acef6cddfb3485f) )
ROM_REGION16_BE( 0x200000, "sprites", 0 ) /* sprites */
ROM_LOAD16_BYTE( "mpr13082.bin", 0x000001, 0x40000, CRC(a782b704) SHA1(ba15bdfbc267b8d86f03e5310ce60846ff846de3) )
ROM_LOAD16_BYTE( "astorm.a11", 0x000000, 0x40000, CRC(7829c4f3) SHA1(3adb7aa7f70163d3848c98316e18b9783c41d663) )
ROM_LOAD16_BYTE( "mpr13081.bin", 0x080001, 0x40000, CRC(eb510228) SHA1(4cd387b160ec7050e1300ebe708853742169e643) )
ROM_LOAD16_BYTE( "mpr13088.bin", 0x080000, 0x40000, CRC(3b6b4c55) SHA1(970495c54b3e1893ee8060f6ca1338c2cbbd1074) )
ROM_LOAD16_BYTE( "mpr13080.bin", 0x100001, 0x40000, CRC(e668eefb) SHA1(d4a087a238b4d3ac2d23fe148d6a73018e348a89) )
ROM_LOAD16_BYTE( "mpr13087.bin", 0x100000, 0x40000, CRC(2293427d) SHA1(4fd07763ff060afd594e3f64fa4750577f56c80e) )
ROM_LOAD16_BYTE( "epr13079.bin", 0x180001, 0x40000, CRC(de9221ed) SHA1(5e2e434d1aa547be1e5652fc906d2e18c5122023) )
ROM_LOAD16_BYTE( "epr13086.bin", 0x180000, 0x40000, CRC(8c9a71c4) SHA1(40b774765ac888792aad46b6351a24b7ef40d2dc) )
ROM_REGION( 0x100000, "soundcpu", 0 ) /* sound CPU */
ROM_LOAD( "epr13083.bin", 0x10000, 0x20000, CRC(5df3af20) SHA1(e49105fcfd5bf37d14bd760f6adca5ce2412883d) )
ROM_LOAD( "epr13076.bin", 0x30000, 0x40000, CRC(94e6c76e) SHA1(f99e58a9bf372c41af211bd9b9ea3ac5b924c6ed) )
ROM_LOAD( "epr13077.bin", 0x70000, 0x40000, CRC(e2ec0d8d) SHA1(225b0d223b7282cba7710300a877fb4a2c6dbabb) )
ROM_LOAD( "epr13078.bin", 0xb0000, 0x40000, CRC(15684dc5) SHA1(595051006de24f791dae937584e502ff2fa31d9c) )
ROM_END
/*
CPUs:
on main board:
1x MC68000P10 (main)
1x Z8400BB1-Z80BCPU (sound)
1x OKI M6295 (sound)
1x oscillator 24.000MHz (close to main)
1x oscillator 8.000MHz (close to sound)
ROMs
on main board:
9x M27C512 (1,2,3,4,5,6,7,8,10)
1x TMS27C256 (9)
21x NM27C010Q (11-31)
----------------------
on roms board:
6x NM27C010Q (32-37)
2x N82S123N
*/
ROM_START( astormb2 )
ROM_REGION( 0x080000, "maincpu", 0 ) /* 68000 code */
ROM_LOAD16_BYTE( "1.a4", 0x000000, 0x10000, CRC(cca0d0af) SHA1(26fdbbeb8444d05f0ca2056a7c7fb81b0f1f2b5a) )
ROM_LOAD16_BYTE( "2.a3", 0x020000, 0x10000, CRC(f95eb883) SHA1(b25d9c0fd46a534e7612f4a3ffa708b73654ae2b) )
ROM_LOAD16_BYTE( "3.a2", 0x040000, 0x10000, CRC(4206ecd4) SHA1(45c65d7727cfaf215a7081159f6931185e92b39a) ) // epr13182.bin [3/4] IDENTICAL
ROM_LOAD16_BYTE( "4.a1", 0x060000, 0x10000, CRC(23247c95) SHA1(e4d78c453d2cb77946dd1b5266de823968eade77) ) // epr13182.bin [4/4] 98.648071%
ROM_LOAD16_BYTE( "5.a9", 0x000001, 0x10000, CRC(6143039e) SHA1(8a5143c1e2c637149e988c423fa30b31e29a1193) )
ROM_LOAD16_BYTE( "6.a8", 0x020001, 0x10000, CRC(0fd17bec) SHA1(e9a5dd93394fdf1561a925e4111dfce51b717b14) )
ROM_LOAD16_BYTE( "7.a7", 0x040001, 0x10000, CRC(c901e228) SHA1(f459ba819a4e5f5174ff1b3957fb648c93beed53) ) // epr13181.bin [3/4] IDENTICAL
ROM_LOAD16_BYTE( "8.a6", 0x060001, 0x10000, CRC(bfb9d607) SHA1(8c3e10c1397fa0807d8df4715c9eb1945c774924) ) // epr13181.bin [4/4] 98.587036%
ROM_REGION( 0xc0000, "gfx1", 0 ) /* tiles */
ROM_LOAD( "32.01", 0x00000, 0x20000, CRC(d2aeb4ab) SHA1(9338ec5dc48f5d2b20511628a281236fe4646ef4) ) // epr13073.bin [1/2] IDENTICAL
ROM_LOAD( "33.011", 0x20000, 0x20000, CRC(2193f0ae) SHA1(84070f74693699c1ffc1a47517a97b5d058d08ec) ) // epr13073.bin [2/2] IDENTICAL
ROM_LOAD( "34.02", 0x40000, 0x20000, CRC(849aa725) SHA1(0f949dfe8a6c5796edc86a05339da80a158a95ae) ) // epr13074.bin [1/2] IDENTICAL
ROM_LOAD( "35.021", 0x60000, 0x20000, CRC(3f190347) SHA1(131953ccefb95eeef1ea90499ce521c3749f95c1) ) // epr13074.bin [2/2] IDENTICAL
ROM_LOAD( "36.03", 0x80000, 0x20000, CRC(c0f9628d) SHA1(aeacf5e409adfa0b9c28c90d4e89eb1f56cd5f4d) ) // epr13075.bin [1/2] IDENTICAL
ROM_LOAD( "37.031", 0xa0000, 0x20000, CRC(95af904e) SHA1(6574fa874c355c368109b417aab7d0b05c9d215d) ) // epr13075.bin [2/2] IDENTICAL
ROM_REGION16_BE( 0x200000, "sprites", 0 ) /* sprites */
ROM_LOAD16_BYTE( "17.042", 0x000001, 0x20000, CRC(db08beb5) SHA1(c154d22c69b77637d6a9d0f2bffcfb47e6901ec8) ) // mpr13082.bin [1/2] IDENTICAL
ROM_LOAD16_BYTE( "16.043", 0x040001, 0x20000, CRC(41f78977) SHA1(9cf9fcf96722d148c4b2cf7aa33425b6efcd0379) ) // mpr13082.bin [2/2] IDENTICAL
ROM_LOAD16_BYTE( "29.012", 0x000000, 0x20000, CRC(22acf675) SHA1(80fd0d96017bf36d964a79f7e13e73fee7ed370a) ) // mpr13089.bin [1/2] 99.941254%
ROM_LOAD16_BYTE( "28.013", 0x040000, 0x20000, CRC(32b37a3a) SHA1(70f268aa99a17739fd9d832b5f1d9e37247747e6) ) // mpr13089.bin [2/2] IDENTICAL
ROM_LOAD16_BYTE( "19.040", 0x080001, 0x20000, CRC(10c359ac) SHA1(9087cb824242ce5fc8eba45b61cca8b329c576e5) ) // mpr13081.bin [1/2] IDENTICAL
ROM_LOAD16_BYTE( "18.041", 0x0c0001, 0x20000, CRC(47146c1d) SHA1(cd5d92136f86128a9f304c4f8850f1efd652dd5c) ) // mpr13081.bin [2/2] IDENTICAL
ROM_LOAD16_BYTE( "31.010", 0x080000, 0x20000, CRC(e88fc39c) SHA1(f19c55c49771625a76e65b639a3b23969db8031d) ) // mpr13088.bin [1/2] IDENTICAL
ROM_LOAD16_BYTE( "30.011", 0x0c0000, 0x20000, CRC(6fe7e2a2) SHA1(94e5852377f72fd00daae302db4a5f93301213e4) ) // mpr13088.bin [2/2] IDENTICAL
ROM_LOAD16_BYTE( "21.032", 0x100001, 0x20000, CRC(c9e5a258) SHA1(809a3a3f88efe9c7a9dd9f6439ccb48fffb84df0) ) // mpr13080.bin [1/2] IDENTICAL
ROM_LOAD16_BYTE( "20.033", 0x140001, 0x20000, CRC(ddf8d00e) SHA1(0a9031063921bb03e7fd57eea369a1ddcfa85431) ) // mpr13080.bin [2/2] IDENTICAL
ROM_LOAD16_BYTE( "25.022", 0x100000, 0x20000, CRC(af8f3700) SHA1(3787f732eee5c6c9b6550bd4ce5387aff2c4072e) ) // mpr13087.bin [1/2] IDENTICAL
ROM_LOAD16_BYTE( "24.023", 0x140000, 0x20000, CRC(a092ecb6) SHA1(d7cc85eaea70c7947c497bc1d9743ab12a6fb43e) ) // mpr13087.bin [2/2] IDENTICAL
ROM_LOAD16_BYTE( "23.030", 0x180001, 0x20000, CRC(adc1b625) SHA1(496a1e92a833dbde37a0426165ff4250848b6ef4) ) // epr13079.bin [1/2] IDENTICAL
ROM_LOAD16_BYTE( "22.031", 0x1c0001, 0x20000, CRC(27c27f38) SHA1(439502250da4e376d2aa4bd9122455c6991e334d) ) // epr13079.bin [2/2] IDENTICAL
ROM_LOAD16_BYTE( "27.020", 0x180000, 0x20000, CRC(6c5312aa) SHA1(94b74c78f318fcc1881a2926cebc98033a7e535d) ) // epr13086.bin [1/2] IDENTICAL
ROM_LOAD16_BYTE( "26.021", 0x1c0000, 0x20000, CRC(c67fc986) SHA1(5fac826f9dde45201e3b93582dbe29c584a10229) ) // epr13086.bin [2/2] 99.987030%
/* Sound HW is very different to the originals */
ROM_REGION( 0x08000, "soundcpu", 0 ) /* Z80 sound CPU */
ROM_LOAD( "9.a5", 0x00000, 0x08000, CRC(0a4638e9) SHA1(0470e03a194464ff53c7583637193b585f5fd79f) )
ROM_REGION( 0xb0000, "oki", 0 ) /* Oki6295 Samples */
ROM_LOAD( "11.a10", 0x00000, 0x20000, CRC(7e0f752c) SHA1(a4070c3fa4848b5be223f9b927de4b6926dbb4e6) ) // contains sample table
ROM_LOAD( "10.a11", 0x20000, 0x10000, CRC(722e5969) SHA1(9cf891c6533b2e2a5c4741aa4e405038a7bf4e97) ) // sound effects
// BGM (banked 0x30000-0x3ffff)
ROM_LOAD( "15.a12", 0x30000, 0x20000, CRC(dffde929) SHA1(037b32470747d155385e532ee574b1234b3c2b26) )
ROM_LOAD( "14.a13", 0x50000, 0x20000, CRC(07e6b3a5) SHA1(32da2a9aeb840b76e6f0117ac342ff5d612762b4) )
ROM_LOAD( "13.a14", 0x70000, 0x20000, CRC(c60d6f18) SHA1(c9610729f19ae8414efd785948a1e6fb079bfe8d) )
ROM_LOAD( "12.a15", 0x90000, 0x20000, CRC(cb4517db) SHA1(4c93376c2b3e70001bbc283d4485bb55514f6ef9) )
ROM_REGION( 0x0120, "proms", 0 )
ROM_LOAD( "n82s129n.129", 0x0000, 0x0100, CRC(a7c22d96) SHA1(160deae8053b09c09328325246598b3518c7e20b) )
ROM_LOAD( "n82s123n.123", 0x0100, 0x0020, CRC(58bcf8bd) SHA1(e4d3d179b08c0f3424a6bec0f15058fb1b56f8d8) )
ROM_REGION( 0x600, "plds", 0 )
ROM_LOAD("pal1.bin", 0x000, 0x117, CRC(9b362047) SHA1(1e6db7d6b8a6e4c321e3245f36f5b794f22e880e) ) // GAL16V8S-20HB1 on main PCB
ROM_LOAD("pal2.bin", 0x200, 0x117, CRC(b7eecbd4) SHA1(2ba89ec54a628abe08750ff6ba6eff5845fe0d30) ) // GAL16V8S-20HB1 on video PCB
ROM_LOAD("pal3.bin", 0x400, 0x117, NO_DUMP ) // GAL16V8S-20HB1 on video PCB
ROM_END
/*
Michael Jackson's Mooonwalker bootleg - Complete Dump
@ -4116,27 +3952,6 @@ void segas1x_bootleg_state::init_shdancbl()
m_splittab_bg_x = &m_textram[0x0fc0/2];
}
void segas1x_bootleg_state::init_astormbl()
{
uint8_t *RAM = m_soundcpu_region->base();
static const int astormbl_sound_info[] =
{
0x0f, 0x00000, // ROM #1 = 128K
0x1f, 0x20000, // ROM #2 = 256K
0x1f, 0x60000, // ROM #3 = 256K
0x1f, 0xA0000 // ROM #4 = 256K
};
memcpy(m_sound_info, astormbl_sound_info, sizeof(m_sound_info));
memcpy(RAM, &RAM[0x10000], 0xa000);
init_common();
m_spritebank_type = 1;
m_splittab_fg_x = &m_textram[0x0f80/2];
m_splittab_bg_x = &m_textram[0x0fc0/2];
}
void segas1x_bootleg_state::init_sys18bl_oki()
{
init_common();
@ -4148,14 +3963,6 @@ void segas1x_bootleg_state::init_sys18bl_oki()
m_okibank->configure_entries(0, 8, memregion("oki")->base() + 0x30000, 0x10000);
}
void segas1x_bootleg_state::init_astormb2()
{
init_sys18bl_oki();
m_maincpu->space(AS_PROGRAM).unmap_write(0xa00006, 0xa00007);
m_maincpu->space(AS_PROGRAM).install_write_handler(0xa00006, 0xa00007, write8smo_delegate(*m_soundlatch, FUNC(generic_latch_8_device::write)), 0x00ff);
}
/*************************************
*
* Game driver(s)
@ -4190,8 +3997,6 @@ GAME( 1991, beautyb, 0, beautyb, tetris, segas1x_bootleg_sta
GAME( 1991, iqpipe, 0, beautyb, tetris, segas1x_bootleg_state, init_beautyb, ROT0, "AMT", "IQ Pipe", MACHINE_NO_SOUND | MACHINE_NOT_WORKING )
/* System 18 bootlegs */
GAME( 1990, astormbl, astorm, astormbl, astormbl, segas1x_bootleg_state, init_astormbl, ROT0, "bootleg", "Alien Storm (bootleg, set 1)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
GAME( 1990, astormb2, astorm, astormb2, astormbl, segas1x_bootleg_state, init_astormb2, ROT0, "bootleg", "Alien Storm (bootleg, set 2)", MACHINE_IMPERFECT_GRAPHICS ) // sound verified on real hardware
GAME( 1990, mwalkbl, mwalk, mwalkbl, mwalkbl, segas1x_bootleg_state, init_sys18bl_oki,ROT0, "bootleg", "Michael Jackson's Moonwalker (bootleg)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
GAME( 1989, shdancbl, shdancer, shdancbl, shdancbl, segas1x_bootleg_state, init_shdancbl, ROT0, "bootleg", "Shadow Dancer (bootleg, set 1)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
GAME( 1989, shdancbla, shdancer, shdancbla, shdancbl, segas1x_bootleg_state, init_shdancbl, ROT0, "bootleg", "Shadow Dancer (bootleg, set 2)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND | MACHINE_NOT_WORKING )

View File

@ -57,8 +57,6 @@ public:
void eswatbl2(machine_config &config);
void ddcrewbl(machine_config &config);
void shdancbla(machine_config &config);
void astormbl(machine_config &config);
void astormb2(machine_config &config);
void passsht4b(machine_config &config);
void wb3bb(machine_config &config);
void wb3bble(machine_config &config);
@ -78,7 +76,6 @@ public:
void init_wb3bble();
void init_fpointbl();
void init_eswatbl();
void init_astormbl();
void init_sys18bl_oki();
void init_astormb2();
void init_shdancbl();
@ -176,7 +173,6 @@ private:
DECLARE_WRITE_LINE_MEMBER(shdancbl_msm5205_callback);
DECLARE_WRITE_LINE_MEMBER(sound_cause_nmi);
void astormbl_map(address_map &map);
void bayrouteb1_map(address_map &map);
void bayrouteb2_map(address_map &map);
void beautyb_map(address_map &map);

View File

@ -37377,6 +37377,10 @@ wwallyja // 1992.06 Wally wo Sagase! (Japan, FD1094)
wwallyjad //
wwallyjd //
@source:segas18_astormbl.cpp
astormbl
astormb2
@source:segas24.cpp
bnzabros // 1990.08 Bonanza Bros. (US)
bnzabrosj // 1990.06 Bonanza Bros. (Japan)
@ -39802,8 +39806,6 @@ wmatch // (c) 1984 (S1)
@source:system16.cpp
altbeastbl //
altbeastbl2 //
astormb2 // BOOTLEG
astormbl // BOOTLEG
bayrouteb1 // (c) 1989 (protected) (bootleg)
bayrouteb2 // (c) 1989 (protected) (bootleg)
beautyb // (c) 1991 AMT