summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author David Haywood <28625134+DavidHaywood@users.noreply.github.com>2020-07-21 21:41:16 +0100
committer GitHub <noreply@github.com>2020-07-21 16:41:16 -0400
commitc54c41258054a419d10d0f7a1b1afe9243141e3a (patch)
tree313024c44c3301f3e27c317c18e4340cc9034ee2
parenta3274c2f3046fd4bac6458a724cd1300f7fcdee9 (diff)
misc work on raidenm + new working machines (zone mini, reactor) (#6964)
raidenm: misc work on sprites. new WORKING machines ------ Zone Mini [Sean Riddle, David Haywood] Reactor 32-in-1 (NTSC) [Sean Riddle, David Haywood]
-rw-r--r--src/mame/drivers/raiden_ms.cpp513
-rw-r--r--src/mame/drivers/spg2xx_zone.cpp36
-rw-r--r--src/mame/mame.lst2
3 files changed, 309 insertions, 242 deletions
diff --git a/src/mame/drivers/raiden_ms.cpp b/src/mame/drivers/raiden_ms.cpp
index 28323371cd3..3b279d0dd7c 100644
--- a/src/mame/drivers/raiden_ms.cpp
+++ b/src/mame/drivers/raiden_ms.cpp
@@ -31,6 +31,7 @@
#include "emupal.h"
#include "screen.h"
#include "speaker.h"
+#include "tilemap.h"
class raiden_ms_state : public driver_device
@@ -40,13 +41,20 @@ public:
driver_device(mconfig, type, tag),
m_maincpu(*this, "maincpu"),
m_subcpu(*this, "subcpu"),
- m_soundcpu(*this, "soundcpu"),
+ m_audiocpu(*this, "audiocpu"),
m_screen(*this, "screen"),
+ m_palette(*this, "palette"),
m_ym1(*this, "ym1"),
m_ym2(*this, "ym2"),
m_msm(*this, "msm5205"),
m_spriteram(*this, "spriteram"),
- m_gfxdecode(*this, "gfxdecode")
+ m_scrollram1(*this, "scrollram1"),
+ m_scrollram2(*this, "scrollram2"),
+ m_gfxdecode(*this, "gfxdecode"),
+ m_videoram(*this, "videoram"),
+ m_videoram2(*this, "videoram2"),
+ m_videoram3(*this, "videoram3"),
+ m_soundlatch(*this, "soundlatch")
{ }
void raidenm(machine_config &config);
@@ -54,29 +62,60 @@ public:
protected:
virtual void machine_start() override;
+ virtual void video_start() override;
private:
required_device<cpu_device> m_maincpu;
required_device<cpu_device> m_subcpu;
- required_device<cpu_device> m_soundcpu;
+ required_device<cpu_device> m_audiocpu;
required_device<screen_device> m_screen;
+ required_device<palette_device> m_palette;
required_device<ym2203_device> m_ym1;
required_device<ym2203_device> m_ym2;
required_device<msm5205_device> m_msm;
required_shared_ptr<uint16_t> m_spriteram;
+ required_shared_ptr<uint16_t> m_scrollram1;
+ required_shared_ptr<uint16_t> m_scrollram2;
required_device<gfxdecode_device> m_gfxdecode;
+ required_shared_ptr<uint16_t> m_videoram;
+ required_shared_ptr<uint16_t> m_videoram2;
+ required_shared_ptr<uint16_t> m_videoram3;
+ required_device<generic_latch_8_device> m_soundlatch;
+ uint16_t pal_read16(offs_t offset, u16 mem_mask = ~0) { uint16_t data = m_palette->read16(offset); return ((data & 0xff00) >> 8) | ((data & 0x00ff) << 8); };
+ uint16_t pal_read16_ext(offs_t offset, u16 mem_mask = ~0) { uint16_t data = m_palette->read16_ext(offset); return ((data & 0xff00) >> 8) | ((data & 0x00ff) << 8); };
+ void pal_write16(offs_t offset, u16 data, u16 mem_mask = ~0) { m_palette->write16(offset, ((data & 0xff00) >> 8) | ((data & 0x00ff) << 8), ((mem_mask & 0xff00) >> 8) | ((mem_mask & 0x00ff) << 8)); };
+ void pal_write16_ext(offs_t offset, u16 data, u16 mem_mask = ~0) { m_palette->write16_ext(offset, ((data & 0xff00) >> 8) | ((data & 0x00ff) << 8), ((mem_mask & 0xff00) >> 8) | ((mem_mask & 0x00ff) << 8)); };
uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
void raidenm_map(address_map &map);
void raidenm_sub_map(address_map &map);
- void raidenm_sound_map(address_map &map);
+
+ u8 sound_status_r();
+ void sound_command_w(u8 data);
+ void adpcm_w(u8 data);
+ void audio_map(address_map& map);
+ DECLARE_WRITE_LINE_MEMBER(adpcm_int);
+ u8 m_adpcm_data;
+
+ void unk_snd_dffx_w(offs_t offset, u8 data);
DECLARE_WRITE_LINE_MEMBER(vblank_irq);
void descramble_16x16tiles(uint8_t* src, int len);
+ void vram_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0);
+ void vram2_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0);
+ void vram3_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0);
+
+ TILE_GET_INFO_MEMBER(get_tile_info_tilemap1);
+ TILE_GET_INFO_MEMBER(get_tile_info_tilemap2);
+ TILE_GET_INFO_MEMBER(get_tile_info_tilemap3);
+
+ tilemap_t *m_bg_tilemap;
+ tilemap_t *m_bg_tilemap2;
+ tilemap_t *m_bg_tilemap3;
};
@@ -84,68 +123,177 @@ void raiden_ms_state::raidenm_map(address_map &map)
{
map(0x00000, 0x06fff).ram();
map(0x07000, 0x07fff).ram();
- map(0x08000, 0x08fff).ram();
map(0x0a000, 0x0afff).ram().share("shared_ram");
map(0x0b000, 0x0b001).portr("P1");
map(0x0b002, 0x0b003).portr("P2");
map(0x0b004, 0x0b005).portr("P3");
- map(0x0b008, 0x0b009).portr("P4");
+ map(0x0b006, 0x0b007).nopw();
+ map(0x0b008, 0x0b009).rw(FUNC(raiden_ms_state::sound_status_r), FUNC(raiden_ms_state::sound_command_w)).umask16(0xff00);
- map(0x0b006, 0x0b007).ram();
-
-
- map(0x0c000, 0x0cfff).ram();
+ map(0x0c000, 0x0cfff).ram().w(FUNC(raiden_ms_state::vram_w)).share("videoram");
map(0x0d800, 0x0dfff).ram().share("spriteram");
+ map(0x0f100, 0x0f103).ram().share("scrollram1");
+ map(0x0f900, 0x0f903).ram().share("scrollram2");
+
map(0xa0000, 0xfffff).rom();
}
void raiden_ms_state::raidenm_sub_map(address_map &map)
{
map(0x00000, 0x01fff).ram();
- map(0x02000, 0x02fff).ram();
- map(0x03000, 0x03fff).ram();
+ map(0x02000, 0x027ff).ram().w(FUNC(raiden_ms_state::vram2_w)).share("videoram2");
+ map(0x02800, 0x02fff).ram().w(FUNC(raiden_ms_state::vram3_w)).share("videoram3");
+ map(0x03000, 0x033ff).ram().rw(FUNC(raiden_ms_state::pal_read16), FUNC(raiden_ms_state::pal_write16)).share("palette");
+ map(0x03400, 0x037ff).ram().rw(FUNC(raiden_ms_state::pal_read16_ext), FUNC(raiden_ms_state::pal_write16_ext)).share("palette_ext");
+ map(0x03800, 0x03fff).ram();
+
+ map(0x04000, 0x04fff).ram().share("shared_ram");
map(0x07ffe, 0x07fff).ram();
- map(0x04000, 0x04fff).ram().share("shared_ram");
+ map(0x08000, 0x08001).nopw();
+ map(0x0a000, 0x0a001).nopw();
+ map(0x0e800, 0x0e801).nopw();
map(0xc0000, 0xfffff).rom();
}
-void raiden_ms_state::raidenm_sound_map(address_map &map)
+u8 raiden_ms_state::sound_status_r()
{
- map(0x0000, 0x7fff).rom();
+ return 0;
+}
- map(0xdff0, 0xdfff).ram();
+void raiden_ms_state::sound_command_w(u8 data)
+{
+ m_soundlatch->write(data & 0xff);
+}
+
+void raiden_ms_state::adpcm_w(u8 data)
+{
+// membank("sound_bank")->set_entry(((data & 0x10) >> 4) ^ 1);
+ m_msm->reset_w(BIT(data, 4));
+
+ m_adpcm_data = data & 0xf;
+ //m_msm->data_w(data & 0xf);
+// m_msm->vclk_w(BIT(data, 7));
+ //m_msm->vclk_w(1);
+ //m_msm->vclk_w(0);
+}
+
+void raiden_ms_state::unk_snd_dffx_w(offs_t offset, u8 data)
+{
+
+}
+
+void raiden_ms_state::audio_map(address_map &map)
+{
+ map(0x0000, 0x7fff).rom();
+ map(0x8000, 0x8000).w(FUNC(raiden_ms_state::adpcm_w));
+ map(0x8000, 0xbfff).bankr("sound_bank");
map(0xc000, 0xc7ff).ram();
+ map(0xd000, 0xd7ff).ram();
+ // area 0xdff0-5 is never ever readback, applying a RAM mirror causes sound to go significantly worse,
+ // what they are even for? (offset select bankswitch rather than data select?)
+ map(0xdff0, 0xdfff).r(m_soundlatch, FUNC(generic_latch_8_device::read)).w(FUNC(raiden_ms_state::unk_snd_dffx_w));
map(0xe000, 0xe001).w(m_ym1, FUNC(ym2203_device::write));
map(0xe002, 0xe003).w(m_ym2, FUNC(ym2203_device::write));
map(0xe008, 0xe009).r(m_ym1, FUNC(ym2203_device::read));
map(0xe00a, 0xe00b).r(m_ym2, FUNC(ym2203_device::read));
}
+WRITE_LINE_MEMBER(raiden_ms_state::adpcm_int)
+{
+ m_msm->data_w(m_adpcm_data);
+ m_audiocpu->set_input_line(0, HOLD_LINE);
+}
+
void raiden_ms_state::machine_start()
{
+ membank("sound_bank")->configure_entries(0, 2, memregion("audiocpu")->base() + 0x8000, 0x4000);
}
+void raiden_ms_state::vram_w(offs_t offset, uint16_t data, uint16_t mem_mask)
+{
+ COMBINE_DATA(&m_videoram[offset]);
+ m_bg_tilemap->mark_tile_dirty(offset);
+}
+
+void raiden_ms_state::vram2_w(offs_t offset, uint16_t data, uint16_t mem_mask)
+{
+ COMBINE_DATA(&m_videoram2[offset]);
+ m_bg_tilemap2->mark_tile_dirty(offset);
+}
+
+void raiden_ms_state::vram3_w(offs_t offset, uint16_t data, uint16_t mem_mask)
+{
+ COMBINE_DATA(&m_videoram3[offset]);
+ m_bg_tilemap3->mark_tile_dirty(offset);
+}
+
+TILE_GET_INFO_MEMBER(raiden_ms_state::get_tile_info_tilemap1)
+{
+ int tiledata = m_videoram[tile_index];
+ int tile = (tiledata & 0xff) | ((tiledata >> 6) & 0x300);
+ int color = (tiledata >> 8) & 0x0f;
+
+ tileinfo.set(3, tile, color, 0);
+}
+
+TILE_GET_INFO_MEMBER(raiden_ms_state::get_tile_info_tilemap2)
+{
+ int tile = m_videoram2[tile_index];
+ tileinfo.set(1, tile & 0xfff, tile >> 12, 0);
+}
+
+TILE_GET_INFO_MEMBER(raiden_ms_state::get_tile_info_tilemap3)
+{
+ int tile = m_videoram3[tile_index];
+ tileinfo.set(2, tile & 0xfff, tile >> 12, 0);
+}
+
+
+void raiden_ms_state::video_start()
+{
+ m_bg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(raiden_ms_state::get_tile_info_tilemap1)), TILEMAP_SCAN_ROWS, 8, 8, 32, 32);
+ m_bg_tilemap->set_transparent_pen(15);
+
+ m_bg_tilemap2 = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(raiden_ms_state::get_tile_info_tilemap2)), TILEMAP_SCAN_COLS, 16, 16, 32, 32);
+ //m_bg_tilemap2->set_transparent_pen(15);
+
+ m_bg_tilemap3 = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(raiden_ms_state::get_tile_info_tilemap3)), TILEMAP_SCAN_COLS, 16, 16, 32, 32);
+ m_bg_tilemap3->set_transparent_pen(15);
+
+}
+
uint32_t raiden_ms_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
bitmap.fill(0, cliprect);
+ m_bg_tilemap3->set_scrollx(0, 64 + (((m_scrollram1[0] & 0xff00) >> 8) | ((m_scrollram1[0] & 0x00ff) << 8)));
+ m_bg_tilemap3->set_scrolly(0, 17 + (((m_scrollram1[1] & 0xff00) >> 8) | ((m_scrollram1[1] & 0x00ff) << 8)));
+
+ m_bg_tilemap2->set_scrollx(0, 64 + (((m_scrollram2[0] & 0xff00) >> 8) | ((m_scrollram2[0] & 0x00ff) << 8)));
+ m_bg_tilemap2->set_scrolly(0, 17 + (((m_scrollram2[1] & 0xff00) >> 8) | ((m_scrollram2[1] & 0x00ff) << 8)));
+
+ m_bg_tilemap2->draw(screen, bitmap, cliprect, 0, 0);
+ m_bg_tilemap3->draw(screen, bitmap, cliprect, 0, 0);
+
+
// TODO, convert to device, share between Modualar System games
- const int NUM_SPRITES = 0x400;
- const int X_EXTRA_OFFSET = 0;
+ const int NUM_SPRITES = 0x200;
+ const int X_EXTRA_OFFSET = 256-16;
+ const int Y_EXTRA_OFFSET = 30;
- for (int i = NUM_SPRITES-2; i >= 0; i-=2)
+ for (int i = NUM_SPRITES - 2; i >= 0; i -= 2)
{
- gfx_element *gfx = m_gfxdecode->gfx(0);
+ gfx_element* gfx = m_gfxdecode->gfx(0);
uint16_t attr0 = m_spriteram[i + 0];
uint16_t attr1 = m_spriteram[i + 1];
@@ -154,223 +302,117 @@ uint32_t raiden_ms_state::screen_update(screen_device &screen, bitmap_ind16 &bit
//uint16_t attr3 = m_spriteram[i + NUM_SPRITES + 1]; // unused?
int ypos = attr0 & 0x00ff;
- int xpos = (attr1 & 0xff00)>>8;
- xpos |= (attr2 & 0x8000) ? 0x100 : 0x000;
+ int xpos = (attr1 & 0xff00) >> 8;
+ xpos |= (attr2 & 0x8000) ? 0x100 : 0x000;
ypos = (0xff - ypos);
int tile = (attr0 & 0xff00) >> 8;
tile |= (attr1 & 0x003f) << 8;
- int flipx = (attr1 & 0x0040);
int flipy = (attr2 & 0x4000);
+ int flipx = (attr2 & 0x2000);
- gfx->transpen(bitmap,cliprect,tile,(attr2&0x0f00)>>8,flipx,flipy,xpos-16-X_EXTRA_OFFSET,ypos-16,15);
+ gfx->transpen(bitmap, cliprect, tile, (attr2 & 0x0f00) >> 8, flipx, flipy, xpos - 16 - X_EXTRA_OFFSET, ypos - Y_EXTRA_OFFSET, 15);
}
+ m_bg_tilemap->set_scrolly(0, 16);
+
+ m_bg_tilemap->draw(screen, bitmap, cliprect, 0, 0);
+
return 0;
}
static INPUT_PORTS_START( raidenm )
PORT_START("P1")
- PORT_DIPNAME( 0x0001, 0x0001, "P1" )
- PORT_DIPSETTING( 0x0001, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0002, 0x0002, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0002, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0004, 0x0004, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0004, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0008, 0x0008, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0008, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0010, 0x0010, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0010, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0020, 0x0020, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0020, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0040, 0x0040, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0040, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0080, 0x0080, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0080, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0100, 0x0100, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0100, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0200, 0x0200, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0200, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0400, 0x0400, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0400, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0800, 0x0800, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0800, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x1000, 0x1000, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x1000, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x2000, 0x2000, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x2000, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x4000, 0x4000, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x4000, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x8000, 0x8000, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x8000, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_JOYSTICK_UP )
+ PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN )
+ PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT )
+ PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT )
+ PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_BUTTON1 )
+ PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_BUTTON2 )
+ PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_UNUSED )
+ PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_START1 )
+ PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_PLAYER(2)
+ PORT_BIT( 0x0200, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_PLAYER(2)
+ PORT_BIT( 0x0400, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_PLAYER(2)
+ PORT_BIT( 0x0800, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(2)
+ PORT_BIT( 0x1000, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2)
+ PORT_BIT( 0x2000, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(2)
+ PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_UNUSED )
+ PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_START2 )
PORT_START("P2")
- PORT_DIPNAME( 0x0001, 0x0001, "P2" )
- PORT_DIPSETTING( 0x0001, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0002, 0x0002, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0002, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0004, 0x0004, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0004, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0008, 0x0008, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0008, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0010, 0x0010, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0010, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0020, 0x0020, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0020, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0040, 0x0040, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0040, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0080, 0x0080, DEF_STR( Unknown ) )
+ PORT_DIPNAME( 0x0001, 0x0001, "Coin Mode" ) PORT_DIPLOCATION("SW1:1")
+ PORT_DIPSETTING( 0x0001, "A" )
+ PORT_DIPSETTING( 0x0000, "B" )
+ /* Coin Mode A */
+ PORT_DIPNAME( 0x001e, 0x001e, DEF_STR( Coinage ) ) PORT_CONDITION("P2", 0x0001, EQUALS, 0x0001) PORT_DIPLOCATION("SW1:2,3,4,5")
+ PORT_DIPSETTING( 0x0014, DEF_STR( 6C_1C ) )
+ PORT_DIPSETTING( 0x0016, DEF_STR( 5C_1C ) )
+ PORT_DIPSETTING( 0x0018, DEF_STR( 4C_1C ) )
+ PORT_DIPSETTING( 0x001a, DEF_STR( 3C_1C ) )
+ PORT_DIPSETTING( 0x0002, DEF_STR( 8C_3C ) )
+ PORT_DIPSETTING( 0x001c, DEF_STR( 2C_1C ) )
+ PORT_DIPSETTING( 0x0004, DEF_STR( 5C_3C ) )
+ PORT_DIPSETTING( 0x0006, DEF_STR( 3C_2C ) )
+ PORT_DIPSETTING( 0x001e, DEF_STR( 1C_1C ) )
+ PORT_DIPSETTING( 0x0008, DEF_STR( 2C_3C ) )
+ PORT_DIPSETTING( 0x0012, DEF_STR( 1C_2C ) )
+ PORT_DIPSETTING( 0x0010, DEF_STR( 1C_3C ) )
+ PORT_DIPSETTING( 0x000e, DEF_STR( 1C_4C ) )
+ PORT_DIPSETTING( 0x000c, DEF_STR( 1C_5C ) )
+ PORT_DIPSETTING( 0x000a, DEF_STR( 1C_6C ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( Free_Play ) )
+ /* Coin Mode B */
+ PORT_DIPNAME( 0x0006, 0x0006, DEF_STR( Coin_A ) ) PORT_CONDITION("P2", 0x0001, NOTEQUALS, 0x0001) PORT_DIPLOCATION("SW1:2,3")
+ PORT_DIPSETTING( 0x0000, "5C/1C or Free if Coin B too" )
+ PORT_DIPSETTING( 0x0002, DEF_STR( 3C_1C ) )
+ PORT_DIPSETTING( 0x0004, DEF_STR( 2C_1C ) )
+ PORT_DIPSETTING( 0x0006, DEF_STR( 1C_1C ) )
+ PORT_DIPNAME( 0x0018, 0x0018, DEF_STR( Coin_B ) ) PORT_CONDITION("P2", 0x0001, NOTEQUALS, 0x0001) PORT_DIPLOCATION("SW1:4,5")
+ PORT_DIPSETTING( 0x0018, DEF_STR( 1C_2C ) )
+ PORT_DIPSETTING( 0x0010, DEF_STR( 1C_3C ) )
+ PORT_DIPSETTING( 0x0008, DEF_STR( 1C_5C ) )
+ PORT_DIPSETTING( 0x0000, "1C/6C or Free if Coin A too" )
+
+ PORT_DIPNAME( 0x0020, 0x0020, "Credits to Start" ) PORT_DIPLOCATION("SW1:6")
+ PORT_DIPSETTING( 0x0020, "1" )
+ PORT_DIPSETTING( 0x0000, "2" )
+ PORT_DIPUNUSED_DIPLOC( 0x0040, 0x0040, "SW1:7")
+ PORT_DIPNAME( 0x0080, 0x0080, DEF_STR( Flip_Screen ) ) PORT_DIPLOCATION("SW1:8")
PORT_DIPSETTING( 0x0080, DEF_STR( Off ) )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0100, 0x0100, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0100, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0200, 0x0200, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0200, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0400, 0x0400, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0400, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0800, 0x0800, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0800, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x1000, 0x1000, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x1000, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x2000, 0x2000, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x2000, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x4000, 0x4000, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x4000, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x8000, 0x8000, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x8000, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0300, 0x0300, DEF_STR( Lives ) ) PORT_DIPLOCATION("SW2:1,2")
+ PORT_DIPSETTING( 0x0200, "1" )
+ PORT_DIPSETTING( 0x0100, "2" )
+ PORT_DIPSETTING( 0x0300, "3" )
+ PORT_DIPSETTING( 0x0000, "5" )
+ PORT_DIPNAME( 0x0c00, 0x0c00, DEF_STR( Bonus_Life ) ) PORT_DIPLOCATION("SW2:3,4")
+ PORT_DIPSETTING( 0x0800, "80000 300000" )
+ PORT_DIPSETTING( 0x0c00, "150000 400000" )
+ PORT_DIPSETTING( 0x0400, "300000 1000000" )
+ PORT_DIPSETTING( 0x0000, "1000000 5000000" )
+ PORT_DIPNAME( 0x3000, 0x3000, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SW2:5,6")
+ PORT_DIPSETTING( 0x2000, DEF_STR( Easy ) )
+ PORT_DIPSETTING( 0x3000, DEF_STR( Normal ) )
+ PORT_DIPSETTING( 0x1000, DEF_STR( Hard ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( Very_Hard ) )
+ PORT_DIPNAME( 0x4000, 0x4000, DEF_STR( Allow_Continue ) ) PORT_DIPLOCATION("SW2:7")
+ PORT_DIPSETTING( 0x0000, DEF_STR( No ) )
+ PORT_DIPSETTING( 0x4000, DEF_STR( Yes ) )
+ PORT_DIPNAME( 0x8000, 0x8000, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("SW2:8")
+ PORT_DIPSETTING( 0x0000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x8000, DEF_STR( On ) )
PORT_START("P3")
- PORT_DIPNAME( 0x0001, 0x0001, "P3" )
- PORT_DIPSETTING( 0x0001, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0002, 0x0002, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0002, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0004, 0x0004, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0004, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0008, 0x0008, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0008, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0010, 0x0010, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0010, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0020, 0x0020, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0020, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0040, 0x0040, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0040, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0080, 0x0080, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0080, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0100, 0x0100, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0100, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0200, 0x0200, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0200, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0400, 0x0400, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0400, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0800, 0x0800, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0800, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x1000, 0x1000, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x1000, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x2000, 0x2000, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x2000, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x4000, 0x4000, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x4000, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x8000, 0x8000, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x8000, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_BIT( 0x00ff, IP_ACTIVE_LOW, IPT_UNUSED )
+ PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_COIN1 )
+ PORT_BIT( 0x0200, IP_ACTIVE_LOW, IPT_COIN2 )
+ PORT_BIT( 0xfc00, IP_ACTIVE_LOW, IPT_UNUSED )
PORT_START("P4")
- PORT_DIPNAME( 0x0001, 0x0001, "P4" )
- PORT_DIPSETTING( 0x0001, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0002, 0x0002, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0002, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0004, 0x0004, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0004, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0008, 0x0008, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0008, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0010, 0x0010, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0010, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0020, 0x0020, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0020, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0040, 0x0040, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0040, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0080, 0x0080, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0080, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0100, 0x0100, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0100, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0200, 0x0200, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0200, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0400, 0x0400, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0400, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0800, 0x0800, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0800, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x1000, 0x1000, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x1000, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x2000, 0x2000, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x2000, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x4000, 0x4000, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x4000, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x8000, 0x8000, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x8000, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_BIT( 0xffff, IP_ACTIVE_HIGH, IPT_UNUSED )
INPUT_PORTS_END
static const gfx_layout tiles16x16x4_layout =
@@ -398,11 +440,11 @@ static const gfx_layout tiles8x8x4_layout =
static GFXDECODE_START( gfx_raiden_ms )
- GFXDECODE_ENTRY( "sprites", 0, tiles16x16x4_layout, 0x100, 32 )
+ GFXDECODE_ENTRY( "sprites", 0, tiles16x16x4_layout, 0x200, 16 )
- GFXDECODE_ENTRY( "gfx1", 0, tiles16x16x4_layout, 0x000, 32 )
- GFXDECODE_ENTRY( "gfx2", 0, tiles16x16x4_layout, 0x000, 32 )
- GFXDECODE_ENTRY( "gfx3", 0, tiles8x8x4_layout, 0x000, 32 )
+ GFXDECODE_ENTRY( "gfx1", 0, tiles16x16x4_layout, 0x300, 16 )
+ GFXDECODE_ENTRY( "gfx2", 0, tiles16x16x4_layout, 0x100, 16 )
+ GFXDECODE_ENTRY( "gfx3", 0, tiles8x8x4_layout, 0x000, 16 )
GFXDECODE_END
WRITE_LINE_MEMBER(raiden_ms_state::vblank_irq)
@@ -424,8 +466,8 @@ void raiden_ms_state::raidenm(machine_config &config)
V30(config, m_subcpu, 20_MHz_XTAL / 2); // divisor unknown
m_subcpu->set_addrmap(AS_PROGRAM, &raiden_ms_state::raidenm_sub_map);
- Z80(config, m_soundcpu, 24_MHz_XTAL / 8); // divisor unknown, no XTAL on the PCB, might also use the 20 MHz one
- m_soundcpu->set_addrmap(AS_PROGRAM, &raiden_ms_state::raidenm_sound_map);
+ Z80(config, m_audiocpu, XTAL(4'000'000));
+ m_audiocpu->set_addrmap(AS_PROGRAM, &raiden_ms_state::audio_map);
/* video hardware */
SCREEN(config, m_screen, SCREEN_TYPE_RASTER); // all wrong
@@ -437,30 +479,29 @@ void raiden_ms_state::raidenm(machine_config &config)
m_screen->set_palette("palette");
m_screen->screen_vblank().set(FUNC(raiden_ms_state::vblank_irq));
- PALETTE(config, "palette").set_format(palette_device::xBRG_444, 1024);
+ PALETTE(config, m_palette).set_format(palette_device::xBGR_444, 0x400);
GFXDECODE(config, "gfxdecode", "palette", gfx_raiden_ms);
+
+ GENERIC_LATCH_8(config, m_soundlatch);
/* sound hardware */
SPEAKER(config, "mono").front_center();
-
- GENERIC_LATCH_8(config, "soundlatch");
-
- YM2203(config, m_ym1, 24_MHz_XTAL / 8); // unknown clock
+ YM2203(config, m_ym1, XTAL(4'000'000)/4); // unknown clock
m_ym1->add_route(0, "mono", 0.15);
m_ym1->add_route(1, "mono", 0.15);
m_ym1->add_route(2, "mono", 0.15);
m_ym1->add_route(3, "mono", 0.10);
- YM2203(config, m_ym2, 24_MHz_XTAL / 8); // unknown clock
+ YM2203(config, m_ym2, XTAL(4'000'000)/4); // unknown clock
m_ym2->add_route(0, "mono", 0.15);
m_ym2->add_route(1, "mono", 0.15);
m_ym2->add_route(2, "mono", 0.15);
m_ym2->add_route(3, "mono", 0.10);
MSM5205(config, m_msm, XTAL(384'000)); // unknown clock
-// m_msm->vck_legacy_callback().set(FUNC(toki_ms_state::adpcm_int));
-// m_msm->set_prescaler_selector(msm5205_device::S48_4B); // unverified
+ m_msm->vck_legacy_callback().set(FUNC(raiden_ms_state::adpcm_int));
+ m_msm->set_prescaler_selector(msm5205_device::S48_4B); // unverified
m_msm->add_route(ALL_OUTPUTS, "mono", 0.25);
}
@@ -500,29 +541,29 @@ ROM_START( raidenm )
ROM_LOAD16_BYTE( "msraid_6-1-8086-1_rd606b.u19", 0x0c0001, 0x20000, CRC(58eac0b6) SHA1(618813c7593d13271d2826739f24e08dda400b0d) )
ROM_LOAD16_BYTE( "msraid_6-1-8086-1_rd605b.u18", 0x0c0000, 0x20000, CRC(251fef93) SHA1(818095a77cb94fd4acc9eb26954615ee93e8432c) )
- ROM_REGION( 0x10000, "soundcpu", 0 ) // on MOD 1/5 board
+ ROM_REGION( 0x10000, "audiocpu", 0 ) // on MOD 1/5 board
ROM_LOAD( "msraid_1-5_rd101.ic12", 0x00000, 0x10000, CRC(2b76e371) SHA1(4c9732950f576e498d02fde485ba92fb293d5594) )
// dumper's note: ROMs [rd4b1, rd4b2, rb4b3, rd4b4] and [rd4a1, rd4a2, rb4a3, rd4a4] have a strange setup
// with pins 32, 31 and 31 soldered together and pin 2 connected between all four chips, while the sockets are for 28 pin chips
// (with 27C512 silkscreened on the PCB behind the chips)
- ROM_REGION( 0x80000, "gfx1", 0 ) // on one of the MOD 4/3 boards
+ ROM_REGION( 0x80000, "gfx1", ROMREGION_INVERT ) // on one of the MOD 4/3 boards
ROM_LOAD32_BYTE( "msraid_4-3-1_rd4b1.ic17", 0x00003, 0x20000, CRC(ff35b830) SHA1(fb552b2aa50aed12c3adb6ef9032a438adf6f37f) )
ROM_LOAD32_BYTE( "msraid_4-3-1_rd4b2.ic16", 0x00002, 0x20000, CRC(da0b2fca) SHA1(4ffe177587759ea03e73bcc5c36bedc869653ce5) )
ROM_LOAD32_BYTE( "msraid_4-3-1_rd4b3.ic15", 0x00001, 0x20000, CRC(00e5953f) SHA1(488ac889a587bf4108be424faa9123abe73b5246) )
ROM_LOAD32_BYTE( "msraid_4-3-1_rd4b4.ic14", 0x00000, 0x20000, CRC(932f8407) SHA1(0c7a0b18bbc3ac1f30bdb0ba4466c1e253130305) )
- ROM_REGION( 0x80000, "gfx2", 0 ) // on another MOD 4/3 board
+ ROM_REGION( 0x80000, "gfx2", ROMREGION_INVERT ) // on another MOD 4/3 board
ROM_LOAD32_BYTE( "msraid_4-3-2_rd4a1.ic17", 0x00003, 0x20000, CRC(32892554) SHA1(8136626bf7073cdf19a8a38d19f6d0c52405df16) )
ROM_LOAD32_BYTE( "msraid_4-3-2_rd4a2.ic16", 0x00002, 0x20000, CRC(cb325246) SHA1(f0a7bf8b1b5145541af78eba0375392a3030e2d9) )
ROM_LOAD32_BYTE( "msraid_4-3-2_rd4a3.ic15", 0x00001, 0x20000, CRC(7554acef) SHA1(ec418ef2246c889d0e308925e11b1d3328bd83f9) )
ROM_LOAD32_BYTE( "msraid_4-3-2_rd4a4.ic14", 0x00000, 0x20000, CRC(1e1537a5) SHA1(3f17a85c185dd8be7f7b3a5adb28d508f9f059a5) )
- ROM_REGION( 0x20000, "gfx3", 0 ) // on a third MOD 4/3 board, all 1st and 2nd half identical
- ROM_LOAD32_BYTE( "msraid_4-3-3_rd404.ic17", 0x00003, 0x08000, CRC(caec39f5) SHA1(c61bd1f02515c6597d276dfcb21ed0969b556b8b) )
- ROM_LOAD32_BYTE( "msraid_4-3-3_rd403.ic16", 0x00002, 0x08000, CRC(0e817530) SHA1(efbc05d31ab38d0213387f4e61977f5203e19ace) )
- ROM_LOAD32_BYTE( "msraid_4-3-3_rd402.ic15", 0x00001, 0x08000, CRC(55dd887b) SHA1(efa687afe0b19fc741626b8fe5cd6ab541874396) )
- ROM_LOAD32_BYTE( "msraid_4-3-3_rd401.ic14", 0x00000, 0x08000, CRC(da82ab5d) SHA1(462db31a3cc1494fdc163d5abdf6d74a182a1421) )
+ ROM_REGION( 0x20000, "gfx3", ROMREGION_INVERT ) // on a third MOD 4/3 board, all 1st and 2nd half identical
+ ROM_LOAD32_BYTE( "msraid_4-3-3_rd404.ic17", 0x00000, 0x08000, CRC(caec39f5) SHA1(c61bd1f02515c6597d276dfcb21ed0969b556b8b) )
+ ROM_LOAD32_BYTE( "msraid_4-3-3_rd403.ic16", 0x00001, 0x08000, CRC(0e817530) SHA1(efbc05d31ab38d0213387f4e61977f5203e19ace) )
+ ROM_LOAD32_BYTE( "msraid_4-3-3_rd402.ic15", 0x00002, 0x08000, CRC(55dd887b) SHA1(efa687afe0b19fc741626b8fe5cd6ab541874396) )
+ ROM_LOAD32_BYTE( "msraid_4-3-3_rd401.ic14", 0x00003, 0x08000, CRC(da82ab5d) SHA1(462db31a3cc1494fdc163d5abdf6d74a182a1421) )
ROM_REGION( 0x80000, "sprites", ROMREGION_INVERT ) // on MOD 51/3 board
ROM_LOAD32_BYTE( "msraid_51-3_rd501.ic43", 0x00003, 0x20000, CRC(fcd1fc21) SHA1(465036348f19dd3ff999c12e6591b172a7fb621e) )
diff --git a/src/mame/drivers/spg2xx_zone.cpp b/src/mame/drivers/spg2xx_zone.cpp
index 1172dcc793d..e8bd8698ce3 100644
--- a/src/mame/drivers/spg2xx_zone.cpp
+++ b/src/mame/drivers/spg2xx_zone.cpp
@@ -341,18 +341,42 @@ ROM_START( lx_jg7415 )
ROM_LOAD16_WORD_SWAP( "rom.bin", 0x0000, 0x10000000, CRC(59442e00) SHA1(7e91cf6b19c37f9b4fa4dc21e241c6634d6a6f95) )
ROM_END
+ROM_START( zonemini )
+ ROM_REGION( 0x4000000, "maincpu", ROMREGION_ERASE00 )
+ ROM_LOAD16_WORD_SWAP( "zonemini.bin", 0x0000, 0x4000000, CRC(ba8c367c) SHA1(92ce2e895145ad76ea68ab7575d2c52aa0c0c5a9) )
+ROM_END
-CONS( 2009, zone40, 0, 0, zone40, wirels60, zone40_state, init_zone40, "Jungle Soft / Ultimate Products (HK) Ltd", "Zone 40", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS )
-CONS( 2009, itvg49, 0, 0, zone40p, wirels60, zone40_state, init_reactmd, "TaiKee", "Interactive TV Games 49-in-1 (PAL)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS ) // Badminton hangs, otherwise everything runs
+ROM_START( react )
+ ROM_REGION( 0x4000000, "maincpu", ROMREGION_ERASE00 )
+ ROM_LOAD16_WORD_SWAP( "reactor.bin", 0x0000, 0x0800000, CRC(0378c594) SHA1(b2214e3e235f26fb501df6c66a9b2c0da87b1c73))
+ ROM_CONTINUE(0x1000000, 0x0800000)
+ ROM_CONTINUE(0x0800000, 0x0800000)
+ ROM_CONTINUE(0x1800000, 0x0800000)
+ ROM_CONTINUE(0x2000000, 0x0800000)
+ ROM_CONTINUE(0x3000000, 0x0800000)
+ ROM_CONTINUE(0x2800000, 0x0800000)
+ ROM_CONTINUE(0x3800000, 0x0800000)
+ROM_END
-CONS( 2010, zone60, 0, 0, wireless60, wirels60, wireless60_state, empty_init, "Jungle's Soft / Ultimate Products (HK) Ltd", "Zone 60", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS )
-CONS( 200?, zone100, 0, 0, wireless60, wirels60, wireless60_state, init_zone100, "Jungle's Soft / Ultimate Products (HK) Ltd", "Zone 100", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS ) // unit was black, menus still show white controllers, unlike wireless 60
-CONS( 2010, wirels60, 0, 0, wireless60, wirels60, wireless60_state, empty_init, "Jungle Soft / Kids Station Toys Inc", "Wireless 60", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS )
-CONS( 2011, lx_jg7415,0, 0, wireless60, wirels60, wireless60_state, init_lx_jg7415, "Lexibook", "Lexibook JG7415 120-in-1", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS )
+// These have games from Waixing and were likely manufactured by Subor and sold by Ultimate Products Ltd.
+// Many of these games are rewrites of VT1682 based titles, which in turn were based on older NES/VT ones
+// Badminton hangs in units where it is present (cause not yet investigated), otherwise everything runs
+CONS( 2009, zone40, 0, 0, zone40, wirels60, zone40_state, init_zone40, "Ultimate Products Ltd.", "Zone 40", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS )
+CONS( 2009, itvg49, 0, 0, zone40p, wirels60, zone40_state, init_reactmd, "TaiKee", "Interactive TV Games 49-in-1 (PAL)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS )
+CONS( 200?, zonemini, 0, 0, zone40, wirels60, zone40_state, init_reactmd, "Ultimate Products Ltd.", "Zone Mini", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS )
+CONS( 2009, react, 0, 0, zone40, wirels60, zone40_state, init_reactmd, "Ultimate Products Ltd.", "Reactor 32-in-1 (NTSC)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS )
// Two systems in one unit - Genesis on a Chip and SunPlus, only the SunPlus part is currently emulated. Genesis on a chip is a very poor implementation with many issues on real hardware.
// This should actually boot to a menu on the MD size, with the SunPlus only being enabled if selected from that menu. MD side menu runs in some enhanced / custom MD mode tho.
// Badminton hangs, as it does in the 49-in-1 above
CONS( 2009, reactmd, 0, 0, zone40p, wirels60, zone40_state, init_reactmd, "AtGames / Sega", "Reactor MD (PAL)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS )
+// These have a newer selection of games by Jungletac instead of the Waixing ones
+
+CONS( 2010, zone60, 0, 0, wireless60, wirels60, wireless60_state, empty_init, "Jungle's Soft / Ultimate Products (HK) Ltd", "Zone 60", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS )
+CONS( 200?, zone100, 0, 0, wireless60, wirels60, wireless60_state, init_zone100, "Jungle's Soft / Ultimate Products (HK) Ltd", "Zone 100", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS ) // unit was black, menus still show white controllers, unlike wireless 60
+CONS( 2010, wirels60, 0, 0, wireless60, wirels60, wireless60_state, empty_init, "Jungle Soft / Kids Station Toys Inc", "Wireless 60", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS )
+CONS( 2011, lx_jg7415,0, 0, wireless60, wirels60, wireless60_state, init_lx_jg7415, "Lexibook", "Lexibook JG7415 120-in-1", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS )
+
+
diff --git a/src/mame/mame.lst b/src/mame/mame.lst
index d3beb6cc1c5..1b3bf2ece9a 100644
--- a/src/mame/mame.lst
+++ b/src/mame/mame.lst
@@ -38070,6 +38070,8 @@ itvg49
zone60 // Zone 60
zone100 //
lx_jg7415 //
+zonemini
+react
@source:spg2xx_zone_32bit.cpp
mywicodx //