diff --git a/hash/easy_karaoke_cart.xml b/hash/easy_karaoke_cart.xml
new file mode 100644
index 00000000000..79c2f216a77
--- /dev/null
+++ b/hash/easy_karaoke_cart.xml
@@ -0,0 +1,36 @@
+
+
+
+
+
+
+ Golden Greats Vol.3
+ 2004
+ IVL Technologies
+
+
+
+
+
+
+
+
+
+
+
+ Golden Greats Vol.4
+ 2004
+ IVL Technologies
+
+
+
+
+
+
+
+
+
+
+
diff --git a/scripts/target/mame/mess.lua b/scripts/target/mame/mess.lua
index 0188badce30..82245dc559a 100644
--- a/scripts/target/mame/mess.lua
+++ b/scripts/target/mame/mess.lua
@@ -4068,6 +4068,7 @@ files {
MAME_DIR .. "src/mame/drivers/generalplus_gpl16250_nand.cpp",
MAME_DIR .. "src/mame/drivers/generalplus_gpl16250_mobigo.cpp",
MAME_DIR .. "src/mame/drivers/generalplus_gpl16250_spi.cpp",
+ MAME_DIR .. "src/mame/drivers/generalplus_gpl16250_spi_direct.cpp",
MAME_DIR .. "src/mame/includes/generalplus_gpl16250.h",
MAME_DIR .. "src/mame/includes/generalplus_gpl16250_romram.h",
MAME_DIR .. "src/mame/includes/generalplus_gpl16250_nand.h",
@@ -4101,6 +4102,7 @@ files {
MAME_DIR .. "src/mame/machine/xavix2002_io.h",
MAME_DIR .. "src/mame/drivers/xavix2.cpp",
MAME_DIR .. "src/mame/drivers/titan_soc.cpp",
+ MAME_DIR .. "src/mame/drivers/st22xx_bbl338.cpp",
MAME_DIR .. "src/mame/drivers/unk6502_st2xxx.cpp",
MAME_DIR .. "src/mame/drivers/actions_atj2279b.cpp",
MAME_DIR .. "src/mame/drivers/pubint_storyreader.cpp",
@@ -4410,6 +4412,7 @@ files {
MAME_DIR .. "src/mame/drivers/dual68.cpp",
MAME_DIR .. "src/mame/drivers/e100.cpp",
MAME_DIR .. "src/mame/drivers/eacc.cpp",
+ MAME_DIR .. "src/mame/drivers/easy_karaoke.cpp",
MAME_DIR .. "src/mame/drivers/elwro800.cpp",
MAME_DIR .. "src/mame/drivers/epic14e.cpp",
MAME_DIR .. "src/mame/drivers/esprit.cpp",
diff --git a/src/devices/machine/generalplus_gpl16250soc.cpp b/src/devices/machine/generalplus_gpl16250soc.cpp
index b8f7ef690cc..c86f3b477a7 100644
--- a/src/devices/machine/generalplus_gpl16250soc.cpp
+++ b/src/devices/machine/generalplus_gpl16250soc.cpp
@@ -46,6 +46,35 @@ generalplus_gpspispi_device::generalplus_gpspispi_device(const machine_config &m
}
+uint16_t generalplus_gpspi_direct_device::spi_direct_7b40_r()
+{
+ return machine().rand();
+}
+
+
+void generalplus_gpspi_direct_device::gpspi_direct_internal_map(address_map& map)
+{
+ sunplus_gcm394_base_device::base_internal_map(map);
+
+ map(0x0079f4, 0x0079f4).r(FUNC(generalplus_gpspi_direct_device::spi_direct_7b40_r));
+ map(0x0079f5, 0x0079f5).r(FUNC(generalplus_gpspi_direct_device::spi_direct_7b40_r));
+
+ map(0x007b40, 0x007b40).r(FUNC(generalplus_gpspi_direct_device::spi_direct_7b40_r));
+
+ map(0x009000, 0x3fffff).rom().region("spidirect", 0);
+}
+
+
+DEFINE_DEVICE_TYPE(GP_SPI_DIRECT, generalplus_gpspi_direct_device, "gpac800spi_direct", "GeneralPlus GPL16250 (with direct SPI handling)")
+
+generalplus_gpspi_direct_device::generalplus_gpspi_direct_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) :
+ sunplus_gcm394_base_device(mconfig, GP_SPISPI, tag, owner, clock, address_map_constructor(FUNC(generalplus_gpspi_direct_device::gpspi_direct_internal_map), this))
+{
+}
+
+
+
+
void sunplus_gcm394_base_device::default_cs_callback(uint16_t cs0, uint16_t cs1, uint16_t cs2, uint16_t cs3, uint16_t cs4)
{
logerror("callback not hooked\n");
diff --git a/src/devices/machine/generalplus_gpl16250soc.h b/src/devices/machine/generalplus_gpl16250soc.h
index 095b0692352..50b8f67d8a6 100644
--- a/src/devices/machine/generalplus_gpl16250soc.h
+++ b/src/devices/machine/generalplus_gpl16250soc.h
@@ -464,10 +464,34 @@ private:
uint16_t spi_unk_7943_r();
};
+class generalplus_gpspi_direct_device : public sunplus_gcm394_base_device
+{
+public:
+ template
+ generalplus_gpspi_direct_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock, T &&screen_tag) :
+ generalplus_gpspi_direct_device(mconfig, tag, owner, clock)
+ {
+ m_screen.set_tag(std::forward(screen_tag));
+ m_csbase = 0x30000;
+ }
+
+ generalplus_gpspi_direct_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+
+protected:
+ void gpspi_direct_internal_map(address_map &map);
+
+ //virtual void device_start() override;
+ //virtual void device_reset() override;
+
+private:
+ uint16_t spi_direct_7b40_r();
+};
+
DECLARE_DEVICE_TYPE(GCM394, sunplus_gcm394_device)
DECLARE_DEVICE_TYPE(GPAC800, generalplus_gpac800_device)
DECLARE_DEVICE_TYPE(GP_SPISPI, generalplus_gpspispi_device)
+DECLARE_DEVICE_TYPE(GP_SPI_DIRECT, generalplus_gpspi_direct_device)
#endif // MAME_MACHINE_GENERALPLUS_GPL16250SOC_H
diff --git a/src/mame/drivers/easy_karaoke.cpp b/src/mame/drivers/easy_karaoke.cpp
new file mode 100644
index 00000000000..15ad36e96b3
--- /dev/null
+++ b/src/mame/drivers/easy_karaoke.cpp
@@ -0,0 +1,160 @@
+// license:BSD-3-Clause
+// copyright-holders:David Haywood
+/******************************************************************************
+
+ Easy Karaoke (c)IVL Technologies
+
+ A version of this was also released in France by Lexibook, with French songs
+
+
+ This uses
+
+ Clarity 4.3 ARM
+ SVI1186
+ NV0165 0317
+ Sound Vision Inc.
+
+ an overview for 4.1 and 4.2 can be found at
+ http://web.archive.org/web/20031212120255fw_/http://www.soundvisioninc.com/OEMProducts/C4datasheet072401.pdf
+ Amusingly this datasheet advertises 'MAME Game emulation' as one of the capabilities despite the chip
+ clocking in at only 72Mhz
+
+ Support chip is
+
+ IVL
+ Technologies
+ ICS0253R1.0
+ UA1068ABK-RD
+ 0327 A01491F
+
+ RAM chip is
+
+ IC42S16400-7T
+
+ ROM is
+
+ IVL
+ Technologies
+ ICS0303-B
+ (c)1985-1986
+ 3415BAI THAI
+
+ --------------
+
+ Cartridges contain:
+
+ 1x MX 29LV040TC-90 (Flash ROM)
+
+ 1x HC573A
+
+ 1x ICSI IC89LV52A-24PQ (80C52 MCU with 8KBytes Flash memory, can be read protected)
+
+ presumably manages a serial protocol to send data to the main unit
+
+*******************************************************************************/
+
+#include "emu.h"
+
+#include "cpu/arm7/arm7.h"
+#include "cpu/arm7/arm7core.h"
+
+#include "bus/generic/slot.h"
+#include "bus/generic/carts.h"
+
+#include "screen.h"
+#include "softlist.h"
+#include "speaker.h"
+
+class easy_karaoke_state : public driver_device
+{
+public:
+ easy_karaoke_state(const machine_config &mconfig, device_type type, const char *tag)
+ : driver_device(mconfig, type, tag)
+ , m_maincpu(*this, "maincpu")
+ , m_screen(*this, "screen")
+ , m_cart(*this, "cartslot")
+ , m_cart_region(nullptr)
+ { }
+
+ void easy_karaoke(machine_config &config);
+
+private:
+ virtual void machine_start() override;
+ virtual void machine_reset() override;
+
+ void easy_karaoke_base(machine_config &config);
+
+ DECLARE_DEVICE_IMAGE_LOAD_MEMBER(cart_load);
+
+ required_device m_maincpu;
+
+ required_device m_screen;
+ required_device m_cart;
+ memory_region *m_cart_region;
+
+ uint32_t screen_update_storio(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
+};
+
+uint32_t easy_karaoke_state::screen_update_storio(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
+{
+ return 0;
+}
+
+void easy_karaoke_state::machine_start()
+{
+ // if there's a cart, override the standard mapping
+ if (m_cart && m_cart->exists())
+ {
+ m_cart_region = memregion(std::string(m_cart->tag()) + GENERIC_ROM_REGION_TAG);
+ }
+}
+
+void easy_karaoke_state::machine_reset()
+{
+}
+
+DEVICE_IMAGE_LOAD_MEMBER(easy_karaoke_state::cart_load)
+{
+ uint32_t size = m_cart->common_get_size("rom");
+
+ m_cart->rom_alloc(size, GENERIC_ROM16_WIDTH, ENDIANNESS_LITTLE);
+ m_cart->common_load_rom(m_cart->get_rom_base(), size, "rom");
+
+ return image_init_result::PASS;
+}
+
+static INPUT_PORTS_START( easy_karaoke )
+INPUT_PORTS_END
+
+
+void easy_karaoke_state::easy_karaoke_base(machine_config &config)
+{
+ ARM9(config, m_maincpu, 72000000); // ARM 720 core
+
+ 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(easy_karaoke_state::screen_update_storio));
+
+ SPEAKER(config, "lspeaker").front_left();
+ SPEAKER(config, "rspeaker").front_right();
+
+ GENERIC_CARTSLOT(config, m_cart, generic_plain_slot, "easy_karaoke_cart");
+ m_cart->set_width(GENERIC_ROM16_WIDTH);
+ m_cart->set_device_load(FUNC(easy_karaoke_state::cart_load));
+
+}
+
+void easy_karaoke_state::easy_karaoke(machine_config &config)
+{
+ easy_karaoke_base(config);
+ SOFTWARE_LIST(config, "cart_list").set_original("easy_karaoke_cart");
+}
+
+ROM_START( easykara )
+ ROM_REGION( 0x200000, "maincpu", ROMREGION_ERASEFF ) // unknown size
+ ROM_LOAD( "ics0303-b.bin", 0x000000, 0x200000, NO_DUMP )
+ROM_END
+
+CONS( 2004, easykara, 0, 0, easy_karaoke, easy_karaoke, easy_karaoke_state, empty_init, "IVL Technologies", "Easy Karaoke Groove Station", MACHINE_IS_SKELETON )
diff --git a/src/mame/drivers/generalplus_gpl16250_spi_direct.cpp b/src/mame/drivers/generalplus_gpl16250_spi_direct.cpp
new file mode 100644
index 00000000000..702330fc9f8
--- /dev/null
+++ b/src/mame/drivers/generalplus_gpl16250_spi_direct.cpp
@@ -0,0 +1,107 @@
+// license:BSD-3-Clause
+// copyright-holders:David Haywood
+/*
+ These seem to be GPL16250 related based on video register use
+ however the SPI ROM maps directly into CPU space, where you'd
+ expect internal ROM to be?!
+*/
+
+#include "emu.h"
+#include "includes/generalplus_gpl16250.h"
+
+class generalplus_gpspi_direct_game_state : public gcm394_game_state
+{
+public:
+ generalplus_gpspi_direct_game_state(const machine_config& mconfig, device_type type, const char* tag) :
+ gcm394_game_state(mconfig, type, tag)
+ {
+ }
+
+ void init_fif();
+
+ void generalplus_gpspi_direct(machine_config &config);
+
+protected:
+ virtual void machine_start() override;
+ virtual void machine_reset() override;
+
+private:
+};
+
+void generalplus_gpspi_direct_game_state::machine_start()
+{
+}
+
+void generalplus_gpspi_direct_game_state::machine_reset()
+{
+ m_maincpu->reset(); // reset CPU so vector gets read etc.
+}
+
+static INPUT_PORTS_START( gcm394 )
+ PORT_START("IN0")
+ PORT_START("IN1")
+ PORT_START("IN2")
+INPUT_PORTS_END
+
+
+void generalplus_gpspi_direct_game_state::generalplus_gpspi_direct(machine_config &config)
+{
+ GP_SPI_DIRECT(config, m_maincpu, 96000000/2, m_screen);
+ m_maincpu->porta_in().set(FUNC(generalplus_gpspi_direct_game_state::porta_r));
+ m_maincpu->portb_in().set(FUNC(generalplus_gpspi_direct_game_state::portb_r));
+ m_maincpu->portc_in().set(FUNC(generalplus_gpspi_direct_game_state::portc_r));
+ m_maincpu->porta_out().set(FUNC(generalplus_gpspi_direct_game_state::porta_w));
+ m_maincpu->space_read_callback().set(FUNC(generalplus_gpspi_direct_game_state::read_external_space));
+ m_maincpu->space_write_callback().set(FUNC(generalplus_gpspi_direct_game_state::write_external_space));
+ m_maincpu->set_irq_acknowledge_callback(m_maincpu, FUNC(sunplus_gcm394_base_device::irq_vector_cb));
+ m_maincpu->add_route(ALL_OUTPUTS, "lspeaker", 0.5);
+ m_maincpu->add_route(ALL_OUTPUTS, "rspeaker", 0.5);
+ m_maincpu->set_bootmode(0);
+ m_maincpu->set_cs_config_callback(FUNC(gcm394_game_state::cs_callback));
+
+ FULL_MEMORY(config, m_memory).set_map(&generalplus_gpspi_direct_game_state::cs_map_base);
+
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_size(320*2, 262*2);
+ m_screen->set_visarea(0, (320*2)-1, 0, (240*2)-1);
+ m_screen->set_screen_update("maincpu", FUNC(sunplus_gcm394_device::screen_update));
+ m_screen->screen_vblank().set(m_maincpu, FUNC(sunplus_gcm394_device::vblank));
+
+ SPEAKER(config, "lspeaker").front_left();
+ SPEAKER(config, "rspeaker").front_right();
+}
+
+// Is there an internal ROM that gets mapped out or can this type really execute directly from scrambled SPI?
+
+ROM_START( fixitflx )
+ ROM_REGION16_BE( 0x40000, "maincpu:internal", ROMREGION_ERASE00 )
+ //ROM_LOAD16_WORD_SWAP( "internal.rom", 0x00000, 0x40000, NO_DUMP )
+
+ ROM_REGION16_BE(0x800000, "maincpu:spidirect", ROMREGION_ERASE00)
+ ROM_LOAD16_WORD_SWAP( "fixitfelix_md25q16csig_c84015.bin", 0x0000, 0x200000, CRC(605c6863) SHA1(4f6cc2e8388e20eb90c6b05265273650eeea56eb) )
+ROM_END
+
+ROM_START( wiwcs )
+ ROM_REGION16_BE( 0x40000, "maincpu:internal", ROMREGION_ERASE00 )
+ //ROM_LOAD16_WORD_SWAP( "internal.rom", 0x00000, 0x40000, NO_DUMP )
+
+ ROM_REGION16_BE(0x800000, "maincpu:spidirect", ROMREGION_ERASE00)
+ ROM_LOAD16_WORD_SWAP( "wwcs.img", 0x0000, 0x800000, CRC(9b86bc45) SHA1(17721c662642a257d3e0f56e351a9a80d75d9110) )
+
+ ROM_REGION16_BE(0x400, "i2c", ROMREGION_ERASE00)
+ ROM_LOAD( "witw_eeprom.bin", 0x0000, 0x400, CRC(9426350b) SHA1(c481ded8b1f61fbf2403532dabb9c0a5c2a33fa2) )
+ROM_END
+
+void generalplus_gpspi_direct_game_state::init_fif()
+{
+ uint16_t* spirom16 = (uint16_t*)memregion("maincpu:spidirect")->base();
+ for (int i = 0; i < 0x800000 / 2; i++)
+ {
+ spirom16[i] = bitswap<16>(spirom16[i] ^ 0xdd0d,
+ 3, 1, 11, 9, 6, 14, 0, 2, 8, 7, 13, 15, 4, 5, 12, 10);
+ }
+}
+
+CONS(2017, fixitflx, 0, 0, generalplus_gpspi_direct, gcm394, generalplus_gpspi_direct_game_state , init_fif, "Basic Fun", "Fix It Felix Jr. (Mini Arcade)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND)
+CONS(2018, wiwcs, 0, 0, generalplus_gpspi_direct, gcm394, generalplus_gpspi_direct_game_state , init_fif, "Basic Fun", "Where in the World is Carmen Sandiego? (Handheld)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND)
diff --git a/src/mame/drivers/nes_clone.cpp b/src/mame/drivers/nes_clone.cpp
index bc9403546e4..ef97c551e1b 100644
--- a/src/mame/drivers/nes_clone.cpp
+++ b/src/mame/drivers/nes_clone.cpp
@@ -1074,6 +1074,21 @@ ROM_START( vtvsocr )
ROM_LOAD16_WORD_SWAP( "virtualtvsoccer.bin", 0x00000, 0x40000, CRC(2cfe42aa) SHA1(c2cafdbd5cc6491c94efd3f1be4b70c9de737b46) )
ROM_END
+ROM_START( hs36red )
+ ROM_REGION( 0x200000, "maincpu", ROMREGION_ERASE00 )
+ ROM_LOAD( "mx29lv160cb.u3", 0x00000, 0x200000, CRC(318a81bb) SHA1(8b207e6a5fca53cbf383b79ff570fcdb89639fa3) )
+ROM_END
+
+ROM_START( hs36blk )
+ ROM_REGION( 0x200000, "maincpu", ROMREGION_ERASE00 )
+ ROM_LOAD( "mx29lv160cbtc.u3", 0x00000, 0x200000, CRC(b5cf91a0) SHA1(399f015fb0580c90928e7f3d73810cc4b6cc70d9) )
+ROM_END
+
+ROM_START( dancmix3 )
+ ROM_REGION( 0x100000, "maincpu", ROMREGION_ERASE00 )
+ ROM_LOAD( "e28f008sa.u5", 0x00000, 0x100000, CRC(faf6480c) SHA1(68bf79910e091443aecc7bf256cd5378a04c550e) )
+ROM_END
+
void nes_clone_state::init_nes_clone()
{
}
@@ -1097,3 +1112,12 @@ CONS( 200?, vtvppong, 0, 0, nes_clone_vtvppong, nes_clone, nes_clone_vtvpp
CONS( 200?, pjoypj001, 0, 0, nes_clone, nes_clone, nes_clone_state, init_nes_clone, "Trump Grand", "PowerJoy (PJ001, NES based plug & play)", MACHINE_NOT_WORKING )
CONS( 200?, vtvsocr, 0, 0, nes_clone_vtvsocr, nes_clone, nes_clone_vtvsocr_state, init_nes_clone, "", "Virtual TV Soccer", MACHINE_NOT_WORKING )
+
+// might be VT02 hardware, needs decrypting, possibly designed by wellminds (M350 etc.)
+CONS( 2010, hs36red, 0, 0, nes_clone, nes_clone, nes_clone_state, init_nes_clone, "HengSheng", "HengSheng 36-in-1 (Red pad)", MACHINE_NOT_WORKING )
+CONS( 2010, hs36blk, 0, 0, nes_clone, nes_clone, nes_clone_state, init_nes_clone, "HengSheng", "HengSheng 36-in-1 (Black pad)", MACHINE_NOT_WORKING )
+
+// probably not a plain NES clone, uses extended opcodes found in later chips, but doesn't fit directly in either
+// ROM seems very small for a device with sampled music, but size matches chip type
+// does access NES-like addresses
+CONS( 201?, dancmix3, 0, 0, nes_clone, nes_clone, nes_clone_state, init_nes_clone, "Venom", "TV Dance Mat 4 Games in 1 (Mix Party 3 / Dance Mix 3)", MACHINE_NOT_WORKING )
diff --git a/src/mame/drivers/st22xx_bbl338.cpp b/src/mame/drivers/st22xx_bbl338.cpp
new file mode 100644
index 00000000000..dbb4615cded
--- /dev/null
+++ b/src/mame/drivers/st22xx_bbl338.cpp
@@ -0,0 +1,68 @@
+// license:BSD-3-Clause
+// copyright-holders:David Haywood, AJR
+
+#include "emu.h"
+#include "cpu/m6502/st2205u.h"
+#include "screen.h"
+
+class st22xx_bbl338_state : public driver_device
+{
+public:
+ st22xx_bbl338_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 st22xx_bbl338(machine_config &config);
+
+private:
+ void st22xx_bbl338_map(address_map &map);
+
+ required_device m_maincpu;
+ required_device m_screen;
+
+ u32 screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
+};
+
+void st22xx_bbl338_state::st22xx_bbl338_map(address_map &map)
+{
+ map(0x000000, 0x1fffff).rom().region("maincpu", 0);
+}
+
+
+static INPUT_PORTS_START(st22xx_bbl338)
+INPUT_PORTS_END
+
+u32 st22xx_bbl338_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
+{
+ return 0;
+}
+
+
+void st22xx_bbl338_state::st22xx_bbl338(machine_config &config)
+{
+ ST2205U(config, m_maincpu, 4000000); // likely higher clock
+ m_maincpu->set_addrmap(AS_DATA, &st22xx_bbl338_state::st22xx_bbl338_map);
+
+ SCREEN(config, m_screen, SCREEN_TYPE_LCD);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(0));
+ m_screen->set_size(160, 128); // incorrect
+ m_screen->set_visarea(0, 160 - 1, 0, 128 - 1);
+ m_screen->set_screen_update(FUNC(st22xx_bbl338_state::screen_update));
+}
+
+ROM_START( bbl338 )
+ // is internal ROM used? the code in the external ROM contains a bank for 4000-6fff including vectors at least.
+ // it sets stack to 14f, but quickly jumps to 150 in RAM where there is no code? was something meant to have copied
+ // code there earlier?
+
+ ROM_REGION( 0x200000, "maincpu", 0 )
+ ROM_LOAD( "en29lv160ab.u1", 0x000000, 0x200000, CRC(2c73e16c) SHA1(e2c69b3534e32ef384c0c2f5618118a419326e3a) )
+ROM_END
+
+
+// this is uses a higher resolution display than the common units, but not as high as the SunPlus based ones
+COMP( 201?, bbl338, 0, 0, st22xx_bbl338, st22xx_bbl338, st22xx_bbl338_state, empty_init, "BaoBaoLong", "Portable Game Player BBL-338 (BaoBaoLong, 48-in-1)", MACHINE_IS_SKELETON )
diff --git a/src/mame/drivers/vt1682.cpp b/src/mame/drivers/vt1682.cpp
index 366af75ae70..a43ce42046e 100644
--- a/src/mame/drivers/vt1682.cpp
+++ b/src/mame/drivers/vt1682.cpp
@@ -5671,6 +5671,10 @@ static INPUT_PORTS_START( 110dance )
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_NAME("Pad Right") PORT_16WAY
INPUT_PORTS_END
+static INPUT_PORTS_START( gm235upc )
+ PORT_START("IN0")
+INPUT_PORTS_END
+
static INPUT_PORTS_START( lxts3 )
PORT_START("IN0")
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON1 )
@@ -6156,6 +6160,15 @@ ROM_START( lxts3 )
ROM_END
+ROM_START( gm235upc )
+ ROM_REGION( 0x800000, "mainrom", 0 )
+ ROM_LOAD( "39vf3201.u3", 0x00000, 0x400000, CRC(182f8a2c) SHA1(7be56e1063cc8dbb78c419f5adc05b8cd65c8e2f))
+ // also has RAM
+ROM_END
+
+
+
+
// TODO: this is a cartridge based system (actually, verify this, it seems some versions simply had built in games) move these to SL if verified as from cartridge config
// actually it appears that for the cart based systems these are 'fake systems' anyway, where the base unit is just a Famiclone but as soon as you plug in a cart none of
// the internal hardware gets used at all.
@@ -6228,12 +6241,15 @@ CONS( 200?, dance555, 0, 0, vt1682_exsportp, dance555, vt1682_exsport_state
// manual explicitly states it has NTSC output only (unit can be connected to a TV) and both Ranning Horse + Explosion (Bomberman) are the NTSC versions
// has 21.477 Mhz XTAL
-CONS( 200?, njp60in1, 0, 0, vt1682_lxts3, njp60in1, vt1682_lxts3_state, njp60in1_init, "", "NJ Pocket 60-in-1 handheld 'X zero' (NTSC)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND) // RNG + linescroll issues
+CONS( 200?, njp60in1, 0, 0, vt1682_lxts3, njp60in1, vt1682_lxts3_state, njp60in1_init, "", "NJ Pocket 60-in-1 handheld 'X zero' (NTSC)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND) // linescroll issues
// this appears to be related to the NJ Pocket, claims 101-in-1 but has some duplicates.
// Like the 'Wow Wireless gaming' it incorrectly mixes the PAL version of 'Ranning Horse' with the NTSC version of 'Bomberman', it has no TV output.
// has 26.6017 Mhz (6xPAL) XTAL
-CONS( 200?, unk1682, 0, 0, vt1682_unk1682, lxts3, vt1682_lxts3_state, unk1682_init, "", "unknown VT1682-based 101-in-1 handheld (PAL)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND) // RNG + linescroll issues
+CONS( 200?, unk1682, 0, 0, vt1682_unk1682, lxts3, vt1682_lxts3_state, unk1682_init, "", "unknown VT1682-based 101-in-1 handheld (PAL)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND) // linescroll issues
-CONS( 2010, lxts3, 0, 0, vt1682_lxts3, lxts3, vt1682_lxts3_state, regular_init, "Lexibook", "Toy Story 3 (Lexibook)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) // RNG + linescroll issues
+CONS( 2010, lxts3, 0, 0, vt1682_lxts3, lxts3, vt1682_lxts3_state, regular_init, "Lexibook", "Toy Story 3 (Lexibook)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) // linescroll issues
+// there are products on SunPlus type hardware with nearly identical shells 'Mi DiGi World' / 'Mi Digi Diary'
+// needs IO ports on sound CPU side, needs write access to space for RAM (inputs are 'mini-keyboard' style)
+CONS( 200?, gm235upc, 0, 0, vt1682_dance, gm235upc, vt1682_dance_state, regular_init, "TimeTop", "Ultimate Pocket Console GM-235", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND | MACHINE_NOT_WORKING )
diff --git a/src/mame/mame.lst b/src/mame/mame.lst
index 20766592e34..3855fae81c2 100644
--- a/src/mame/mame.lst
+++ b/src/mame/mame.lst
@@ -12558,6 +12558,9 @@ e9161 //
@source:eacc.cpp
eacc //
+@source:easy_karaoke.cpp
+easykara
+
@source:ec184x.cpp
ec1840 //
ec1841 //
@@ -14924,6 +14927,10 @@ wrlshunt // Wireless: Hunting Video Game System
@source:generalplus_gpl16250_spi.cpp
bkrankp
+@source:generalplus_gpl16250_spi_direct.cpp
+fixitflx
+wiwcs
+
@source:generalplus_gpl32612.cpp
jak_swbstrik
jak_tmnthp
@@ -32271,12 +32278,15 @@ nes // Nintendo Entertainment System
nespal // Nintendo Entertainment System PAL
@source:nes_clone.cpp
-pjoypj001
afbm7800
+dancmix3
dnce2000
-vtvppong
-papsudok
+hs36blk
+hs36red
nytsudo
+papsudok
+pjoypj001
+vtvppong
vtvsocr
@source:nes_sh6578.cpp
@@ -38122,6 +38132,9 @@ sorcerera // Sorcerer with Dreamdisk fdc
sorcererb // Sorcerer with Digitrio fdc
sorcererd // Sorcerer with Micropolis fdc
+@source:st22xx_bbl338.cpp
+bbl338
+
@source:storio.cpp
innotab2 // (c) 2011 V.Tech
storio // (c) 2011 V.Tech
@@ -41601,23 +41614,24 @@ wrecking // (c) 1984 Nintendo
dgun2572
@source:vt1682.cpp
+110dance
+dance555
+exsprt48
+gm235upc
ii8in1
ii32in1
-zone7in1
-zone7in1p
-dance555
-miwi2_16
-miwi2_7
intact89
intg5410
-exsprt48
itvg48
-xing48
-wowwg
-110dance
lxts3
-unk1682
+miwi2_16
+miwi2_7
njp60in1
+unk1682
+wowwg
+xing48
+zone7in1
+zone7in1p
@source:vt52.cpp
vt52 // 1975 Digital Equipment Corporation
diff --git a/src/mame/mess.flt b/src/mame/mess.flt
index 8cb6226d8c9..1deb0466685 100644
--- a/src/mame/mess.flt
+++ b/src/mame/mess.flt
@@ -250,6 +250,7 @@ dvk_ksm.cpp
e100.cpp
e9161.cpp
eacc.cpp
+easy_karaoke.cpp
ec184x.cpp
ec65.cpp
ec7915.cpp
@@ -346,6 +347,7 @@ generalplus_gpl16250_nand.cpp
generalplus_gpl16250_rom.cpp
generalplus_gpl16250_romram.cpp
generalplus_gpl16250_spi.cpp
+generalplus_gpl16250_spi_direct.cpp
generalplus_gpl32612.cpp
geneve.cpp
geniusiq.cpp
@@ -946,6 +948,7 @@ spg2xx_zone.cpp
squale.cpp
ssem.cpp
st17xx.cpp
+st22xx_bbl338.cpp
storio.cpp
studio2.cpp
sun1.cpp