diff --git a/hash/nes_vt_cart.xml b/hash/nes_vt_cart.xml
new file mode 100644
index 00000000000..0662a07eb91
--- /dev/null
+++ b/hash/nes_vt_cart.xml
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+
+ Color Screen Game World - 10 Types of Crazy Games / Wonders 163-in-1
+ 200?
+ TimeTop
+
+
+
+
+
+
+
+
diff --git a/src/mame/mame.lst b/src/mame/mame.lst
index 68735a0f621..1a03406ef53 100644
--- a/src/mame/mame.lst
+++ b/src/mame/mame.lst
@@ -11648,6 +11648,9 @@ cswat // (c) 1984
@source:at/ct486.cpp
ct486 // 1993? 486 with CS4031
+@source:skeleton/ct909e_segadvd.cpp
+megatrix
+
@source:casio/ctk551.cpp
ctk551 //
@@ -33302,72 +33305,74 @@ vsmaxx15
dgun806
@source:nintendo/nes_vt02_vt03.cpp
-vdogdeme
-vdogdemo
-pinkjelly
-vtpinball
-vtsndtest
-vtboxing
-ablpinb
-sporzpp
-sporzbx
-sporztn
-wldsoctv
-mc_dgear
-sudo6in1
-sudopptv
-megapad
ablmini
-solargm
-zudugo
-timetp36
-timetp7
-majkon
-majgnc
-vsmaxx17
-polmega
-vsmax25v
+ablpinb
+ablping
+cbrs8
+dbdancem
+ddrdismx
+ddrstraw
+dgun2500
+dgun2869
dgun851
dgun853
-silv35
-vsmaxxvd
-vsmaxx77
+gprnrs1
+gprnrs16
joysti30
-techni4
-senwld
-protpp
-mc_sp69
-ablping
+majgnc
+majkon
+mc_105te
+mc_110cb
+mc_138cb
+mc_7x6ss
+mc_89in1
+mc_8x6cb
+mc_8x6ss
+mc_9x6sa
+mc_9x6ss
+mc_aa2
+mc_dcat8
+mc_dcat8a
+mc_dg101
+mc_dgear
mc_sam60
-zdog
+mc_sp69
+mc_tv200
+megapad
+pinkjelly
pjoyn50
pjoys30
pjoys60
-mc_110cb
-mc_138cb
-cbrs8
-rfcp168
-gprnrs1
-gprnrs16
-ddrdismx
-ddrstraw
-dbdancem
-sen101
-mc_dg101
-mc_aa2
-mc_105te
-mc_8x6cb
-mc_9x6ss
-mc_9x6sa
-mc_7x6ss
-mc_8x6ss
-mc_dcat8
-mc_dcat8a
-mc_89in1
-mc_tv200
-dgun2500
+polmega
ppgc200g
-dgun2869
+protpp
+pumpactv
+rfcp168
+sen101
+senwld
+silv35
+solargm
+sporzbx
+sporzpp
+sporztn
+sudo6in1
+sudopptv
+techni4
+timetp36
+timetp7
+vdogdeme
+vdogdemo
+vsmax25v
+vsmaxx17
+vsmaxx77
+vsmaxxvd
+vt25in1
+vtboxing
+vtpinball
+vtsndtest
+wldsoctv
+zdog
+zudugo
@source:nintendo/nes_vt09.cpp
cybar120
@@ -33433,7 +33438,9 @@ mc_cb280
mc_hh210
mog_m320
myarccn
+nubsupmf
otrail
+q5_500in1
rd5_240
red5mam
retro400
@@ -33443,6 +33450,8 @@ sealvt
sy888b
sy889
tup240
+unk2019hh
+unk2020hh
unkra200
zonefusn
diff --git a/src/mame/mess.flt b/src/mame/mess.flt
index defa0c21e75..249f73535ba 100644
--- a/src/mame/mess.flt
+++ b/src/mame/mess.flt
@@ -797,6 +797,7 @@ skeleton/controlid.cpp
skeleton/cortex.cpp
skeleton/cosmicos.cpp
skeleton/cp1.cpp
+skeleton/ct909e_segadvd.cpp
skeleton/cxhumax.cpp
skeleton/d400.cpp
skeleton/d6800.cpp
diff --git a/src/mame/nintendo/nes_vt02_vt03.cpp b/src/mame/nintendo/nes_vt02_vt03.cpp
index 3f230d07e8d..04fc724d9bf 100644
--- a/src/mame/nintendo/nes_vt02_vt03.cpp
+++ b/src/mame/nintendo/nes_vt02_vt03.cpp
@@ -1208,6 +1208,16 @@ ROM_START( majgnc )
ROM_LOAD( "majescogoldennuggetcasino_st29w800at_002000d7.bin", 0x00000, 0x100000, CRC(1a156a9d) SHA1(08be4079dd68c9cf05bb92e11a3da4f092d7cfea) )
ROM_END
+ROM_START( vt25in1 )
+ ROM_REGION( 0x100000, "mainrom", ROMREGION_ERASEFF )
+ ROM_LOAD( "25in1.bin", 0x00000, 0x100000, CRC(1038b5ec) SHA1(e7d1ccafe0edcfa44c11412d2aa771f4ba96b5b8) )
+ROM_END
+
+ROM_START( pumpactv )
+ ROM_REGION( 0x100000, "mainrom", ROMREGION_ERASEFF )
+ ROM_LOAD( "pumpactive.bin", 0x00000, 0x100000, CRC(e3c07561) SHA1(2bfff426d72d481ba0647e9110f942d142a4625f) )
+ROM_END
+
ROM_START( zudugo )
ROM_REGION( 0x400000, "mainrom", ROMREGION_ERASEFF )
ROM_LOAD( "zudugo.bin", 0x00000, 0x400000, CRC(0fa9d9ad) SHA1(7533eaf51785d8fcced900ea0498281b0cf49dbf) )
@@ -1363,6 +1373,10 @@ CONS( 2004, majkon, 0, 0, nes_vt_1mb_majkon, nes_vt, nes_vt_state, empty_ini
CONS( 200?, majgnc, 0, 0, nes_vt_1mb, majgnc, nes_vt_state, empty_init, "Majesco / JungleTac", "Golden Nugget Casino", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
+CONS( 2004, vt25in1, 0, 0, nes_vt_1mb, nes_vt, nes_vt_state, empty_init, "", "unknown VT02 based 25-in-1 handheld", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
+
+// might be a later VT type, 'pump' control is mapped on extra IO address that I don't think is present on 02/03
+CONS( 200?, pumpactv, 0, 0, nes_vt_1mb, nes_vt, nes_vt_state, empty_init, "Giggle", "TV Pump Active", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
// CPU die is marked 'VH2009' There's also a 62256 RAM chip on the PCB, some scrambled opcodes
CONS( 2004, vsmaxx17, 0, 0, nes_vt_vh2009_2mb, nes_vt, nes_vt_swap_op_d5_d6_state, empty_init, "Senario / JungleTac", "Vs Maxx 17-in-1", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) // from a Green unit, '17 Classic & Racing Game'
diff --git a/src/mame/nintendo/nes_vt09.cpp b/src/mame/nintendo/nes_vt09.cpp
index a0be3e78ee7..0cc7111e52c 100644
--- a/src/mame/nintendo/nes_vt09.cpp
+++ b/src/mame/nintendo/nes_vt09.cpp
@@ -20,6 +20,11 @@
#include "emu.h"
#include "nes_vt09_soc.h"
+#include "bus/generic/slot.h"
+#include "bus/generic/carts.h"
+
+#include "softlist_dev.h"
+
class nes_vt09_common_base_state : public driver_device
{
public:
@@ -105,6 +110,58 @@ public:
private:
};
+class nes_vt09_cart_state : public nes_vt09_state
+{
+public:
+ nes_vt09_cart_state(const machine_config& mconfig, device_type type, const char* tag) :
+ nes_vt09_state(mconfig, type, tag),
+ m_bank(*this, "cartbank"),
+ m_cart(*this, "cartslot"),
+ m_cart_region(nullptr)
+ { }
+
+ void nes_vt09_cart(machine_config& config);
+
+protected:
+ void machine_start() override;
+
+private:
+ void vt_external_space_map_cart(address_map& map);
+
+ DECLARE_DEVICE_IMAGE_LOAD_MEMBER(cart_load);
+
+ required_memory_bank m_bank;
+ required_device m_cart;
+ memory_region *m_cart_region;
+};
+
+void nes_vt09_cart_state::machine_start()
+{
+ nes_vt09_state::machine_start();
+
+ m_bank->configure_entries(0, 1, memregion("mainrom")->base(), 0x200000);
+ m_bank->set_entry(0);
+
+ // if there's a cart, override the standard banking
+ if (m_cart && m_cart->exists())
+ {
+ m_cart_region = memregion(std::string(m_cart->tag()) + GENERIC_ROM_REGION_TAG);
+ m_bank->configure_entries(0, 1, m_cart_region->base(), 0x200000);
+ m_bank->set_entry(0);
+ }
+}
+
+DEVICE_IMAGE_LOAD_MEMBER(nes_vt09_cart_state::cart_load)
+{
+ uint32_t size = m_cart->common_get_size("rom");
+
+ m_cart->rom_alloc(size, GENERIC_ROM8_WIDTH, ENDIANNESS_LITTLE);
+ m_cart->common_load_rom(m_cart->get_rom_base(), size, "rom");
+
+ return image_init_result::PASS;
+}
+
+
uint8_t nes_vt09_common_base_state::vt_rom_r(offs_t offset)
{
return m_prgrom[offset];
@@ -151,6 +208,12 @@ void nes_vt09_common_state::vt_external_space_map_512kbyte(address_map &map)
map(0x0000000, 0x007ffff).mirror(0x1f80000).r(FUNC(nes_vt09_common_state::vt_rom_r));
}
+void nes_vt09_cart_state::vt_external_space_map_cart(address_map &map)
+{
+ map(0x0000000, 0x01fffff).mirror(0x1e00000).bankr("cartbank");
+}
+
+
template uint8_t nes_vt09_common_base_state::extrain_r()
{
if (m_exin[NUM])
@@ -296,7 +359,17 @@ void nes_vt09_state::nes_vt09_4mb_rasterhack(machine_config& config)
m_soc->force_raster_timing_hack();
}
+void nes_vt09_cart_state::nes_vt09_cart(machine_config& config)
+{
+ nes_vt09(config);
+ m_soc->set_addrmap(AS_PROGRAM, &nes_vt09_cart_state::vt_external_space_map_cart);
+ GENERIC_CARTSLOT(config, m_cart, generic_plain_slot, "nes_vt_cart");
+ m_cart->set_width(GENERIC_ROM8_WIDTH);
+ m_cart->set_device_load(FUNC(nes_vt09_cart_state::cart_load));
+
+ SOFTWARE_LIST(config, "cart_list").set_original("nes_vt_cart");
+}
static INPUT_PORTS_START( nes_vt09 )
PORT_START("IO0")
@@ -505,4 +578,4 @@ CONS( 200?, jl2050, 0, 0, nes_vt09_16mb,nes_vt09, nes_vt09_state, empty_init,
// might be VT369 based, if so, move
CONS( 2018, rbbrite, 0, 0, nes_vt09_1mb, nes_vt09, nes_vt09_state, empty_init, "Coleco", "Rainbow Brite (mini-arcade)", MACHINE_NOT_WORKING )
-CONS( 200?, timetp25, 0, 0, nes_vt09_2mb, nes_vt09, nes_vt09_state, empty_init, "Timetop", "Super Game 25-in-1 (GM-228)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
+CONS( 200?, timetp25, 0, 0, nes_vt09_cart, nes_vt09, nes_vt09_cart_state, empty_init, "Timetop", "Super Game 25-in-1 (GM-228)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
diff --git a/src/mame/nintendo/nes_vt369_vtunknown.cpp b/src/mame/nintendo/nes_vt369_vtunknown.cpp
index 473e08996e9..5bec2f21c42 100644
--- a/src/mame/nintendo/nes_vt369_vtunknown.cpp
+++ b/src/mame/nintendo/nes_vt369_vtunknown.cpp
@@ -703,6 +703,27 @@ ROM_START( mc_hh210 )
ROM_LOAD( "msp55lv128t.u4", 0x00000, 0x1000000, CRC(9ba520d4) SHA1(627f811b24314197e289a2ade668ff4115421bed) )
ROM_END
+ROM_START( q5_500in1 )
+ ROM_REGION( 0x1000000, "mainrom", 0 )
+ ROM_LOAD( "s29gl128.u1", 0x00000, 0x1000000, CRC(de779dd7) SHA1(ac6d3fa6f18ceb795532ba9e85edffc040d74347) )
+ROM_END
+
+ROM_START( nubsupmf )
+ ROM_REGION( 0x400000, "mainrom", 0 )
+ ROM_LOAD( "w25q32fv.bin", 0x00000, 0x400000, CRC(5ca234b2) SHA1(3eba3e690f68116fd3e5e914f8bd16b1dc2c0bc4) )
+ROM_END
+
+ROM_START( unk2019hh )
+ ROM_REGION( 0x1000000, "mainrom", 0 )
+ ROM_LOAD( "fgb2019.bin", 0x00000, 0x1000000, CRC(7ef130d5) SHA1(00f45974494707fdac78153b13d8cfb503716ad0) )
+ROM_END
+
+ROM_START( unk2020hh )
+ ROM_REGION( 0x1000000, "mainrom", 0 )
+ ROM_LOAD( "fgb2020.bin", 0x00000, 0x1000000, CRC(a685d943) SHA1(9b272daccd8fe244c910f031466a4fedd83d5236) )
+ROM_END
+
+
ROM_START( dvnimbus )
ROM_REGION( 0x1000000, "mainrom", 0 )
ROM_LOAD( "2012-7-4-v1.bin", 0x00000, 0x1000000, CRC(a91d7aa6) SHA1(9421b70b281bb630752bc352c3715258044c0bbe) )
@@ -961,6 +982,16 @@ CONS( 200?, gcs2mgp, 0, 0, nes_vt369_vtunknown_cy_bigger, nes_vt369_vtunknow
// Several of the games contained in here are buggy / broken on real hardware (see https://www.youtube.com/watch?v=-mgGNaDQ1HE )
CONS( 201?, 240in1ar, 0, 0, nes_vt369_vtunknown_cy_bigger, nes_vt369_vtunknown, nes_vt369_vtunknown_cy_state, empty_init, "Thumbs Up", "Mini Arcade Machine (Thumbs Up, 240IN1ARC)", MACHINE_NOT_WORKING ) // 128Mbyte ROM, must be externally banked or different addressing scheme
+// is one of these bad? where do they fit? the former boots, but banking is wrong (incorrect games selected, gfx corruption) the 2nd looks encrypted or bad
+CONS( 2019, unk2019hh, 0, 0, nes_vt369_vtunknown_hh_8mb, nes_vt369_vtunknown, nes_vt369_vtunknown_unk_state, empty_init, "", "unknown VTxx based GameBoy style handheld (2019 PCB)", MACHINE_NOT_WORKING )
+CONS( 2020, unk2020hh, unk2019hh,0, nes_vt369_vtunknown_hh_8mb, nes_vt369_vtunknown, nes_vt369_vtunknown_unk_state, empty_init, "", "unknown VTxx based GameBoy style handheld (2020 PCB)", MACHINE_NOT_WORKING )
+
+/*****************************************************************************
+* below are VT369? games that use flash ROM
+*****************************************************************************/
+
+// portable fan + famiclone combo handheld
+CONS( 2020, nubsupmf, 0, 0, nes_vt369_vtunknown_hh_4mb, nes_vt369_vtunknown, nes_vt369_vtunknown_unk_state, empty_init, "", "NubSup Mini Game Fan", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS )
/*****************************************************************************
* below are VT369 games that use BGA on sub
@@ -973,6 +1004,9 @@ CONS( 201?, retro400, 0, 0, nes_vt369_vtunknown_hh_16mb, nes_vt369_vtun
* below are VT369 games that use SQI / SPI ROM
*****************************************************************************/
+// doesn't boot
+CONS( 201?, q5_500in1, 0, 0, nes_vt369_vtunknown_hh_8mb, nes_vt369_vtunknown, nes_vt369_vtunknown_unk_state, empty_init, "", "Q5 500 in 1 Handheld", MACHINE_NOT_WORKING )
+
// Runs well, minor GFX issues in intro
CONS( 2017, sy889, 0, 0, nes_vt369_vtunknown_hh_8mb, nes_vt369_vtunknown, nes_vt369_vtunknown_unk_state, empty_init, "SY Corp", "SY-889 300 in 1 Handheld", MACHINE_IMPERFECT_GRAPHICS )
CONS( 2016, sy888b, 0, 0, nes_vt369_vtunknown_hh_4mb, nes_vt369_vtunknown, nes_vt369_vtunknown_unk_state, empty_init, "SY Corp", "SY-888B 288 in 1 Handheld", MACHINE_IMPERFECT_GRAPHICS )
diff --git a/src/mame/skeleton/ct909e_segadvd.cpp b/src/mame/skeleton/ct909e_segadvd.cpp
new file mode 100644
index 00000000000..3e477022075
--- /dev/null
+++ b/src/mame/skeleton/ct909e_segadvd.cpp
@@ -0,0 +1,91 @@
+// license:BSD-3-Clause
+// copyright-holders:David Haywood
+
+
+/*****************************************************************************
+
+ Portable DVD Player with built in Sega Master System games
+ has AT Games strings in ROM
+ sold in Spain as MeGaTrix
+
+ uses a Cheertek CT909E-LF System on a Chip ** unknown CPU core **
+
+*****************************************************************************/
+
+
+#include "emu.h"
+
+#include "cpu/arm7/arm7.h"
+#include "cpu/arm7/arm7core.h"
+
+#include "screen.h"
+#include "speaker.h"
+
+class ct909e_megatrix_state : public driver_device
+{
+public:
+ ct909e_megatrix_state(const machine_config &mconfig, device_type type, const char *tag) :
+ driver_device(mconfig, type, tag),
+ m_maincpu(*this, "maincpu"),
+ m_screen(*this, "screen")
+ { }
+
+ void megatrix(machine_config &config);
+
+protected:
+ virtual void machine_start() override;
+ virtual void machine_reset() override;
+
+ void arm_map(address_map &map);
+
+ required_device m_maincpu;
+ required_device m_screen;
+
+ uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
+
+private:
+};
+
+
+void ct909e_megatrix_state::arm_map(address_map &map)
+{
+ map(0x00000000, 0x003fffff).rom();
+}
+
+uint32_t ct909e_megatrix_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
+{
+ return 0;
+}
+
+void ct909e_megatrix_state::machine_start()
+{
+}
+
+void ct909e_megatrix_state::machine_reset()
+{
+}
+
+static INPUT_PORTS_START( megatrix )
+INPUT_PORTS_END
+
+void ct909e_megatrix_state::megatrix(machine_config &config)
+{
+ ARM9(config, m_maincpu, 100'000'000); // unknown core / frequency, maybe not ARM
+ m_maincpu->set_addrmap(AS_PROGRAM, &ct909e_megatrix_state::arm_map);
+
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_size(320, 262);
+ m_screen->set_visarea(0, 320-1, 0, 240-1);
+ m_screen->set_screen_update(FUNC(ct909e_megatrix_state::screen_update));
+
+ SPEAKER(config, "lspeaker").front_left();
+ SPEAKER(config, "rspeaker").front_right();
+}
+
+ROM_START( megatrix )
+ ROM_REGION( 0x8400000, "maincpu", ROMREGION_ERASEFF )
+ ROM_LOAD( "segadvd_en29lv320b_007f22f9.bin", 0x000000, 0x400000, CRC(33fea2ff) SHA1(85295fd31a06149112295a9b6a8218a4a4c50893) )
+ROM_END
+
+CONS( 2007, megatrix, 0, 0, megatrix, megatrix, ct909e_megatrix_state, empty_init, "", "MeGaTrix (Spain)", MACHINE_IS_SKELETON )