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)
This commit is contained in:
David Haywood 2020-03-07 15:52:47 +00:00 committed by GitHub
parent 80d9962aad
commit c46e3754ba
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
12 changed files with 691 additions and 104 deletions

View File

@ -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",

View File

@ -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,10 +244,26 @@ 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];
uint32_t ctrl = regs[3];
if (ctrl & 0x80) // HiColor mode (rad_digi)
{
for (int i = 0; i < 320; i++)
{
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;
@ -270,6 +287,7 @@ void spg2xx_video_device::draw_bitmap(const rectangle& cliprect, uint32_t scanli
}
}
}
}
void spg2xx_video_device::draw_page(const rectangle &cliprect, uint32_t scanline, int priority, uint32_t bitmap_addr, uint16_t *regs)
{
@ -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

View File

@ -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));

View File

@ -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)
{
@ -219,6 +220,9 @@ void gcm394_base_video_device::device_start()
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));
save_item(NAME(m_rgb5_to_rgb8));
@ -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
{
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;
tile |= (palette & 0x0007) << 16;
}
}
@ -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,34 +1299,35 @@ 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

View File

@ -82,6 +82,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;
};

View File

@ -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"
@ -2692,6 +2753,8 @@ CONS( 200?, sudopptv, 0, 0, nes_vt, nes_vt, nes_vt_waixing_state, empty_init
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)

View File

@ -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) )

View File

@ -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 )

View File

@ -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?)

View File

@ -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
@ -139,4 +148,5 @@ ROM_START( mobigo2 )
ROM_END
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 )

View File

@ -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

View File

@ -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