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,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++)
uint32_t ctrl = regs[3];
if (ctrl & 0x80) // HiColor mode (rad_digi)
{
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];
if (!(color & 0x8000))
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];
}
}
palette_entry = (data & 0xff00) >> 8;
color = m_paletteram[palette_entry];
if (!(color & 0x8000))
}
else
{
for (int i = 0; i < 320 / 2; i++)
{
dest[(i * 2)+1] = m_rgb555_to_rgb888[color & 0x7fff];
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];
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

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

View File

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

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

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

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