diff --git a/hash/monon_color.xml b/hash/monon_color.xml
index e2a28d00d99..f2cba011724 100644
--- a/hash/monon_color.xml
+++ b/hash/monon_color.xml
@@ -58,7 +58,7 @@
- Jī jiǎ xuànfēng-gédòu dàshī
+ Jī jiǎ xuànfēng-gédòu dàshī (set 1)
2011
M&D
@@ -69,6 +69,18 @@
+
+ Jī jiǎ xuànfēng-gédòu dàshī (set 2)
+ 2011
+ M&D
+
+
+
+
+
+
+
+
Shén pò-shīluò de yíjī
2011
diff --git a/src/devices/machine/spg110.cpp b/src/devices/machine/spg110.cpp
index 4762a0c01cc..01ec544d52b 100644
--- a/src/devices/machine/spg110.cpp
+++ b/src/devices/machine/spg110.cpp
@@ -5,7 +5,9 @@
SunPlus SPG110-series SoC peripheral emulation
0032xx looks like it could be the same as 003dxx on spg2xx
- but the video seems quite different?
+ but the video seems to have differences, and data
+ is fetched from private buffers filled by DMA instead of
+ main space? tile attributes different? palette format different
**********************************************************************/
@@ -21,36 +23,136 @@ spg110_device::spg110_device(const machine_config &mconfig, device_type type, co
m_cpu(*this, finder_base::DUMMY_TAG),
m_palette(*this, "palette"),
m_gfxdecode(*this, "gfxdecode"),
- m_bg_videoram(*this, "bg_videoram"),
- m_fg_videoram(*this, "fg_videoram"),
- m_bg_attrram(*this, "bg_attrram"),
- m_fg_attrram(*this, "fg_attrram"),
m_palram(*this, "palram")
{
}
-WRITE16_MEMBER(spg110_device::bg_videoram_w)
+template
+void spg110_device::blit(const rectangle &cliprect, uint32_t line, uint32_t xoff, uint32_t yoff, uint32_t attr, uint32_t ctrl, uint32_t bitmap_addr, uint16_t tile)
{
- COMBINE_DATA(&m_bg_videoram[offset]);
- m_bg_tilemap->mark_tile_dirty(offset);
+ address_space &space = m_cpu->space(AS_PROGRAM);
+
+ int32_t h = 8 << ((attr & PAGE_TILE_HEIGHT_MASK) >> PAGE_TILE_HEIGHT_SHIFT);
+ int32_t w = 8 << ((attr & PAGE_TILE_WIDTH_MASK) >> PAGE_TILE_WIDTH_SHIFT);
+
+ uint32_t yflipmask = attr & TILE_Y_FLIP ? h - 1 : 0;
+
+ uint32_t nc = ((attr & 0x0003) + 1) << 1;
+
+ uint32_t palette_offset = (attr & 0x0f00) >> 4;
+
+ palette_offset >>= nc;
+ palette_offset <<= nc;
+
+ uint32_t bits_per_row = nc * w / 16;
+ uint32_t words_per_tile = bits_per_row * h;
+ uint32_t m = bitmap_addr + words_per_tile * tile + bits_per_row * (line ^ yflipmask);
+ uint32_t bits = 0;
+ uint32_t nbits = 0;
+ uint32_t y = line;
+
+ int yy = (yoff + y) & 0x1ff;
+ if (yy >= 0x01c0)
+ yy -= 0x0200;
+
+ if (yy > 240 || yy < 0)
+ return;
+
+ int y_index = yy * 320;
+
+ for (int32_t x = FlipX ? (w - 1) : 0; FlipX ? x >= 0 : x < w; FlipX ? x-- : x++)
+ {
+ int xx = xoff + x;
+
+ bits <<= nc;
+
+ if (nbits < nc)
+ {
+ uint16_t b = space.read_word(m++ & 0x3fffff);
+ //b = (b << 8) | (b >> 8);
+ bits |= b << (nc - nbits);
+ nbits += 16;
+ }
+ nbits -= nc;
+
+ uint32_t pal = palette_offset + (bits >> 16);
+ bits &= 0xffff;
+
+ xx &= 0x01ff;
+ if (xx >= 0x01c0)
+ xx -= 0x0200;
+
+ if (xx >= 0 && xx < 320)
+ {
+ // TODO, this is completely wrong for this palette system
+ int pix_index = xx + y_index;
+ uint16_t rawpal = m_palram[pal];
+ const pen_t *pens = m_palette->pens();
+ uint32_t paldata = pens[pal];
+
+ if (!(rawpal & 0x8000))
+ {
+ m_screenbuf[pix_index] = paldata;
+ }
+ }
+ }
}
-WRITE16_MEMBER(spg110_device::fg_videoram_w)
+void spg110_device::blit_page(const rectangle &cliprect, uint32_t scanline, int depth, uint32_t bitmap_addr, uint16_t *regs)
{
- COMBINE_DATA(&m_fg_videoram[offset]);
- m_fg_tilemap->mark_tile_dirty(offset);
-}
+ uint32_t xscroll = regs[0];
+ uint32_t yscroll = regs[1];
+ uint32_t attr = regs[2];
+ uint32_t ctrl = regs[3];
+ uint32_t tilemap = regs[4];
+ uint32_t palette_map = regs[5];
+ address_space &space2 = this->space(0);
-WRITE16_MEMBER(spg110_device::bg_attrram_w)
-{
- COMBINE_DATA(&m_bg_attrram[offset]);
- m_bg_tilemap->mark_tile_dirty(offset/2);
-}
+ if (!(ctrl & PAGE_ENABLE_MASK))
+ {
+ return;
+ }
-WRITE16_MEMBER(spg110_device::fg_attrram_w)
-{
- COMBINE_DATA(&m_fg_attrram[offset]);
- m_fg_tilemap->mark_tile_dirty(offset/2);
+ if (((attr & PAGE_DEPTH_FLAG_MASK) >> PAGE_DEPTH_FLAG_SHIFT) != depth)
+ {
+ return;
+ }
+
+ uint32_t tile_h = 8 << ((attr & PAGE_TILE_HEIGHT_MASK) >> PAGE_TILE_HEIGHT_SHIFT);
+ uint32_t tile_w = 8 << ((attr & PAGE_TILE_WIDTH_MASK) >> PAGE_TILE_WIDTH_SHIFT);
+
+ uint32_t tile_count_x = 512 / tile_w;
+
+ uint32_t bitmap_y = (scanline + yscroll) & 0xff;
+ uint32_t y0 = bitmap_y / tile_h;
+ uint32_t tile_scanline = bitmap_y % tile_h;
+ uint32_t tile_address = tile_count_x * y0;
+
+ for (uint32_t x0 = 0; x0 < tile_count_x; x0++, tile_address++)
+ {
+ uint32_t yy = ((tile_h * y0 - yscroll + 0x10) & 0xff) - 0x10;
+ uint32_t xx = (tile_w * x0 - xscroll) & 0x1ff;
+ uint16_t tile = (ctrl & PAGE_WALLPAPER_MASK) ? space2.read_word(tilemap*2) : space2.read_word((tilemap + tile_address)*2);
+ uint16_t palette = 0;
+
+ if (!tile)
+ continue;
+
+ palette = space2.read_word(palette_map + tile_address / 2);
+ if (x0 & 1)
+ palette = (palette & 0xff00) >> 8;
+ else
+ palette = (palette & 0x00ff);
+
+
+ bool flip_x = 0;//(tileattr & TILE_X_FLIP);
+
+ if (flip_x)
+ blit(cliprect, tile_scanline, xx, yy, attr, ctrl, bitmap_addr, tile);
+ else
+ blit(cliprect, tile_scanline, xx, yy, attr, ctrl, bitmap_addr, tile);
+
+ }
}
@@ -166,18 +268,7 @@ WRITE16_MEMBER(spg110_device::spg110_3221_w)
WRITE16_MEMBER(spg110_device::spg110_3223_w) { }
WRITE16_MEMBER(spg110_device::spg110_3225_w) { }
-WRITE16_MEMBER(spg110_device::spg110_bg_scrollx_w) { COMBINE_DATA(&m_bg_scrollx); }
-WRITE16_MEMBER(spg110_device::spg110_bg_scrolly_w) { COMBINE_DATA(&m_bg_scrolly); }
-WRITE16_MEMBER(spg110_device::spg110_2012_w) { }
-WRITE16_MEMBER(spg110_device::spg110_2013_w) { }
-WRITE16_MEMBER(spg110_device::spg110_2014_w) { }
-WRITE16_MEMBER(spg110_device::spg110_2015_w) { }
-WRITE16_MEMBER(spg110_device::spg110_2016_w) { }
-WRITE16_MEMBER(spg110_device::spg110_2017_w) { }
-WRITE16_MEMBER(spg110_device::spg110_2018_w) { }
-WRITE16_MEMBER(spg110_device::spg110_2019_w) { }
-WRITE16_MEMBER(spg110_device::spg110_201a_w) { }
-WRITE16_MEMBER(spg110_device::spg110_201b_w) { }
+
WRITE16_MEMBER(spg110_device::spg110_201c_w) { }
WRITE16_MEMBER(spg110_device::spg110_2020_w) { }
WRITE16_MEMBER(spg110_device::spg110_2042_w) { }
@@ -218,66 +309,44 @@ WRITE16_MEMBER(spg110_device::spg110_205d_w) { }
WRITE16_MEMBER(spg110_device::spg110_205e_w) { }
WRITE16_MEMBER(spg110_device::spg110_205f_w) { }
-WRITE16_MEMBER(spg110_device::spg110_2061_w) { COMBINE_DATA(&m_2061_outer); }
-WRITE16_MEMBER(spg110_device::spg110_2064_w) { COMBINE_DATA(&m_2064_outer); }
-WRITE16_MEMBER(spg110_device::spg110_2067_w) { COMBINE_DATA(&m_2067_outer); }
-WRITE16_MEMBER(spg110_device::spg110_2068_w) { COMBINE_DATA(&m_2068_outer); }
+WRITE16_MEMBER(spg110_device::dma_unk_2061_w) { COMBINE_DATA(&m_dma_unk_2061); }
+WRITE16_MEMBER(spg110_device::dma_dst_step_w) { COMBINE_DATA(&m_dma_dst_step); }
+WRITE16_MEMBER(spg110_device::dma_unk_2067_w) { COMBINE_DATA(&m_dma_unk_2067); }
+WRITE16_MEMBER(spg110_device::dma_src_step_w) { COMBINE_DATA(&m_dma_src_step); }
-WRITE16_MEMBER(spg110_device::spg110_2060_w) { COMBINE_DATA(&m_2060_inner); }
-WRITE16_MEMBER(spg110_device::spg110_2066_w) { COMBINE_DATA(&m_2066_inner); }
+WRITE16_MEMBER(spg110_device::dma_dst_w) { COMBINE_DATA(&m_dma_dst); }
+WRITE16_MEMBER(spg110_device::dma_src_w) { COMBINE_DATA(&m_dma_src); }
-
-WRITE16_MEMBER(spg110_device::spg110_2062_w)
+WRITE16_MEMBER(spg110_device::dma_len_trigger_w)
{
-// int length = (data - 1) & 0xff;
int length = data & 0x1fff;
// this is presumably a counter that underflows to 0x1fff, because that's what the wait loop waits for?
- logerror("%s: trigger (%04x) with values (written outer) %04x %04x %04x %04x | (written inner) %04x (ram source?) %04x\n", machine().describe_context(), data, m_2061_outer, m_2064_outer, m_2067_outer, m_2068_outer, m_2060_inner, m_2066_inner);
+ logerror("%s: (trigger len) %04x with values (unk) %04x (dststep) %04x (unk) %04x (src step) %04x | (dst) %04x (src) %04x\n", machine().describe_context(), data, m_dma_unk_2061, m_dma_dst_step, m_dma_unk_2067, m_dma_src_step, m_dma_dst, m_dma_src);
- int source = m_2066_inner;
- int dest = m_2060_inner;
+ if ((m_dma_unk_2061!=0x0000) || (m_dma_unk_2067 != 0x0000))
+ fatalerror("unknown DMA params are not zero!\n");
+
+ int source = m_dma_src;
+ int dest = m_dma_dst;
- // maybe
- /*
- if (!(m_2068_outer & 1))
- {
- length = length * 4;
- }
- */
- //logerror("[ ");
for (int i = 0; i < length; i++)
{
- if (m_2068_outer & 1)
- {
- address_space &mem = m_cpu->space(AS_PROGRAM);
- uint16_t val = mem.read_word(m_2066_inner + i);
+ address_space &mem = m_cpu->space(AS_PROGRAM);
+ uint16_t val = mem.read_word(source);
- this->space(0).write_word(dest * 2, val, 0xffff);
- }
- else // guess, it needs to clear layers somehow
- {
- // is there a fill mode to fill other values?
- this->space(0).write_word(dest * 2, 0x0000, 0xffff);
- }
-
- source++;
- // m_2064_outer is usually 1, but sometimes 0x20/0x40
- dest+=m_2064_outer;
-
- // logerror("%04x, ", val);
+ this->space(0).write_word(dest * 2, val, 0xffff);
+
+ source+=m_dma_src_step;
+ dest+=m_dma_dst_step;
}
- // logerror(" ]\n");
}
-READ16_MEMBER(spg110_device::spg110_2062_r)
+READ16_MEMBER(spg110_device::dma_len_status_r)
{
return 0x1fff; // DMA related?
}
-
-READ16_MEMBER(spg110_device::spg110_2013_r) { return 0x0000; }
-READ16_MEMBER(spg110_device::spg110_2019_r) { return 0x0000; }
READ16_MEMBER(spg110_device::spg110_2037_r) { return 0x0000; }
READ16_MEMBER(spg110_device::spg110_2042_r) { return 0x0000; }
@@ -308,24 +377,70 @@ WRITE16_MEMBER(spg110_device::spg110_310d_w) { }
READ16_MEMBER(spg110_device::spg110_310f_r) { return 0x0000; }
+READ16_MEMBER(spg110_device::tmap0_regs_r) { return tmap0_regs[offset]; }
+READ16_MEMBER(spg110_device::tmap1_regs_r) { return tmap1_regs[offset]; }
+
+void spg110_device::tilemap_write_regs(int which, uint16_t* regs, int regno, uint16_t data)
+{
+ switch (regno)
+ {
+ case 0x0: // Page X scroll
+ logerror("video_w: Page %d X Scroll = %04x\n", which, data & 0x01ff);
+ regs[regno] = data & 0x01ff;
+ break;
+
+ case 0x1: // Page Y scroll
+ logerror("video_w: Page %d Y Scroll = %04x\n", which, data & 0x00ff);
+ regs[regno] = data & 0x00ff;
+ break;
+
+ case 0x2: // Page Attributes
+ // 'depth' (aka z value) can't be depth here as it is on spg2xx, or the scores in attract will be behind the table, it really seems to be per attribute bit instead
+
+ logerror("video_w: Page %d Attributes = %04x (Depth:%d, Palette:%d, VSize:%d, HSize:%d, FlipY:%d, FlipX:%d, BPP:%d)\n", which, data
+ , (data >> 12) & 3, (data >> 8) & 15, 8 << ((data >> 6) & 3), 8 << ((data >> 4) & 3), BIT(data, 3), BIT(data, 2), 2 * ((data & 3) + 1));
+ regs[regno] = data;
+ break;
+
+ case 0x3: // Page Control
+ logerror("video_w: Page %d Control = %04x (Blend:%d, HiColor:%d, RowScroll:%d, Enable:%d, Wallpaper:%d, RegSet:%d, Bitmap:%d)\n", which, data
+ , BIT(data, 8), BIT(data, 7), BIT(data, 4), BIT(data, 3), BIT(data, 2), BIT(data, 1), BIT(data, 0));
+ regs[regno] = data;
+ break;
+
+ case 0x4: // Page Tile Address
+ logerror("video_w: Page %d Tile Address = %04x\n", which, data);
+ regs[regno] = data;
+ break;
+
+ case 0x5: // Page Attribute Address
+ logerror("video_w: Page %d Attribute Address = %04x\n", which, data);
+ regs[regno] = data;
+ break;
+ }
+}
+
+
+WRITE16_MEMBER(spg110_device::tmap0_regs_w)
+{
+ tilemap_write_regs(0, tmap0_regs,offset,data);
+}
+
+
+WRITE16_MEMBER(spg110_device::tmap1_regs_w)
+{
+ tilemap_write_regs(1, tmap1_regs,offset,data);
+}
+
void spg110_device::map(address_map &map)
{
map(0x000000, 0x000fff).ram();
// vregs are at 2000?
- map(0x002010, 0x002010).w(FUNC(spg110_device::spg110_bg_scrollx_w));
- map(0x002011, 0x002011).w(FUNC(spg110_device::spg110_bg_scrolly_w));
- map(0x002012, 0x002012).w(FUNC(spg110_device::spg110_2012_w));
- map(0x002013, 0x002013).rw(FUNC(spg110_device::spg110_2013_r),FUNC(spg110_device::spg110_2013_w));
- map(0x002014, 0x002014).w(FUNC(spg110_device::spg110_2014_w));
- map(0x002015, 0x002015).w(FUNC(spg110_device::spg110_2015_w));
- map(0x002016, 0x002016).w(FUNC(spg110_device::spg110_2016_w));
- map(0x002017, 0x002017).w(FUNC(spg110_device::spg110_2017_w));
- map(0x002018, 0x002018).w(FUNC(spg110_device::spg110_2018_w));
- map(0x002019, 0x002019).rw(FUNC(spg110_device::spg110_2019_r), FUNC(spg110_device::spg110_2019_w));
- map(0x00201a, 0x00201a).w(FUNC(spg110_device::spg110_201a_w));
- map(0x00201b, 0x00201b).w(FUNC(spg110_device::spg110_201b_w));
+ map(0x002010, 0x002015).rw(FUNC(spg110_device::tmap0_regs_r), FUNC(spg110_device::tmap0_regs_w));
+ map(0x002016, 0x00201b).rw(FUNC(spg110_device::tmap1_regs_r), FUNC(spg110_device::tmap1_regs_w));
+
map(0x00201c, 0x00201c).w(FUNC(spg110_device::spg110_201c_w));
map(0x002020, 0x002020).w(FUNC(spg110_device::spg110_2020_w));
@@ -372,14 +487,14 @@ void spg110_device::map(address_map &map)
//map(0x002010, 0x00205f).ram();
// everything (dma? and interrupt flag?!)
- map(0x002060, 0x002060).w(FUNC(spg110_device::spg110_2060_w));
- map(0x002061, 0x002061).w(FUNC(spg110_device::spg110_2061_w));
- map(0x002062, 0x002062).rw(FUNC(spg110_device::spg110_2062_r),FUNC(spg110_device::spg110_2062_w));
+ map(0x002060, 0x002060).w(FUNC(spg110_device::dma_dst_w));
+ map(0x002061, 0x002061).w(FUNC(spg110_device::dma_unk_2061_w));
+ map(0x002062, 0x002062).rw(FUNC(spg110_device::dma_len_status_r),FUNC(spg110_device::dma_len_trigger_w));
map(0x002063, 0x002063).rw(FUNC(spg110_device::spg110_2063_r),FUNC(spg110_device::spg110_2063_w)); // this looks like interrupt stuff and is checked in the irq like an irq source, but why in the middle of what otherwise look like some kind of DMA?
- map(0x002064, 0x002064).w(FUNC(spg110_device::spg110_2064_w));
- map(0x002066, 0x002066).w(FUNC(spg110_device::spg110_2066_w));
- map(0x002067, 0x002067).w(FUNC(spg110_device::spg110_2067_w));
- map(0x002068, 0x002068).w(FUNC(spg110_device::spg110_2068_w));
+ map(0x002064, 0x002064).w(FUNC(spg110_device::dma_dst_step_w));
+ map(0x002066, 0x002066).w(FUNC(spg110_device::dma_src_w));
+ map(0x002067, 0x002067).w(FUNC(spg110_device::dma_unk_2067_w));
+ map(0x002068, 0x002068).w(FUNC(spg110_device::dma_src_step_w));
map(0x002200, 0x0022ff).ram(); // looks like per-pen brightness or similar? strange because palette isn't memory mapped here
@@ -428,10 +543,7 @@ void spg110_device::map(address_map &map)
void spg110_device::map_video(address_map &map)
{
// are these addresses hardcoded, or can they move (in which case tilemap system isn't really suitable)
- map(0x00000, 0x00fff).ram().w(FUNC(spg110_device::bg_videoram_w)).share("bg_videoram");
- map(0x01000, 0x017ff).ram().w(FUNC(spg110_device::bg_attrram_w)).share("bg_attrram");
- map(0x01800, 0x027ff).ram().w(FUNC(spg110_device::fg_videoram_w)).share("fg_videoram");
- map(0x02800, 0x02fff).ram().w(FUNC(spg110_device::fg_attrram_w)).share("fg_attrram");
+ map(0x00000, 0x03fff).ram(); // 2fff?
map(0x04000, 0x04fff).ram(); // seems to be 3 blocks, almost certainly spritelist
@@ -447,46 +559,17 @@ TIMER_CALLBACK_MEMBER(spg110_device::test_timer)
}
*/
-TILE_GET_INFO_MEMBER(spg110_device::get_bg_tile_info)
-{
- int tileno = m_bg_videoram[tile_index];
- int attr = m_bg_attrram[tile_index/2];
- if (tile_index&1) attr = (attr & 0xff00)>>8;
- else attr = attr & 0x00ff;
-
- SET_TILE_INFO_MEMBER(3, tileno, 0, 0);
- tileinfo.category = (attr >> 4) & 0x0f; // very likely wrong, complete guess
-
-}
-
-TILE_GET_INFO_MEMBER(spg110_device::get_fg_tile_info)
-{
- int tileno = m_fg_videoram[tile_index];
-
- int attr = m_fg_attrram[tile_index/2];
- if (tile_index&1) attr = (attr & 0xff00)>>8;
- else attr = attr & 0x00ff;
-
- int pal = attr & 0x0f;
-
- SET_TILE_INFO_MEMBER(0, tileno, pal, 0);
- tileinfo.category = (attr >> 4) & 0x0f; // very likely wrong, complete guess
-}
void spg110_device::device_start()
{
// m_test_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(spg110_device::test_timer), this));
- m_bg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(spg110_device::get_bg_tile_info),this), TILEMAP_SCAN_ROWS, 8, 8, 64, 32);
- m_fg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(spg110_device::get_fg_tile_info),this), TILEMAP_SCAN_ROWS, 8, 8, 64, 32);
- m_fg_tilemap->set_transparent_pen(0);
-
- save_item(NAME(m_2068_outer));
- save_item(NAME(m_2064_outer));
- save_item(NAME(m_2061_outer));
- save_item(NAME(m_2067_outer));
- save_item(NAME(m_2060_inner));
- save_item(NAME(m_2066_inner));
+ save_item(NAME(m_dma_src_step));
+ save_item(NAME(m_dma_dst_step));
+ save_item(NAME(m_dma_unk_2061));
+ save_item(NAME(m_dma_unk_2067));
+ save_item(NAME(m_dma_dst));
+ save_item(NAME(m_dma_src));
save_item(NAME(m_bg_scrollx));
save_item(NAME(m_bg_scrolly));
save_item(NAME(m_2036_scroll));
@@ -494,12 +577,12 @@ void spg110_device::device_start()
void spg110_device::device_reset()
{
- m_2068_outer = 0;
- m_2064_outer = 0;
- m_2061_outer = 0;
- m_2067_outer = 0;
- m_2060_inner = 0;
- m_2066_inner = 0;
+ m_dma_src_step = 0;
+ m_dma_dst_step = 0;
+ m_dma_unk_2061 = 0;
+ m_dma_unk_2067 = 0;
+ m_dma_dst = 0;
+ m_dma_src = 0;
m_bg_scrollx = 0;
m_bg_scrolly = 0;
m_2036_scroll = 0;
@@ -551,18 +634,30 @@ uint32_t spg110_device::screen_update(screen_device &screen, bitmap_rgb32 &bitma
m_palette->set_pen_color(index, r_real, g_real, b_real);
}
- m_bg_tilemap->set_scrollx(0, m_bg_scrollx);
- m_bg_tilemap->set_scrolly(0, m_bg_scrolly);
+ memset(&m_screenbuf[320 * cliprect.min_y], 0, 4 * 320 * ((cliprect.max_y - cliprect.min_y) + 1));
- m_fg_tilemap->set_scrollx(0, 8); // where does this come from?
+ const uint32_t page1_addr = 0;//0x40 * m_video_regs[0x20];
+ const uint32_t page2_addr = 0;//0x40 * m_video_regs[0x21];
+ uint16_t *page1_regs = tmap0_regs;
+ uint16_t *page2_regs = tmap1_regs;
- // what is 2036 used for, also looks like scrolling, maybe some sprite offset? or zoom? (reference videos suggest maybe start logo text zooms?)
-
- for (int pri = 0; pri < 0x10; pri++) // priority is probably not correct, this is just using a random tile attribute with single use case
+ for (uint32_t scanline = (uint32_t)cliprect.min_y; scanline <= (uint32_t)cliprect.max_y; scanline++)
{
- m_bg_tilemap->draw(screen, bitmap, cliprect, pri, pri, 0);
- m_fg_tilemap->draw(screen, bitmap, cliprect, pri, pri, 0);
+ for (int i = 0; i < 4; i++)
+ {
+ blit_page(cliprect, scanline, i, page2_addr, page2_regs);
+ blit_page(cliprect, scanline, i, page1_addr, page1_regs);
+ //blit_sprites(cliprect, scanline, i);
+ }
}
+
+ for (int y = cliprect.min_y; y <= cliprect.max_y; y++)
+ {
+ uint32_t *dest = &bitmap.pix32(y, cliprect.min_x);
+ uint32_t *src = &m_screenbuf[cliprect.min_x + 320 * y];
+ memcpy(dest, src, sizeof(uint32_t) * ((cliprect.max_x - cliprect.min_x) + 1));
+ }
+
return 0;
}
diff --git a/src/devices/machine/spg110.h b/src/devices/machine/spg110.h
index 763b363813d..dd51e1883b1 100644
--- a/src/devices/machine/spg110.h
+++ b/src/devices/machine/spg110.h
@@ -43,45 +43,37 @@ protected:
address_space_config m_space_config;
private:
+ enum
+ {
+ PAGE_ENABLE_MASK = 0x0008,
+ PAGE_WALLPAPER_MASK = 0x0004,
+
+ PAGE_DEPTH_FLAG_MASK = 0x3000,
+ PAGE_DEPTH_FLAG_SHIFT = 12,
+ PAGE_TILE_HEIGHT_MASK = 0x00c0,
+ PAGE_TILE_HEIGHT_SHIFT = 6,
+ PAGE_TILE_WIDTH_MASK = 0x0030,
+ PAGE_TILE_WIDTH_SHIFT = 4,
+
+ TILE_X_FLIP = 0x0004,
+ TILE_Y_FLIP = 0x0008
+ };
+
+ enum flipx_t : bool
+ {
+ FlipXOff = false,
+ FlipXOn = true
+ };
+
required_device m_cpu;
required_device m_palette;
required_device m_gfxdecode;
- required_shared_ptr m_bg_videoram;
- required_shared_ptr m_fg_videoram;
- required_shared_ptr m_bg_attrram;
- required_shared_ptr m_fg_attrram;
required_shared_ptr m_palram;
- tilemap_t *m_bg_tilemap;
- tilemap_t *m_fg_tilemap;
-
//TIMER_CALLBACK_MEMBER(test_timer);
//emu_timer *m_test_timer;
- DECLARE_WRITE16_MEMBER(bg_videoram_w);
- DECLARE_WRITE16_MEMBER(bg_attrram_w);
- TILE_GET_INFO_MEMBER(get_bg_tile_info);
- DECLARE_WRITE16_MEMBER(fg_videoram_w);
- DECLARE_WRITE16_MEMBER(fg_attrram_w);
- TILE_GET_INFO_MEMBER(get_fg_tile_info);
-
-
- DECLARE_READ16_MEMBER(spg110_2013_r);
- DECLARE_READ16_MEMBER(spg110_2019_r);
-
- DECLARE_WRITE16_MEMBER(spg110_bg_scrollx_w);
- DECLARE_WRITE16_MEMBER(spg110_bg_scrolly_w);
- DECLARE_WRITE16_MEMBER(spg110_2012_w);
- DECLARE_WRITE16_MEMBER(spg110_2013_w);
- DECLARE_WRITE16_MEMBER(spg110_2014_w);
- DECLARE_WRITE16_MEMBER(spg110_2015_w);
- DECLARE_WRITE16_MEMBER(spg110_2016_w);
- DECLARE_WRITE16_MEMBER(spg110_2017_w);
- DECLARE_WRITE16_MEMBER(spg110_2018_w);
- DECLARE_WRITE16_MEMBER(spg110_2019_w);
- DECLARE_WRITE16_MEMBER(spg110_201a_w);
- DECLARE_WRITE16_MEMBER(spg110_201b_w);
DECLARE_WRITE16_MEMBER(spg110_201c_w);
DECLARE_WRITE16_MEMBER(spg110_2020_w);
@@ -128,16 +120,16 @@ private:
DECLARE_READ16_MEMBER(spg110_2037_r);
DECLARE_READ16_MEMBER(spg110_2042_r);
- DECLARE_WRITE16_MEMBER(spg110_2060_w);
- DECLARE_WRITE16_MEMBER(spg110_2061_w);
- DECLARE_WRITE16_MEMBER(spg110_2062_w);
+ DECLARE_WRITE16_MEMBER(dma_dst_w);
+ DECLARE_WRITE16_MEMBER(dma_unk_2061_w);
+ DECLARE_WRITE16_MEMBER(dma_len_trigger_w);
DECLARE_WRITE16_MEMBER(spg110_2063_w);
- DECLARE_WRITE16_MEMBER(spg110_2064_w);
- DECLARE_WRITE16_MEMBER(spg110_2066_w);
- DECLARE_WRITE16_MEMBER(spg110_2067_w);
- DECLARE_WRITE16_MEMBER(spg110_2068_w);
+ DECLARE_WRITE16_MEMBER(dma_dst_step_w);
+ DECLARE_WRITE16_MEMBER(dma_src_w);
+ DECLARE_WRITE16_MEMBER(dma_unk_2067_w);
+ DECLARE_WRITE16_MEMBER(dma_src_step_w);
- DECLARE_READ16_MEMBER(spg110_2062_r);
+ DECLARE_READ16_MEMBER(dma_len_status_r);
DECLARE_READ16_MEMBER(spg110_2063_r);
DECLARE_WRITE16_MEMBER(spg110_3200_w);
@@ -177,18 +169,32 @@ private:
DECLARE_READ16_MEMBER(spg110_310f_r);
+ DECLARE_READ16_MEMBER(tmap0_regs_r);
+ DECLARE_READ16_MEMBER(tmap1_regs_r);
+ DECLARE_WRITE16_MEMBER(tmap0_regs_w);
+ DECLARE_WRITE16_MEMBER(tmap1_regs_w);
- uint16_t m_2068_outer;
- uint16_t m_2064_outer;
- uint16_t m_2061_outer;
- uint16_t m_2067_outer;
+ uint16_t tmap0_regs[0x6];
+ uint16_t tmap1_regs[0x6];
- uint16_t m_2060_inner;
- uint16_t m_2066_inner;
+ uint16_t m_dma_src_step;
+ uint16_t m_dma_dst_step;
+ uint16_t m_dma_unk_2061;
+ uint16_t m_dma_unk_2067;
+
+ uint16_t m_dma_dst;
+ uint16_t m_dma_src;
uint16_t m_bg_scrollx;
uint16_t m_bg_scrolly;
uint16_t m_2036_scroll;
+
+ void tilemap_write_regs(int which, uint16_t* regs, int regno, uint16_t data);
+
+ template
+ void blit(const rectangle &cliprect, uint32_t line, uint32_t xoff, uint32_t yoff, uint32_t attr, uint32_t ctrl, uint32_t bitmap_addr, uint16_t tile);
+ void blit_page(const rectangle &cliprect, uint32_t scanline, int depth, uint32_t bitmap_addr, uint16_t *regs);
+ uint32_t m_screenbuf[320 * 240];
};
DECLARE_DEVICE_TYPE(SPG110, spg110_device)
diff --git a/src/mame/drivers/rad_eu3a14.cpp b/src/mame/drivers/rad_eu3a14.cpp
index 9bd325e81d5..f844eb12698 100644
--- a/src/mame/drivers/rad_eu3a14.cpp
+++ b/src/mame/drivers/rad_eu3a14.cpp
@@ -16,10 +16,7 @@
Baseball 3 ? x16 48 4MB no ELAN EU3A14 (developed by FarSight Studios)
Connectv Football ? x16 48 4MB no ELAN EU3A14 (developed by Medialink)
Huntin’3 ? x16 48 4MB no Elan ? (developed by V-Tac Technology Co Ltd.)
- --------------
- Also on this hardware
- --------------
- Play TV Basketball 75029 x16 48 not dumped no ELAN EU3A14
+ Play TV Basketball 75029 x16 48 4MB no ELAN EU3A14
In many ways this is similar to the rad_eu3a05.cpp hardware
but the video system has changed, here the sprites are more traditional non-tile based, rather
@@ -1063,6 +1060,91 @@ static INPUT_PORTS_START( radica_hnt3p )
PORT_BIT( 0xff, IP_ACTIVE_HIGH, IPT_UNUSED )
INPUT_PORTS_END
+
+static INPUT_PORTS_START( radica_bask )
+ PORT_START("IN0")
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT )
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT )
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON1 )
+ PORT_DIPNAME( 0x08, 0x08, "IN0" )
+ PORT_DIPSETTING( 0x08, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x10, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x20, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x40, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x80, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+
+ PORT_START("IN1")
+ PORT_DIPNAME( 0x01, 0x01, "IN1" )
+ PORT_DIPSETTING( 0x01, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x02, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x04, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x08, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x10, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x20, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x40, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x80, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+
+ PORT_START("IN2")
+ PORT_DIPNAME( 0x01, 0x01, "IN2" )
+ PORT_DIPSETTING( 0x01, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x02, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x04, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x08, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x10, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x20, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x40, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x80, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+
+ PORT_START("TV")
+ PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNUSED )
+INPUT_PORTS_END
+
+static INPUT_PORTS_START( radica_baskp )
+ PORT_INCLUDE(radica_bask)
+
+ PORT_MODIFY("TV")
+ PORT_BIT( 0xff, IP_ACTIVE_HIGH, IPT_UNUSED )
+INPUT_PORTS_END
+
static INPUT_PORTS_START( radica_bb3 )
PORT_START("IN0")
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT )
@@ -1389,6 +1471,16 @@ ROM_START( rad_hnt3p )
ROM_LOAD( "huntin3.bin", 0x000000, 0x400000, CRC(c8e3e40b) SHA1(81eb16ac5ab6d93525fcfadbc6703b2811d7de7f) )
ROM_END
+ROM_START( rad_bask )
+ ROM_REGION( 0x400000, "maincpu", ROMREGION_ERASE00 )
+ ROM_LOAD( "basketball.bin", 0x000000, 0x400000, CRC(7d6ff53c) SHA1(1c75261d55e0107a3b8e8d4c1eb2854750f2d0e8) )
+ROM_END
+
+ROM_START( rad_baskp )
+ ROM_REGION( 0x400000, "maincpu", ROMREGION_ERASE00 )
+ ROM_LOAD( "basketball.bin", 0x000000, 0x400000, CRC(7d6ff53c) SHA1(1c75261d55e0107a3b8e8d4c1eb2854750f2d0e8) )
+ROM_END
+
CONS( 2006, rad_gtg, 0, 0, radica_eu3a14_adc, rad_gtg, radica_eu3a14_state, init_rad_gtg, "Radica / FarSight Studios (licensed from Incredible Technologies)", "Golden Tee Golf: Home Edition", MACHINE_NOT_WORKING )
CONS( 2005, rad_rsg, 0, 0, radica_eu3a14, rad_rsg, radica_eu3a14_state, init_rad_gtg, "Radica / FarSight Studios", "Play TV Real Swing Golf", MACHINE_NOT_WORKING )
@@ -1402,3 +1494,6 @@ CONS( 2005, rad_bb3p, rad_bb3, 0, radica_eu3a14p, radica_bb3p, radica_eu3a
CONS( 2005, rad_hnt3, 0, 0, radica_eu3a14, radica_hnt3, radica_eu3a14_state, init_rad_hnt3, "Radica / V-Tac Technology Co Ltd.", "Play TV Huntin' 3", MACHINE_NOT_WORKING )
CONS( 2005, rad_hnt3p,rad_hnt3, 0, radica_eu3a14p, radica_hnt3p, radica_eu3a14_state, init_rad_hnt3, "Radica / V-Tac Technology Co Ltd.", "Connectv Huntin' 3", MACHINE_NOT_WORKING )
+
+CONS( 2005, rad_bask, 0, 0, radica_eu3a14, radica_bask, radica_eu3a14_state, init_rad_gtg, "Radica / FarSight Studios", "Play TV Basketball", MACHINE_NOT_WORKING )
+CONS( 2005, rad_baskp,rad_bask, 0, radica_eu3a14, radica_baskp, radica_eu3a14_state, init_rad_gtg, "Radica / FarSight Studios", "Connectv Basketball", MACHINE_NOT_WORKING )
diff --git a/src/mame/drivers/subsino2.cpp b/src/mame/drivers/subsino2.cpp
index caa1dc759b4..fa07dd47b63 100644
--- a/src/mame/drivers/subsino2.cpp
+++ b/src/mame/drivers/subsino2.cpp
@@ -116,6 +116,7 @@ public:
void init_bishjan();
void init_new2001();
void init_queenbee();
+ void init_queenbeeb();
void init_humlan();
void init_squeenb();
void init_xtrain();
@@ -2710,6 +2711,33 @@ no ROM labels available
***************************************************************************/
ROM_START( queenbee )
+ ROM_REGION( 0x80000, "maincpu", 0 ) // H8/3044
+ ROM_LOAD( "27c020 u21.bin", 0x00000, 0x40000, CRC(baec0241) SHA1(345cfee7bdb4f4c61caa828372a121f3917bb4eb) )
+ ROM_FILL( 0x40000, 0x40000, 0xff )
+
+ ROM_REGION( 0x200000, "tilemap", 0 )
+ ROM_LOAD32_BYTE( "27c4001 u25.bin", 0x000000, 0x80000, CRC(628ed650) SHA1(dadbc5f73f6a5773303d834a44d2eab836874cfe) )
+ ROM_LOAD32_BYTE( "27c4001 u26.bin", 0x000001, 0x80000, CRC(27a169df) SHA1(d36989c300051a0c41752638ab5134a9b04c50a4) )
+ ROM_LOAD32_BYTE( "27c4001 u27.bin", 0x000002, 0x80000, CRC(27e8c4b9) SHA1(b010b9dcadb357cf4e79d97ce84b86f792bd8ecf) )
+ ROM_LOAD32_BYTE( "27c4001 u28.bin", 0x000003, 0x80000, CRC(7f139a04) SHA1(595a114806756e6f77a6fe20a13515b211ffdf2a) )
+
+ ROM_REGION( 0x80000, "samples", 0 )
+ ROM_LOAD( "27c4001 u9.bin", 0x000000, 0x80000, CRC(c7cda990) SHA1(193144fe0c31fc8342bd44aa4899bf15f0bc399d) )
+ROM_END
+
+void subsino2_state::init_queenbee()
+{
+ uint16_t *rom = (uint16_t*)memregion("maincpu")->base();
+
+ // patch serial protection test (ERROR 093099 otherwise)
+ rom[0x1cc6/2] = 0x4066;
+
+ // rts -> rte
+ rom[0x3e6a/2] = 0x5670; // IRQ 8
+ rom[0x3fbe/2] = 0x5670; // IRQ 0
+}
+
+ROM_START( queenbeeb )
ROM_REGION( 0x80000, "maincpu", 0 ) // H8/3044
ROM_LOAD( "u21", 0x00000, 0x40000, CRC(23e0ad8f) SHA1(d913ebd249c471ab36aabe515a8b36bb3590c1ca) )
ROM_FILL( 0x40000, 0x40000, 0xff )
@@ -2726,7 +2754,7 @@ ROM_START( queenbee )
ROM_LOAD( "u9", 0x000000, 0x40000, NO_DUMP )
ROM_END
-void subsino2_state::init_queenbee()
+void subsino2_state::init_queenbeeb()
{
uint16_t *rom = (uint16_t*)memregion("maincpu")->base();
@@ -2738,6 +2766,35 @@ void subsino2_state::init_queenbee()
rom[0x3a56/2] = 0x5670; // IRQ 0
}
+// make sure these are really queenbee
+ROM_START( queenbeei )
+ ROM_REGION( 0x80000, "maincpu", 0 ) // H8/3044
+ ROM_LOAD( "u21 9ac9 v100", 0x00000, 0x40000, CRC(061b406f) SHA1(2a5433817e41610e9ba90302a6b9608f769176a0) )
+ ROM_FILL( 0x40000, 0x40000, 0xff )
+
+ ROM_REGION( 0x200000, "tilemap", 0 )
+ ROM_LOAD( "gfx", 0x000000, 0x200000, NO_DUMP )
+
+ ROM_REGION( 0x80000, "samples", 0 )
+ ROM_LOAD( "u9", 0x000000, 0x80000, NO_DUMP )
+ROM_END
+
+ROM_START( queenbeesa )
+ ROM_REGION( 0x80000, "maincpu", 0 ) // H8/3044
+ ROM_LOAD( "00b0 u21 1v101", 0x00000, 0x40000, CRC(19e31fd7) SHA1(01cf507958b0411d21dd660280f45668d7c5b9d9) )
+ ROM_FILL( 0x40000, 0x40000, 0xff )
+
+ ROM_REGION( 0x200000, "tilemap", 0 )
+ ROM_LOAD( "gfx", 0x000000, 0x200000, NO_DUMP )
+
+ ROM_REGION( 0x80000, "samples", 0 )
+ ROM_LOAD( "u9", 0x000000, 0x80000, NO_DUMP )
+ROM_END
+
+
+
+
+
/***************************************************************************
Humlan's Lyckohjul (Sweden, V402)
@@ -3255,15 +3312,29 @@ void subsino2_state::init_wtrnymph()
rom[0xc2d7] = 0x18;
}
-GAME( 1996, mtrain, 0, mtrain, mtrain, subsino2_state, init_mtrain, ROT0, "Subsino", "Magic Train (Ver. 1.31)", 0 )
-GAME( 1996, wtrnymph, 0, mtrain, wtrnymph, subsino2_state, init_wtrnymph, ROT0, "Subsino", "Water-Nymph (Ver. 1.4)", 0 )
-GAME( 1998, expcard, 0, expcard, expcard, subsino2_state, init_expcard, ROT0, "American Alpha", "Express Card / Top Card (Ver. 1.5)", 0 )
-GAME( 1998, saklove, 0, saklove, saklove, subsino2_state, init_saklove, ROT0, "Subsino", "Ying Hua Lian 2.0 (China, Ver. 1.02)", 0 )
-GAME( 1999, xtrain, 0, xtrain, xtrain, subsino2_state, init_xtrain, ROT0, "Subsino", "X-Train (Ver. 1.3)", 0 )
-GAME( 1999, ptrain, 0, xtrain, xtrain, subsino2_state, init_ptrain, ROT0, "Subsino", "Panda Train (Novamatic 1.7)", MACHINE_IMPERFECT_GRAPHICS )
-GAME( 1999, bishjan, 0, bishjan, bishjan, subsino2_state, init_bishjan, ROT0, "Subsino", "Bishou Jan (Japan, Ver. 203)", MACHINE_NO_SOUND )
-GAME( 2000, new2001, 0, new2001, new2001, subsino2_state, init_new2001, ROT0, "Subsino", "New 2001 (Italy, Ver. 200N)", MACHINE_NO_SOUND )
-GAME( 2006, xplan, 0, xplan, xplan, subsino2_state, init_xplan, ROT0, "Subsino", "X-Plan (Ver. 101)", 0 )
-GAME( 2001, queenbee, 0, humlan, humlan, subsino2_state, init_queenbee, ROT0, "Subsino", "Queen Bee (Brazil, Ver. 202)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_IMPERFECT_GRAPHICS ) // severe timing issues, only program ROM available
-GAME( 2001, humlan, queenbee, humlan, humlan, subsino2_state, init_humlan, ROT0, "Subsino (Truemax license)", "Humlan's Lyckohjul (Sweden, Ver. 402)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_IMPERFECT_GRAPHICS ) // severe timing issues
-GAME( 2002, squeenb, 0, humlan, humlan, subsino2_state, init_squeenb, ROT0, "Subsino", "Super Queen Bee (Ver. 101)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_IMPERFECT_GRAPHICS ) // severe timing issues
+GAME( 1996, mtrain, 0, mtrain, mtrain, subsino2_state, init_mtrain, ROT0, "Subsino", "Magic Train (Ver. 1.31)", 0 )
+
+GAME( 1996, wtrnymph, 0, mtrain, wtrnymph, subsino2_state, init_wtrnymph, ROT0, "Subsino", "Water-Nymph (Ver. 1.4)", 0 )
+
+GAME( 1998, expcard, 0, expcard, expcard, subsino2_state, init_expcard, ROT0, "Subsino (American Alpha license)", "Express Card / Top Card (Ver. 1.5)", 0 )
+
+GAME( 1998, saklove, 0, saklove, saklove, subsino2_state, init_saklove, ROT0, "Subsino", "Ying Hua Lian 2.0 (China, Ver. 1.02)", 0 )
+
+GAME( 1999, xtrain, 0, xtrain, xtrain, subsino2_state, init_xtrain, ROT0, "Subsino", "X-Train (Ver. 1.3)", 0 )
+
+GAME( 1999, ptrain, 0, xtrain, xtrain, subsino2_state, init_ptrain, ROT0, "Subsino", "Panda Train (Novamatic 1.7)", MACHINE_IMPERFECT_GRAPHICS )
+
+GAME( 1999, bishjan, 0, bishjan, bishjan, subsino2_state, init_bishjan, ROT0, "Subsino", "Bishou Jan (Japan, Ver. 203)", MACHINE_NO_SOUND )
+
+GAME( 2000, new2001, 0, new2001, new2001, subsino2_state, init_new2001, ROT0, "Subsino", "New 2001 (Italy, Ver. 200N)", MACHINE_NO_SOUND )
+
+GAME( 2006, xplan, 0, xplan, xplan, subsino2_state, init_xplan, ROT0, "Subsino", "X-Plan (Ver. 101)", 0 )
+
+GAME( 2001, queenbee, 0, humlan, humlan, subsino2_state, init_queenbee, ROT0, "Subsino (American Alpha license)", "Queen Bee (Ver. 114)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_IMPERFECT_GRAPHICS ) // severe timing issues
+GAME( 2001, queenbeeb,queenbee, humlan, humlan, subsino2_state, init_queenbeeb,ROT0, "Subsino", "Queen Bee (Brazil, Ver. 202)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_IMPERFECT_GRAPHICS ) // severe timing issues, only program ROM available
+GAME( 2001, queenbeei,queenbee, humlan, humlan, subsino2_state, empty_init, ROT0, "Subsino", "Queen Bee (Israel, Ver. 100)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_IMPERFECT_GRAPHICS ) // severe timing issues, only program ROM available
+GAME( 2001, queenbeesa,queenbee,humlan, humlan, subsino2_state, empty_init, ROT0, "Subsino", "Queen Bee (SA-101-HARD)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_IMPERFECT_GRAPHICS ) // severe timing issues, only program ROM available
+
+GAME( 2001, humlan, queenbee, humlan, humlan, subsino2_state, init_humlan, ROT0, "Subsino (Truemax license)", "Humlan's Lyckohjul (Sweden, Ver. 402)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_IMPERFECT_GRAPHICS ) // severe timing issues
+
+GAME( 2002, squeenb, 0, humlan, humlan, subsino2_state, init_squeenb, ROT0, "Subsino", "Super Queen Bee (Ver. 101)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_IMPERFECT_GRAPHICS ) // severe timing issues
diff --git a/src/mame/drivers/xavix.cpp b/src/mame/drivers/xavix.cpp
index 4eb9bcfaae4..715c663cc5c 100644
--- a/src/mame/drivers/xavix.cpp
+++ b/src/mame/drivers/xavix.cpp
@@ -844,11 +844,13 @@ static INPUT_PORTS_START( rad_snow )
PORT_INCLUDE(xavix)
PORT_MODIFY("IN0")
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Go") // is this a button, or 'up' ?
-
- PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN )
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_NAME("Foward / Go")
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_NAME("Enter / Select")
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT )
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT )
+
+ PORT_MODIFY("IN1")
+ PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_POWER_OFF ) PORT_NAME("Power Switch") // pressing this will turn the game off.
INPUT_PORTS_END
static INPUT_PORTS_START( rad_snowp )
@@ -858,6 +860,19 @@ static INPUT_PORTS_START( rad_snowp )
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_CUSTOM )
INPUT_PORTS_END
+static INPUT_PORTS_START( rad_bdp )
+ PORT_INCLUDE(xavix)
+
+ PORT_MODIFY("IN0")
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Purple / Up")
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("Red / Down")
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("Blue / Back")
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_NAME("Pink / Select")
+
+ PORT_MODIFY("IN1")
+ PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_POWER_OFF ) PORT_NAME("Power Switch") // pressing this will turn the game off.
+INPUT_PORTS_END
+
static INPUT_PORTS_START( rad_ping )
PORT_INCLUDE(xavix)
@@ -1136,6 +1151,12 @@ void xavix_state::xavix_nv(machine_config &config)
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_1);
}
+void xavix_state::xavixp_nv(machine_config &config)
+{
+ xavixp(config);
+ NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_1);
+}
+
void xavix_state::xavix2000(machine_config &config)
{
xavix(config);
@@ -1413,6 +1434,25 @@ ROM_START( rad_mtrkp ) // rom was dumped from NTSC unit, assuming to be the same
ROM_LOAD( "monstertruck.bin", 0x000000, 0x400000, CRC(dccda0a7) SHA1(7953cf29643672f8367639555b797c20bb533eab) )
ROM_END
+ROM_START( rad_ssx )
+ ROM_REGION(0x400000, "bios", ROMREGION_ERASE00)
+ ROM_LOAD("snowssx.bin", 0x000000, 0x400000, CRC(108e19a6) SHA1(3dfb18efb6331b96a53138a5ba29dae9cd966e90) )
+ROM_END
+
+ROM_START( rad_ssxp )
+ ROM_REGION(0x400000, "bios", ROMREGION_ERASE00)
+ ROM_LOAD("snowssx.bin", 0x000000, 0x400000, CRC(108e19a6) SHA1(3dfb18efb6331b96a53138a5ba29dae9cd966e90) )
+ROM_END
+
+ROM_START( rad_sbw )
+ ROM_REGION(0x400000, "bios", ROMREGION_ERASE00)
+ ROM_LOAD("snowbwhite.bin", 0x000000, 0x400000, CRC(640c1473) SHA1(d37d1484a5b14735b35afbca305dad7d178b08a2) )
+ROM_END
+
+ROM_START( rad_bdp )
+ ROM_REGION(0x800000, "bios", ROMREGION_ERASE00)
+ ROM_LOAD("barbiepad.bin", 0x000000, 0x200000, CRC(48731512) SHA1(377d4e1c98cafcd9d5e1ee27943289d250a6e7a9) )
+ROM_END
ROM_START( rad_madf )
ROM_REGION(0x400000, "bios", ROMREGION_ERASE00)
@@ -1555,15 +1595,25 @@ CONS( 2001, rad_bass, 0, 0, xavix, rad_bass, xavix_state,
CONS( 2001, rad_bassp, rad_bass, 0, xavixp, rad_bassp,xavix_state, init_xavix, "Radica / SSD Company LTD", "ConnecTV Bass Fishin' (PAL)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND )
// there is another 'Snowboarder' with a white coloured board, it appears to be a newer game closer to 'SSX Snowboarder' but without the SSX license.
-CONS( 2001, rad_snow, 0, 0, xavix, rad_snow, xavix_state, init_xavix, "Radica / SSD Company LTD", "Play TV Snowboarder (Blue) (NTSC)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND )
-CONS( 2001, rad_snowp, rad_snow, 0, xavixp, rad_snowp,xavix_state, init_xavix, "Radica / SSD Company LTD", "ConnecTV Snowboarder (Blue) (PAL)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND )
+CONS( 2001, rad_snow, 0, 0, xavix_nv, rad_snow, xavix_state, init_xavix, "Radica / SSD Company LTD", "Play TV Snowboarder (Blue) (NTSC)", MACHINE_IMPERFECT_SOUND )
+CONS( 2001, rad_snowp, rad_snow, 0, xavixp_nv, rad_snowp,xavix_state, init_xavix, "Radica / SSD Company LTD", "ConnecTV Snowboarder (Blue) (PAL)", MACHINE_IMPERFECT_SOUND )
-CONS( 2003, rad_madf, 0, 0, xavix_madfb, rad_fb, xavix_madfb_state, init_xavix, "Radica / SSD Company LTD", "EA Sports Madden Football (NTSC)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) // no Play TV branding, USA only release?
+CONS( 2003, rad_madf, 0, 0, xavix_madfb, rad_fb, xavix_madfb_state, init_xavix, "Radica / Electronics Arts / SSD Company LTD", "EA Sports Madden Football (NTSC)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) // no Play TV branding, USA only release?
CONS( 200?, rad_fb, 0, 0, xavix_madfb, rad_fb, xavix_madfb_state, init_xavix, "Radica / SSD Company LTD", "Play TV Football (NTSC)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) // USA only release? doesn't change logo for PAL.
CONS( 200?, rad_rh, 0, 0, xavix, rad_rh, xavix_state, init_xavix, "Radica / Fisher-Price / SSD Company LTD", "Play TV Rescue Heroes (NTSC)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND )
+CONS( 2004, rad_ssx, 0, 0, xavix, rad_snow, xavix_state, init_xavix, "Radica / Electronics Arts / SSD Company LTD", "Play TV SSX Snowboarder (NTSC)", MACHINE_IMPERFECT_SOUND )
+CONS( 2004, rad_ssxp, rad_ssx, 0, xavixp, rad_snowp,xavix_state, init_xavix, "Radica / Electronics Arts / SSD Company LTD", "ConnecTV SSX Snowboarder (PAL)", MACHINE_IMPERFECT_SOUND )
+
+// basically a reissue of SSX but without the license
+CONS( 2006, rad_sbw, 0, 0, xavix, rad_snow, xavix_state, init_xavix, "Radica / SSD Company LTD", "Play TV Snowboarder (White) (NTSC)", MACHINE_IMPERFECT_SOUND )
+// doesn't exist with ConnecTV branding?
+
+CONS( 2002, rad_bdp, 0, 0, xavix, rad_bdp, xavix_state, init_xavix, "Radica / Mattel / SSD Company LTD", "Barbie Dance Party", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
+
+
CONS( 2000, epo_epp, 0, 0, xavix, epo_epp, xavix_state, init_xavix, "Epoch / SSD Company LTD", "Excite Ping Pong (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND )
// Excite Ping Pong 2 is from 2003, and there's a 3rd game from 2006 also
diff --git a/src/mame/includes/xavix.h b/src/mame/includes/xavix.h
index e080bdf0913..0e47384a852 100644
--- a/src/mame/includes/xavix.h
+++ b/src/mame/includes/xavix.h
@@ -105,9 +105,12 @@ public:
{ }
void xavix(machine_config &config);
- void xavixp(machine_config &config);
- void xavix2000(machine_config &config);
void xavix_nv(machine_config &config);
+
+ void xavixp(machine_config &config);
+ void xavixp_nv(machine_config &config);
+
+ void xavix2000(machine_config &config);
void xavix2000_nv(machine_config &config);
void xavix2002(machine_config &config);
diff --git a/src/mame/mame.lst b/src/mame/mame.lst
index e414bb5b760..78e2759d998 100644
--- a/src/mame/mame.lst
+++ b/src/mame/mame.lst
@@ -33107,6 +33107,8 @@ rad_bb3
rad_bb3p
rad_hnt3
rad_hnt3p
+rad_bask
+rad_baskp
@source:rad_eu3a05.cpp
rad_sinv
@@ -36295,7 +36297,10 @@ humlan // (c) 2001 Subsino & Truemax
mtrain // (c) 1996 Subsino
new2001 // (c) 2000 Subsino
ptrain // (c) 1999 Subsino
-queenbee // (c) 2001 Subsino
+queenbee // (c) 2001 American Alpha
+queenbeeb // (c) 2001 Subsino
+queenbeei // (c) 2001 Subsino
+queenbeesa // (c) 2001 Subsino
saklove // (c) 1998 Subsino
squeenb // (c) 2002 Subsino
wtrnymph // (c) 1996 Subsino
@@ -39803,6 +39808,10 @@ epo_sdb //
epo_guru //
epo_dmon //
rad_rh //
+rad_ssx //
+rad_ssxp //
+rad_sbw //
+rad_bdp //
has_wamg //
ekara //
ekaraa //