summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author mamehaze <140764005+mamehaze@users.noreply.github.com>2025-11-09 16:16:41 +0000
committer GitHub <noreply@github.com>2025-11-09 17:16:41 +0100
commit3c92436e97b657e74e7d8d6ad4c43a507b62b72e (patch)
tree18e4f211156eb473f5ce06439cb6bbc29907ef4a
parent9f7cf0145a11c4be9d764c9faabe903e926aea60 (diff)
Current Plug and Play PR + some GPL162xx related hack removal (#14496)
- removed several per-game hacks from GPL162xx code in favour of using registers which control the same behaviour [David Haywood] New systems marked not working ------------------------------ Bratz Rock Angelz [Team Europe] Cyber Arcade Motion - Lilo & Stitch (JL3180D_01) [Team Europe] Mecha Nage! Monster Ball (Japan) [Team Europe]
-rw-r--r--src/devices/machine/generalplus_gpl162xx_soc.h5
-rw-r--r--src/devices/machine/generalplus_gpl162xx_soc_video.cpp130
-rw-r--r--src/devices/machine/generalplus_gpl162xx_soc_video.h4
-rw-r--r--src/devices/machine/spg2xx_video.cpp10
-rw-r--r--src/devices/machine/spg_renderer.cpp121
-rw-r--r--src/devices/machine/spg_renderer.h6
-rw-r--r--src/mame/mame.lst3
-rw-r--r--src/mame/tvgames/elan_eu3a05.cpp12
-rw-r--r--src/mame/tvgames/generalplus_gpl16250.cpp1
-rw-r--r--src/mame/tvgames/generalplus_gpl16250_nand.cpp1
-rw-r--r--src/mame/tvgames/generalplus_gpl16250_rom.cpp8
-rw-r--r--src/mame/tvgames/generalplus_gpl16250_romram.cpp4
-rw-r--r--src/mame/tvgames/generalplus_gpl16250_spi.cpp11
-rw-r--r--src/mame/tvgames/generalplus_gpl951xx.cpp13
14 files changed, 178 insertions, 151 deletions
diff --git a/src/devices/machine/generalplus_gpl162xx_soc.h b/src/devices/machine/generalplus_gpl162xx_soc.h
index ed68b581e04..7baec77051c 100644
--- a/src/devices/machine/generalplus_gpl162xx_soc.h
+++ b/src/devices/machine/generalplus_gpl162xx_soc.h
@@ -58,11 +58,6 @@ public:
void set_cs_space(address_space* csspace) { m_cs_space = csspace; }
- //void set_paldisplaybank_high_hack(int pal_displaybank_high) { m_spg_video->set_paldisplaybank_high(pal_displaybank_high); }
- void set_alt_tile_addressing_hack(int alt_tile_addressing) { m_spg_video->set_alt_tile_addressing(alt_tile_addressing); }
- //void set_pal_sprites_hack(int pal_sprites) { m_spg_video->set_pal_sprites(pal_sprites); }
- //void set_pal_back_hack(int pal_back) { m_spg_video->set_pal_back(pal_back); }
- void set_alt_extrasprite_hack(int alt_extrasprite_hack) { m_spg_video->set_alt_extrasprite(alt_extrasprite_hack); }
void set_legacy_video_mode() { m_spg_video->set_legacy_video_mode(); }
void set_disallow_resolution_control() { m_spg_video->set_disallow_resolution_control(); }
diff --git a/src/devices/machine/generalplus_gpl162xx_soc_video.cpp b/src/devices/machine/generalplus_gpl162xx_soc_video.cpp
index cd136ab279f..63c3ee907ac 100644
--- a/src/devices/machine/generalplus_gpl162xx_soc_video.cpp
+++ b/src/devices/machine/generalplus_gpl162xx_soc_video.cpp
@@ -36,8 +36,6 @@ gcm394_base_video_device::gcm394_base_video_device(const machine_config &mconfig
m_space_read_cb(*this, 0),
m_rowscroll(*this, "^rowscroll"),
m_rowzoom(*this, "^rowzoom"),
- m_alt_extrasprite_hack(0),
- m_alt_tile_addressing(0),
m_use_legacy_mode(false),
m_disallow_resolution_control(false),
m_renderer(*this, "renderer")
@@ -254,7 +252,6 @@ void gcm394_base_video_device::device_start()
save_item(NAME(m_spriteram));
save_item(NAME(m_paletteram));
save_item(NAME(m_maxgfxelement));
- save_item(NAME(m_alt_tile_addressing));
}
void gcm394_base_video_device::device_reset()
@@ -331,19 +328,6 @@ uint32_t gcm394_base_video_device::screen_update(screen_device &screen, bitmap_r
// jak_s500 briely sets pen 0 of the layer to magenta, but then ends up erasing it
- uint32_t page0_addr = (m_page0_addr_msb << 16) | m_page0_addr_lsb;
- uint32_t page1_addr = (m_page1_addr_msb << 16) | m_page1_addr_lsb;
- uint32_t page2_addr = (m_page2_addr_msb << 16) | m_page2_addr_lsb;
- uint32_t page3_addr = (m_page3_addr_msb << 16) | m_page3_addr_lsb;
-
- if (m_use_legacy_mode)
- {
- page0_addr = page0_addr * 0x40;
- page1_addr = page1_addr * 0x40;
- page2_addr = page2_addr * 0x40;
- page3_addr = page3_addr * 0x40;
- }
-
if (0)
{
@@ -366,10 +350,10 @@ uint32_t gcm394_base_video_device::screen_update(screen_device &screen, bitmap_r
"p2attr dw:%01x dh:%01x Z:%d P:%d V:%d H:%d FY:%d FX:%d D:%d xs: %04x ys %04x\n"
"p3attr dw:%01x dh:%01x Z:%d P:%d V:%d H:%d FY:%d FX:%d D:%d xs: %04x ys %04x\n"
"palbank %04x 707e: %04x 707f: %04x tvc703c: %04x spr7042: %04x\n",
- (ctrl0 & 0xfe00) >> 9, BIT(ctrl0, 8), BIT(ctrl0, 7), BIT(ctrl0, 6), BIT(ctrl0, 5), BIT(ctrl0, 4), BIT(ctrl0, 3), BIT(ctrl0, 2), BIT(ctrl0, 1), BIT(ctrl0, 0), page0_addr, m_tmap0_regs[2], m_tmap0_regs[3],
- (ctrl1 & 0xfe00) >> 9, BIT(ctrl1, 8), BIT(ctrl1, 7), BIT(ctrl1, 6), BIT(ctrl1, 5), BIT(ctrl1, 4), BIT(ctrl1, 3), BIT(ctrl1, 2), BIT(ctrl1, 1), BIT(ctrl1, 0), page1_addr, m_tmap1_regs[2], m_tmap1_regs[3],
- (ctrl2 & 0xfe00) >> 9, BIT(ctrl2, 8), BIT(ctrl2, 7), BIT(ctrl2, 6), BIT(ctrl2, 5), BIT(ctrl2, 4), BIT(ctrl2, 3), BIT(ctrl2, 2), BIT(ctrl2, 1), BIT(ctrl2, 0), page2_addr, m_tmap2_regs[2], m_tmap2_regs[3],
- (ctrl3 & 0xfe00) >> 9, BIT(ctrl3, 8), BIT(ctrl3, 7), BIT(ctrl3, 6), BIT(ctrl3, 5), BIT(ctrl3, 4), BIT(ctrl3, 3), BIT(ctrl3, 2), BIT(ctrl3, 1), BIT(ctrl3, 0), page3_addr, m_tmap3_regs[2], m_tmap3_regs[3],
+ (ctrl0 & 0xfe00) >> 9, BIT(ctrl0, 8), BIT(ctrl0, 7), BIT(ctrl0, 6), BIT(ctrl0, 5), BIT(ctrl0, 4), BIT(ctrl0, 3), BIT(ctrl0, 2), BIT(ctrl0, 1), BIT(ctrl0, 0), m_page0_addr_lsb, m_tmap0_regs[2], m_tmap0_regs[3],
+ (ctrl1 & 0xfe00) >> 9, BIT(ctrl1, 8), BIT(ctrl1, 7), BIT(ctrl1, 6), BIT(ctrl1, 5), BIT(ctrl1, 4), BIT(ctrl1, 3), BIT(ctrl1, 2), BIT(ctrl1, 1), BIT(ctrl1, 0), m_page1_addr_lsb, m_tmap1_regs[2], m_tmap1_regs[3],
+ (ctrl2 & 0xfe00) >> 9, BIT(ctrl2, 8), BIT(ctrl2, 7), BIT(ctrl2, 6), BIT(ctrl2, 5), BIT(ctrl2, 4), BIT(ctrl2, 3), BIT(ctrl2, 2), BIT(ctrl2, 1), BIT(ctrl2, 0), m_page2_addr_lsb, m_tmap2_regs[2], m_tmap2_regs[3],
+ (ctrl3 & 0xfe00) >> 9, BIT(ctrl3, 8), BIT(ctrl3, 7), BIT(ctrl3, 6), BIT(ctrl3, 5), BIT(ctrl3, 4), BIT(ctrl3, 3), BIT(ctrl3, 2), BIT(ctrl3, 1), BIT(ctrl3, 0), m_page3_addr_lsb, m_tmap3_regs[2], m_tmap3_regs[3],
BIT(attr0, 15), BIT(attr0, 14), (attr0 >> 12) & 3, (attr0 >> 8) & 15, 8 << ((attr0 >> 6) & 3), 8 << ((attr0 >> 4) & 3), BIT(attr0, 3), BIT(attr0, 2), 2 * ((attr0 & 3) + 1), m_tmap0_scroll[0], m_tmap0_scroll[1],
BIT(attr1, 15), BIT(attr1, 14), (attr1 >> 12) & 3, (attr1 >> 8) & 15, 8 << ((attr1 >> 6) & 3), 8 << ((attr1 >> 4) & 3), BIT(attr1, 3), BIT(attr1, 2), 2 * ((attr1 & 3) + 1), m_tmap1_scroll[0], m_tmap1_scroll[1],
BIT(attr2, 15), BIT(attr2, 14), (attr2 >> 12) & 3, (attr2 >> 8) & 15, 8 << ((attr2 >> 6) & 3), 8 << ((attr2 >> 4) & 3), BIT(attr2, 3), BIT(attr2, 2), 2 * ((attr2 & 3) + 1), m_tmap2_scroll[0], m_tmap2_scroll[1],
@@ -397,11 +381,16 @@ uint32_t gcm394_base_video_device::screen_update(screen_device &screen, bitmap_r
address_space &mem = m_cpu->space(AS_PROGRAM);
+ uint32_t sprites_addr;
- uint32_t sprites_addr = (m_sprite_702d_gfxbase_msb << 16) | m_sprite_7022_gfxbase_lsb;
-
- if (m_use_legacy_mode)
- sprites_addr *= 0x40;
+ if (m_707f & 0x0040) // FREE == 1
+ {
+ sprites_addr = ((m_sprite_702d_gfxbase_msb & 0x07ff) << 16) | m_sprite_7022_gfxbase_lsb;
+ }
+ else
+ {
+ sprites_addr = m_sprite_7022_gfxbase_lsb * 0x40;
+ }
for (uint32_t scanline = (uint32_t)cliprect.min_y; scanline <= (uint32_t)cliprect.max_y; scanline++)
{
@@ -409,12 +398,12 @@ uint32_t gcm394_base_video_device::screen_update(screen_device &screen, bitmap_r
for (int i = 0; i < 4; i++)
{
- m_renderer->draw_page(true, true, m_alt_tile_addressing ? false : true, m_703a_palettebank, cliprect, scanline, i, page0_addr, m_tmap0_scroll, m_tmap0_regs, mem, m_paletteram, m_rowscroll, 0);
- m_renderer->draw_page(true, true, m_alt_tile_addressing ? false : true, m_703a_palettebank, cliprect, scanline, i, page1_addr, m_tmap1_scroll, m_tmap1_regs, mem, m_paletteram, m_rowscroll, 1);
- m_renderer->draw_page(true, true, m_alt_tile_addressing ? false : true, m_703a_palettebank, cliprect, scanline, i, page2_addr, m_tmap2_scroll, m_tmap2_regs, mem, m_paletteram, m_rowscroll, 2);
- m_renderer->draw_page(true, true, m_alt_tile_addressing ? false : true, m_703a_palettebank, cliprect, scanline, i, page3_addr, m_tmap3_scroll, m_tmap3_regs, mem, m_paletteram, m_rowscroll, 3);
+ m_renderer->draw_page(true, true, m_703a_palettebank, cliprect, scanline, i, m_page0_addr_msb, m_page0_addr_lsb, m_tmap0_scroll, m_tmap0_regs, mem, m_paletteram, m_rowscroll, 0);
+ m_renderer->draw_page(true, true, m_703a_palettebank, cliprect, scanline, i, m_page1_addr_msb, m_page1_addr_lsb, m_tmap1_scroll, m_tmap1_regs, mem, m_paletteram, m_rowscroll, 1);
+ m_renderer->draw_page(true, true, m_703a_palettebank, cliprect, scanline, i, m_page2_addr_msb, m_page2_addr_lsb, m_tmap2_scroll, m_tmap2_regs, mem, m_paletteram, m_rowscroll, 2);
+ m_renderer->draw_page(true, true, m_703a_palettebank, cliprect, scanline, i, m_page3_addr_msb, m_page3_addr_lsb, m_tmap3_scroll, m_tmap3_regs, mem, m_paletteram, m_rowscroll, 3);
- m_renderer->draw_sprites(true, m_use_legacy_mode ? 2 : 1, m_alt_extrasprite_hack ? true : false, m_703a_palettebank, highres, cliprect, scanline, i, sprites_addr, mem, m_paletteram, m_spriteram, -1);
+ m_renderer->draw_sprites(true, m_use_legacy_mode ? 2 : 1, m_703a_palettebank, highres, cliprect, scanline, i, sprites_addr, mem, m_paletteram, m_spriteram, -1);
}
m_renderer->apply_saturation_and_fade(bitmap, cliprect, scanline);
@@ -748,6 +737,19 @@ void gcm394_base_video_device::sprite_7042_extra_w(uint16_t data)
m_7042_sprite = data;
m_renderer->set_video_reg_42(data);
+ // format is
+ // NNNN NNNN ZRMD rBCE
+ //
+ // N = number of sprites to draw
+ // Z = global sprite zoom enable
+ // R = global sprite rotate enable
+ // M = global sprite mosaic enable
+ // D = direct addressing enable
+ // r = sprite round robin mode
+ // B = blend mode (0 = use 702a for blending, 1 = use individual sprite blending)
+ // C = co-ordinate mode
+ // E = sprite enable
+
//popmessage("extra modes %04x\n", data);
}
@@ -779,15 +781,19 @@ void gcm394_base_video_device::video_dma_size_trigger_w(address_space &space, ui
LOGMASKED(LOG_GCM394_VIDEO_DMA, "%s: doing sprite / video DMA source %04x dest %04x size %04x value of 707e (bank) %04x value of 707f %04x\n", machine().describe_context(), m_videodma_source, m_videodma_dest, m_videodma_size, m_707e_spritebank, m_707f );
- // jak_spmm sets dest to 0 when it wants to write to spriteram, looks intentional?
- // does something else force writes to go to spriteram or does 0 always just mean there?
- if (m_videodma_dest == 0)
- m_videodma_dest = 0x7400;
+ // sprite DMA can only write to spriteram (just like on spg2xx)
+ int dest = m_videodma_dest & 0x03ff;
+ int size = m_videodma_size & 0x03ff;
+
+ // on spg2xx size 0 means full transfer, with a < condition in the loop rather than <=
+ // jak_spmm seems to indicate that it differs here
- for (int i = 0; i <= m_videodma_size; i++)
+ for (int i = 0; i <= size; i++)
{
- uint16_t dat = space.read_word(m_videodma_source+i);
- space.write_word(m_videodma_dest + i, dat);
+ uint16_t dat = space.read_word(m_videodma_source + i);
+
+ if ((dest + i) < 0x400)
+ space.write_word(0x7400 + dest + i, dat);
}
m_videodma_size = 0x0000;
@@ -814,22 +820,6 @@ uint16_t gcm394_base_video_device::video_707c_r()
return 0x8000;
}
-/* 707f is VERY important, lots of rendering codepaths in the code depend on the value it returns.
-
- all operations in the code based on 707f are bit based, usually read register, set / clear a bit
- and then write register, or read register and test an individual bit.
-
- our current codeflow means that bits are only ever set, not cleared.
-
- are the bits triggers? acks? enables? status flags?
-
- in wrlshunt this ends up being set to 02f9 ---- --x- xxxx x--x
- and in smartfp it ends up being set to 0065 ---- ---- -xx- -x-x
-
- is this because wrlshunt uses more layers?
-*/
-
-
uint16_t gcm394_base_video_device::video_707f_r()
{
uint16_t retdata = m_renderer->get_video_reg_7f();
@@ -840,22 +830,26 @@ void gcm394_base_video_device::video_707f_w(uint16_t data)
{
LOGMASKED(LOG_GCM394_VIDEO, "%s:gcm394_base_video_device::video_707f_w %04x\n", machine().describe_context(), data);
- for (int i = 0; i < 16; i++)
- {
- uint16_t mask = 1 << i;
-
- if ((m_707f & mask) != (data & mask))
- {
- if (data & mask)
- {
- LOGMASKED(LOG_GCM394_VIDEO, "\tbit %04x Low -> High\n", mask);
- }
- else
- {
- LOGMASKED(LOG_GCM394_VIDEO, "\tbit %04x High -> Low\n", mask);
- }
- }
- }
+ // Format for GPL1625x / GPAC800
+ //
+ // S000 MMDF EfIV BDCP
+ //
+ // S# = SAVE_ROM (0 = normal mode, 1 = ROM saving mode, uses even line data for odd lines)
+ // MM = FB_MONO (0 = RGB, 1 = Mono, 2 = 2bpp, 3 = 4bpp)
+ // D* = SPR25D (0 = disable virtual 3D sprites, 1 = enable)
+ // F = FB_FORMAT (0 = RGB565, 1 = RGBG)
+ // E = FB_EN (0 = Half-line base mode, 1 = Frame base mode)
+ // f = FREE (0 = 22 bit addressing, 1 = 27 bit addressing)
+ // I* = VGA_NOINTL (0 = VGA interlace mode 640x480, 1 = VGA-non interlace mode, 640x240)
+ // V* = VGA_EN (0 = QVGA / 320x240, 1 = VGA / 640x480)
+ // B = TX_BOTUP (0 = top to bottom layers, 1 = bottom to top layers)
+ // D = TX_DIRECT (0 = relative addressing, 1 = direct addressing)
+ // C = TCHAR (0 = disable transparent tile, 1 = enable transparent tile - only works in relative address mode)
+ // P = PPU_EN
+ //
+ // # not on GPL16250 (GPAC500 only?)
+ // * not on GPL1622x / GPL1623x / GPAC500
+ //
m_707f = data;
m_renderer->set_video_reg_7f(data);
diff --git a/src/devices/machine/generalplus_gpl162xx_soc_video.h b/src/devices/machine/generalplus_gpl162xx_soc_video.h
index c836ec69035..fc60a9c84e9 100644
--- a/src/devices/machine/generalplus_gpl162xx_soc_video.h
+++ b/src/devices/machine/generalplus_gpl162xx_soc_video.h
@@ -32,8 +32,6 @@ public:
void write_tmap_regs(int tmap, uint16_t* regs, int offset, uint16_t data);
//void set_paldisplaybank_high(int pal_displaybank_high) { m_pal_displaybank_high = pal_displaybank_high; }
- void set_alt_tile_addressing(int alt_tile_addressing) { m_alt_tile_addressing = alt_tile_addressing; }
- void set_alt_extrasprite(int alt_extrasprite_hack) { m_alt_extrasprite_hack = alt_extrasprite_hack; }
void set_legacy_video_mode() { m_use_legacy_mode = true; }
void set_disallow_resolution_control() { m_disallow_resolution_control = true; }
@@ -231,8 +229,6 @@ protected:
//int m_pal_displaybank_high;
//int m_pal_sprites;
//int m_pal_back;
- int m_alt_extrasprite_hack;
- int m_alt_tile_addressing;
bool m_use_legacy_mode; // could be related to the 'unused' bits in the palete bank select being set, but uncertain
bool m_disallow_resolution_control;
diff --git a/src/devices/machine/spg2xx_video.cpp b/src/devices/machine/spg2xx_video.cpp
index d8ff4805b30..0b522ee7b36 100644
--- a/src/devices/machine/spg2xx_video.cpp
+++ b/src/devices/machine/spg2xx_video.cpp
@@ -95,8 +95,8 @@ uint32_t spg2xx_video_device::screen_update(screen_device &screen, bitmap_rgb32
}
- const uint32_t page1_addr = 0x40 * m_video_regs[0x20];
- const uint32_t page2_addr = 0x40 * m_video_regs[0x21];
+ const uint32_t page1_addr = m_video_regs[0x20];
+ const uint32_t page2_addr = m_video_regs[0x21];
const uint32_t sprite_addr = 0x40 * m_video_regs[0x22];
uint16_t *page1_scroll = m_video_regs + 0x10;
@@ -110,9 +110,9 @@ uint32_t spg2xx_video_device::screen_update(screen_device &screen, bitmap_rgb32
for (int i = 0; i < 4; i++)
{
- m_renderer->draw_page(false, false, false, 0, cliprect, scanline, i, page1_addr, page1_scroll, page1_regs, mem, m_paletteram, m_scrollram, 0);
- m_renderer->draw_page(false, false, false, 0, cliprect, scanline, i, page2_addr, page2_scroll, page2_regs, mem, m_paletteram, m_scrollram, 1);
- m_renderer->draw_sprites(false, 0, false, 0, false, cliprect, scanline, i, sprite_addr, mem, m_paletteram, m_spriteram, m_sprlimit_read_cb());
+ m_renderer->draw_page(false, false, 0, cliprect, scanline, i, 0, page1_addr, page1_scroll, page1_regs, mem, m_paletteram, m_scrollram, 0);
+ m_renderer->draw_page(false, false, 0, cliprect, scanline, i, 0, page2_addr, page2_scroll, page2_regs, mem, m_paletteram, m_scrollram, 1);
+ m_renderer->draw_sprites(false, 0, 0, false, cliprect, scanline, i, sprite_addr, mem, m_paletteram, m_spriteram, m_sprlimit_read_cb());
}
m_renderer->apply_saturation_and_fade(bitmap, cliprect, scanline);
diff --git a/src/devices/machine/spg_renderer.cpp b/src/devices/machine/spg_renderer.cpp
index cf758f859e8..ad4689cfca0 100644
--- a/src/devices/machine/spg_renderer.cpp
+++ b/src/devices/machine/spg_renderer.cpp
@@ -399,7 +399,7 @@ void spg_renderer_device::draw_tilestrip(bool read_from_csspace, uint32_t screen
}
}
-void spg_renderer_device::draw_page(bool read_from_csspace, bool has_extended_tilemaps, bool use_alt_tile_addressing, uint32_t palbank, const rectangle& cliprect, uint32_t scanline, int priority, uint32_t tilegfxdata_addr, uint16_t* scrollregs, uint16_t* tilemapregs, address_space& spc, uint16_t* paletteram, uint16_t* scrollram, uint32_t which)
+void spg_renderer_device::draw_page(bool read_from_csspace, bool has_extended_tilemaps, uint32_t palbank, const rectangle& cliprect, uint32_t scanline, int priority, uint16_t tilegfxdata_addr_msb, uint16_t tilegfxdata_addr, uint16_t* scrollregs, uint16_t* tilemapregs, address_space& spc, uint16_t* paletteram, uint16_t* scrollram, uint32_t which)
{
const uint32_t attr = tilemapregs[0];
const uint32_t ctrl = tilemapregs[1];
@@ -414,9 +414,22 @@ void spg_renderer_device::draw_page(bool read_from_csspace, bool has_extended_ti
return;
}
+ // graphic data segments/bases
+ uint32_t tilegfxdata_addr_full;
+
+ if (m_video_regs_7f & 0x0040) // FREE == 1
+ {
+ tilegfxdata_addr_full = ((tilegfxdata_addr_msb & 0x07ff) << 16) | tilegfxdata_addr;
+ }
+ else // FREE == 0 (default / legacy)
+ {
+ tilegfxdata_addr_full = tilegfxdata_addr * 0x40;
+ }
+
+
if (ctrl & 0x0001) // Bitmap / Linemap mode! (basically screen width tile mode)
{
- draw_linemap(has_extended_tilemaps, cliprect, scanline, priority, tilegfxdata_addr, scrollregs, tilemapregs, spc, paletteram);
+ draw_linemap(has_extended_tilemaps, cliprect, scanline, priority, tilegfxdata_addr_full, scrollregs, tilemapregs, spc, paletteram);
return;
}
@@ -484,14 +497,13 @@ void spg_renderer_device::draw_page(bool read_from_csspace, bool has_extended_ti
uint32_t words_per_tile;
+ words_per_tile = bits_per_row * tile_h;
+
// good for gormiti, smartfp, wrlshunt, paccon, jak_totm, jak_s500, jak_gtg
- if (has_extended_tilemaps && use_alt_tile_addressing)
- {
- words_per_tile = 8;
- }
- else
+ if (has_extended_tilemaps)
{
- words_per_tile = bits_per_row * tile_h;
+ if (m_video_regs_7f & 0x0004) // TX_DIRECT
+ words_per_tile = 8;
}
int realxscroll = xscroll;
@@ -513,10 +525,10 @@ void spg_renderer_device::draw_page(bool read_from_csspace, bool has_extended_ti
const int endpos = (screenwidth + tile_w) / tile_w;
int upperpalselect = 0;
- if (has_extended_tilemaps && (tilegfxdata_addr & 0x80000000))
- upperpalselect = 1;
- tilegfxdata_addr &= 0x7ffffff;
+ // smartfp
+ if (has_extended_tilemaps && (tilegfxdata_addr_msb & 0x8000))
+ upperpalselect = 1;
for (uint32_t x0 = 0; x0 < endpos; x0++)
{
@@ -555,17 +567,16 @@ void spg_renderer_device::draw_page(bool read_from_csspace, bool has_extended_ti
uint32_t tileattr = attr;
uint32_t tilectrl = ctrl;
- if (has_extended_tilemaps && use_alt_tile_addressing)
+ if (has_extended_tilemaps && (m_video_regs_7f & 0x0004)) // TX_DIRECT
{
- // in this mode what would be the 'palette' bits get used for extra tile bits (even if the usual 'extended table' mode is disabled?)
- // used by smartfp
uint16_t exattribute = (ctrl & 0x0004) ? spc.read_word(exattributemap_rambase) : spc.read_word(exattributemap_rambase + tile_address / 2);
if (realx0 & 1)
exattribute >>= 8;
else
exattribute &= 0x00ff;
- tile |= (exattribute & 0x07) << 16;
+ // when TX_DIRECT is used the attributes become extra addressing bits (smartfp)
+ tile |= (exattribute & 0xff) << 16;
//blendlevel = 0x1f; // hack
}
else if ((ctrl & 2) == 0)
@@ -606,11 +617,11 @@ void spg_renderer_device::draw_page(bool read_from_csspace, bool has_extended_ti
palette_offset <<= nc_bpp;
const int drawx = (x0 * tile_w) - (realxscroll & (tile_w - 1));
- draw_tilestrip(read_from_csspace, screenwidth, drawwidthmask, blend, flip_x, cliprect, tile_h, tile_w, tilegfxdata_addr, tile, tile_scanline, drawx, flip_y, palette_offset, nc_bpp, bits_per_row, words_per_tile, spc, paletteram, blendlevel);
+ draw_tilestrip(read_from_csspace, screenwidth, drawwidthmask, blend, flip_x, cliprect, tile_h, tile_w, tilegfxdata_addr_full, tile, tile_scanline, drawx, flip_y, palette_offset, nc_bpp, bits_per_row, words_per_tile, spc, paletteram, blendlevel);
}
}
-void spg_renderer_device::draw_sprite(bool read_from_csspace, int extended_sprites_mode, bool alt_extrasprite_hack, uint32_t palbank, bool highres, const rectangle& cliprect, uint32_t scanline, int priority, uint32_t spritegfxdata_addr, uint32_t base_addr, address_space &spc, uint16_t* paletteram, uint16_t* spriteram)
+void spg_renderer_device::draw_sprite(bool read_from_csspace, int extended_sprites_mode, uint32_t palbank, bool highres, const rectangle& cliprect, uint32_t scanline, int priority, uint32_t spritegfxdata_addr, uint32_t base_addr, address_space &spc, uint16_t* paletteram, uint16_t* spriteram)
{
uint32_t tilegfxdata_addr = spritegfxdata_addr;
uint32_t tile = spriteram[base_addr + 0];
@@ -663,6 +674,7 @@ void spg_renderer_device::draw_sprite(bool read_from_csspace, int extended_sprit
const spg_renderer_device::blend_enable_t blend = (attr & 0x4000) ? BlendOn : BlendOff;
spg_renderer_device::flipx_t flip_x = (attr & 0x0004) ? FlipXOn : FlipXOff;
+ bool flip_y = (attr & 0x0008);
const uint8_t bpp = attr & 0x0003;
const uint32_t nc_bpp = ((bpp)+1) << 1;
const uint32_t bits_per_row = nc_bpp * tile_w / 16;
@@ -672,43 +684,60 @@ void spg_renderer_device::draw_sprite(bool read_from_csspace, int extended_sprit
static const uint8_t s_blend_levels[4] = { 0x08, 0x10, 0x18, 0x20 };
uint8_t blendlevel = s_blend_levels[m_video_regs_2a & 3];
- uint32_t words_per_tile;
+ uint32_t words_per_tile = bits_per_row * tile_h;
+;
- // good for gormiti, smartfp, wrlshunt, paccon, jak_totm, jak_s500, jak_gtg
- if (extended_sprites_mode && ((m_video_regs_42 & 0x0010) == 0x10))
+ if (extended_sprites_mode)
{
- // paccon and smartfp use this mode
- words_per_tile = 8;
+ // 7400 format on GPL162xx is
+ //
+ // 7400 - NNNN NNNN NNNN NNNN (N = sprite tile number/address)
+ // 7401 - AAAA AAXX XXXX XXXX (A = Angle or Y1[5:0], X = Xpos/X0[9:0])
+ // 7402 - ZZZZ ZZYY YYYY YYYY (Z = Zoom, or Y2[5:0], Y = Ypos/Y0[9:0])
+ // 7403 - pbDD PPPP VVHH FFCC (p = Palette Bank, b = blend, D = depth, P = palette, V = vertical size, H = horizontal size, F = flip, C = colour)
- if (!alt_extrasprite_hack) // 1 extra word for each sprite
+ if (m_video_regs_7f & 0x0200) // 'virtual 3D' sprite mode (GPAC800 / GPL16250 only) has 4 extra entries per sprite
{
- // before or after the 0 tile check?
- tile |= (spriteram[(base_addr / 4) + 0x400] & 0x01ff) << 16;
- blendlevel = ((spriteram[(base_addr / 4) + 0x400] & 0x3e00) >> 9);
+ // 2nd sprite bank is...
+ //
+ // 7400 - MMBB BBBB NNNN NNNN - M = Mosaic, B = blend level, N = sprite/tile number/adddress) Attribute 1 of sprite 0
+ // 7401 - YYYY YYXX XXXX XXXX - Y = Y3[5:0] X = X1[9:0] X1 of sprite 0
+ // 7402 - YYyy yyXX XXXX XXXX - Y = Y3[7:6] y = Y1[9:6] X = X2[9:0] X2 of sprite 0
+ // 7403 - YYyy yyXX XXXX XXXX - Y = Y3[9:8] y = Y2[9:6] X = X3[9:0] X3 of sprite 0
+ // 7404 - Attribute 1 of sprite 1
+ // ....
+ //
+ // Normally Zoom/Rotate functions are disabled in this mode, as the attributes are use for co-ordinate data
+ // but setting Flip to 0x3 causes them to be used (ignoring flip) instead of the extra co-ordinates
+ flip_x = FlipXOff;
+ flip_y = 0;
+
+ tile |= (spriteram[(base_addr)+0x400] & 0x00ff) << 16;
+ blendlevel = ((spriteram[(base_addr)+0x400] & 0x3f00) >> 8);
}
- else // jak_prft - no /4 to offset in this mode - 4 extra words per sprite instead ? (or is RAM content incorrect for one of these cases?)
+ else // regular extended mode, just 1 extra entry per sprite
{
- tile |= spriteram[(base_addr) + 0x400] << 16;
- blendlevel = ((spriteram[(base_addr) + 0x400] & 0x3e00) >> 9);
+ // 2nd sprite bank is...
+ // 7400 - MMBB BBBB NNNN NNNN - M = Mosaic, B = blend level, N = sprite/tile number/adddress) Attribute 1 of sprite 0
+ // ....
+
+ // before or after the 0 tile check?
+ tile |= (spriteram[(base_addr / 4) + 0x400] & 0x00ff) << 16;
+ blendlevel = ((spriteram[(base_addr / 4) + 0x400] & 0x3f00) >> 8);
}
- }
- else
- {
- words_per_tile = bits_per_row * tile_h;
- }
+ blendlevel >>= 1; // hack, drawing code expects 5 bits, not 6
- bool flip_y = (attr & 0x0008);
-
- // various games don't want the flip bits in the usual place, wrlshunt for example, there's probably a bit to control this
- // and likewise these bits probably now have a different meaning, so this shouldn't be trusted
- // beijuehh does NOT want this either (see characters in 'empire fighter')
- if (extended_sprites_mode)
- {
- if (highres || alt_extrasprite_hack)
+ // good for gormiti, smartfp, wrlshunt, paccon, jak_totm, jak_s500, jak_gtg
+ if (m_video_regs_42 & 0x0010) // direct addressing mode
{
- flip_x = FlipXOff;
- flip_y = 0;
+ // paccon and smartfp use this mode
+ words_per_tile = 8;
+ }
+ else
+ {
+ // extended address bits only used in direct mode, jak_prr and other GPAC500 games rely on this
+ tile &= 0xffff;
}
}
@@ -764,7 +793,7 @@ void spg_renderer_device::draw_sprite(bool read_from_csspace, int extended_sprit
}
}
-void spg_renderer_device::draw_sprites(bool read_from_csspace, int extended_sprites_mode, bool alt_extrasprite_hack, uint32_t palbank, bool highres, const rectangle &cliprect, uint32_t scanline, int priority, uint32_t spritegfxdata_addr, address_space &spc, uint16_t* paletteram, uint16_t* spriteram, int sprlimit)
+void spg_renderer_device::draw_sprites(bool read_from_csspace, int extended_sprites_mode, uint32_t palbank, bool highres, const rectangle &cliprect, uint32_t scanline, int priority, uint32_t spritegfxdata_addr, address_space &spc, uint16_t* paletteram, uint16_t* spriteram, int sprlimit)
{
if (!(m_video_regs_42 & 0x0001))
{
@@ -781,7 +810,7 @@ void spg_renderer_device::draw_sprites(bool read_from_csspace, int extended_spri
for (uint32_t n = 0; n < sprlimit; n++)
{
- draw_sprite(read_from_csspace, extended_sprites_mode, alt_extrasprite_hack, palbank, highres, cliprect, scanline, priority, spritegfxdata_addr, 4 * n, spc, paletteram, spriteram);
+ draw_sprite(read_from_csspace, extended_sprites_mode, palbank, highres, cliprect, scanline, priority, spritegfxdata_addr, 4 * n, spc, paletteram, spriteram);
}
}
diff --git a/src/devices/machine/spg_renderer.h b/src/devices/machine/spg_renderer.h
index 922e0905c8e..9676078c1f8 100644
--- a/src/devices/machine/spg_renderer.h
+++ b/src/devices/machine/spg_renderer.h
@@ -14,8 +14,8 @@ public:
spg_renderer_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
spg_renderer_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- void draw_sprites(bool read_from_csspace, int extended_sprites_mode, bool alt_extrasprite_hack, uint32_t palbank, bool highres, const rectangle& cliprect, uint32_t scanline, int priority, uint32_t spritegfxdata_addr, address_space& spc, uint16_t* paletteram, uint16_t* spriteram, int sprlimit);
- void draw_page(bool read_from_csspace, bool has_extended_tilemaps, bool use_alt_tile_addressing, uint32_t palbank, const rectangle& cliprect, uint32_t scanline, int priority, uint32_t tilegfxdata_addr, uint16_t* scrollregs, uint16_t* tilemapregs, address_space& spc, uint16_t* paletteram, uint16_t* scrollram, uint32_t which);
+ void draw_sprites(bool read_from_csspace, int extended_sprites_mode, uint32_t palbank, bool highres, const rectangle& cliprect, uint32_t scanline, int priority, uint32_t spritegfxdata_addr, address_space& spc, uint16_t* paletteram, uint16_t* spriteram, int sprlimit);
+ void draw_page(bool read_from_csspace, bool has_extended_tilemaps, uint32_t palbank, const rectangle& cliprect, uint32_t scanline, int priority, uint16_t tilegfxdata_addr_msb, uint16_t tilegfxdata_addr, uint16_t* scrollregs, uint16_t* tilemapregs, address_space& spc, uint16_t* paletteram, uint16_t* scrollram, uint32_t which);
void new_line(const rectangle& cliprect);
void apply_saturation_and_fade(bitmap_rgb32& bitmap, const rectangle& cliprect, int scanline);
@@ -77,7 +77,7 @@ protected:
inline void draw_tilestrip(bool read_from_csspace, uint32_t screenwidth, uint32_t drawwidthmask, spg_renderer_device::blend_enable_t blend, spg_renderer_device::flipx_t flip_x, const rectangle& cliprect, uint32_t tile_h, uint32_t tile_w, uint32_t tilegfxdata_addr, uint32_t tile, uint32_t tile_scanline, int drawx, bool flip_y, uint32_t palette_offset, const uint32_t nc_bpp, const uint32_t bits_per_row, const uint32_t words_per_tile, address_space& spc, uint16_t* paletteram, uint8_t blendlevel);
- inline void draw_sprite(bool read_from_csspace, int extended_sprites_mode, bool alt_extrasprite_hack, uint32_t palbank, bool highres, const rectangle& cliprect, uint32_t scanline, int priority, uint32_t spritegfxdata_addr, uint32_t base_addr, address_space& spc, uint16_t* paletteram, uint16_t* spriteram);
+ inline void draw_sprite(bool read_from_csspace, int extended_sprites_mode, uint32_t palbank, bool highres, const rectangle& cliprect, uint32_t scanline, int priority, uint32_t spritegfxdata_addr, uint32_t base_addr, address_space& spc, uint16_t* paletteram, uint16_t* spriteram);
inline void draw_linemap(bool has_extended_tilemaps, const rectangle& cliprect, uint32_t scanline, int priority, uint32_t tilegfxdata_addr, uint16_t* scrollregs, uint16_t* tilemapregs, address_space& spc, uint16_t* paletteram);
diff --git a/src/mame/mame.lst b/src/mame/mame.lst
index 3fd7a1775d8..de7a32d1202 100644
--- a/src/mame/mame.lst
+++ b/src/mame/mame.lst
@@ -47053,6 +47053,7 @@ tvbg6b
@source:tvgames/elan_eu3a05.cpp
airblsjs
+bratzra
buzztime
carlecfg
pvmil8
@@ -47157,6 +47158,7 @@ anpaneng
anpanm15
bk139in1
bkrankp
+lxcymls
lxcympp
lxcymsm
lxcyrace
@@ -47177,6 +47179,7 @@ bubltea
dsgnpal
pokebala
pokeissh
+pokemech
pokgoget
punifrnd
punij1m
diff --git a/src/mame/tvgames/elan_eu3a05.cpp b/src/mame/tvgames/elan_eu3a05.cpp
index f2a8ff25ac7..960428587ed 100644
--- a/src/mame/tvgames/elan_eu3a05.cpp
+++ b/src/mame/tvgames/elan_eu3a05.cpp
@@ -1026,6 +1026,12 @@ ROM_START( pvwwcas )
ROM_RELOAD(0x200000, 0x200000)
ROM_END
+ROM_START( bratzra )
+ ROM_REGION( 0x400000, "maincpu", ROMREGION_ERASE00 )
+ // this does not seem to contain the game code, is it internal, or is this badly dumped somehow (all lines going to glob were used)
+ ROM_LOAD( "bratzrockangels.u1", 0x000000, 0x100000, BAD_DUMP CRC(078fa134) SHA1(e9ad3e2f0f39b2544821b9c8f71be976726aec3b) )
+ROM_END
+
void elan_eu3a13_state::init_sudelan3()
{
// skip infinite loop (why is this needed? does it think we've soft shutdown?)
@@ -1067,7 +1073,6 @@ CONS( 2004, buzztime, 0, 0, elan_buzztime, sudoku, elan_eu3a05_buzztime_state, e
CONS( 2005, pvwwcas, 0, 0, pvwwcas, sudoku, elan_eu3a05_pvwwcas_state, init_pvwwcas, "Play Vision / Taikee / V-Tac", "Worldwide Casino Tour 12-in-1", MACHINE_NOT_WORKING )
-
// Below seem to be EU3A13, as that was confirmed for the Family Tetris die. They're like EU3A05, but with a different memory map
CONS( 2006, sudelan3, 0, 0, elan_eu3a13, sudoku, elan_eu3a13_state, init_sudelan3, "All in 1 Products Ltd / Senario", "Ultimate Sudoku TV Edition 3-in-1 (All in 1 / Senario)", MACHINE_NOT_WORKING )
@@ -1086,3 +1091,8 @@ CONS( 200?, carlecfg, 0, 0, elan_eu3a13, carlecfg, elan_eu3a13_state
CONS( 2005, pvmil8, 0, 0, elan_eu3a13_pvmil8, sudoku, elan_eu3a13_state, empty_init, "Play Vision", "Who Wants to Be a Millionaire? (Play Vision, Plug and Play, UK, 8-bit version)", MACHINE_NOT_WORKING )
// see https://millionaire.fandom.com/wiki/Haluatko_miljon%C3%A4%C3%A4riksi%3F_(Play_Vision_game)
CONS( 2005, pvmilfin, pvmil8, 0, elan_eu3a13_pvmil8, sudoku, elan_eu3a13_state, empty_init, "Play Vision", u8"Haluatko miljonääriksi? (Finland)", MACHINE_NOT_WORKING )
+
+// Below are unknown, probably belong here, but dumps are bad
+
+// CE and OE are on the other side of the CPU die compared to EU3A05, ROM seems half sized, or maybe internal area missing?
+CONS( 200?, bratzra, 0, 0, elan_eu3a05, rad_sinv, elan_eu3a05_state, empty_init, "MGA", "Bratz Rock Angelz", MACHINE_NOT_WORKING )
diff --git a/src/mame/tvgames/generalplus_gpl16250.cpp b/src/mame/tvgames/generalplus_gpl16250.cpp
index eeb83dd1855..3b3954bef18 100644
--- a/src/mame/tvgames/generalplus_gpl16250.cpp
+++ b/src/mame/tvgames/generalplus_gpl16250.cpp
@@ -179,7 +179,6 @@ void gcm394_game_state::machine_reset()
m_maincpu->reset(); // reset CPU so vector gets read etc.
//m_maincpu->set_paldisplaybank_high_hack(1);
- m_maincpu->set_alt_tile_addressing_hack(0);
}
void gcm394_game_state::cs_callback(uint16_t cs0, uint16_t cs1, uint16_t cs2, uint16_t cs3, uint16_t cs4)
diff --git a/src/mame/tvgames/generalplus_gpl16250_nand.cpp b/src/mame/tvgames/generalplus_gpl16250_nand.cpp
index a776a34b0fc..e4a74eb13f9 100644
--- a/src/mame/tvgames/generalplus_gpl16250_nand.cpp
+++ b/src/mame/tvgames/generalplus_gpl16250_nand.cpp
@@ -861,7 +861,6 @@ void generalplus_gpac800_game_state::machine_reset()
m_maincpu->reset(); // reset CPU so vector gets read etc.
//m_maincpu->set_paldisplaybank_high_hack(0);
- m_maincpu->set_alt_tile_addressing_hack(1);
}
diff --git a/src/mame/tvgames/generalplus_gpl16250_rom.cpp b/src/mame/tvgames/generalplus_gpl16250_rom.cpp
index b7ede5f298f..063a717cb27 100644
--- a/src/mame/tvgames/generalplus_gpl16250_rom.cpp
+++ b/src/mame/tvgames/generalplus_gpl16250_rom.cpp
@@ -491,7 +491,6 @@ void tkmag220_game_state::machine_reset()
//m_maincpu->set_paldisplaybank_high_hack(0);
//m_maincpu->set_pal_sprites_hack(0x000);
//m_maincpu->set_pal_back_hack(0x000);
- m_maincpu->set_alt_tile_addressing_hack(1);
}
@@ -583,8 +582,6 @@ void beijuehh_game_state::machine_reset()
//m_maincpu->set_paldisplaybank_high_hack(0);
//m_maincpu->set_pal_sprites_hack(0x000);
//m_maincpu->set_pal_back_hack(0x000);
- m_maincpu->set_alt_tile_addressing_hack(1);
- //m_maincpu->set_alt_extrasprite_hack(1);
m_maincpu->set_legacy_video_mode();
}
@@ -606,7 +603,6 @@ void gameu_handheld_game_state::gameu(machine_config &config)
void gormiti_game_state::machine_reset()
{
gcm394_game_state::machine_reset();
- m_maincpu->set_alt_tile_addressing_hack(1);
}
uint16_t gameu_handheld_game_state::cs0_r(offs_t offset)
@@ -664,7 +660,6 @@ void gameu_handheld_game_state::machine_start()
void gameu_handheld_game_state::machine_reset()
{
gcm394_game_state::machine_reset();
- m_maincpu->set_alt_tile_addressing_hack(1);
m_upperbase = 0;
}
@@ -681,10 +676,7 @@ void gameu_handheld_game_state::init_gameu()
8, 7, 13, 15, 4, 5, 12, 10);
}
- m_maincpu->set_alt_tile_addressing_hack(0);
m_maincpu->set_disallow_resolution_control();
-
-
}
void gameu_handheld_game_state::init_gameu50()
diff --git a/src/mame/tvgames/generalplus_gpl16250_romram.cpp b/src/mame/tvgames/generalplus_gpl16250_romram.cpp
index 97e6940a774..54deb01d5c6 100644
--- a/src/mame/tvgames/generalplus_gpl16250_romram.cpp
+++ b/src/mame/tvgames/generalplus_gpl16250_romram.cpp
@@ -317,7 +317,6 @@ void wrlshunt_game_state::machine_reset()
m_maincpu->reset(); // reset CPU so vector gets read etc.
//m_maincpu->set_paldisplaybank_high_hack(1);
- m_maincpu->set_alt_tile_addressing_hack(1);
}
void wrlshunt_game_state::init_wrlshunt()
@@ -398,7 +397,6 @@ void jak_s500_game_state::machine_reset()
m_maincpu->reset(); // reset CPU so vector gets read etc.
//m_maincpu->set_paldisplaybank_high_hack(0);
- m_maincpu->set_alt_tile_addressing_hack(1);
}
@@ -425,8 +423,6 @@ void jak_pf_game_state::machine_reset()
void jak_prft_game_state::machine_reset()
{
jak_s500_game_state::machine_reset();
- //m_maincpu->set_alt_tile_addressing_hack(0);
- m_maincpu->set_alt_extrasprite_hack(1);
}
diff --git a/src/mame/tvgames/generalplus_gpl16250_spi.cpp b/src/mame/tvgames/generalplus_gpl16250_spi.cpp
index 2e4bf1aabd2..931f0f5fc30 100644
--- a/src/mame/tvgames/generalplus_gpl16250_spi.cpp
+++ b/src/mame/tvgames/generalplus_gpl16250_spi.cpp
@@ -63,7 +63,6 @@ void generalplus_gpspispi_game_state::machine_reset()
m_maincpu->reset(); // reset CPU so vector gets read etc.
//m_maincpu->set_paldisplaybank_high_hack(0);
- m_maincpu->set_alt_tile_addressing_hack(1);
}
static INPUT_PORTS_START( gcm394 )
@@ -226,6 +225,15 @@ ROM_START( lxcympp )
ROM_LOAD( "25q256.bin", 0x0000, 0x2000000, CRC(570b669c) SHA1(e7fcae662c8c8cae18cf1151d6caefacfe1e9fda) )
ROM_END
+ROM_START( lxcymls )
+ ROM_REGION16_BE( 0x40000, "maincpu:internal", ROMREGION_ERASE00 )
+ //ROM_LOAD16_WORD_SWAP( "internal.rom", 0x00000, 0x40000, NO_DUMP ) // used as bootstrap only (if it exists at all)
+
+ ROM_REGION(0x2000000, "maincpu", ROMREGION_ERASE00)
+ ROM_LOAD( "25q256.bin", 0x0000, 0x2000000, CRC(76c89fe5) SHA1(99668cbce2ace6ec972ee4e72fec8b93862a0ef4) )
+ROM_END
+
+
void generalplus_gpspispi_game_state::init_spi()
{
int vectorbase = 0x2fe0;
@@ -308,3 +316,4 @@ CONS(202?, bk139in1, 0, 0, generalplus_gpspispi, gcm394, generalplus_gpspispi_g
CONS(2021, lxcyrace, 0, 0, generalplus_gpspispi, gcm394, generalplus_gpspispi_game_state, empty_init, "Lexibook", "Cyber Arcade Racing (JL3150)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND)
CONS(2021, lxcymsm, 0, 0, generalplus_gpspispi, gcm394, generalplus_gpspispi_game_state, empty_init, "Lexibook", "Cyber Arcade Motion - Superman (JL3180SU)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND)
CONS(2021, lxcympp, 0, 0, generalplus_gpspispi, gcm394, generalplus_gpspispi_game_state, empty_init, "Lexibook", "Cyber Arcade Motion - Paw Patrol (JL3180PA)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND)
+CONS(2021, lxcymls, 0, 0, generalplus_gpspispi, gcm394, generalplus_gpspispi_game_state, empty_init, "Lexibook", "Cyber Arcade Motion - Lilo & Stitch (JL3180D_01)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND)
diff --git a/src/mame/tvgames/generalplus_gpl951xx.cpp b/src/mame/tvgames/generalplus_gpl951xx.cpp
index 656402fe0a8..3a66ac821ea 100644
--- a/src/mame/tvgames/generalplus_gpl951xx.cpp
+++ b/src/mame/tvgames/generalplus_gpl951xx.cpp
@@ -47,8 +47,6 @@ void generalplus_gpspi_direct_game_state::machine_reset()
m_maincpu->set_cs_space(m_memory->get_program());
m_maincpu->reset(); // reset CPU so vector gets read etc.
-
- m_maincpu->set_alt_tile_addressing_hack(1);
}
static INPUT_PORTS_START( bfmpac )
@@ -261,6 +259,11 @@ ROM_START( pokeissh )
ROM_LOAD16_WORD_SWAP( "mx25l25645g.u1", 0x0000, 0x2000000, CRC(1eaf3457) SHA1(a7f16ad7abfc13c67d8e50f462882a771b6777ab) )
ROM_END
+ROM_START( pokemech )
+ ROM_REGION16_BE(0x2000000, "maincpu:spidirect", ROMREGION_ERASE00)
+ ROM_LOAD16_WORD_SWAP( "mx25l25645g.u1", 0x0000, 0x2000000, CRC(e170dede) SHA1(4b07cfcc92e6af412ad0e5c9852b7075a15bd75c) )
+ROM_END
+
ROM_START( smkcatch )
ROM_REGION16_BE(0x800000, "maincpu:spidirect", ROMREGION_ERASE00 )
ROM_LOAD16_WORD_SWAP( "gpr25l64.u2", 0x0000, 0x800000, CRC(e2f52c4a) SHA1(f79862d27152cff8f96151c672d9762a3897a593) )
@@ -371,8 +374,10 @@ CONS(2021, punistar, 0, 0, generalplus_gpspi_direct, bfspyhnt, generalplu
CONS(2021, pokgoget, 0, 0, generalplus_gpspi_direct, bfspyhnt, generalplus_gpspi_direct_game_state, empty_init, "Takara Tomy", "Gachitto Get da ze! Monster Ball Go! (210406, Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND)
// ガチッとゲットだぜ! モンスターボール
CONS(2021, pokebala, 0, 0, generalplus_gpspi_direct, bfspyhnt, generalplus_gpspi_direct_game_state, empty_init, "Takara Tomy", "Gachitto Get da ze! Monster Ball (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND)
-
-CONS(2021, pokeissh, 0, 0, generalplus_gpspi_direct, bfspyhnt, generalplus_gpspi_direct_game_state, empty_init, "Takara Tomy", "Pokemon to Issho! Pokeball (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND)
+// ポケモンといっしょ!モンスターボール
+CONS(2021, pokeissh, 0, 0, generalplus_gpspi_direct, bfspyhnt, generalplus_gpspi_direct_game_state, empty_init, "Takara Tomy", "Pokemon to Issho! Monster Ball (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND)
+// めちゃナゲ! モンスターボール
+CONS(2021, pokemech, 0, 0, generalplus_gpspi_direct, bfspyhnt, generalplus_gpspi_direct_game_state, empty_init, "Takara Tomy", "Mecha Nage! Monster Ball (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND)
// 2020 (device) / 2021 (box) version of Sumikko Gurashi a cloud shaped device
// Sumikko Gurashi - Sumikko Catch (すみっコぐらし すみっコキャッチ)