diff --git a/src/devices/machine/generalplus_gpl162xx_soc.h b/src/devices/machine/generalplus_gpl162xx_soc.h index ed68b581e047e..7baec77051cc0 100644 --- a/src/devices/machine/generalplus_gpl162xx_soc.h +++ b/src/devices/machine/generalplus_gpl162xx_soc.h @@ -58,11 +58,6 @@ class sunplus_gcm394_base_device : public unsp_20_device, public device_mixer_in 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 cd136ab279fc9..63c3ee907ac03 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 c836ec690356d..fc60a9c84e901 100644 --- a/src/devices/machine/generalplus_gpl162xx_soc_video.h +++ b/src/devices/machine/generalplus_gpl162xx_soc_video.h @@ -32,8 +32,6 @@ class gcm394_base_video_device : public device_t, public device_video_interface 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 @@ class gcm394_base_video_device : public device_t, public device_video_interface //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 d8ff4805b30ba..0b522ee7b3644 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 cf758f859e870..ad4689cfca063 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 922e0905c8ef2..9676078c1f89a 100644 --- a/src/devices/machine/spg_renderer.h +++ b/src/devices/machine/spg_renderer.h @@ -14,8 +14,8 @@ class spg_renderer_device : public device_t 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 @@ class spg_renderer_device : public device_t 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 972ddae0fcd4d..590f10020b6cf 100644 --- a/src/mame/mame.lst +++ b/src/mame/mame.lst @@ -47047,6 +47047,7 @@ tvbg6b @source:tvgames/elan_eu3a05.cpp airblsjs +bratzra buzztime carlecfg pvmil8 @@ -47151,6 +47152,7 @@ anpaneng anpanm15 bk139in1 bkrankp +lxcymls lxcympp lxcymsm lxcyrace @@ -47171,6 +47173,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 f2a8ff25ac7d0..960428587edc3 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 eeb83dd185513..3b3954bef188f 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 a776a34b0fc72..e4a74eb13f95c 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 b7ede5f298f22..063a717cb27c7 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 97e6940a7746b..54deb01d5c63d 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 2e4bf1aabd2a2..931f0f5fc30c5 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 656402fe0a88f..3a66ac821ea97 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 (すみっコぐらし すみっコキャッチ)