From b0628a92ec89386a5b898d7c95c5930046d48c75 Mon Sep 17 00:00:00 2001 From: David Haywood <28625134+DavidHaywood@users.noreply.github.com> Date: Wed, 23 Jun 2021 14:31:30 +0100 Subject: [PATCH] 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. --- scripts/target/mame/arcade.lua | 1 + src/mame/arcade.flt | 1 + src/mame/drivers/segas18_astormbl.cpp | 760 ++++++++++++++++++++++++++ src/mame/drivers/system16.cpp | 211 +------ src/mame/includes/system16.h | 4 - src/mame/mame.lst | 6 +- 6 files changed, 774 insertions(+), 209 deletions(-) create mode 100644 src/mame/drivers/segas18_astormbl.cpp diff --git a/scripts/target/mame/arcade.lua b/scripts/target/mame/arcade.lua index ad5d9ce3372..feda074e03c 100644 --- a/scripts/target/mame/arcade.lua +++ b/scripts/target/mame/arcade.lua @@ -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", diff --git a/src/mame/arcade.flt b/src/mame/arcade.flt index 21bde9492c1..cdba11cf6a1 100644 --- a/src/mame/arcade.flt +++ b/src/mame/arcade.flt @@ -1124,6 +1124,7 @@ segaorun.cpp segas16a.cpp segas16b.cpp segas18.cpp +segas18_astormbl.cpp segas24.cpp segas32.cpp segasp.cpp diff --git a/src/mame/drivers/segas18_astormbl.cpp b/src/mame/drivers/segas18_astormbl.cpp new file mode 100644 index 00000000000..8369b157a4c --- /dev/null +++ b/src/mame/drivers/segas18_astormbl.cpp @@ -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 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 m_screen; + required_device m_gfxdecode; + required_device m_sprites; + required_shared_ptr m_textram; + required_shared_ptr m_tileram; + required_shared_ptr m_tilestripconfig; + required_shared_ptr m_tileenable; + required_shared_ptr m_tileyscroll1; + required_shared_ptr 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 m_soundcpu; + required_memory_bank m_soundbank; + required_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 m_soundcpu; + required_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 diff --git a/src/mame/drivers/system16.cpp b/src/mame/drivers/system16.cpp index e59e40ea826..898aeba7f63 100644 --- a/src/mame/drivers/system16.cpp +++ b/src/mame/drivers/system16.cpp @@ -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 ) diff --git a/src/mame/includes/system16.h b/src/mame/includes/system16.h index b3a0a685532..82fd9e0f150 100644 --- a/src/mame/includes/system16.h +++ b/src/mame/includes/system16.h @@ -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); diff --git a/src/mame/mame.lst b/src/mame/mame.lst index e852713a822..176dfeb1672 100644 --- a/src/mame/mame.lst +++ b/src/mame/mame.lst @@ -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