From d75ce57f3c416ee24b5b62a0225176efe4612725 Mon Sep 17 00:00:00 2001 From: David Haywood Date: Sat, 2 Feb 2019 15:52:12 +0000 Subject: [PATCH] new WORKING machines --- Play TV SSX Snowboarder (and other misc / TV game work) (#4576) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit New working machines --- Play TV SSX Snowboarder (NTSC) [Sean Riddle, Peter Wilhelmsen, David Haywood] Play TV Snowboarder (White) (NTSC) [Sean Riddle, Peter Wilhelmsen, David Haywood] Barbie Dance Party [Sean Riddle, Peter Wilhelmsen, David Haywood] Play TV Basketball [Sean Riddle, Peter Wilhelmsen, David Haywood] Machines promoted to working --- Play TV Snowboarder (Blue) (NTSC) [Sean Riddle, Peter Wilhelmsen, David Haywood] New clones marked as NOT_WORKING ---- Queen Bee (Ver. 114) [Cristiano-MDQ] Queen Bee (Israel, Ver. 100) [Cristiano-MDQ] Queen Bee (SA-101-HARD) [Cristiano-MDQ] New NOT_WORKING software list additions --- monon_color.xml: mechcycla Jī jiǎ xuànfēng-gédòu dàshī (set 2) [zhongtiao1] also refactored the spg110 stuff to be closer to spg2xx, which regresses things a bit for now due to differences, but only thing using it is the in-progress jak_capb emulation I'm working on. sharing the code doesn't seem practical due to all the subtle differences, so needs working out like this for now at least. (nw) --- hash/monon_color.xml | 14 +- src/devices/machine/spg110.cpp | 389 ++++++++++++++++++++------------ src/devices/machine/spg110.h | 94 ++++---- src/mame/drivers/rad_eu3a14.cpp | 103 ++++++++- src/mame/drivers/subsino2.cpp | 97 ++++++-- src/mame/drivers/xavix.cpp | 62 ++++- src/mame/includes/xavix.h | 7 +- src/mame/mame.lst | 11 +- 8 files changed, 559 insertions(+), 218 deletions(-) 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 //