summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author David Haywood <28625134+DavidHaywood@users.noreply.github.com>2020-07-02 19:03:29 +0100
committer GitHub <noreply@github.com>2020-07-02 20:03:29 +0200
commit50baacce8b98bc561213e07e61c505394176b6c4 (patch)
tree184d099b80e848169001021b343c37ac2e591334
parentb87984408aa34e53bfcd75bfa87fbd7c216d62b7 (diff)
-Miscellaneous SPG-related additions, changes, and improvements associated with recent promotions. [David Haywood]
- Added alternate V.Smile V.Motion BIOS. [Sean Riddle, TeamEurope] New working machines -------------------- Dora l'exploratrice - Pocket Dream Console (VideoJet, France) [TeamEurope, David Haywood] PDC50 - Pocket Dream Console (VideoJet, France) [TeamEurope, David Haywood] Plug Play TV Games 2 (4-in-1) (VideoJet, France) [TeamEurope, David Haywood] PDC40 Tactile - Pocket Dream Console (VideoJet, France) [TeamEurope, David Haywood] New machines marked as NOT_WORKING ---------------------------------- Virtual TV Ping Pong [Sean Riddle, David Haywood] Kiu Games [TeamEurope, David Haywood] New NOT_WORKING software list additions --------------------------------------- vsmilem.xml: Action Mania (USA) [Sean Riddle, TeamEurope] Soccer Challenge (USA) [Sean Riddle, TeamEurope] Marvel Spider-Man & Friends - Secret Missions (USA) [Sean Riddle, TeamEurope] Toy Story 3 (USA) [Sean Riddle, TeamEurope]
-rw-r--r--hash/mobigo_cart.xml24
-rw-r--r--hash/vsmilem_cart.xml67
-rw-r--r--src/mame/drivers/generalplus_gpl16250_nand.cpp19
-rw-r--r--src/mame/drivers/nes_clone.cpp38
-rw-r--r--src/mame/drivers/spg2xx_pdc.cpp144
-rw-r--r--src/mame/drivers/spg2xx_wiwi.cpp267
-rw-r--r--src/mame/drivers/vsmile.cpp15
-rw-r--r--src/mame/includes/generalplus_gpl16250_nand.h1
-rw-r--r--src/mame/mame.lst6
9 files changed, 531 insertions, 50 deletions
diff --git a/hash/mobigo_cart.xml b/hash/mobigo_cart.xml
index 7cd5c229991..41d0920f36a 100644
--- a/hash/mobigo_cart.xml
+++ b/hash/mobigo_cart.xml
@@ -475,5 +475,29 @@ license:CC0
</dataarea>
</part>
</software>
+
+ <!-- these have downloaded games on them, they do however appear to be tied to the machine that downloaded them, on other units they appear as blank -->
+ <software name="user1" supported="no">
+ <description>NAND User Cartridge (unknown data, set 1)</description>
+ <year>201?</year>
+ <publisher>VTech</publisher>
+ <part name="cart" interface="mobigo_cart">
+ <dataarea name="rom" size="0x8400000">
+ <rom name="80-201401.bin" size="0x8400000" crc="ea99f4d7" sha1="a9f8a7f05de21d971895e3385621112461a0a339"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="user2" supported="no">
+ <description>NAND User Cartridge (unknown data, set 2)</description>
+ <year>201?</year>
+ <publisher>VTech</publisher>
+ <part name="cart" interface="mobigo_cart">
+ <dataarea name="rom" size="0x8400000">
+ <rom name="80-201404.bin" size="0x8400000" crc="a776ff2b" sha1="a154ad9bd58d14128752236fee5385aace3717e1"/>
+ <rom name="80-201404_Console.bin" size="0x8400000" crc="ed3388f5" sha1="583d7eab0bf2a0e9bb90a28d1fdda701f0a7f32b"/>
+ </dataarea>
+ </part>
+ </software>
</softwarelist>
diff --git a/hash/vsmilem_cart.xml b/hash/vsmilem_cart.xml
index f15c2119571..51e0c85d971 100644
--- a/hash/vsmilem_cart.xml
+++ b/hash/vsmilem_cart.xml
@@ -100,7 +100,7 @@ Language:
+========+===================+===========================================================================================+
| XX | 80-084240(US) | Ni Hao Kai Lan |
| XX | 80-084245(FR) | Ni Hao Kai Lan - Joyeux Nouvel an chinois! |
-+========+===================+===========================================================================================+
++========+===================+===========================================================================================+
| | 80-084260(US) | My Pet Puppy (unreleased in USA? UK version plays OK on NTSC console) |
| XX | 80-084262(NL) | Mijn Puppy! |
| | 80-084263(UK) | My Pet Puppy |
@@ -259,6 +259,18 @@ Language:
</part>
</software>
+ <software name="actnmniamb" cloneof="actnmniam" supported="no">
+ <description>Action Mania (USA)</description>
+ <year>201?</year>
+ <publisher>VTech</publisher>
+ <part name="cart" interface="vsmile_cart">
+ <dataarea name="rom" size="0x0800000">
+ <rom name="vmotion80-084000.bin" size="0x0800000" crc="c3ca971e" sha1="5c63215280ec3fdb01e8b4a0c151496718b6bc0a" />
+ </dataarea>
+ </part>
+ </software>
+
+
<software name="actnmniamnl" cloneof="actnmniam" supported="no">
<description>Sport Games (Netherlands)</description>
<year>201?</year>
@@ -990,7 +1002,19 @@ Language:
</software>
<!-- Soccer Challenge -->
- <software name="soccerchmg" supported="no">
+ <software name="soccerchm" supported="no">
+ <description>Soccer Challenge (USA)</description>
+ <year>200?</year>
+ <publisher>VTech</publisher>
+
+ <part name="cart" interface="vsmile_cart">
+ <dataarea name="rom" size="0x0800000">
+ <rom name="vmotion80-084300.bin" size="0x0800000" crc="4d0dd939" sha1="b5411b036fa91daf56f654be4ce71b4ac15541ca" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="soccerchmg" cloneof="soccerchm" supported="no">
<description>Fussball Meisterschaft (Germany)</description>
<year>20??</year>
<publisher>VTech</publisher>
@@ -1005,8 +1029,7 @@ Language:
</part>
</software>
- <!-- Soccer Challenge -->
- <software name="soccerchmf" supported="no" cloneof="soccerchmg">
+ <software name="soccerchmf" cloneof="soccerchm" supported="no">
<description>Football Challenge (France)</description>
<year>20??</year>
<publisher>VTech</publisher>
@@ -1019,7 +1042,20 @@ Language:
</part>
</software>
- <software name="spidermnmg" supported="no">
+
+ <software name="spidermnm" supported="no">
+ <description>Marvel Spider-Man &amp; Friends - Secret Missions (USA)</description>
+ <year>200?</year>
+ <publisher>VTech</publisher>
+
+ <part name="cart" interface="vsmile_cart">
+ <dataarea name="rom" size="0x0800000">
+ <rom name="vmotion80-084140.bin" size="0x0800000" crc="be4f9c32" sha1="9f7d77f1cdf64ab993a5d07b91d435a861c91758" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="spidermnmg" cloneof="spidermnm" supported="no">
<description>Marvel Spider-Man &amp; Freunde - Geheime Missionen (Germany)</description>
<year>2010</year>
<publisher>VTech</publisher>
@@ -1034,7 +1070,7 @@ Language:
</part>
</software>
- <software name="spidermnmf" cloneof="spidermnmg" supported="no">
+ <software name="spidermnmf" cloneof="spidermnm" supported="no">
<description>Marvel Spider-Man &amp; ses amis - Missions Secrètes (France)</description>
<year>2008</year>
<publisher>VTech</publisher>
@@ -1115,7 +1151,18 @@ Language:
</part>
</software>
- <software name="toystor3mg" supported="no">
+ <software name="toystor3" supported="no">
+ <description>Toy Story 3 (USA)</description>
+ <year>2010</year>
+ <publisher>VTech</publisher>
+ <part name="cart" interface="vsmile_cart">
+ <dataarea name="rom" size="0x1000000">
+ <rom name="vmotion80-084420.bin" size="0x1000000" crc="c0500151" sha1="265d55fd723ff7698154165719ff9cfe6c3bf0c3" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="toystor3mg" cloneof="toystor3" supported="no">
<description>Toy Story 3 (Germany)</description>
<year>2010</year>
<publisher>VTech</publisher>
@@ -1132,7 +1179,7 @@ Language:
</part>
</software>
- <software name="toystor3mf" cloneof="toystor3mg" supported="no">
+ <software name="toystor3mf" cloneof="toystor3" supported="no">
<description>Toy Story 3 (France)</description>
<year>2010</year>
<publisher>VTech</publisher>
@@ -1145,7 +1192,7 @@ Language:
</part>
</software>
- <software name="toystor3ms" cloneof="toystor3mg" supported="no">
+ <software name="toystor3ms" cloneof="toystor3" supported="no">
<description>Disney/Pixar Toy Story 3 (Spain)</description>
<year>2010</year>
<publisher>VTech</publisher>
@@ -1286,5 +1333,5 @@ Language:
</dataarea>
</part>
</software>
-
+
</softwarelist>
diff --git a/src/mame/drivers/generalplus_gpl16250_nand.cpp b/src/mame/drivers/generalplus_gpl16250_nand.cpp
index 85de19d0744..e1eae87e606 100644
--- a/src/mame/drivers/generalplus_gpl16250_nand.cpp
+++ b/src/mame/drivers/generalplus_gpl16250_nand.cpp
@@ -458,6 +458,15 @@ ROM_START( wlsair60 )
ROM_LOAD( "wlsair60.nand", 0x0000, 0x8400000, CRC(eec23b97) SHA1(1bb88290cf54579a5bb51c08a02d793cd4d79f7a) )
ROM_END
+ROM_START( kiugames )
+ ROM_REGION16_BE( 0x40000, "maincpu:internal", ROMREGION_ERASE00 )
+ ROM_LOAD16_WORD_SWAP( "internal.rom", 0x00000, 0x40000, NO_DUMP ) // used as bootstrap only
+
+ ROM_REGION( 0x21000000, "nandrom", ROMREGION_ERASE00 )
+ ROM_LOAD( "hy27084g2m.u2", 0x0000, 0x21000000, CRC(65cc3864) SHA1(b759ec9816fe98a33ee7d5e12e5492f0160c5b31) )
+ROM_END
+
+
ROM_START( jak_gtg )
ROM_REGION16_BE( 0x40000, "maincpu:internal", ROMREGION_ERASE00 )
ROM_LOAD16_WORD_SWAP( "internal.rom", 0x00000, 0x40000, NO_DUMP ) // used as bootstrap only
@@ -729,7 +738,7 @@ void generalplus_gpac800_game_state::machine_reset()
*/
// probably more bytes are used
- int dest = m_strippedrom[0x15] << 8;
+ int dest = m_strippedrom[0x15] << 8 | (m_strippedrom[0x16] << 16);
// copy a block of code from the NAND to RAM
for (int i = 0; i < m_initial_copy_words; i++)
@@ -795,6 +804,13 @@ void generalplus_gpac800_game_state::nand_wlsair60()
m_initial_copy_words = 0x2800;
}
+void generalplus_gpac800_game_state::nand_kiugames()
+{
+ nand_init840();
+ m_initial_copy_words = 0x10000;
+}
+
+
void generalplus_gpac800_game_state::nand_vbaby()
{
nand_init840();
@@ -828,6 +844,7 @@ CONS(2010, wlsair60, 0, 0, generalplus_gpac800, jak_car2, generalplus_gp
CONS(200?, beambox, 0, 0, generalplus_gpac800, jak_car2, generalplus_gpac800_game_state, nand_beambox, "Hasbro", "Playskool Heroes Transformers Rescue Bots Beam Box (Spain)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING)
CONS(200?, mgtfit, 0, 0, generalplus_gpac800, jak_car2, generalplus_gpac800_game_state, nand_wlsair60, "MGT", "Fitness Konsole (NC1470)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING) // probably has other names in English too? menus don't appear to be in German
CONS(200?, vbaby, 0, 0, generalplus_gpac800_vbaby, jak_car2, generalplus_gpac800_vbaby_game_state, nand_vbaby, "VTech", "V.Baby", MACHINE_NO_SOUND | MACHINE_NOT_WORKING)
+CONS(200?, kiugames, 0, 0, generalplus_gpac800, jak_car2, generalplus_gpac800_game_state, nand_kiugames, "VideoJet", "Kiu Games", MACHINE_NO_SOUND | MACHINE_NOT_WORKING) // probably has other names in English too? menus don't appear to be in German
CONS(200?, jak_gtg, 0, 0, generalplus_gpac800, jak_gtg, generalplus_gpac800_game_state, nand_init210, "JAKKS Pacific Inc / HotGen Ltd", "Golden Tee Golf (JAKKS Pacific TV Game)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING)
CONS(200?, jak_car2, 0, 0, generalplus_gpac800, jak_car2, generalplus_gpac800_game_state, nand_init210, "JAKKS Pacific Inc / HotGen Ltd", "Cars 2 (JAKKS Pacific TV Game)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING)
diff --git a/src/mame/drivers/nes_clone.cpp b/src/mame/drivers/nes_clone.cpp
index 555b5456ba1..eef9a37b597 100644
--- a/src/mame/drivers/nes_clone.cpp
+++ b/src/mame/drivers/nes_clone.cpp
@@ -75,6 +75,18 @@ private:
int m_rombase;
};
+class nes_clone_vtvppong_state : public nes_clone_state
+{
+public:
+ nes_clone_vtvppong_state(const machine_config& mconfig, device_type type, const char* tag) :
+ nes_clone_state(mconfig, type, tag)
+ { }
+ void nes_clone_vtvppong(machine_config& config);
+
+private:
+ void nes_clone_vtvppong_map(address_map& map);
+};
+
void nes_clone_state::sprite_dma_w(address_space &space, uint8_t data)
{
@@ -249,15 +261,12 @@ void nes_clone_dnce2000_state::nes_clone_dnce2000(machine_config& config)
m_maincpu->set_addrmap(AS_PROGRAM, &nes_clone_dnce2000_state::nes_clone_dnce2000_map);
}
-
-
void nes_clone_dnce2000_state::nes_clone_dnce2000_map(address_map& map)
{
nes_clone_basemap(map);
map(0x8000, 0xffff).rw(FUNC(nes_clone_dnce2000_state::rom_r), FUNC(nes_clone_dnce2000_state::bank_w));
}
-
void nes_clone_dnce2000_state::machine_reset()
{
nes_clone_state::machine_reset();
@@ -280,6 +289,19 @@ void nes_clone_dnce2000_state::bank_w(uint8_t data)
m_rombase = data;
}
+void nes_clone_vtvppong_state::nes_clone_vtvppong(machine_config& config)
+{
+ nes_clone_pal(config);
+ m_maincpu->set_addrmap(AS_PROGRAM, &nes_clone_vtvppong_state::nes_clone_vtvppong_map);
+}
+
+void nes_clone_vtvppong_state::nes_clone_vtvppong_map(address_map& map)
+{
+ nes_clone_basemap(map);
+ map(0x8000, 0xffff).rom().region("maincpu", 0x38000);
+}
+
+
ROM_START( pjoypj001 )
ROM_REGION( 0x100000, "maincpu", ROMREGION_ERASE00 )
ROM_LOAD( "powerjoy_pj001_lh28f008sc_89a6.bin", 0x00000, 0x100000, CRC(e655e0aa) SHA1(c96d3422e26451c366fee2151fedccb95014cbc7) )
@@ -298,6 +320,13 @@ ROM_START( dnce2000 ) // use Mapper 241 if you want to run this in a NES emulato
ROM_LOAD( "dance.bin", 0x00000, 0x40000, CRC(0982bb50) SHA1(bd608159d7e624ea345f2a188de51cb1aa116421) )
ROM_END
+ROM_START( vtvppong )
+ ROM_REGION( 0x40000, "maincpu", ROMREGION_ERASE00 ) // high bit is never set in the first 0x28000 bytes of this ROM, probably 7-bit sound data? code might need opcode bits swapping
+ ROM_LOAD( "vtvpongcpu.bin", 0x00000, 0x40000, CRC(52df95fa) SHA1(3015bcc90eee862b3568f122b402c9defa566aab) )
+
+ ROM_REGION( 0x20000, "gfx1", ROMREGION_ERASE00 )
+ ROM_LOAD( "vtvpongppu.bin", 0x00000, 0x20000, CRC(474dfc0c) SHA1(4d0afab111e40172ae0b31e94f1b74b73a18385f) )
+ROM_END
void nes_clone_state::init_nes_clone()
{
@@ -308,4 +337,7 @@ CONS( 200?, pjoypj001, 0, 0, nes_clone, nes_clone, nes_clone_state, init_nes_clo
// "Flashback Mini 7800 uses normal NES-style hardware, together with a mapper chipset similar to the Waixing kk33xx cartridges (NES 2.0 Mapper 534)"
CONS( 2004, afbm7800, 0, 0, nes_clone, nes_clone, nes_clone_state, init_nes_clone, "Atari", "Atari Flashback Mini 7800", MACHINE_NOT_WORKING )
+CONS( 200?, vtvppong, 0, 0, nes_clone_vtvppong, nes_clone, nes_clone_vtvppong_state, init_nes_clone, "<unknown>", "Virtual TV Ping Pong", MACHINE_NOT_WORKING )
+
+
CONS( 200?, dnce2000, 0, 0, nes_clone_dnce2000, dnce2000, nes_clone_dnce2000_state, init_nes_clone, "Shenzhen Soyin Electric Appliance Ind. Co., Ltd.", "Dance 2000 / Hot 2000 (Jin Bao TV Dancing Carpet, SY-2000-04)", 0 )
diff --git a/src/mame/drivers/spg2xx_pdc.cpp b/src/mame/drivers/spg2xx_pdc.cpp
index 24290fc0565..04f17451600 100644
--- a/src/mame/drivers/spg2xx_pdc.cpp
+++ b/src/mame/drivers/spg2xx_pdc.cpp
@@ -14,6 +14,9 @@ public:
{ }
void pdc100(machine_config& config);
+ void pdc_tactile(machine_config& config);
+
+ void init_pdc40t();
protected:
virtual void machine_start() override;
@@ -21,6 +24,18 @@ protected:
virtual void porta_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0) override;
+ uint16_t touch_xpos_r()
+ { // >= 0x800 = right of screen
+ uint16_t ret = ioport("AD1")->read();
+ return ret;
+ }
+
+ uint16_t touch_ypos_r()
+ { // >= 0x800 = top of screen
+ uint16_t ret = ioport("AD2")->read();
+ return ret;
+ }
+
private:
int m_numbanks;
};
@@ -47,8 +62,66 @@ static INPUT_PORTS_START( pdc100 )
PORT_START("P3")
PORT_BIT( 0xffff, IP_ACTIVE_HIGH, IPT_UNKNOWN )
+
+
+INPUT_PORTS_END
+
+
+static INPUT_PORTS_START( pdc_tactile )
+ PORT_START("P1")
+ PORT_BIT( 0x01ff, IP_ACTIVE_HIGH, IPT_UNKNOWN )
+ PORT_BIT( 0x0200, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("A")
+ PORT_BIT( 0xfc00, IP_ACTIVE_HIGH, IPT_UNKNOWN )
+
+ PORT_START("P2")
+ PORT_BIT( 0xffff, IP_ACTIVE_HIGH, IPT_UNKNOWN )
+
+ PORT_START("P3")
+ PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_NAME("Touch")
+ PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("B")
+ PORT_BIT( 0x0004, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_NAME("Pause / Menu")
+ PORT_BIT( 0x0038, IP_ACTIVE_HIGH, IPT_UNKNOWN )
+ PORT_BIT( 0x0040, IP_ACTIVE_HIGH, IPT_UNKNOWN ) // if this bit flips you get black screen (soft power off?)
+ PORT_BIT( 0x0080, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP )
+ PORT_BIT( 0x0100, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN )
+ PORT_BIT( 0x0600, IP_ACTIVE_HIGH, IPT_UNKNOWN )
+ PORT_BIT( 0x0800, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT )
+ PORT_BIT( 0x1000, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT )
+ PORT_BIT( 0xe000, IP_ACTIVE_HIGH, IPT_UNKNOWN )
+
+ PORT_START("AD1")
+ PORT_BIT(0xfff, 0x800, IPT_LIGHTGUN_X) PORT_CROSSHAIR(X, 1.10f, -0.055f, 0) PORT_MINMAX(0x000, 0xfff) PORT_SENSITIVITY(100) PORT_KEYDELTA(10) PORT_PLAYER(1)
+
+ PORT_START("AD2")
+ PORT_BIT(0xfff, 0x800, IPT_LIGHTGUN_Y) PORT_INVERT PORT_CROSSHAIR(Y, 1.148f, -0.1f, 0) PORT_MINMAX(0x000, 0xfff) PORT_SENSITIVITY(100) PORT_KEYDELTA(10) PORT_PLAYER(1)
+
+ PORT_START("AD3")
+ PORT_BIT( 0x003f, IP_ACTIVE_HIGH, IPT_UNKNOWN )
+ PORT_BIT( 0x0040, IP_ACTIVE_HIGH, IPT_UNKNOWN ) // unk, causes powerdown
+ PORT_BIT( 0x0080, IP_ACTIVE_HIGH, IPT_UNKNOWN ) // unk, causes powerdown
+ PORT_BIT( 0x0100, IP_ACTIVE_HIGH, IPT_UNKNOWN ) // unk, causes powerdown
+ PORT_BIT( 0x0200, IP_ACTIVE_HIGH, IPT_UNKNOWN ) // unk, causes powerdown
+ PORT_BIT( 0x0400, IP_ACTIVE_HIGH, IPT_UNKNOWN ) // unk, causes powerdown
+ PORT_BIT( 0x0800, IP_ACTIVE_HIGH, IPT_UNKNOWN ) // unk, causes powerdown
INPUT_PORTS_END
+static INPUT_PORTS_START( vjpp2 )
+ PORT_START("P1")
+ PORT_BIT( 0xffff, IP_ACTIVE_HIGH, IPT_UNKNOWN )
+
+ PORT_START("P2")
+ PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP )
+ PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN )
+ PORT_BIT( 0x0004, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT )
+ PORT_BIT( 0x0008, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT )
+ PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_BUTTON1 )
+ PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_BUTTON2 )
+ PORT_BIT( 0x0040, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("Pause")
+ PORT_BIT( 0xff80, IP_ACTIVE_HIGH, IPT_UNKNOWN )
+
+ PORT_START("P3")
+ PORT_BIT( 0xffff, IP_ACTIVE_HIGH, IPT_UNKNOWN )
+INPUT_PORTS_END
void spg2xx_pdc100_game_state::machine_start()
{
@@ -67,10 +140,11 @@ void spg2xx_pdc100_game_state::porta_w(offs_t offset, uint16_t data, uint16_t me
{
// pdc100 simply writes 0000 at times during bootup while initializing stuff, which causes an invalid bankswitch mid-code execution
if (data & 0xff00)
+ {
switch_bank(data & (m_numbanks - 1));
+ }
}
-
void spg2xx_pdc100_game_state::pdc100(machine_config &config)
{
non_spg_base(config);
@@ -78,8 +152,38 @@ void spg2xx_pdc100_game_state::pdc100(machine_config &config)
m_maincpu->porta_in().set_ioport("P1");
m_maincpu->portb_in().set_ioport("P2");
m_maincpu->portc_in().set_ioport("P3"); // not used?
+
+}
+
+void spg2xx_pdc100_game_state::pdc_tactile(machine_config& config)
+{
+ pdc100(config);
+
+ m_maincpu->porta_in().set_ioport("P1");
+ m_maincpu->portb_in().set_ioport("P2");
+ m_maincpu->portc_in().set_ioport("P3");
+
+ m_maincpu->adc_in<0>().set(FUNC(spg2xx_pdc100_game_state::touch_xpos_r));
+ m_maincpu->adc_in<1>().set(FUNC(spg2xx_pdc100_game_state::touch_ypos_r));
+ m_maincpu->adc_in<2>().set_ioport("AD3");
}
+
+void spg2xx_pdc100_game_state::init_pdc40t()
+{
+ uint8_t *src = memregion("maincpu")->base();
+ int len = memregion("maincpu")->bytes();
+
+ std::vector<u8> buffer(len);
+
+ for (int i = 0; i < len; i++)
+ {
+ buffer[i] = src[bitswap<26>(i, 18, 20, 16, 17, 24, 25, 19, 23, 22, 21, 5, 6, 7, 8, 13, 15, 14, 9, 10, 12, 11, 1, 2, 3, 4, 0)];
+ }
+ std::copy(buffer.begin(), buffer.end(), &src[0]);
+}
+
+
ROM_START( pdc100 )
ROM_REGION( 0x4000000, "maincpu", ROMREGION_ERASE00 )
// only 1st half of this is used "Jumper resistor (0 ohm) that short A25 to ground"
@@ -88,22 +192,54 @@ ROM_START( pdc100 )
ROM_IGNORE(0x4000000)
ROM_END
+ROM_START( pdc50 )
+ ROM_REGION( 0x4000000, "maincpu", ROMREGION_ERASE00 )
+ ROM_LOAD16_WORD_SWAP( "pdc50_7050.u3", 0x000000, 0x1000000, CRC(9b4eb348) SHA1(81d2ff5af7b6dc5e1f9277b45f259762e7d24cce) )
+ ROM_RELOAD(0x1000000,0x1000000)
+ ROM_RELOAD(0x2000000,0x1000000)
+ ROM_RELOAD(0x3000000,0x1000000)
+ROM_END
+
+
+
+ROM_START( pdc40t )
+ ROM_REGION( 0x4000000, "maincpu", ROMREGION_ERASE00 )
+ ROM_LOAD16_WORD_SWAP( "pdc_5060.bin", 0x000000, 0x4000000, CRC(28e0c16e) SHA1(fef4af00c737fab2716eef550badbbe0628f26a8) )
+ROM_END
+
ROM_START( tmntpdc )
ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASE00 )
ROM_LOAD16_WORD_SWAP( "pdc_turtles.bin", 0x000000, 0x800000, CRC(ee9e70a3) SHA1(7620f1b7aeaec8032faa8eb7552f775e8d6d14ba) )
ROM_END
+ROM_START( dorapdc )
+ ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASE00 )
+ ROM_LOAD16_WORD_SWAP( "pdc_dora_5030.bin", 0x000000, 0x800000, CRC(cea549ad) SHA1(b6ac8ea186d7c624451dd6121932cecb38c1f25f) )
+ROM_END
+
+ROM_START( vjpp2 )
+ ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASE00 )
+ ROM_LOAD16_WORD_SWAP( "29lv320at.u2", 0x000000, 0x400000, CRC(de2592eb) SHA1(9b537205808c502cf872e62f9701357ef8e28f3c) )
+ROM_END
// there were older models eg. PDC30 with fewer games, and some differences (eg "Jo Ma" instead of "Jo Ma 2")
// "Jo Ma 2" shows "Licensed by Mitchell Corporation" (Mitchell made the original Puzzloop on which this style of game is based) Videos of the original Jo Ma show it lacking this text.
// Other known units
-// PDC Dora the Explorer
// PDC 30
// PDC 40
// PDC 200
// This was dumped from an Anncia branded unit, although there's no ingame branding, so ROM is probably the same for all PDC100 units
-CONS( 2008, pdc100, 0, 0, pdc100, pdc100, spg2xx_pdc100_game_state, empty_init, "Conny", "PDC100 - Pocket Dream Console", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS )
+CONS( 2008, pdc100, 0, 0, pdc100, pdc100, spg2xx_pdc100_game_state, empty_init, "Conny / Anncia", "PDC100 - Pocket Dream Console (Anncia, US)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS )
+
+// interestingly this is newer than the PDC100 above, despite containing fewer games
+CONS( 2010, pdc50, 0, 0, pdc100, pdc100, spg2xx_pdc100_game_state, empty_init , "Conny / VideoJet", "PDC50 - Pocket Dream Console (VideoJet, France)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS )
+
+CONS( 2011, pdc40t, 0, 0, pdc_tactile, pdc_tactile, spg2xx_pdc100_game_state, init_pdc40t, "Conny / VideoJet", "PDC40 Tactile - Pocket Dream Console (VideoJet, France)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS ) // needs touch input
+
+CONS( 2013, tmntpdc, 0, 0, pdc100, pdc100, spg2xx_pdc100_game_state, empty_init, "Conny / VideoJet", "Teenage Mutant Ninja Turtles - Pocket Dream Console (VideoJet, France)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS )
+
+CONS( 2013, dorapdc, 0, 0, pdc100, pdc100, spg2xx_pdc100_game_state, empty_init, "Conny / VideoJet", "Dora l'exploratrice - Pocket Dream Console (VideoJet, France)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS )
-CONS( 2013, tmntpdc, 0, 0, pdc100, pdc100, spg2xx_pdc100_game_state, empty_init, "Conny / VideoJet", "Teenage Mutant Ninja Turtles - Pocket Dream Console (France)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS )
+CONS( 200?, vjpp2, 0, 0, pdc100, vjpp2, spg2xx_pdc100_game_state, empty_init, "Conny / VideoJet", "Plug Play TV Games 2 (4-in-1) (VideoJet, France)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS )
diff --git a/src/mame/drivers/spg2xx_wiwi.cpp b/src/mame/drivers/spg2xx_wiwi.cpp
index ceeec61c580..7d3836ec0a2 100644
--- a/src/mame/drivers/spg2xx_wiwi.cpp
+++ b/src/mame/drivers/spg2xx_wiwi.cpp
@@ -28,38 +28,249 @@ class spg2xx_game_marc101_state : public spg2xx_game_state
{
public:
spg2xx_game_marc101_state(const machine_config &mconfig, device_type type, const char *tag) :
- spg2xx_game_state(mconfig, type, tag)
+ spg2xx_game_state(mconfig, type, tag),
+ m_prev_porta(0),
+ m_toggle(false)
{ }
+ void marc101(machine_config &config);
+
void init_m489();
protected:
+ void machine_start() override;
+ void machine_reset() override;
+
+ virtual void device_timer(emu_timer& timer, device_timer_id id, int param, void* ptr) override;
+
+ virtual uint16_t porta_r();
+ virtual void porta_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0) override;
+ virtual void portb_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0) override;
+
+ uint16_t m_prev_porta;
+ bool m_toggle;
+ emu_timer *m_pulse_timer;
private:
- void portb_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0) override;
+
};
-class spg2xx_game_marc250_state : public spg2xx_game_state
+class spg2xx_game_marc250_state : public spg2xx_game_marc101_state
{
public:
spg2xx_game_marc250_state(const machine_config &mconfig, device_type type, const char *tag) :
- spg2xx_game_state(mconfig, type, tag)
+ spg2xx_game_marc101_state(mconfig, type, tag),
+ m_toggle2(false)
{ }
void init_m527();
protected:
- void machine_reset() override
- {
- spg2xx_game_state::machine_reset();
- switch_bank(31);
- m_maincpu->reset();
- }
+ void machine_start() override;
+ void machine_reset() override;
+
+ virtual void device_timer(emu_timer& timer, device_timer_id id, int param, void* ptr) override;
+
+ virtual uint16_t porta_r() override;
+ virtual void porta_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0) override;
+ virtual void portb_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0) override;
private:
- void portb_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0) override;
+ bool m_toggle2;
+ emu_timer *m_pulse_timer2;
};
+void spg2xx_game_marc101_state::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
+{
+ switch (id)
+ {
+ case 0:
+ m_toggle = !m_toggle;
+ //printf("toggle\n");
+ break;
+ }
+}
+
+void spg2xx_game_marc250_state::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
+{
+ switch (id)
+ {
+ case 0:
+ m_toggle = !m_toggle;
+ //printf("toggle\n");
+ break;
+
+ case 1:
+ m_toggle2 = !m_toggle2;
+ //printf("toggle\n");
+ break;
+ }
+}
+
+
+void spg2xx_game_marc101_state::machine_start()
+{
+ spg2xx_game_state::machine_start();
+ m_pulse_timer = timer_alloc(0);
+ m_pulse_timer->adjust(attotime::never);
+
+}
+
+void spg2xx_game_marc101_state::machine_reset()
+{
+ spg2xx_game_state::machine_reset();
+ m_pulse_timer->adjust(attotime::never);
+ m_prev_porta = 0;
+ m_toggle = false;
+}
+
+void spg2xx_game_marc250_state::machine_start()
+{
+ spg2xx_game_marc101_state::machine_start();
+ m_pulse_timer2 = timer_alloc(1);
+ m_pulse_timer2->adjust(attotime::never);
+
+ // hack, makes x-racer3 and some others more stable, TODO: find out what is really wrong
+ m_maincpu->set_clock_scale(2.0000f);
+
+}
+
+void spg2xx_game_marc250_state::machine_reset()
+{
+ spg2xx_game_marc101_state::machine_reset();
+ switch_bank(31);
+ m_maincpu->reset();
+
+ m_pulse_timer2->adjust(attotime::never);
+ m_toggle2 = false;
+}
+
+
+void spg2xx_game_marc101_state::marc101(machine_config &config)
+{
+ spg2xx(config);
+
+ m_maincpu->set_pal(true);
+ m_screen->set_refresh_hz(50);
+
+ m_maincpu->porta_in().set(FUNC(spg2xx_game_marc101_state::porta_r));
+ m_maincpu->porta_out().set(FUNC(spg2xx_game_marc101_state::porta_w));
+}
+
+
+// are these Port A behaviors related to IO A Special mode on the SoC?
+// the bits being tested do seem to be 'ExtClk2 / ExtClk1'
+
+uint16_t spg2xx_game_marc101_state::porta_r()
+{
+ uint16_t ret = m_io_p1->read() &~ 0x2000;
+
+ ret |= m_toggle ? 0x2000 : 0x0000;
+
+ return ret;
+}
+
+
+void spg2xx_game_marc101_state::porta_w(offs_t offset, uint16_t data, uint16_t mem_mask)
+{
+ logerror("%s: porta_w %04x (%04x) %c %c %c %c | %c %c %c %c | %c %c %c %c | %c %c %c %c \n", machine().describe_context(), data, mem_mask,
+ (mem_mask & 0x8000) ? ((data & 0x8000) ? '1' : '0') : 'x',
+ (mem_mask & 0x4000) ? ((data & 0x4000) ? '1' : '0') : 'x',
+ (mem_mask & 0x2000) ? ((data & 0x2000) ? '1' : '0') : 'x',
+ (mem_mask & 0x1000) ? ((data & 0x1000) ? '1' : '0') : 'x',
+ (mem_mask & 0x0800) ? ((data & 0x0800) ? '1' : '0') : 'x',
+ (mem_mask & 0x0400) ? ((data & 0x0400) ? '1' : '0') : 'x',
+ (mem_mask & 0x0200) ? ((data & 0x0200) ? '1' : '0') : 'x',
+ (mem_mask & 0x0100) ? ((data & 0x0100) ? '1' : '0') : 'x',
+ (mem_mask & 0x0080) ? ((data & 0x0080) ? '1' : '0') : 'x',
+ (mem_mask & 0x0040) ? ((data & 0x0040) ? '1' : '0') : 'x',
+ (mem_mask & 0x0020) ? ((data & 0x0020) ? '1' : '0') : 'x',
+ (mem_mask & 0x0010) ? ((data & 0x0010) ? '1' : '0') : 'x',
+ (mem_mask & 0x0008) ? ((data & 0x0008) ? '1' : '0') : 'x',
+ (mem_mask & 0x0004) ? ((data & 0x0004) ? '1' : '0') : 'x',
+ (mem_mask & 0x0002) ? ((data & 0x0002) ? '1' : '0') : 'x',
+ (mem_mask & 0x0001) ? ((data & 0x0001) ? '1' : '0') : 'x');
+
+ // see function at 053E19 (marc101)
+ // it has several states
+ // 00 - wait a while
+ // 01 - set 0x0400 in port a high
+ // 02 - clear 0x0400 in port a
+ // 07 - measure number of times 0x2000 on port a changes, with min/max acceptable values and a timeout
+ // ff - failure (causes blank screen / shutdown + inf loop)
+ if ((data & 0x0400) != (m_prev_porta & 0x0400))
+ {
+ if (!(data & 0x0400))
+ {
+ //logerror("pulse / timer reset\n");
+ m_pulse_timer->adjust(attotime::from_hz(32), 0, attotime::from_hz(32));
+ }
+ }
+
+ m_prev_porta = data;
+}
+
+uint16_t spg2xx_game_marc250_state::porta_r()
+{
+ uint16_t ret = m_io_p1->read() &~ 0x6000;
+ ret |= m_toggle ? 0x2000 : 0x0000;
+ ret |= m_toggle2 ? 0x4000 : 0x0000;
+// printf("porta %04x\n", ret);
+
+ return ret;
+}
+
+
+void spg2xx_game_marc250_state::porta_w(offs_t offset, uint16_t data, uint16_t mem_mask)
+{
+ logerror("%s: porta_w %04x (%04x) %c %c %c %c | %c %c %c %c | %c %c %c %c | %c %c %c %c \n", machine().describe_context(), data, mem_mask,
+ (mem_mask & 0x8000) ? ((data & 0x8000) ? '1' : '0') : 'x',
+ (mem_mask & 0x4000) ? ((data & 0x4000) ? '1' : '0') : 'x',
+ (mem_mask & 0x2000) ? ((data & 0x2000) ? '1' : '0') : 'x',
+ (mem_mask & 0x1000) ? ((data & 0x1000) ? '1' : '0') : 'x',
+ (mem_mask & 0x0800) ? ((data & 0x0800) ? '1' : '0') : 'x',
+ (mem_mask & 0x0400) ? ((data & 0x0400) ? '1' : '0') : 'x',
+ (mem_mask & 0x0200) ? ((data & 0x0200) ? '1' : '0') : 'x',
+ (mem_mask & 0x0100) ? ((data & 0x0100) ? '1' : '0') : 'x',
+ (mem_mask & 0x0080) ? ((data & 0x0080) ? '1' : '0') : 'x',
+ (mem_mask & 0x0040) ? ((data & 0x0040) ? '1' : '0') : 'x',
+ (mem_mask & 0x0020) ? ((data & 0x0020) ? '1' : '0') : 'x',
+ (mem_mask & 0x0010) ? ((data & 0x0010) ? '1' : '0') : 'x',
+ (mem_mask & 0x0008) ? ((data & 0x0008) ? '1' : '0') : 'x',
+ (mem_mask & 0x0004) ? ((data & 0x0004) ? '1' : '0') : 'x',
+ (mem_mask & 0x0002) ? ((data & 0x0002) ? '1' : '0') : 'x',
+ (mem_mask & 0x0001) ? ((data & 0x0001) ? '1' : '0') : 'x');
+
+ // see function at 8AB2 (marc250 menu)
+ // it has several states
+ // 00 - wait a while
+ // 01 - clear 0x1000 in port a
+ // 02 - wait a while
+ // 05 - check rate of port a bit 0x4000
+
+ // 06 - wait a while
+ // 07 - clear 0x1000 in port a
+ // 08 - wait a while
+ // 09 - check rate of port a bit 0x2000
+
+ // ff - failure (causes blank screen / shutdown + inf loop)
+
+ // function is at 04D918 in x-racer 3 (values tweaked to pass)
+ // but x-racer 3 also seems to need faster CPU or it randomly corrupts (or its an IRQ problem?)
+
+ if ((data & 0x1000) != (m_prev_porta & 0x1000))
+ {
+ if (!(data & 0x1000))
+ {
+ // these values stop the marc250 menu from failing, but not the games
+ //printf("pulse / timer reset\n");
+ m_pulse_timer->adjust(attotime::from_hz(6), 0, attotime::from_hz(6));
+ m_pulse_timer2->adjust(attotime::from_hz(12), 0, attotime::from_hz(12));
+ }
+ }
+
+ m_prev_porta = data;
+}
static INPUT_PORTS_START( wiwi18 )
@@ -302,7 +513,7 @@ void spg2xx_game_wiwi18_state::init_wiwi18()
}
- void spg2xx_game_wiwi18_state::portb_w(offs_t offset, uint16_t data, uint16_t mem_mask)
+void spg2xx_game_wiwi18_state::portb_w(offs_t offset, uint16_t data, uint16_t mem_mask)
{
logerror("%s: portb_w %04x (%04x) %c %c %c %c | %c %c %c %c | %c %c %c %c | %c %c %c %c \n", machine().describe_context(), data, mem_mask,
(mem_mask & 0x8000) ? ((data & 0x8000) ? '1' : '0') : 'x',
@@ -329,15 +540,10 @@ void spg2xx_game_wiwi18_state::init_wiwi18()
else
switch_bank(0);
}
-
}
void spg2xx_game_marc101_state::init_m489()
{
- uint16_t* rom = (uint16_t*)memregion("maincpu")->base();
-
- // bypass a call that turns unit off after about 2 seconds, maybe it's a battery check?
- if (rom[0x6460]==0x4240) rom[0x6460] = 0x4241;
}
void spg2xx_game_marc101_state::portb_w(offs_t offset, uint16_t data, uint16_t mem_mask)
@@ -383,13 +589,11 @@ void spg2xx_game_marc101_state::portb_w(offs_t offset, uint16_t data, uint16_t m
void spg2xx_game_marc250_state::init_m527()
{
- uint16_t* rom = (uint16_t*)memregion("maincpu")->base();
- // bypass a call that turns unit off after about 10 seconds, maybe it's a battery check?
- rom[((31 * 0x800000) / 2) | 0x004ea5] = 0x4241;
-
- // same for xracing 3
- rom[((22 * 0x800000) / 2) | 0x00eb2a] = 0x4241;
+ // the code being patched turns the IRQ off, code looks a bit like smarttv code.. is SoC IRQ handling wrong?
+ // or is this more security, or something else? games don't run with the IRQ off...
+#if 1
+ uint16_t* rom = (uint16_t*)memregion("maincpu")->base();
uint16_t ident2[6] = { 0x9512, 0x2862, 0xa70a, 0x0002, 0xd71b, 0x2862 };
@@ -412,7 +616,6 @@ void spg2xx_game_marc250_state::init_m527()
}
}
- // this turns the IRQ off, code looks a bit like smarttv code.. is SoC IRQ handling wrong?
// pass maze road
//rom[((12 * 0x800000) / 2) | 0x0284b5] = 0x0003;
@@ -422,7 +625,7 @@ void spg2xx_game_marc250_state::init_m527()
//rom[((17 * 0x800000) / 2) | 0x015e58] = 0x0003;
// cliff overhang / gym dancing
//rom[((18 * 0x800000) / 2) | 0x01cab4] = 0x0003;
- rom[((18 * 0x800000) / 2) | 0x021e25] = 0xffff;
+ rom[((18 * 0x800000) / 2) | 0x021e25] = 0xffff; // secondary 'turn off'
// jump chess
//rom[((19 * 0x800000) / 2) | 0x012c3a] = 0x0003;
// boxing, basketball etc.
@@ -435,13 +638,14 @@ void spg2xx_game_marc250_state::init_m527()
//rom[((26 * 0x800000) / 2) | 0x0084dd] = 0x0003;
// 4 score
//rom[((27 * 0x800000) / 2) | 0x145cdd] = 0x0003;
+#endif
}
void spg2xx_game_marc250_state::portb_w(offs_t offset, uint16_t data, uint16_t mem_mask)
{
- if (m_maincpu->pc() == 0x18)
+ if (m_maincpu->pc() < 0x2000)
{
- printf("%s: portb_w %04x (%04x) %c %c %c %c | %c %c %c %c | %c %c %c %c | %c %c %c %c \n", machine().describe_context().c_str(), data, mem_mask,
+ logerror("%s: portb_w %04x (%04x) %c %c %c %c | %c %c %c %c | %c %c %c %c | %c %c %c %c \n", machine().describe_context(), data, mem_mask,
(mem_mask & 0x8000) ? ((data & 0x8000) ? '1' : '0') : 'x',
(mem_mask & 0x4000) ? ((data & 0x4000) ? '1' : '0') : 'x',
(mem_mask & 0x2000) ? ((data & 0x2000) ? '1' : '0') : 'x',
@@ -496,9 +700,10 @@ void spg2xx_game_marc250_state::portb_w(offs_t offset, uint16_t data, uint16_t m
// bank 30 = (used) 'ROM 2 64M'
// bank 31 = (used) menu (no bank number check)
- if ((m_maincpu->pc() == 0x18) && (data != 0x00ff))
+ // bits 0x1804 aren't set as an output, but clearly need to be treated as output, also bad values of 0x00ff and 0x0000 are written on startup, with direction bits set!
+ // this seems similar to issues with banking in some other units.
+ if ((m_maincpu->pc() < 0x2000) && (data != 0x00ff) && (data != 0x0000))
{
- // bits 0x1804 aren't set as an output, but clearly need to be treated as output
switch (data & 0x1807)
{
case 0x0000: switch_bank(0); break; // unused
@@ -583,6 +788,6 @@ CONS( 200?, foxsport, 0, 0, rad_skat, wiwi18, spg2xx_game_wiwi18_state,
// thtere is another 'Drahtlose Spielekonsole 48-in-1' with '11 hyper sports games' (including Running) which are clearly SunPlus and would fit here, with the 37 non-hyper sports games presumably again being a NES/Famiclone cart
-CONS( 200?, marc101, 0, 0, spg2xx, m489, spg2xx_game_marc101_state, init_m489, "Millennium 2000 GmbH", "Millennium Arcade 101 (M489) (Game Station 2 101-in-1)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS )
+CONS( 2014, marc101, 0, 0, marc101, m489, spg2xx_game_marc101_state, init_m489, "Millennium 2000 GmbH", "Millennium Arcade 101 (M489) (Game Station 2 101-in-1)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS )
-CONS( 200?, marc250, 0, 0, spg2xx, m489, spg2xx_game_marc250_state, init_m527, "Millennium 2000 GmbH", "Millennium Arcade 250 (M527)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS )
+CONS( 2015, marc250, 0, 0, marc101, m489, spg2xx_game_marc250_state, init_m527, "Millennium 2000 GmbH", "Millennium Arcade 250 (M527)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS )
diff --git a/src/mame/drivers/vsmile.cpp b/src/mame/drivers/vsmile.cpp
index 723bb22e32a..b5bc1a83c4a 100644
--- a/src/mame/drivers/vsmile.cpp
+++ b/src/mame/drivers/vsmile.cpp
@@ -323,9 +323,22 @@ ROM_END
ROM_START( vsmilem )
ROM_REGION16_BE( 0x800000, "sysrom", ROMREGION_ERASEFF )
- ROM_LOAD16_WORD_SWAP( "vsmilemotion.bin", 0x000000, 0x200000, CRC(60fa5426) SHA1(91e0b7b44b975df65095d6ee622436d65fb1aca5) ) // from a Spanish unit (but doesn't seem region specific)
+ ROM_SYSTEM_BIOS( 0, "bios0", "bios0" )
+ ROMX_LOAD( "vsmilemotion.bin", 0x000000, 0x200000, CRC(60fa5426) SHA1(91e0b7b44b975df65095d6ee622436d65fb1aca5), ROM_GROUPWORD | ROM_REVERSE | ROM_BIOS(0) ) // from a Spanish unit (but doesn't seem region specific)
+
+ /* This ROM doesn't show the 'Motion' logo at all, but was dumped from a Motion unit
+
+ Console says "Vtech V.Smile V-motion Active Learning System"
+ "FCC ID 62R-0788, IC 1135D-0788" "53-36600-056-080"
+ melted into plastic "VT8281"
+ The PCB has the code 35-078800-001-103_708979-2.
+ */
+ ROM_SYSTEM_BIOS( 1, "bios1", "bios1" )
+ ROMX_LOAD( "vmotionbios.bin", 0x000000, 0x200000, CRC(427087ea) SHA1(dc9eaa55f4a0047b6069ef73beea86d26f0f5394), ROM_GROUPWORD | ROM_REVERSE | ROM_BIOS(1) ) // from a US unit
+
ROM_END
+
// year, name, parent, compat, machine, input, class, init, company, fullname, flags
CONS( 2005, vsmile, 0, 0, vsmile, vsmile, vsmile_state, empty_init, "VTech", "V.Smile", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS )
CONS( 2008, vsmilem, vsmile, 0, vsmilem, vsmilem, vsmilem_state, empty_init, "VTech", "V.Smile Motion", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS )
diff --git a/src/mame/includes/generalplus_gpl16250_nand.h b/src/mame/includes/generalplus_gpl16250_nand.h
index 3613c9d83cd..34c24423fcf 100644
--- a/src/mame/includes/generalplus_gpl16250_nand.h
+++ b/src/mame/includes/generalplus_gpl16250_nand.h
@@ -35,6 +35,7 @@ public:
void nand_vbaby();
void nand_tsm();
void nand_beambox();
+ void nand_kiugames();
protected:
virtual void machine_start() override;
diff --git a/src/mame/mame.lst b/src/mame/mame.lst
index da64ecdd346..8ef8a06fd62 100644
--- a/src/mame/mame.lst
+++ b/src/mame/mame.lst
@@ -14738,6 +14738,7 @@ mobigo2
@source:generalplus_gpl16250_nand.cpp
wlsair60 // Wireless Air 60
+kiugames
jak_car2
jak_gtg
jak_sspop
@@ -31661,6 +31662,7 @@ nespal // Nintendo Entertainment System PAL
pjoypj001
afbm7800
dnce2000
+vtvppong
@source:nes_sh6578.cpp
bandgpad
@@ -37625,7 +37627,11 @@ mgt20in1
@source:spg2xx_pdc.cpp
pdc100
+pdc50
+pdc40t
tmntpdc
+dorapdc
+vjpp2
@source:spg2xx_playvision.cpp
pvmil //