summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author David Haywood <28625134+DavidHaywood@users.noreply.github.com>2020-03-07 15:52:47 +0000
committer GitHub <noreply@github.com>2020-03-07 10:52:47 -0500
commitc46e3754ba38155c0dc6928ea8623c99110dac39 (patch)
tree6be5750615b44ac9dcdd0cc402d8e88bc2302b58
parent80d9962aad8ac77b1680fdcb698729478f4e68da (diff)
Plug and Play work (#6396)
* gcm394 / paccon - use screen resolution to determine tilemap limits nstead of hardcoding it (nw) * debugging (nw) * tweaks to video (nw) * new NOT WORKING ---- Super Game 36-in-1 (TimeTop SuperGame) [JP_Ronny, TeamEurope] (actually seems playable, but there are some details I want to verify / figure out before promoting it) * map 'X' for timetp36 (nw) * extra io notes (nw) * confirm difficulty mapping (nw) * set to PAL timings (nw) * new NOT WORKING ---- Digi Makeover (Girl Tech) [Sean Riddle, Clawgrip] * move digimakeover to its own driver (nw) * hack to force IRQ on (nw) * alt mode for rad_digi (nw) * some buton notes (nw) * flips for rallyx (nw) * make some IRQ code closer to spg2xx (nw) * improve raster for Xevious (nw) * no macro (nw) * new NOT WORKING ---- Gormiti Game Arena (Spain) [Sean Riddle, Clawgrip] * new NOT WORKING ---- MobiGo (Spain) [Sean Riddle, Clawgrip] * don't use smartfp inputs (nw)
-rw-r--r--scripts/target/mame/mess.lua1
-rw-r--r--src/devices/machine/spg2xx_video.cpp65
-rw-r--r--src/devices/machine/sunplus_gcm394.cpp5
-rw-r--r--src/devices/machine/sunplus_gcm394_video.cpp198
-rw-r--r--src/devices/machine/sunplus_gcm394_video.h16
-rw-r--r--src/mame/drivers/nes_vt.cpp93
-rw-r--r--src/mame/drivers/spg2xx.cpp2
-rw-r--r--src/mame/drivers/spg2xx_digimake.cpp220
-rw-r--r--src/mame/drivers/sunplus_unsp20soc.cpp172
-rw-r--r--src/mame/drivers/sunplus_unsp20soc_mobigo.cpp14
-rw-r--r--src/mame/mame.lst6
-rw-r--r--src/mame/mess.flt1
12 files changed, 690 insertions, 103 deletions
diff --git a/scripts/target/mame/mess.lua b/scripts/target/mame/mess.lua
index 3180c533b88..1ef8bb26da5 100644
--- a/scripts/target/mame/mess.lua
+++ b/scripts/target/mame/mess.lua
@@ -3835,6 +3835,7 @@ files {
MAME_DIR .. "src/mame/drivers/spg110.cpp",
MAME_DIR .. "src/mame/drivers/spg2xx.cpp",
MAME_DIR .. "src/mame/drivers/spg2xx_skannerztv.cpp",
+ MAME_DIR .. "src/mame/drivers/spg2xx_digimake.cpp",
MAME_DIR .. "src/mame/drivers/spg2xx_jakks.cpp",
MAME_DIR .. "src/mame/drivers/spg2xx_jakks_gkr.cpp",
MAME_DIR .. "src/mame/drivers/spg2xx_jakks_tvtouch.cpp",
diff --git a/src/devices/machine/spg2xx_video.cpp b/src/devices/machine/spg2xx_video.cpp
index 45f3c5e9ee5..942b31d4dab 100644
--- a/src/devices/machine/spg2xx_video.cpp
+++ b/src/devices/machine/spg2xx_video.cpp
@@ -225,6 +225,7 @@ void spg2xx_video_device::draw_bitmap(const rectangle& cliprect, uint32_t scanli
//printf("draw bitmap bases %04x %04x\n", tilemap, palette_map);
+ //uint32_t xscroll = regs[0];
uint32_t yscroll = regs[1];
int realline = (scanline + yscroll) & 0xff;
@@ -243,30 +244,47 @@ void spg2xx_video_device::draw_bitmap(const rectangle& cliprect, uint32_t scanli
palette &= 0x00ff;
//const int linewidth = 320 / 2;
- int sourcebase = tile | (palette << 16); // this is correct for Texas Hold'em - TODO: get from a register?
+ int sourcebase = tile | (palette << 16);
uint32_t* dest = &m_screenbuf[320 * scanline];
- for (int i = 0; i < 320 / 2; i++)
- {
- uint8_t palette_entry;
- uint16_t color;
- const uint16_t data = space.read_word(sourcebase + i);
-
- palette_entry = (data & 0x00ff);
- color = m_paletteram[palette_entry];
+ uint32_t ctrl = regs[3];
- if (!(color & 0x8000))
+ if (ctrl & 0x80) // HiColor mode (rad_digi)
+ {
+ for (int i = 0; i < 320; i++)
{
- dest[(i * 2)+0] = m_rgb555_to_rgb888[color & 0x7fff];
+ const uint16_t data = space.read_word(sourcebase + i);
+
+ if (!(data & 0x8000))
+ {
+ dest[i] = m_rgb555_to_rgb888[data & 0x7fff];
+ }
}
+ }
+ else
+ {
+ for (int i = 0; i < 320 / 2; i++)
+ {
+ uint8_t palette_entry;
+ uint16_t color;
+ const uint16_t data = space.read_word(sourcebase + i);
- palette_entry = (data & 0xff00) >> 8;
- color = m_paletteram[palette_entry];
+ palette_entry = (data & 0x00ff);
+ color = m_paletteram[palette_entry];
- if (!(color & 0x8000))
- {
- dest[(i * 2)+1] = m_rgb555_to_rgb888[color & 0x7fff];
+ if (!(color & 0x8000))
+ {
+ dest[(i * 2) + 0] = m_rgb555_to_rgb888[color & 0x7fff];
+ }
+
+ palette_entry = (data & 0xff00) >> 8;
+ color = m_paletteram[palette_entry];
+
+ if (!(color & 0x8000))
+ {
+ dest[(i * 2) + 1] = m_rgb555_to_rgb888[color & 0x7fff];
+ }
}
}
}
@@ -317,21 +335,22 @@ void spg2xx_video_device::draw_page(const rectangle &cliprect, uint32_t scanline
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) ? space.read_word(tilemap) : space.read_word(tilemap + tile_address);
- uint16_t palette = 0;
if (!tile)
continue;
- palette = (ctrl & PAGE_WALLPAPER_MASK) ? space.read_word(palette_map) : space.read_word(palette_map + tile_address / 2);
- if (x0 & 1)
- palette >>= 8;
- else
- palette &= 0x00ff;
-
uint32_t tileattr = attr;
uint32_t tilectrl = ctrl;
if ((ctrl & 2) == 0)
{ // -(1) bld(1) flip(2) pal(4)
+
+ uint16_t palette = (ctrl & PAGE_WALLPAPER_MASK) ? space.read_word(palette_map) : space.read_word(palette_map + tile_address / 2);
+ if (x0 & 1)
+ palette >>= 8;
+ else
+ palette &= 0x00ff;
+
+
tileattr &= ~0x000c;
tileattr |= (palette >> 2) & 0x000c; // flip
diff --git a/src/devices/machine/sunplus_gcm394.cpp b/src/devices/machine/sunplus_gcm394.cpp
index bb060e03ae4..d48e110787c 100644
--- a/src/devices/machine/sunplus_gcm394.cpp
+++ b/src/devices/machine/sunplus_gcm394.cpp
@@ -152,6 +152,7 @@ void sunplus_gcm394_base_device::trigger_systemm_dma(address_space &space, int c
address_space& mem = this->space(AS_PROGRAM);
source &= 0x0fffffff;
+ length &= 0x0fffffff; // gormiti
for (int i = 0; i < length; i++)
{
@@ -662,6 +663,10 @@ void sunplus_gcm394_base_device::base_internal_map(address_map &map)
map(0x00702e, 0x00702e).rw(m_spg_video, FUNC(gcm394_base_video_device::tmap2_tilebase_msb_r), FUNC(gcm394_base_video_device::tmap2_tilebase_msb_w)); // written with other tmap2 regs (roz layer or line layer?)
map(0x00702f, 0x00702f).rw(m_spg_video, FUNC(gcm394_base_video_device::tmap3_tilebase_msb_r), FUNC(gcm394_base_video_device::tmap3_tilebase_msb_w)); // written with other tmap3 regs (roz layer or line layer?)
+ map(0x007036, 0x007036).w(m_spg_video, FUNC(gcm394_base_video_device::split_irq_xpos_w));
+ map(0x007037, 0x007037).w(m_spg_video, FUNC(gcm394_base_video_device::split_irq_ypos_w));
+
+
map(0x007030, 0x007030).rw(m_spg_video, FUNC(gcm394_base_video_device::video_7030_brightness_r), FUNC(gcm394_base_video_device::video_7030_brightness_w));
map(0x007038, 0x007038).r(m_spg_video, FUNC(gcm394_base_video_device::video_curline_r));
map(0x00703a, 0x00703a).rw(m_spg_video, FUNC(gcm394_base_video_device::video_703a_palettebank_r), FUNC(gcm394_base_video_device::video_703a_palettebank_w));
diff --git a/src/devices/machine/sunplus_gcm394_video.cpp b/src/devices/machine/sunplus_gcm394_video.cpp
index f06a42ea959..e91061dc94b 100644
--- a/src/devices/machine/sunplus_gcm394_video.cpp
+++ b/src/devices/machine/sunplus_gcm394_video.cpp
@@ -4,6 +4,8 @@
SunPlus GCM394-series SoC peripheral emulation (Video)
+ This is very similar to spg2xx but with additional features, layers and modes
+
**********************************************************************/
#include "emu.h"
@@ -35,7 +37,6 @@ gcm394_base_video_device::gcm394_base_video_device(const machine_config &mconfig
m_space_read_cb(*this),
m_rowscroll(*this, "^rowscroll"),
m_rowzoom(*this, "^rowzoom"),
- m_global_y_mask(0x1ff),
m_pal_displaybank_high(0),
m_alt_tile_addressing(0)
{
@@ -218,6 +219,9 @@ void gcm394_base_video_device::device_start()
decodegfx(":maincpu");
m_space_read_cb.resolve_safe(0);
+
+ m_screenpos_timer = timer_alloc(TIMER_SCREENPOS);
+ m_screenpos_timer->adjust(attotime::never);
save_item(NAME(m_screenbuf));
@@ -241,10 +245,12 @@ void gcm394_base_video_device::device_start()
save_item(NAME(m_tmap3_scroll));
save_item(NAME(m_707f));
save_item(NAME(m_703a_palettebank));
- save_item(NAME(m_7062));
- save_item(NAME(m_7063));
+ save_item(NAME(m_video_irq_enable));
+ save_item(NAME(m_video_irq_status));
save_item(NAME(m_702a));
save_item(NAME(m_7030_brightness));
+ save_item(NAME(m_xirqpos));
+ save_item(NAME(m_yirqpos));
save_item(NAME(m_703c_tvcontrol1));
save_item(NAME(m_7042_sprite));
save_item(NAME(m_7080));
@@ -262,12 +268,10 @@ void gcm394_base_video_device::device_start()
save_item(NAME(m_page2_addr_msb));
save_item(NAME(m_page3_addr_lsb));
save_item(NAME(m_page3_addr_msb));
- save_item(NAME(m_video_irq_status));
save_item(NAME(m_spriteram));
save_item(NAME(m_spriteextra));
save_item(NAME(m_paletteram));
save_item(NAME(m_maxgfxelement));
- save_item(NAME(m_global_y_mask));
save_item(NAME(m_pal_displaybank_high));
save_item(NAME(m_alt_tile_addressing));
}
@@ -302,11 +306,13 @@ void gcm394_base_video_device::device_reset()
m_707f = 0x0000;
m_703a_palettebank = 0x0000;
- m_7062 = 0x0000;
- m_7063 = 0x0000;
+ m_video_irq_enable = 0x0000;
+ m_video_irq_status = 0x0000;
m_702a = 0x0000;
m_7030_brightness = 0x0000;
+ m_xirqpos = 0x0000;
+ m_yirqpos = 0x0000;
m_703c_tvcontrol1 = 0x0000;
m_7042_sprite = 0x0000;
@@ -326,8 +332,6 @@ void gcm394_base_video_device::device_reset()
m_videodma_dest = 0x0000;
m_videodma_source = 0x0000;
- m_video_irq_status = 0x0000;
-
m_sprite_7022_gfxbase_lsb = 0;
m_sprite_702d_gfxbase_msb = 0;
m_page2_addr_lsb = 0;
@@ -550,35 +554,35 @@ void gcm394_base_video_device::draw_page(const rectangle &cliprect, uint32_t sca
int total_width;
int use_alt_drawmode = m_alt_tile_addressing;
+ int y_mask = 0;
// just a guess based on this being set on the higher resolution tilemaps we've seen, could be 100% incorrect register
if ((attr_reg >> 14) & 0x2)
{
total_width = 1024;
+ y_mask = 0x1ff;
// use_alt_drawmode = 1; // probably doesn't control this
}
else
{
total_width = 512;
+ y_mask = 0xff;
// use_alt_drawmode = 0; // probably doesn't control this
}
uint32_t tile_count_x = total_width / tile_w;
- uint32_t bitmap_y = (scanline + yscroll);// &0xff;
+ uint32_t bitmap_y = (scanline + yscroll) & y_mask;
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) & m_global_y_mask) - 0x10;
- uint32_t xx = (tile_w * x0 - xscroll);// &0x1ff;
+ uint32_t yy = ((tile_h * y0 - yscroll + 0x10) & y_mask) - 0x10;
+ uint32_t xx = (tile_w * x0 - xscroll) & (total_width-1);
uint32_t tile = (ctrl_reg & PAGE_WALLPAPER_MASK) ? space.read_word(tilemap) : space.read_word(tilemap + tile_address);
- uint16_t palette = (ctrl_reg & PAGE_WALLPAPER_MASK) ? space.read_word(palette_map) : space.read_word(palette_map + tile_address / 2);
- if (x0 & 1)
- palette >>= 8;
if (!tile)
@@ -588,19 +592,7 @@ void gcm394_base_video_device::draw_page(const rectangle &cliprect, uint32_t sca
uint32_t tileattr = attr_reg;
uint32_t tilectrl = ctrl_reg;
-#if 0
- if ((ctrl_reg & 2) == 0)
- { // -(1) bld(1) flip(2) pal(4)
- tileattr &= ~0x000c;
- tileattr |= (palette >> 2) & 0x000c; // flip
-
- tileattr &= ~0x0f00;
- tileattr |= (palette << 8) & 0x0f00; // palette
- tilectrl &= ~0x0100;
- tilectrl |= (palette << 2) & 0x0100; // blend
- }
-#endif
bool blend;
bool row_scroll;
bool flip_x;
@@ -611,18 +603,41 @@ void gcm394_base_video_device::draw_page(const rectangle &cliprect, uint32_t sca
row_scroll = (tilectrl & 0x0010);
- if ((ctrl_reg & 2) == 0)
+ if ((ctrl_reg & 2) == 0) // RegSet:0
{
- flip_x = 0;
- yflipmask = 0;
+ uint16_t palette = (ctrl_reg & PAGE_WALLPAPER_MASK) ? space.read_word(palette_map) : space.read_word(palette_map + tile_address / 2);
+ if (x0 & 1)
+ palette >>= 8;
+
+ flip_x = palette & 0x0010;
+ yflipmask = (palette & 0x0020) ? tile_h - 1 : 0;
palette_offset = (palette & 0x0f) << 4;
+
+ //tilectrl &= ~0x0100;
+ //tilectrl |= (palette << 2) & 0x0100; // blend
}
- else // jak_car2 uses this mode for sky ingame
+ else // RegSet:1
{
- flip_x = (tileattr & TILE_X_FLIP);
- yflipmask = tileattr & TILE_Y_FLIP ? tile_h - 1 : 0;
- palette_offset = (tileattr & 0x0f00) >> 4;
- tile |= (palette & 0x0007) << 16;
+ if (m_alt_tile_addressing == 0)
+ {
+ // smartfp needs the attribute table to contain extra tile bits even if regset is 1
+ uint16_t palette = (ctrl_reg & PAGE_WALLPAPER_MASK) ? space.read_word(palette_map) : space.read_word(palette_map + tile_address / 2);
+ if (x0 & 1)
+ palette >>= 8;
+
+ tile |= (palette & 0x0007) << 16;
+
+ flip_x = (tileattr & TILE_X_FLIP);
+ yflipmask = tileattr & TILE_Y_FLIP ? tile_h - 1 : 0;
+ palette_offset = (tileattr & 0x0f00) >> 4;
+
+ }
+ else
+ {
+ flip_x = (tileattr & TILE_X_FLIP);
+ yflipmask = tileattr & TILE_Y_FLIP ? tile_h - 1 : 0;
+ palette_offset = (tileattr & 0x0f00) >> 4;
+ }
}
@@ -800,15 +815,17 @@ uint32_t gcm394_base_video_device::screen_update(screen_device &screen, bitmap_r
for (int i = 0; i < 4; i++)
{
+ const int draw_all = 1;
+
if (1)
{
- draw_page(cliprect, scanline, i, (m_page0_addr_lsb | (m_page0_addr_msb<<16)), m_tmap0_regs, m_tmap0_scroll);
- draw_page(cliprect, scanline, i, (m_page1_addr_lsb | (m_page1_addr_msb<<16)), m_tmap1_regs, m_tmap1_scroll);
- draw_page(cliprect, scanline, i, (m_page2_addr_lsb | (m_page2_addr_msb<<16)), m_tmap2_regs, m_tmap2_scroll);
- draw_page(cliprect, scanline, i, (m_page3_addr_lsb | (m_page3_addr_msb<<16)), m_tmap3_regs, m_tmap3_scroll);
+ if ((!(machine().input().code_pressed(KEYCODE_Q))) || draw_all) draw_page(cliprect, scanline, i, (m_page0_addr_lsb | (m_page0_addr_msb<<16)), m_tmap0_regs, m_tmap0_scroll);
+ if ((!(machine().input().code_pressed(KEYCODE_W))) || draw_all) draw_page(cliprect, scanline, i, (m_page1_addr_lsb | (m_page1_addr_msb<<16)), m_tmap1_regs, m_tmap1_scroll);
+ if ((!(machine().input().code_pressed(KEYCODE_E))) || draw_all) draw_page(cliprect, scanline, i, (m_page2_addr_lsb | (m_page2_addr_msb<<16)), m_tmap2_regs, m_tmap2_scroll);
+ if ((!(machine().input().code_pressed(KEYCODE_R))) || draw_all) draw_page(cliprect, scanline, i, (m_page3_addr_lsb | (m_page3_addr_msb<<16)), m_tmap3_regs, m_tmap3_scroll);
}
- draw_sprites(cliprect, scanline, i);
+ if ((!(machine().input().code_pressed(KEYCODE_T))) || draw_all) draw_sprites(cliprect, scanline, i);
}
}
@@ -1145,6 +1162,7 @@ WRITE16_MEMBER(gcm394_base_video_device::sprite_7042_extra_w)
{
LOGMASKED(LOG_GCM394_VIDEO, "%s:gcm394_base_video_device::sprite_7042_extra_w %04x\n", machine().describe_context(), data);
m_7042_sprite = data;
+ //popmessage("extra modes %04x\n", data);
}
@@ -1182,6 +1200,15 @@ WRITE16_MEMBER(gcm394_base_video_device::video_dma_size_trigger_w)
}
m_videodma_size = 0x0000;
+
+ if (m_video_irq_enable & 4)
+ {
+ const uint16_t old = m_video_irq_status;
+ m_video_irq_status |= 4;
+ const uint16_t changed = old ^ (m_video_irq_enable & m_video_irq_status);
+ if (changed)
+ check_video_irq();
+ }
}
WRITE16_MEMBER(gcm394_base_video_device::video_dma_unk_w)
@@ -1272,33 +1299,34 @@ WRITE16_MEMBER(gcm394_base_video_device::video_703a_palettebank_w)
READ16_MEMBER(gcm394_base_video_device::videoirq_source_enable_r)
{
LOGMASKED(LOG_GCM394_VIDEO, "%s:gcm394_base_video_device::videoirq_source_enable_r\n", machine().describe_context());
- return m_7062;
+ return m_video_irq_enable;
}
WRITE16_MEMBER(gcm394_base_video_device::videoirq_source_enable_w)
{
- LOGMASKED(LOG_GCM394_VIDEO, "%s:gcm394_base_video_device::videoirq_source_enable_w %04x\n", machine().describe_context(), data);
- m_7062 = data;
+ LOGMASKED(LOG_GCM394_VIDEO, "videoirq_source_enable_w: Video IRQ Enable = %04x (DMA:%d, Timing:%d, Blanking:%d)\n", data, BIT(data, 2), BIT(data, 1), BIT(data, 0));
+ const uint16_t old = m_video_irq_enable & m_video_irq_status;
+ m_video_irq_enable = data & 0x0007;
+ const uint16_t changed = old ^ (m_video_irq_enable & m_video_irq_status);
+ if (changed)
+ check_video_irq();
}
READ16_MEMBER(gcm394_base_video_device::video_7063_videoirq_source_r)
{
LOGMASKED(LOG_GCM394_VIDEO, "%s:gcm394_base_video_device::video_7063_videoirq_source_r\n", machine().describe_context());
- return machine().rand();
+ return m_video_irq_status;
}
WRITE16_MEMBER(gcm394_base_video_device::video_7063_videoirq_source_ack_w)
{
- LOGMASKED(LOG_GCM394_VIDEO, "%s:gcm394_base_video_device::video_7063_videoirq_source_ack_w %04x\n", machine().describe_context(), data);
- m_7063 = data;
-
- // ack or enable? happens near start of the IRQ
- if (data & 0x01)
- {
- m_video_irq_status &= ~1;
+ LOGMASKED(LOG_GCM394_VIDEO, "video_7063_videoirq_source_ack_w: Video IRQ Acknowledge = %04x\n", data);
+ const uint16_t old = m_video_irq_enable & m_video_irq_status;
+ m_video_irq_status &= ~data;
+ const uint16_t changed = old ^ (m_video_irq_enable & m_video_irq_status);
+ if (changed)
check_video_irq();
- }
}
WRITE16_MEMBER(gcm394_base_video_device::video_702a_w)
@@ -1331,6 +1359,35 @@ WRITE16_MEMBER(gcm394_base_video_device::video_7030_brightness_w)
m_7030_brightness = data;
}
+void gcm394_base_video_device::update_raster_split_position()
+{
+ // this might need updating to handle higher res modes
+ LOGMASKED(LOG_GCM394_VIDEO, "update_raster_split_position: %04x,%04x\n", m_yirqpos, m_xirqpos);
+ if (m_xirqpos < 300 && m_yirqpos < 240)
+ {
+ m_screenpos_timer->adjust(m_screen->time_until_pos(m_yirqpos, m_xirqpos));
+ //printf("setting irq timer for y:%d x:%d", m_yirqpos, m_xirqpos);
+ }
+ else
+ m_screenpos_timer->adjust(attotime::never);
+}
+
+WRITE16_MEMBER(gcm394_base_video_device::split_irq_ypos_w)
+{
+ LOGMASKED(LOG_GCM394_VIDEO, "%s:split_irq_ypos_w %04x\n", machine().describe_context(), data);
+
+ m_yirqpos = data & 0x1ff;
+ update_raster_split_position();
+}
+
+WRITE16_MEMBER(gcm394_base_video_device::split_irq_xpos_w)
+{
+ LOGMASKED(LOG_GCM394_VIDEO, "%s:split_irq_xpos_w %04x\n", machine().describe_context(), data);
+
+ m_xirqpos = data & 0x1ff;
+ update_raster_split_position();
+}
+
READ16_MEMBER(gcm394_base_video_device::video_703c_tvcontrol1_r)
{
LOGMASKED(LOG_GCM394_VIDEO, "%s:gcm394_base_video_device::video_703c_tvcontrol1_r\n", machine().describe_context());
@@ -1457,27 +1514,52 @@ WRITE16_MEMBER(gcm394_base_video_device::video_701e_w)
void gcm394_base_video_device::check_video_irq()
{
- m_video_irq_cb((m_video_irq_status & 1) ? ASSERT_LINE : CLEAR_LINE);
+ LOGMASKED(LOG_GCM394_VIDEO, "%ssserting Video IRQ (%04x, %04x)\n", (m_video_irq_status & m_video_irq_enable) ? "A" : "Dea", m_video_irq_status, m_video_irq_enable);
+ m_video_irq_cb((m_video_irq_status & m_video_irq_enable) ? ASSERT_LINE : CLEAR_LINE);
}
WRITE_LINE_MEMBER(gcm394_base_video_device::vblank)
{
- int i = 0x0001;
-
if (!state)
{
- m_video_irq_status &= ~i;
+ m_video_irq_status &= ~1;
+ LOGMASKED(LOG_GCM394_VIDEO, "Setting video IRQ status to %04x\n", m_video_irq_status);
check_video_irq();
return;
}
- //if (m_video_irq_enable & 1)
+ if (m_video_irq_enable & 1)
{
- m_video_irq_status |= i;
+ m_video_irq_status |= 1;
+ LOGMASKED(LOG_GCM394_VIDEO, "Setting video IRQ status to %04x\n", m_video_irq_status);
check_video_irq();
}
}
+void gcm394_base_video_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
+{
+ switch (id)
+ {
+ case TIMER_SCREENPOS:
+ {
+ if (m_video_irq_enable & 2)
+ {
+ m_video_irq_status |= 2;
+ check_video_irq();
+ }
+
+ //printf("firing irq timer\n");
+
+ m_screen->update_partial(m_screen->vpos());
+
+ // fire again, jak_dbz pinball needs this
+ m_screenpos_timer->adjust(m_screen->time_until_pos(m_yirqpos, m_xirqpos));
+ break;
+ }
+ }
+}
+
+
static GFXDECODE_START( gfx )
GFXDECODE_END
diff --git a/src/devices/machine/sunplus_gcm394_video.h b/src/devices/machine/sunplus_gcm394_video.h
index 0f8e2392a5d..e9349700e3b 100644
--- a/src/devices/machine/sunplus_gcm394_video.h
+++ b/src/devices/machine/sunplus_gcm394_video.h
@@ -81,6 +81,10 @@ public:
DECLARE_READ16_MEMBER(video_703a_palettebank_r);
DECLARE_WRITE16_MEMBER(video_703a_palettebank_w);
+
+ void update_raster_split_position();
+ DECLARE_WRITE16_MEMBER(split_irq_xpos_w);
+ DECLARE_WRITE16_MEMBER(split_irq_ypos_w);
DECLARE_READ16_MEMBER(videoirq_source_enable_r);
DECLARE_WRITE16_MEMBER(videoirq_source_enable_w);
@@ -145,6 +149,8 @@ protected:
TILE_Y_FLIP = 0x0008
};
+ static const device_timer_id TIMER_SCREENPOS = 2;
+ virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override;
inline void check_video_irq();
@@ -215,11 +221,13 @@ protected:
uint16_t m_707f;
uint16_t m_703a_palettebank;
- uint16_t m_7062;
- uint16_t m_7063;
+ uint16_t m_video_irq_enable;
+ uint16_t m_video_irq_status;
uint16_t m_702a;
uint16_t m_7030_brightness;
+ uint16_t m_xirqpos;
+ uint16_t m_yirqpos;
uint16_t m_703c_tvcontrol1;
uint16_t m_7042_sprite;
@@ -243,7 +251,7 @@ protected:
void unk_vid_regs_w(int which, int offset, uint16_t data);
- uint16_t m_video_irq_status;
+ emu_timer *m_screenpos_timer;
uint16_t m_spriteram[0x400];
uint16_t m_spriteextra[0x400];
@@ -259,8 +267,6 @@ protected:
int m_maxgfxelement;
void decodegfx(const char* tag);
- int m_global_y_mask;
-
int m_pal_displaybank_high;
int m_alt_tile_addressing;
};
diff --git a/src/mame/drivers/nes_vt.cpp b/src/mame/drivers/nes_vt.cpp
index 66809f83a7c..de198228a8e 100644
--- a/src/mame/drivers/nes_vt.cpp
+++ b/src/mame/drivers/nes_vt.cpp
@@ -103,6 +103,7 @@ public:
{ }
void nes_vt_base(machine_config& config);
+ void nes_vt_base_pal(machine_config& config);
void nes_vt(machine_config& config);
@@ -190,10 +191,10 @@ private:
/* Extra IO */
DECLARE_WRITE8_MEMBER(extra_io_control_w);
- DECLARE_READ8_MEMBER(extrain_01_r);
- DECLARE_READ8_MEMBER(extrain_23_r);
- DECLARE_WRITE8_MEMBER(extraout_01_w);
- DECLARE_WRITE8_MEMBER(extraout_23_w);
+ virtual DECLARE_READ8_MEMBER(extrain_01_r);
+ virtual DECLARE_READ8_MEMBER(extrain_23_r);
+ virtual DECLARE_WRITE8_MEMBER(extraout_01_w);
+ virtual DECLARE_WRITE8_MEMBER(extraout_23_w);
DECLARE_WRITE8_MEMBER(chr_w);
@@ -274,6 +275,16 @@ protected:
virtual void machine_reset() override;
};
+class nes_vt_timetp36_state : public nes_vt_state
+{
+public:
+ nes_vt_timetp36_state(const machine_config& mconfig, device_type type, const char* tag) :
+ nes_vt_state(mconfig, type, tag)
+ { }
+
+protected:
+};
+
class nes_vt_hum_state : public nes_vt_state
{
public:
@@ -420,8 +431,6 @@ public:
m_plunger(*this, "PLUNGER")
{ }
- void nes_vt_ablpinb(machine_config& config);
-
protected:
virtual void machine_start() override;
virtual void machine_reset() override;
@@ -1571,13 +1580,13 @@ READ8_MEMBER(nes_vt_state::extrain_23_r)
WRITE8_MEMBER(nes_vt_state::extraout_01_w)
{
// TODO: use callbacks for this as output can be hooked up to anything
- logerror("%s: extraout_01_w %02x\n", data);
+ logerror("%s: extraout_01_w %02x\n", machine().describe_context(), data);
}
WRITE8_MEMBER(nes_vt_state::extraout_23_w)
{
// TODO: use callbacks for this as output can be hooked up to anything
- logerror("%s: extraout_23_w %02x\n", data);
+ logerror("%s: extraout_23_w %02x\n", machine().describe_context(), data);
}
READ8_MEMBER(nes_vt_state::rs232flags_region_r)
@@ -1706,8 +1715,8 @@ void nes_vt_state::nes_vt_map(address_map &map)
map(0x4100, 0x410b).r(FUNC(nes_vt_state::vt03_410x_r)).w(FUNC(nes_vt_state::vt03_410x_w));
// 0x410c unused
map(0x410d, 0x410d).w(FUNC(nes_vt_state::extra_io_control_w));
- map(0x410e, 0x410e).r(FUNC(nes_vt_state::extrain_01_r));
- map(0x410f, 0x410f).r(FUNC(nes_vt_state::extrain_23_r));
+ map(0x410e, 0x410e).rw(FUNC(nes_vt_state::extrain_01_r), FUNC(nes_vt_state::extraout_01_w));
+ map(0x410f, 0x410f).rw(FUNC(nes_vt_state::extrain_23_r), FUNC(nes_vt_state::extraout_23_w));
// 0x4114 RS232 timer (low)
// 0x4115 RS232 timer (high)
// 0x4116 unused
@@ -1924,7 +1933,7 @@ void nes_vt_state::nes_vt_base(machine_config &config)
m_apu->add_route(ALL_OUTPUTS, "mono", 0.50);
}
-void nes_vt_ablpinb_state::nes_vt_ablpinb(machine_config &config)
+void nes_vt_state::nes_vt_base_pal(machine_config &config)
{
nes_vt_base(config);
@@ -1944,6 +1953,8 @@ void nes_vt_ablpinb_state::nes_vt_ablpinb(machine_config &config)
m_screen->set_visarea(0 * 8, 32 * 8 - 1, 0 * 8, 30 * 8 - 1);
}
+
+
void nes_vt_sudoku_state::nes_vt_sudoku(machine_config &config)
{
nes_vt_base(config);
@@ -2202,6 +2213,51 @@ static INPUT_PORTS_START( majgnc )
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_NAME("4")
INPUT_PORTS_END
+static INPUT_PORTS_START( timetp36 )
+ PORT_INCLUDE(nes_vt)
+
+ PORT_MODIFY("IO0")
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(1) PORT_NAME("A")
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(1) PORT_NAME("B")
+
+ PORT_MODIFY("IO1") // no 2nd player
+ PORT_BIT( 0xff, IP_ACTIVE_HIGH, IPT_UNUSED )
+
+ // where does the 'Y' button map? no games use it?
+ PORT_START("EXTRAIN0") // see code at 8084, stored at 0x66
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_NAME("X") // used in the NAM-1975 rip-off 'Army Strike'
+ PORT_DIPNAME( 0x02, 0x02, "Unknown Bit 0" )
+ PORT_DIPSETTING( 0x02, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+
+ PORT_DIPNAME( 0x04, 0x04, "Unknown Bit 1" ) // see code at 808D, stored at 0x68 (never read?)
+ PORT_DIPSETTING( 0x04, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x08, 0x08, "Unknown Bit 2" )
+ PORT_DIPSETTING( 0x08, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+
+ PORT_START("EXTRAIN1") // code at 809A reads this in, stored at 0x156
+ PORT_DIPNAME( 0x01, 0x01, "Unknown Bit 3" )
+ PORT_DIPSETTING( 0x01, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x06, 0x04, DEF_STR( Difficulty ) ) // 3 possible slider positions
+ PORT_DIPSETTING( 0x06, DEF_STR( Easy ) ) // 3 minutes timer in Bombs Away
+ PORT_DIPSETTING( 0x04, DEF_STR( Normal ) ) // 2 minute 30
+ PORT_DIPSETTING( 0x02, DEF_STR( Hard ) ) // 2 minute
+ PORT_DIPSETTING( 0x00, "Hard (duplicate)" )
+ PORT_DIPNAME( 0x08, 0x08, "Unknown Bit 4" ) // ... code at 8064 instead seems to be reading 8 bits with a shifter? stored at 0x67 (investigate)
+ PORT_DIPSETTING( 0x08, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+
+ PORT_START("EXTRAIN2")
+ PORT_BIT( 0x0f, IP_ACTIVE_HIGH, IPT_UNUSED )
+
+ PORT_START("EXTRAIN3")
+ PORT_BIT( 0x0f, IP_ACTIVE_HIGH, IPT_UNUSED )
+INPUT_PORTS_END
+
+
void nes_vt_sudoku_state::init_sudoku()
{
u8 *src = memregion("mainrom")->base();
@@ -2511,6 +2567,11 @@ ROM_START( megapad )
ROM_LOAD( "megapad.bin", 0x00000, 0x200000, CRC(1eb603a8) SHA1(3de6f0620a0db0558daa7fd7ccf08d9d5607a6af) )
ROM_END
+ROM_START( timetp36 )
+ ROM_REGION( 0x400000, "mainrom", 0 )
+ ROM_LOAD( "36in1.bin", 0x00000, 0x400000, CRC(e2fb8a6c) SHA1(163d257dd0e6dc19c8fab19cc363ea8be659c40a) )
+ROM_END
+
ROM_START( ddrstraw )
ROM_REGION( 0x200000, "mainrom", 0 )
ROM_LOAD( "straws-ddr.bin", 0x00000, 0x200000, CRC(ce94e53a) SHA1(10c6970205a4df28086029c0a348225f57bf0cc5) ) // 26LV160 Flash
@@ -2666,7 +2727,7 @@ CONS( 200?, vtboxing, 0, 0, nes_vt, nes_vt, nes_vt_state, empty_init, "VRT
// Menu system clearly started off as 'vtpinball' Many elements seem similar to Family Pinball for the Famicom.
// 050329 (29th March 2005) date on PCB
-CONS( 2005, ablpinb, 0, 0, nes_vt_ablpinb, ablpinb, nes_vt_ablpinb_state, empty_init, "Advance Bright Ltd", "Pinball (P8002, ABL TV Game)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
+CONS( 2005, ablpinb, 0, 0, nes_vt_base_pal, ablpinb, nes_vt_ablpinb_state, empty_init, "Advance Bright Ltd", "Pinball (P8002, ABL TV Game)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
// Black pad marked 'SUDOKU' with tails on the S and U characters looping over the logo. Box says "Plug and Play Sudoku"
@@ -2685,13 +2746,15 @@ CONS( 2006, vgtablet, 0, 0, nes_vt_vg, nes_vt, nes_vt_hh_state, empty_i
// There is a 2004 Majesco Frogger "TV game" that appears to contain the same version of Frogger as above but with no other games, so probably fits here.
CONS( 2004, majkon, 0, 0, nes_vt_vg_baddma, nes_vt, nes_vt_hh_state, empty_init, "Majesco (licensed from Konami)", "Konami Collector's Series Arcade Advanced", MACHINE_NOT_WORKING ) // raster timing is broken for Frogger, palette issues
-CONS( 200?, majgnc, 0, 0, nes_vt_majgnc, majgnc, nes_vt_majgnc_state, empty_init, "Majesco", "Golden Nugget Casino", MACHINE_NOT_WORKING )
+CONS( 200?, majgnc, 0, 0, nes_vt_majgnc, majgnc, nes_vt_majgnc_state, empty_init, "Majesco", "Golden Nugget Casino", MACHINE_NOT_WORKING )
// small black unit, dpad on left, 4 buttons (A,B,X,Y) on right, Start/Reset/Select in middle, unit text "Sudoku Plug & Play TV Game"
-CONS( 200?, sudopptv, 0, 0, nes_vt, nes_vt, nes_vt_waixing_state, empty_init, "Smart Planet", "Sudoku Plug & Play TV Game '6 Intelligent Games'", MACHINE_NOT_WORKING )
+CONS( 200?, sudopptv, 0, 0, nes_vt, nes_vt, nes_vt_waixing_state, empty_init, "Smart Planet", "Sudoku Plug & Play TV Game '6 Intelligent Games'", MACHINE_NOT_WORKING )
-CONS( 200?, megapad, 0, 0, nes_vt, nes_vt, nes_vt_waixing_state, empty_init, "Waixing", "Megapad 31-in-1", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) // Happy Biqi has broken sprites, investigate before promoting
+CONS( 200?, megapad, 0, 0, nes_vt, nes_vt, nes_vt_waixing_state, empty_init, "Waixing", "Megapad 31-in-1", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) // Happy Biqi has broken sprites, investigate before promoting
+ // needs PCM samples, Y button is not mapped (not used by any of the games?)
+CONS( 200?, timetp36, 0, 0, nes_vt_base_pal, timetp36, nes_vt_timetp36_state, empty_init, "TimeTop", "Super Game 36-in-1 (TimeTop SuperGame) (PAL)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
// this is VT09 based
// it boots, most games correct, but palette issues in some games still (usually they appear greyscale)
diff --git a/src/mame/drivers/spg2xx.cpp b/src/mame/drivers/spg2xx.cpp
index 77104819b89..fb81413e415 100644
--- a/src/mame/drivers/spg2xx.cpp
+++ b/src/mame/drivers/spg2xx.cpp
@@ -1119,6 +1119,8 @@ ROM_START( rad_fb2 )
ROM_LOAD16_WORD_SWAP( "football2.bin", 0x000000, 0x400000, CRC(96b4f0d2) SHA1(e91f2ac679fb0c026ffe216eb4ab58802f361a17) )
ROM_END
+
+
ROM_START( rad_crik ) // only released in EU?
ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASE00 )
ROM_LOAD16_WORD_SWAP( "cricket.bin", 0x000000, 0x200000, CRC(6fa0aaa9) SHA1(210d2d4f542181f59127ce2f516d0408dc6de7a8) )
diff --git a/src/mame/drivers/spg2xx_digimake.cpp b/src/mame/drivers/spg2xx_digimake.cpp
new file mode 100644
index 00000000000..dd9c504d6de
--- /dev/null
+++ b/src/mame/drivers/spg2xx_digimake.cpp
@@ -0,0 +1,220 @@
+// license:BSD-3-Clause
+// copyright-holders:Ryan Holtz, David Haywood
+
+// Digi Makeover - this uses a camrea and touchpad, both currently unsupported
+// - why do we need a hack to boot?
+
+#include "emu.h"
+#include "includes/spg2xx.h"
+#include "machine/nvram.h"
+
+class spg2xx_game_digimake_state : public spg2xx_game_state
+{
+public:
+ spg2xx_game_digimake_state(const machine_config &mconfig, device_type type, const char *tag) :
+ spg2xx_game_state(mconfig, type, tag)
+ { }
+
+ void digimake(machine_config &config);
+ void mem_map_digi(address_map& map);
+
+private:
+ virtual DECLARE_WRITE16_MEMBER(portc_w) override;
+};
+
+void spg2xx_game_digimake_state::mem_map_digi(address_map &map)
+{
+ map(0x000000, 0x1fffff).bankr("cartbank");
+ // there is also a write/read on 37FFFF before anything is configured as RAM
+ map(0x380000, 0x3fffff).ram();
+}
+static INPUT_PORTS_START( rad_digi ) // some of the inputs seem to act like buttons, others are positional touchpad?
+ PORT_START("P1")
+ PORT_DIPNAME( 0x0001, 0x0001, "Used 1" )
+ PORT_DIPSETTING( 0x0001, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0002, 0x0002, "1" )
+ PORT_DIPSETTING( 0x0002, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0004, 0x0004, "Used 2" )
+ 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_BIT( 0x0010, IP_ACTIVE_LOW, IPT_BUTTON6 ) PORT_NAME("6")
+ PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_BUTTON5 ) PORT_NAME("5")
+ PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_NAME("4")
+ PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_NAME("3")
+ PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_NAME("2")
+ PORT_BIT( 0x0200, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_NAME("1")
+ 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_START("P2")
+ PORT_DIPNAME( 0x0001, 0x0001, "2" )
+ 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_START("P3")
+ PORT_DIPNAME( 0x0001, 0x0001, "3" )
+ PORT_DIPSETTING( 0x0001, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0002, 0x0002, "Save" )
+ 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, "Something" )
+ 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, "Touch?" )
+ 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, "Forward" )
+ PORT_DIPSETTING( 0x0200, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0400, 0x0400, "Back?" )
+ 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 ) )
+INPUT_PORTS_END
+
+void spg2xx_game_digimake_state::digimake(machine_config &config)
+{
+ SPG24X(config, m_maincpu, XTAL(27'000'000), m_screen);
+ m_maincpu->set_addrmap(AS_PROGRAM, &spg2xx_game_digimake_state::mem_map_digi);
+
+ spg2xx_base(config);
+
+ m_maincpu->porta_in().set(FUNC(spg2xx_game_digimake_state::base_porta_r));
+ m_maincpu->portb_in().set(FUNC(spg2xx_game_digimake_state::base_portb_r));
+ m_maincpu->portc_in().set(FUNC(spg2xx_game_digimake_state::base_portc_r));
+
+ m_maincpu->portc_out().set(FUNC(spg2xx_game_digimake_state::portc_w));
+
+}
+
+WRITE16_MEMBER(spg2xx_game_digimake_state::portc_w)
+{
+ logerror("%s: portc_w %04x (%04x) %c %c %c %c | %c %c %c %c | %c %c %c %c | %c %c %c %c \n", machine().describe_context(), data, mem_mask,
+ (mem_mask & 0x8000) ? ((data & 0x8000) ? '1' : '0') : 'x',
+ (mem_mask & 0x4000) ? ((data & 0x4000) ? '1' : '0') : 'x',
+ (mem_mask & 0x2000) ? ((data & 0x2000) ? '1' : '0') : 'x',
+ (mem_mask & 0x1000) ? ((data & 0x1000) ? '1' : '0') : 'x',
+ (mem_mask & 0x0800) ? ((data & 0x0800) ? '1' : '0') : 'x',
+ (mem_mask & 0x0400) ? ((data & 0x0400) ? '1' : '0') : 'x',
+ (mem_mask & 0x0200) ? ((data & 0x0200) ? '1' : '0') : 'x',
+ (mem_mask & 0x0100) ? ((data & 0x0100) ? '1' : '0') : 'x',
+ (mem_mask & 0x0080) ? ((data & 0x0080) ? '1' : '0') : 'x',
+ (mem_mask & 0x0040) ? ((data & 0x0040) ? '1' : '0') : 'x',
+ (mem_mask & 0x0020) ? ((data & 0x0020) ? '1' : '0') : 'x',
+ (mem_mask & 0x0010) ? ((data & 0x0010) ? '1' : '0') : 'x',
+ (mem_mask & 0x0008) ? ((data & 0x0008) ? '1' : '0') : 'x',
+ (mem_mask & 0x0004) ? ((data & 0x0004) ? '1' : '0') : 'x',
+ (mem_mask & 0x0002) ? ((data & 0x0002) ? '1' : '0') : 'x',
+ (mem_mask & 0x0001) ? ((data & 0x0001) ? '1' : '0') : 'x');
+
+ // HACK! force vbl interrupt to be on, I'm guessing some check is failing causing it to remain off otherwise?
+ if (m_maincpu->pc() == 0xaf5a)
+ {
+ address_space& mem = m_maincpu->space(AS_PROGRAM);
+ mem.write_word(0x2862, 0x0003);
+ }
+}
+
+ROM_START( rad_digi )
+ ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASE00 )
+ ROM_LOAD16_WORD_SWAP( "digimakeover.bin", 0x000000, 0x400000, CRC(bbe60bc2) SHA1(fb0c96d1f35af85d6d0fa76c390e42e2eda301ae) )
+ROM_END
+
+
+CONS( 2005, rad_digi, 0, 0, digimake, rad_digi, spg2xx_game_digimake_state, init_crc, "Radica", "Digi Makeover (Girl Tech)", MACHINE_IMPERFECT_SOUND | MACHINE_NOT_WORKING )
diff --git a/src/mame/drivers/sunplus_unsp20soc.cpp b/src/mame/drivers/sunplus_unsp20soc.cpp
index 59a9aa59e64..95a842e7eba 100644
--- a/src/mame/drivers/sunplus_unsp20soc.cpp
+++ b/src/mame/drivers/sunplus_unsp20soc.cpp
@@ -49,6 +49,12 @@
V.Baby HY27UF081G2A (2048+64) x 64 x 1024
+
+
+ Non-emulation bugs (happen on real hardware):
+ paccon: Pac-Man - Bottom set of Power Pills are squashed.
+ Galaga - Incorrect sprite used for left shot in 'Double Ship' mode
+
*/
#include "emu.h"
@@ -615,6 +621,158 @@ static INPUT_PORTS_START( smartfp )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
INPUT_PORTS_END
+static INPUT_PORTS_START( gormiti )
+ PORT_START("IN0")
+ PORT_DIPNAME( 0x0001, 0x0001, "IN0" )
+ 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_START("IN1")
+ PORT_DIPNAME( 0x0001, 0x0001, "IN1" )
+ 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_START("IN2")
+ PORT_DIPNAME( 0x0001, 0x0001, "IN2" )
+ 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 ) )
+INPUT_PORTS_END
+
static INPUT_PORTS_START( wrlshunt )
PORT_START("IN0")
PORT_START("IN1")
@@ -1138,6 +1296,16 @@ ROM_START( smartfp )
ROM_LOAD16_WORD_SWAP("smartfitpark.bin", 0x000000, 0x800000, CRC(ada84507) SHA1(a3a80bf71fae62ebcbf939166a51d29c24504428))
ROM_END
+ROM_START( gormiti )
+ //ROM_REGION16_BE( 0x40000, "maincpu:internal", ROMREGION_ERASE00 ) // not on this model? (or at least not this size, as CS base is different)
+ //ROM_LOAD16_WORD_SWAP( "internal.rom", 0x00000, 0x40000, NO_DUMP )
+
+ ROM_REGION(0x800000, "maincpu", ROMREGION_ERASE00)
+ ROM_LOAD16_WORD_SWAP("gormiti.bin", 0x000000, 0x800000, CRC(71b82d41) SHA1(169b35dc7bdd05b7b32176ddf901ace27736cb86) )
+ROM_END
+
+
+
ROM_START( paccon )
//ROM_REGION16_BE( 0x40000, "maincpu:internal", ROMREGION_ERASE00 ) // not on this model? (or at least not this size, as CS base is different)
//ROM_LOAD16_WORD_SWAP( "internal.rom", 0x00000, 0x40000, NO_DUMP )
@@ -1382,6 +1550,10 @@ ROM_END
CONS(2009, smartfp, 0, 0, base, smartfp, gcm394_game_state, empty_init, "Fisher-Price", "Fun 2 Learn Smart Fit Park (Spain)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND)
CONS(200?, tkmag220, 0, 0, tkmag220, tkmag220, tkmag220_game_state, empty_init, "TaiKee", "Mini Arcade Games Console (Family Sport 220-in-1)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS )
+// die on this one is 'GCM420'
+CONS(2013, gormiti, 0, 0, base, gormiti, gcm394_game_state, empty_init, "Giochi Preziosi", "Gormiti Game Arena (Spain)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND)
+
+
// Fun 2 Learn 3-in-1 SMART SPORTS ?
// also sold as "Pac-Man Connect & Play 35th Anniversary" (same ROM?)
diff --git a/src/mame/drivers/sunplus_unsp20soc_mobigo.cpp b/src/mame/drivers/sunplus_unsp20soc_mobigo.cpp
index f88e2b0406d..346d4ec8246 100644
--- a/src/mame/drivers/sunplus_unsp20soc_mobigo.cpp
+++ b/src/mame/drivers/sunplus_unsp20soc_mobigo.cpp
@@ -130,6 +130,15 @@ ROM_START( mobigo )
ROM_LOAD16_WORD_SWAP("mobigo.bin", 0x0000, 0x800000, CRC(49479bad) SHA1(4ee82c7ba13072cf25a34893cf6272f2da5d8928) )
ROM_END
+ROM_START( mobigos )
+ //ROM_REGION16_BE( 0x40000, "maincpu:internal", ROMREGION_ERASE00 ) // not on this model? (or at least not this size, as CS base is different)
+ //ROM_LOAD16_WORD_SWAP( "internal.rom", 0x00000, 0x40000, NO_DUMP )
+
+ ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASE00)
+ ROM_LOAD16_WORD_SWAP("mobigospanish.bin", 0x0000, 0x200000, CRC(462b4f9d) SHA1(1541152f1a359bc18de4d4f3d5038a954c9a3ad4))
+ROM_END
+
+
ROM_START( mobigo2 )
ROM_REGION16_BE( 0x40000, "maincpu:internal", ROMREGION_ERASE00 )
ROM_LOAD16_WORD_SWAP( "internal.rom", 0x00000, 0x40000, NO_DUMP ) // doesn't have GPnandnand header in NAND, so bootstrap is likely custom
@@ -138,5 +147,6 @@ ROM_START( mobigo2 )
ROM_LOAD( "mobigo2_bios_ger.bin", 0x00000, 0x8400000, CRC(d5ab613d) SHA1(6fb104057dc3484fa958e2cb20c5dd0c19589f75) ) // SPANSION S34ML01G100TF100
ROM_END
-CONS( 200?, mobigo, 0, 0, mobigo, mobigo, mobigo_state, init_mobigo , "VTech", "MobiGo", MACHINE_IS_SKELETON )
-CONS( 200?, mobigo2, 0, 0, mobigo2, mobigo, mobigo2_state, nand_init840, "VTech", "MobiGo 2 (Germany)", MACHINE_IS_SKELETON )
+CONS( 200?, mobigo, 0, 0, mobigo, mobigo, mobigo_state, init_mobigo , "VTech", "MobiGo", MACHINE_IS_SKELETON )
+CONS( 200?, mobigos, mobigo, 0, mobigo, mobigo, mobigo_state, init_mobigo , "VTech", "MobiGo (Spain)", MACHINE_IS_SKELETON )
+CONS( 200?, mobigo2, 0, 0, mobigo2, mobigo, mobigo2_state, nand_init840, "VTech", "MobiGo 2 (Germany)", MACHINE_IS_SKELETON )
diff --git a/src/mame/mame.lst b/src/mame/mame.lst
index 4afac69defc..5018af22f3c 100644
--- a/src/mame/mame.lst
+++ b/src/mame/mame.lst
@@ -31436,6 +31436,7 @@ gprnrs16
ddrdismx // (c) 2006 Majesco / Konami [(c) 2001 Disney on title screen]
ddrstraw // (c) 2006 Majesco / Konami
megapad
+timetp36
majkon
majgnc
sudopptv
@@ -37121,6 +37122,9 @@ pballpup
swclone
dreamlss
+@source:spg2xx_digimake.cpp
+rad_digi
+
@source:spg2xx_dreamlife.cpp
dreamlif //
dsgnwrld
@@ -37804,6 +37808,7 @@ jak_s500
jak_totm
jak_ths
smartfp // Smart Fit Park
+gormiti
wlsair60 // Wireless Air 60
wrlshunt // Wireless: Hunting Video Game System
tkmag220 //
@@ -37821,6 +37826,7 @@ bkrankp
@source:sunplus_unsp20soc_mobigo.cpp
mobigo
+mobigos
mobigo2
@source:supbtime.cpp
diff --git a/src/mame/mess.flt b/src/mame/mess.flt
index ed9265cf7d7..686cc882f63 100644
--- a/src/mame/mess.flt
+++ b/src/mame/mess.flt
@@ -819,6 +819,7 @@ spg110.cpp
spg29x.cpp
spg29x_lexibook_jg7425.cpp
spg2xx.cpp
+spg2xx_digimake.cpp
spg2xx_dreamlife.cpp
spg2xx_ican.cpp
spg2xx_jakks.cpp