From 86727fba94d1d67b6487b4640a90e38c4970540e Mon Sep 17 00:00:00 2001 From: David Haywood Date: Fri, 14 Nov 2025 15:12:54 +0000 Subject: [PATCH 1/4] VT Changes --- src/mame/mame.lst | 6 +++++ src/mame/nintendo/nes_vt32.cpp | 9 ++++++- src/mame/nintendo/nes_vt32_soc.cpp | 10 ++++--- src/mame/nintendo/nes_vt369_vtunknown.cpp | 17 +++++++++++- src/mame/nintendo/nes_vt42xx.cpp | 33 +++++++++++++++++------ src/mame/nintendo/rp2a03_vtscr.cpp | 10 +++---- src/mame/nintendo/rp2a03_vtscr.h | 8 +++--- 7 files changed, 71 insertions(+), 22 deletions(-) diff --git a/src/mame/mame.lst b/src/mame/mame.lst index 97831035b8b37..72be548125920 100644 --- a/src/mame/mame.lst +++ b/src/mame/mame.lst @@ -35786,6 +35786,7 @@ dgun2573a dgunl3201 dgunl3202 fcpocket +fingerd k10_2l k10_5l lxpcli @@ -35817,6 +35818,7 @@ dgun2577 dgun2593 dvnimbus egame150 +f5_620 gb50_150 gbox2020 gcs2mgp @@ -35879,6 +35881,7 @@ rtvgc300 rtvgc300cr rtvgc300fz rtvgc300pj +s10_520 s10fake sealvt supr200 @@ -35898,7 +35901,10 @@ zonefusn bittboy bl339 fapocket +g3_800 g5_500 +g6_666 +g7_666 g9_666 gbox2019 gprnrs1 diff --git a/src/mame/nintendo/nes_vt32.cpp b/src/mame/nintendo/nes_vt32.cpp index 33db8d7873077..c671b94051c3d 100644 --- a/src/mame/nintendo/nes_vt32.cpp +++ b/src/mame/nintendo/nes_vt32.cpp @@ -476,6 +476,10 @@ ROM_START( tvkunio1 ) ROM_LOAD( "mx29lv160dt.u3", 0x00000, 0x200000, CRC(4f502bff) SHA1(5c91c46c8b3b837cf98a5519d71117164c23a721) ) ROM_END +ROM_START( fingerd ) + ROM_REGION( 0x2000000, "mainrom", 0 ) + ROM_LOAD( "s29gl256n11tai02.u2", 0x00000, 0x2000000, CRC(58829d3c) SHA1(fab3b9914ec61f289509344b2d3f8a8b2f5bb5ba) ) +ROM_END } // anonymous namespace @@ -536,7 +540,10 @@ CONS( 2020, lxpcpp, 0, 0, nes_vt32_32mb, nes_vt32, nes_vt32_unk_state, empt CONS( 201?, k10_5l, 0, 0, nes_vt32_16mb, nes_vt32, nes_vt32_unk_state, empty_init, "", "Games Power 500-in-1 Ultra Thin Handheld Game (K10) (5 languages)", MACHINE_NOT_WORKING ) CONS( 201?, k10_2l, 0, 0, nes_vt32_16mb, nes_vt32, nes_vt32_unk_state, empty_init, "", "Games Power 500-in-1 Ultra Thin Handheld Game (K10) (2 languages)", MACHINE_NOT_WORKING ) +CONS( 2022, tvkunio1, 0, 0, nes_vt32_2mb, nes_vt32, nes_vt32_unk_state, empty_init, "Arc System Works", "Kunio-kun TV! Bikkuri Nekketsu Shin Kiroku! Harukanaru Kin Medal (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS ) // yellow unit + CONS( 202?, micac250, 0, 0, nes_vt32_16mb, nes_vt32, nes_vt32_unk_state, empty_init, "", "Micro Arcade 250-in-1", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS ) -CONS( 2022, tvkunio1, 0, 0, nes_vt32_2mb, nes_vt32, nes_vt32_unk_state, empty_init, "Arc System Works", "Kunio-kun TV! Bikkuri Nekketsu Shin Kiroku! Harukanaru Kin Medal (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS ) // yellow unit +// title screen shows Finger Pump, box shows Finger Dancing +CONS( 201?, fingerd, 0, 0, nes_vt32_32mb, nes_vt32, nes_vt32_unk_state, empty_init, "Orb Gaming", "Finger Dancing", MACHINE_NOT_WORKING ) diff --git a/src/mame/nintendo/nes_vt32_soc.cpp b/src/mame/nintendo/nes_vt32_soc.cpp index c3be3f843c70b..803483f31cb5c 100644 --- a/src/mame/nintendo/nes_vt32_soc.cpp +++ b/src/mame/nintendo/nes_vt32_soc.cpp @@ -144,11 +144,15 @@ void nes_vt32_soc_device::vtfp_411e_encryption_state_w(u8 data) if (data == 0x05) { - downcast(*m_maincpu).set_next_scramble(true); + downcast(*m_maincpu).set_next_scramble(0xa1); + } + else if (data == 0x07) + { + downcast(*m_maincpu).set_next_scramble(0x7e); } else if (data == 0x00) { - downcast(*m_maincpu).set_next_scramble(false); + downcast(*m_maincpu).set_next_scramble(0x00); } else if (data == 0xc0) { @@ -170,7 +174,7 @@ void nes_vt32_soc_device::vtfp_411e_encryption_state_w(u8 data) */ m_ppu_chr_data_scramble = 1; - downcast(*m_maincpu).set_next_scramble(false); + downcast(*m_maincpu).set_next_scramble(0x00); } } diff --git a/src/mame/nintendo/nes_vt369_vtunknown.cpp b/src/mame/nintendo/nes_vt369_vtunknown.cpp index efe47f7ccbd34..171819fb37523 100644 --- a/src/mame/nintendo/nes_vt369_vtunknown.cpp +++ b/src/mame/nintendo/nes_vt369_vtunknown.cpp @@ -1196,6 +1196,15 @@ ROM_START( h12p1000 ) ROM_LOAD( "h12pro1000.u12", 0x00000, 0x2000000, CRC(b471cb79) SHA1(2324d82a6ae00537090fb534cdf4e4ac6a74ebaf) ) ROM_END +ROM_START( s10_520 ) + ROM_REGION( 0x1000000, "mainrom", 0 ) + ROM_LOAD( "s10_white_520.bin", 0x00000, 0x1000000, CRC(552ffddb) SHA1(6a1be8bead43eceb51e674499159e850d4c115be) ) +ROM_END + +ROM_START( f5_620 ) + ROM_REGION( 0x1000000, "mainrom", 0 ) + ROM_LOAD( "f5_620in1.u4", 0x00000, 0x1000000, CRC(e3ec27c8) SHA1(d377ccf9bdbe60f6d484360b4b13c3b132628676) ) +ROM_END void vt369_state::init_lxcmcypp() { @@ -1226,7 +1235,8 @@ void vt369_state::init_dgun2572() void vt369_state::init_s10fake() { uint8_t *romdata = memregion("mainrom")->base(); - for (offs_t i = 0; i < 0x800000; i += 2) + int size = memregion("mainrom")->bytes(); + for (offs_t i = 0; i < size; i += 2) { uint16_t w = get_u16le(&romdata[i]); put_u16le(&romdata[i], (w & 0xf9f9) | (w & 0x0600) >> 8 | (w & 0x0006) << 8); @@ -1382,6 +1392,11 @@ CONS( 2018, goretrop, 0, 0, vt369_unk_32mb, vt369, vt36x_state, empty_init, // unused routines suggest this was originally developed for nes_vt42xx.cpp hardware (cf. g9_666, g5_500 with the same bitswap) // there are other S10 units available CONS( 202?, s10fake, 0, 0, vt36x_s10swap_8mb, vt369, vt36x_state, init_s10fake, "", "S10 Handheld Game Console (520-in-1, fake entries)", MACHINE_NOT_WORKING ) +// different version, same packaging. Larger ROM, fewer duplicates etc. needs different bitswap, or different hardware +CONS( 202?, s10_520, 0, 0, vt36x_16mb, vt369, vt36x_state, empty_init, "", "S10 Handheld Game Console (520-in-1)", MACHINE_NOT_WORKING ) + +// could be in the wrong driver +CONS( 202?, f5_620, 0, 0, vt36x_16mb, vt369, vt36x_state, empty_init, "", "F5 Handheld Game Console (620-in-1)", MACHINE_NOT_WORKING ) // banking(?) issues, some games don't boot (writes data to ALU mirror, then some other ports) CONS( 202?, h12p1000, 0, 0, vt36x, vt369, vt36x_state, empty_init, "", "H12 Pro 1000 in 1 Handheld Game Console", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS ) diff --git a/src/mame/nintendo/nes_vt42xx.cpp b/src/mame/nintendo/nes_vt42xx.cpp index e9b991dc22a30..6c1a1f70571a5 100644 --- a/src/mame/nintendo/nes_vt42xx.cpp +++ b/src/mame/nintendo/nes_vt42xx.cpp @@ -420,14 +420,24 @@ ROM_START( rfcp168 ) ROM_LOAD( "winbond_w29gl128c.bin", 0x00000, 0x1000000, CRC(d11caf71) SHA1(64b269cee30a51549a2d0491bbeed07751771559) ) // ROM verified on 2 units ROM_END -ROM_START( g9_666 ) +ROM_START( g5_500 ) ROM_REGION( 0x1000000, "mainrom", 0 ) - ROM_LOAD( "666in1.u1", 0x00000, 0x1000000, CRC(e3a98465) SHA1(dfec3e74e36aef9bfa57ec530c37642015569dc5) ) + ROM_LOAD( "s29gl128.u1", 0x00000, 0x1000000, CRC(de779dd7) SHA1(ac6d3fa6f18ceb795532ba9e85edffc040d74347) ) ROM_END -ROM_START( g5_500 ) +ROM_START( g6_666 ) ROM_REGION( 0x1000000, "mainrom", 0 ) - ROM_LOAD( "s29gl128.u1", 0x00000, 0x1000000, CRC(de779dd7) SHA1(ac6d3fa6f18ceb795532ba9e85edffc040d74347) ) + ROM_LOAD( "g6_666.bin", 0x00000, 0x1000000, CRC(0f443cbe) SHA1(25c4d59e65b05f1255f18c802d72e4cf308ba49b) ) +ROM_END + +ROM_START( g7_666 ) + ROM_REGION( 0x1000000, "mainrom", 0 ) + ROM_LOAD( "g7_666.u1", 0x00000, 0x1000000, CRC(d2bbc3ab) SHA1(19d3326c30b048dd8483f6336656e0301b5aec8a) ) +ROM_END + +ROM_START( g9_666 ) + ROM_REGION( 0x1000000, "mainrom", 0 ) + ROM_LOAD( "666in1.u1", 0x00000, 0x1000000, CRC(e3a98465) SHA1(dfec3e74e36aef9bfa57ec530c37642015569dc5) ) ROM_END ROM_START( hhgc319 ) @@ -504,7 +514,10 @@ ROM_START( wol260 ) ROM_LOAD( "js28f256m29ewh.u1", 0x00000, 0x2000000, CRC(ccb08b50) SHA1(089335c001085cfae94db6ea39e31388674581ed) ) ROM_END - +ROM_START( g3_800 ) + ROM_REGION( 0x4000000, "mainrom", 0 ) + ROM_LOAD( "g3_800in1.bin", 0x00000, 0x4000000, CRC(df326924) SHA1(38c26ea96fbf3ba80526072d07209f19b04812e9) ) +ROM_END void nes_vt42xx_state::init_rfcp168() { @@ -571,11 +584,15 @@ void nes_vt42xx_state::init_bl339() CONS( 201?, rfcp168, 0, 0, nes_vt42xx_16mb, nes_vt42xx, nes_vt42xx_state, init_rfcp168, "", "Retro FC Plus 168 in 1 Handheld", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS ) // "RETRO_FC_V3.5" -// many duplicates, real game count to be confirmed, graphical issues in some games -CONS( 202?, g9_666, 0, 0, nes_vt42xx_16mb, nes_vt42xx, nes_vt42xx_state, init_g9_666, "", "G9 Game Box 666 Games", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS ) -// same bitswap as above +// these share the same bitswap, many duplicates, real game counts to be confirmed, graphical issues in some games CONS( 201?, g5_500, 0, 0, nes_vt42xx_16mb, nes_vt42xx, nes_vt42xx_state, init_g9_666, "", "G5 500 in 1 Handheld", MACHINE_NOT_WORKING ) +CONS( 201?, g6_666, 0, 0, nes_vt42xx_16mb, nes_vt42xx, nes_vt42xx_state, init_g9_666, "", "G6 666 in 1 Handheld", MACHINE_NOT_WORKING ) +CONS( 201?, g7_666, 0, 0, nes_vt42xx_16mb, nes_vt42xx, nes_vt42xx_state, init_g9_666, "", "G7 666 in 1 Handheld", MACHINE_NOT_WORKING ) +CONS( 202?, g9_666, 0, 0, nes_vt42xx_16mb, nes_vt42xx, nes_vt42xx_state, init_g9_666, "", "G9 Game Box 666 Games", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS ) + +// 64Mbytes, must have banking +CONS( 202?, g3_800, 0, 0, nes_vt42xx_16mb, nes_vt42xx, nes_vt42xx_state, empty_init, "", "G3 800 in 1 Handheld", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS ) // highly scrambled CONS( 201?, hhgc319, 0, 0, nes_vt42xx_16mb, nes_vt42xx, nes_vt42xx_state, init_hhgc319, "", "Handheld Game Console 319-in-1", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS ) diff --git a/src/mame/nintendo/rp2a03_vtscr.cpp b/src/mame/nintendo/rp2a03_vtscr.cpp index 33da5eb9732bd..037b6c408c3ad 100644 --- a/src/mame/nintendo/rp2a03_vtscr.cpp +++ b/src/mame/nintendo/rp2a03_vtscr.cpp @@ -25,16 +25,16 @@ rp2a03_vtscr::rp2a03_vtscr(const machine_config &mconfig, const char *tag, devic void rp2a03_vtscr::device_start() { mintf = std::make_unique(); - set_scramble(false); + set_scramble(0x00); init(); } -void rp2a03_vtscr::set_next_scramble(bool scr) +void rp2a03_vtscr::set_next_scramble(uint8_t scr) { downcast(*mintf).m_next_scramble = scr; } -void rp2a03_vtscr::set_scramble(bool scr) +void rp2a03_vtscr::set_scramble(uint8_t scr) { downcast(*mintf).m_next_scramble = scr; downcast(*mintf).m_scramble_en = scr; @@ -43,7 +43,7 @@ void rp2a03_vtscr::set_scramble(bool scr) void rp2a03_vtscr::device_reset() { - set_scramble(false); + set_scramble(0x00); rp2a03_core_device::device_reset(); } @@ -69,7 +69,7 @@ uint8_t rp2a03_vtscr::mi_decrypt::read_sync(uint16_t adr) uint8_t rp2a03_vtscr::mi_decrypt::descramble(uint8_t op) { - return op ^ 0xa1; + return op ^ m_scramble_en; } std::unique_ptr rp2a03_vtscr::create_disassembler() diff --git a/src/mame/nintendo/rp2a03_vtscr.h b/src/mame/nintendo/rp2a03_vtscr.h index 5eaf57080bd2e..1297f75aeb2b4 100644 --- a/src/mame/nintendo/rp2a03_vtscr.h +++ b/src/mame/nintendo/rp2a03_vtscr.h @@ -20,15 +20,15 @@ class rp2a03_vtscr : public rp2a03_core_device { public: rp2a03_vtscr(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - void set_next_scramble(bool scr); - void set_scramble(bool scr); + void set_next_scramble(uint8_t scr); + void set_scramble(uint8_t scr); protected: class mi_decrypt : public mi_default { public: - bool m_scramble_en = false; - bool m_next_scramble = false; + uint8_t m_scramble_en = 0x00; + uint8_t m_next_scramble = 0x00; virtual ~mi_decrypt() {} virtual uint8_t read_sync(uint16_t adr) override; From 287b482c1a965e15925465a8738485f19801577e Mon Sep 17 00:00:00 2001 From: David Haywood Date: Fri, 14 Nov 2025 16:07:16 +0000 Subject: [PATCH 2/4] set g3_800 to fapocket style --- src/mame/nintendo/nes_vt42xx.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/mame/nintendo/nes_vt42xx.cpp b/src/mame/nintendo/nes_vt42xx.cpp index 6c1a1f70571a5..5abedff16bd76 100644 --- a/src/mame/nintendo/nes_vt42xx.cpp +++ b/src/mame/nintendo/nes_vt42xx.cpp @@ -591,8 +591,8 @@ CONS( 201?, g6_666, 0, 0, nes_vt42xx_16mb, nes_vt42xx, nes_vt42xx_state, ini CONS( 201?, g7_666, 0, 0, nes_vt42xx_16mb, nes_vt42xx, nes_vt42xx_state, init_g9_666, "", "G7 666 in 1 Handheld", MACHINE_NOT_WORKING ) CONS( 202?, g9_666, 0, 0, nes_vt42xx_16mb, nes_vt42xx, nes_vt42xx_state, init_g9_666, "", "G9 Game Box 666 Games", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS ) -// 64Mbytes, must have banking -CONS( 202?, g3_800, 0, 0, nes_vt42xx_16mb, nes_vt42xx, nes_vt42xx_state, empty_init, "", "G3 800 in 1 Handheld", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS ) +// 64Mbytes, same banking as fapocket, but no fake cart switch / port +CONS( 202?, g3_800, 0, 0, nes_vt42xx_fa, nes_vt42xx, nes_vt42xx_fapocket_state, empty_init, "", "G3 800 in 1 Handheld", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS ) // highly scrambled CONS( 201?, hhgc319, 0, 0, nes_vt42xx_16mb, nes_vt42xx, nes_vt42xx_state, init_hhgc319, "", "Handheld Game Console 319-in-1", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS ) From 201228d7db2695cedf15b96f64dd735f29cec3fa Mon Sep 17 00:00:00 2001 From: David Haywood Date: Fri, 14 Nov 2025 17:31:20 +0000 Subject: [PATCH 3/4] fixes from AJR --- src/mame/nintendo/nes_vt369_vtunknown.cpp | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/src/mame/nintendo/nes_vt369_vtunknown.cpp b/src/mame/nintendo/nes_vt369_vtunknown.cpp index 171819fb37523..1ec984237e703 100644 --- a/src/mame/nintendo/nes_vt369_vtunknown.cpp +++ b/src/mame/nintendo/nes_vt369_vtunknown.cpp @@ -98,6 +98,7 @@ class vt369_state : public vt369_base_state void init_lxcmcypp(); void init_dgun2572(); void init_s10fake(); + void init_f5_620(); protected: u8 vt_rom_banked_r(offs_t offset); @@ -1199,6 +1200,7 @@ ROM_END ROM_START( s10_520 ) ROM_REGION( 0x1000000, "mainrom", 0 ) ROM_LOAD( "s10_white_520.bin", 0x00000, 0x1000000, CRC(552ffddb) SHA1(6a1be8bead43eceb51e674499159e850d4c115be) ) + ROM_FILL( 0x07f3d9, 1, 0x64 ) // bug in init code? how does this work on hardware ROM_END ROM_START( f5_620 ) @@ -1243,6 +1245,17 @@ void vt369_state::init_s10fake() } } +void vt369_state::init_f5_620() +{ + uint8_t *romdata = memregion("mainrom")->base(); + int size = memregion("mainrom")->bytes(); + for (offs_t i = 0; i < size; i += 2) + { + uint16_t w = get_u16le(&romdata[i]); + put_u16le(&romdata[i], (w & 0xfbfb) | (w & 0x0400) >> 8 | (w & 0x0004) << 8); + } +} + } // anonymous namespace @@ -1392,11 +1405,11 @@ CONS( 2018, goretrop, 0, 0, vt369_unk_32mb, vt369, vt36x_state, empty_init, // unused routines suggest this was originally developed for nes_vt42xx.cpp hardware (cf. g9_666, g5_500 with the same bitswap) // there are other S10 units available CONS( 202?, s10fake, 0, 0, vt36x_s10swap_8mb, vt369, vt36x_state, init_s10fake, "", "S10 Handheld Game Console (520-in-1, fake entries)", MACHINE_NOT_WORKING ) -// different version, same packaging. Larger ROM, fewer duplicates etc. needs different bitswap, or different hardware -CONS( 202?, s10_520, 0, 0, vt36x_16mb, vt369, vt36x_state, empty_init, "", "S10 Handheld Game Console (520-in-1)", MACHINE_NOT_WORKING ) +// different version, same packaging. Larger ROM, fewer duplicates etc. +CONS( 202?, s10_520, 0, 0, vt36x_gbox2020_16mb, vt369, vt36x_state, empty_init, "", "S10 Handheld Game Console (520-in-1)", MACHINE_NOT_WORKING ) -// could be in the wrong driver -CONS( 202?, f5_620, 0, 0, vt36x_16mb, vt369, vt36x_state, empty_init, "", "F5 Handheld Game Console (620-in-1)", MACHINE_NOT_WORKING ) +// there were also 'F1' units, shaped like a car, ROM may or may not be the same +CONS( 202?, f5_620, 0, 0, vt36x_16mb, vt369, vt36x_state, init_f5_620, "", "F5 Handheld Game Console (620-in-1)", MACHINE_NOT_WORKING ) // banking(?) issues, some games don't boot (writes data to ALU mirror, then some other ports) CONS( 202?, h12p1000, 0, 0, vt36x, vt369, vt36x_state, empty_init, "", "H12 Pro 1000 in 1 Handheld Game Console", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS ) From b52c8d47595d885f6ccf57c01460f6cb00c57cdd Mon Sep 17 00:00:00 2001 From: David Haywood Date: Fri, 14 Nov 2025 18:15:01 +0000 Subject: [PATCH 4/4] micac250 has this register value for the extended timemap mode on vt32 --- src/devices/video/ppu2c0x_vt.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/devices/video/ppu2c0x_vt.cpp b/src/devices/video/ppu2c0x_vt.cpp index 7ae95c59321bc..f3b02e66ca9ba 100644 --- a/src/devices/video/ppu2c0x_vt.cpp +++ b/src/devices/video/ppu2c0x_vt.cpp @@ -589,7 +589,9 @@ void ppu_vt32_device::m_newvid_1d_w(u8 data) { logerror("%s: m_newvid_1d_w %02x\ void ppu_vt32_device::draw_background(u8 *line_priority) { - if ((get_newvid_1c() == 0x2e) || (get_newvid_1c() == 0x0a)) + // fingerd also uses 6d for the first song, which doesn't work with this code + // maybe changes how extended attribute is used? + if ((get_newvid_1c() == 0x2e) || (get_newvid_1c() == 0x0a) || (get_newvid_1c() == 0x6e)) { // strange custom mode, feels more like a vt369 mode // tiles use 16x16x8 packed data