diff --git a/hash/ekara_japan_gk.xml b/hash/ekara_japan_gk.xml
index e088ebb1155..ff4b921c771 100644
--- a/hash/ekara_japan_gk.xml
+++ b/hash/ekara_japan_gk.xml
@@ -14,8 +14,8 @@ license:CC0
(check what units these are for)
*GK-1 Detective Conan
- GK-2 (unknown)
- GK-3 (seen)
+ *GK-2 Disney Princess: Princess Debut
+ *GK-3 Disney Tinkerbell to Tinkle Star Uranai
(more? what's the GK highest number?)
@@ -31,5 +31,28 @@ license:CC0
+
+
+ GK-2 - Disney Princess: Princess Debut (Japan)
+ 2004
+ Takara
+
+
+
+
+
+
+
+
+
+ GK-3 - Disney Tinkerbell to Tinkle Star Uranai (Japan)
+ 2004
+ Takara
+
+
+
+
+
+
diff --git a/hash/ekara_japan_s.xml b/hash/ekara_japan_s.xml
index b92de86aeb2..8b9ae596140 100644
--- a/hash/ekara_japan_s.xml
+++ b/hash/ekara_japan_s.xml
@@ -13,7 +13,7 @@ license:CC0
SAI seems to be used for multiple different series here, need to look at the subtitles too
- S-1 SC0001- Hello Kitty Special
+ S-1 *SC0001-KTY Hello Kitty Special
S-2 SC0002-SAI SAI (series 3) Volume 1
S-3 *SC0003- Kids' Challenge Volume 1
S-4 *SC0004-SAI SAI (series 1) Volume 1
@@ -43,6 +43,18 @@ license:CC0
+
+ Hello Kitty Special (Japan) (SC0001-KTY)
+ 2001
+ Takara
+
+
+
+
+
+
+
+
Kids' Challenge Volume 1 (Japan) (SC0003-xxx)
2001
diff --git a/hash/ekara_japan_sp.xml b/hash/ekara_japan_sp.xml
index 7739a38e47e..95d4923955f 100644
--- a/hash/ekara_japan_sp.xml
+++ b/hash/ekara_japan_sp.xml
@@ -26,13 +26,13 @@ license:CC0
SP-01 (unknown)
*SP-02 'Super Cartridge' SP-2
- *SP-03 'Super Cartridge' SP-3
+ *SP-03 'Super Cartridge' SP-3 TV Pop
*SP-04 'Super Cartridge' SP-4
- SP-05
+ *SP-05 'Super Cartridge' SP-5 TV POP Junior with Chibi Marukochan & Anpanman
SP-06 (seen)
SP-07 (seen)
- (more? what's the SP highest number?)
+ (more? what's the SP highest number? correct titles for each of these etc.)
-->
@@ -49,7 +49,7 @@ license:CC0
- SP-03 Super Cartridge (Japan)
+ SP-03 Super Cartridge - TV Pop (Japan)
2004
Takara
@@ -71,5 +71,17 @@ license:CC0
+
+
+ SP-05 Super Cartridge - TV POP Junior with Chibi Marukochan & Anpanman (Japan)
+ 2004
+ Takara
+
+
+
+
+
+
+
diff --git a/hash/leapfrog_didj_cart.xml b/hash/leapfrog_didj_cart.xml
index 493fb166533..5614b4e747b 100644
--- a/hash/leapfrog_didj_cart.xml
+++ b/hash/leapfrog_didj_cart.xml
@@ -70,4 +70,16 @@
+
+ Super Chicks (USA)
+ 2008
+ LeapFrog
+
+
+
+
+
+
+
+
diff --git a/hash/leapfrog_zippity_cart.xml b/hash/leapfrog_zippity_cart.xml
new file mode 100644
index 00000000000..9a2020a3aff
--- /dev/null
+++ b/hash/leapfrog_zippity_cart.xml
@@ -0,0 +1,40 @@
+
+
+
+
+
+
+
+
+ The World of Cars - Driven to Learn (500-13589-B) (UK)
+ 2009
+ LeapFrog
+
+
+
+
+
+
+
+
+ Disney Princess - Magical Movement & Learning (500-13590-A) (UK)
+ 2009
+ LeapFrog
+
+
+
+
+
+
+
+
diff --git a/src/mame/drivers/generalplus_gpl32612.cpp b/src/mame/drivers/generalplus_gpl32612.cpp
index 4132440e503..59236a52f6d 100644
--- a/src/mame/drivers/generalplus_gpl32612.cpp
+++ b/src/mame/drivers/generalplus_gpl32612.cpp
@@ -24,6 +24,9 @@
#include "cpu/arm7/arm7.h"
#include "cpu/arm7/arm7core.h"
+#include "bus/generic/slot.h"
+#include "bus/generic/carts.h"
+#include "softlist.h"
#include "screen.h"
#include "speaker.h"
@@ -41,18 +44,19 @@ public:
void nand_init840();
-private:
+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_gpl32612(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
+private:
+
void nand_init(int blocksize, int blocksize_stripped);
void copy_block(int i, int blocksize, int blocksize_stripped, uint8_t* nandrom, int dest);
void bootstrap();
@@ -65,6 +69,30 @@ private:
uint32_t unk_d0900153_r(offs_t offset, uint32_t mem_mask);
};
+
+class generalplus_zippity_game_state : public generalplus_gpl32612_game_state
+{
+public:
+ generalplus_zippity_game_state(const machine_config &mconfig, device_type type, const char *tag) :
+ generalplus_gpl32612_game_state(mconfig, type, tag),
+ m_cart(*this, "cartslot"),
+ m_cart_region(nullptr)
+ { }
+
+ void zippity(machine_config &config);
+
+protected:
+ virtual void machine_start() override;
+
+ DECLARE_DEVICE_IMAGE_LOAD_MEMBER(cart_load);
+
+ required_device m_cart;
+ memory_region *m_cart_region;
+
+
+};
+
+
uint32_t generalplus_gpl32612_game_state::unk_d000003c_r(offs_t offset, uint32_t mem_mask)
{
return machine().rand();
@@ -144,7 +172,7 @@ void generalplus_gpl32612_game_state::bootstrap()
void generalplus_gpl32612_game_state::gpl32612(machine_config &config)
{
- ARM9(config, m_maincpu, 240000000); // unknown core / frequency, but ARM based
+ ARM9(config, m_maincpu, 240'000'000); // unknown core / frequency, but ARM based
m_maincpu->set_addrmap(AS_PROGRAM, &generalplus_gpl32612_game_state::arm_map);
SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
@@ -157,6 +185,54 @@ void generalplus_gpl32612_game_state::gpl32612(machine_config &config)
SPEAKER(config, "rspeaker").front_right();
}
+void generalplus_zippity_game_state::machine_start()
+{
+ generalplus_gpl32612_game_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);
+ }
+}
+
+DEVICE_IMAGE_LOAD_MEMBER(generalplus_zippity_game_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;
+}
+
+
+
+void generalplus_zippity_game_state::zippity(machine_config &config)
+{
+ // don't inherit from gpl32612 as in reality this is GPL32300A and could differ
+
+ ARM9(config, m_maincpu, 240'000'000); // unknown core / frequency, but ARM based
+ m_maincpu->set_addrmap(AS_PROGRAM, &generalplus_zippity_game_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(generalplus_zippity_game_state::screen_update_gpl32612));
+
+ SPEAKER(config, "lspeaker").front_left();
+ SPEAKER(config, "rspeaker").front_right();
+
+ GENERIC_CARTSLOT(config, m_cart, generic_plain_slot, "leapfrog_zippity_cart");
+ m_cart->set_width(GENERIC_ROM16_WIDTH);
+ m_cart->set_device_load(FUNC(generalplus_zippity_game_state::cart_load));
+
+ SOFTWARE_LIST(config, "cart_list").set_original("leapfrog_zippity_cart");
+}
+
+
+
// NAND dumps, so there will be a bootloader / boot strap at least
ROM_START( jak_swbstrik )
@@ -245,6 +321,6 @@ CONS( 200?, jak_prhp, 0, 0, gpl32612, gpl32612, generalplus_gp
CONS( 200?, jak_dchp, 0, 0, gpl32612, gpl32612, generalplus_gpl32612_game_state, nand_init840, "JAKKS Pacific Inc", "DC Super Heroes The Watchtower Hero Portal", MACHINE_IS_SKELETON )
// Might not belong here, SoC is marked GPL32300A instead, but is still ARM based, and has GPNAND strings
-CONS( 201?, zippity, 0, 0, gpl32612, gpl32612, generalplus_gpl32612_game_state, empty_init, "LeapFrog", "Zippity (US)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING)
+CONS( 201?, zippity, 0, 0, zippity, gpl32612, generalplus_zippity_game_state, empty_init, "LeapFrog", "Zippity (US)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING)
// TODO, check if code differs, or just unused areas of the NAND
-CONS( 201?, zippityuk, zippity, 0, gpl32612, gpl32612, generalplus_gpl32612_game_state, empty_init, "LeapFrog", "Zippity (UK)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING)
+CONS( 201?, zippityuk, zippity, 0, zippity, gpl32612, generalplus_zippity_game_state, empty_init, "LeapFrog", "Zippity (UK)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING)
diff --git a/src/mame/drivers/nes_vt09.cpp b/src/mame/drivers/nes_vt09.cpp
index ac4f8a5fc35..70dd95d1004 100644
--- a/src/mame/drivers/nes_vt09.cpp
+++ b/src/mame/drivers/nes_vt09.cpp
@@ -324,7 +324,8 @@ static INPUT_PORTS_START( nes_vt09_msi )
PORT_START("IO0")
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(1) PORT_NAME("A")
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(1) PORT_NAME("B")
- PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_PLAYER(1) // doesn't exist?
+ //PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_PLAYER(1) // doesn't exist?
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED )
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_PLAYER(1)
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_PLAYER(1) PORT_8WAY
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_PLAYER(1) PORT_8WAY
@@ -339,7 +340,8 @@ static INPUT_PORTS_START( nes_vt09_msi_mm2 )
PORT_START("IO0")
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(1) PORT_NAME("A")
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(1) PORT_NAME("B")
- PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_PLAYER(1) // doesn't exist?
+ //PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_PLAYER(1) // doesn't exist?
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED )
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_PLAYER(1)
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_PLAYER(1) PORT_8WAY
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_PLAYER(1) PORT_8WAY
@@ -371,6 +373,11 @@ ROM_START( msimm2 )
ROM_LOAD( "megaman2_s99jl032hbt1_001227e_readas_s29jl032h.bin", 0x00000, 0x400000, CRC(f537a053) SHA1(bd9353df34c0c0ee7d0e5e9808fc36f1a5eecc22) )
ROM_END
+ROM_START( msinamco )
+ ROM_REGION( 0x200000, "mainrom", 0 )
+ ROM_LOAD( "msinamco3in1.bin", 0x00000, 0x200000, CRC(c69ad54a) SHA1(f12b9274d827e8a8a8f1bf2646fa426d9f8e6ece) )
+ROM_END
+
ROM_START( msimpac )
ROM_REGION( 0x100000, "mainrom", 0 )
ROM_LOAD( "mspacman_29dl800ba_000422cb.bin", 0x00000, 0x100000, CRC(c66300e3) SHA1(3fc0bdfbf449d884151f1b581e848243cd2df3a5) )
@@ -463,6 +470,8 @@ CONS( 2016, msisinv, 0, 0, nes_vt09_1mb, nes_vt09_msi, nes_vt09_state, empt
// MSI also issued a version in the original Majesco shell but with the updated case logos and boot logos in the software, the software on that revision might match this one.
CONS( 2016, msifrog, 0, 0, nes_vt09_4mb_rasterhack, nes_vt09_msi, nes_vt09_state, empty_init, "MSI / Konami", "Frogger (MSI Plug & Play, white joystick)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) // raster timing for need a hack
+CONS( 2018, msinamco, 0, 0, nes_vt09_1mb, nes_vt09_msi, nes_vt09_state, empty_init, "MSI / Bandai Namco", "Namco Classics Vol.1 (3-in-1) (MSI Plug & Play)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
+
// MSI Midway (Joust+Gauntlet 2 + Defender 2) has 2x Globs, rather than Glob + Flash ROM
// this is VT09 based
diff --git a/src/mame/drivers/spg2xx.cpp b/src/mame/drivers/spg2xx.cpp
index 4dea858b588..f344089fca7 100644
--- a/src/mame/drivers/spg2xx.cpp
+++ b/src/mame/drivers/spg2xx.cpp
@@ -1066,6 +1066,69 @@ static INPUT_PORTS_START( hotwheels )
PORT_BIT( 0xffff, IP_ACTIVE_HIGH, IPT_UNUSED )
INPUT_PORTS_END
+
+// TODO: work out how to access hidden test mode again
+static INPUT_PORTS_START( doraphone )
+ PORT_START("P1")
+ PORT_CONFNAME( 0x0070, 0x0060, "On/Off Mode Slider" )
+ PORT_CONFSETTING( 0x0030, "Play Alone (no video)" )
+ PORT_CONFSETTING( 0x0060, "Play on TV" )
+
+ PORT_BIT( 0x0080, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(1) PORT_NAME("Lift Handset") // this could be done as a toggle, although note, handset being down is treated like a button being held
+ PORT_BIT( 0x0100, IP_ACTIVE_HIGH, IPT_CUSTOM ) // this setting is US NTSC, ACTIVE_LOW gives US PAL (invalid?) no way to switch to non-US?
+ PORT_BIT( 0x0200, IP_ACTIVE_LOW, IPT_CUSTOM ) // must be 0x0200 or resets over and over
+ PORT_BIT( 0x0400, IP_ACTIVE_LOW, IPT_UNUSED )
+ PORT_BIT( 0x0800, IP_ACTIVE_LOW, IPT_UNUSED )
+ PORT_BIT( 0x1000, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_PLAYER(1)
+ PORT_BIT( 0x2000, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_PLAYER(1)
+ PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_PLAYER(1)
+ PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(1)
+
+ PORT_START("P1_ROW1")
+ PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("Phone Pad 1") PORT_CODE(KEYCODE_1_PAD)
+ PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("Phone Pad 4") PORT_CODE(KEYCODE_4_PAD)
+ PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("Phone Pad 7") PORT_CODE(KEYCODE_7_PAD)
+ PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("Phone Pad 'Repeat'") PORT_CODE(KEYCODE_PLUS_PAD)
+
+ PORT_START("P1_ROW2")
+ PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("Phone Pad 2") PORT_CODE(KEYCODE_2_PAD)
+ PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("Phone Pad 5") PORT_CODE(KEYCODE_5_PAD)
+ PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("Phone Pad 8") PORT_CODE(KEYCODE_8_PAD)
+ PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("Phone Pad 0") PORT_CODE(KEYCODE_0_PAD)
+
+ PORT_START("P1_ROW3")
+ PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("Phone Pad 3") PORT_CODE(KEYCODE_3_PAD)
+ PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("Phone Pad 6") PORT_CODE(KEYCODE_6_PAD)
+ PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("Phone Pad 9") PORT_CODE(KEYCODE_9_PAD)
+ PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("Phone Pad 'Help'") PORT_CODE(KEYCODE_MINUS_PAD)
+
+ PORT_START("P1_ROW4")
+ PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_PLAYER(1) PORT_NAME("Show Answer") // Not 'answer phone'
+ PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(1) PORT_NAME("Enter")
+ PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_SERVICE1 ) PORT_PLAYER(1) PORT_NAME("Reset")
+ PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_BUTTON10 ) PORT_PLAYER(1) PORT_NAME("Hear Dora (non-TV mode only)")
+
+ PORT_START("P1_ROW5")
+ PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_BUTTON12 ) PORT_PLAYER(1) PORT_NAME("Dora The Explorer Logo Button (non-TV mode only)") // manual doesn't list this? speech says 'Dora the Explorer' in alone mode, presumably when you press the logo
+ PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(1) PORT_NAME("Exit")
+ PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_BUTTON9 ) PORT_PLAYER(1) PORT_NAME("Adventure Mode")
+ PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_BUTTON11 ) PORT_PLAYER(1) PORT_NAME("Hear Boots (non-TV mode only)")
+
+ PORT_START("P1_ROW6")
+ PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_BUTTON5 ) PORT_PLAYER(1) PORT_NAME("Amusement Park")
+ PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_BUTTON8 ) PORT_PLAYER(1) PORT_NAME("Quick Play")
+ PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_BUTTON6 ) PORT_PLAYER(1) PORT_NAME("Big Drum Parade")
+ PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_BUTTON7 ) PORT_PLAYER(1) PORT_NAME("Banana Grove")
+
+ PORT_START("P2")
+ PORT_BIT( 0xff7f, IP_ACTIVE_HIGH, IPT_UNUSED )
+ PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_CUSTOM ) // battery state
+
+ PORT_START("P3")
+ PORT_BIT( 0xffff, IP_ACTIVE_LOW, IPT_UNUSED )
+INPUT_PORTS_END
+
+
void spg2xx_game_state::machine_start()
{
if (m_bank)
@@ -1709,7 +1772,35 @@ void spg2xx_game_hotwheels_state::hotwheels(machine_config &config)
m_screen->set_refresh_hz(50);
}
+uint16_t spg2xx_game_doraphone_state::porta_r(offs_t offset, uint16_t mem_mask)
+{
+ uint16_t matrix = 0x000f;
+ for (int b = 1; 6 >= b; ++b)
+ {
+ if (!BIT(m_portb_data, b))
+ matrix &= m_io_p1_rows[b - 1]->read();
+ }
+ return matrix | (m_io_p1->read() & 0xfff0);
+}
+
+void spg2xx_game_doraphone_state::portb_w(offs_t offset, uint16_t data, uint16_t mem_mask)
+{
+ m_portb_data = data;
+}
+
+void spg2xx_game_doraphone_state::doraphone(machine_config &config)
+{
+ SPG24X(config, m_maincpu, XTAL(27'000'000), m_screen);
+ m_maincpu->set_addrmap(AS_PROGRAM, &spg2xx_game_doraphone_state::mem_map_4m);
+
+ spg2xx_base(config);
+
+ m_maincpu->porta_in().set(FUNC(spg2xx_game_doraphone_state::porta_r));
+ m_maincpu->portb_out().set(FUNC(spg2xx_game_doraphone_state::portb_w));
+ m_maincpu->portb_in().set(FUNC(spg2xx_game_doraphone_state::base_portb_r));
+ m_maincpu->portc_in().set(FUNC(spg2xx_game_doraphone_state::base_portc_r));
+}
ROM_START( rad_skat )
@@ -1867,6 +1958,12 @@ ROM_START( jouet )
ROM_LOAD16_WORD_SWAP( "jouet.bin", 0x000000, 0x400000, CRC(da46097e) SHA1(f760f4d126a8291b7dacdea7a70691b25ad8b989) )
ROM_END
+ROM_START( doraphon )
+ ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASE00 )
+ ROM_LOAD16_WORD_SWAP( "doraphone.bin", 0x000000, 0x800000, CRC(a79c154b) SHA1(f5b9bf63ea52d058252ab6702508b519fbdee0cc) )
+ROM_END
+
+
ROM_START( senspeed )
ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASE00 )
ROM_LOAD16_WORD_SWAP( "speedracer.bin", 0x000000, 0x800000, CRC(4efbcd39) SHA1(2edffbaa9ea309ad308fa60f32d8b7a98ee313c7) )
@@ -1994,6 +2091,9 @@ CONS( 2009, senwfit, 0, 0, gssytts, senwfit, spg2xx_game_senwfit_s
CONS( 2006, vtechtvssp, 0, 0, spg2xx, spg2xx, spg2xx_game_state, empty_init, "VTech", "TV Station (VTech, Spain)", MACHINE_NOT_WORKING )
CONS( 2006, vtechtvsgr, 0, 0, spg2xx, spg2xx, spg2xx_game_state, empty_init, "VTech", "TV Learning Station (VTech, Germany)", MACHINE_NOT_WORKING )
+// "Boots's" is used on the title screen and in the manual, even if "Boots'" is usually used outside of this game.
+CONS( 200?, doraphon, 0, 0, doraphone, doraphone, spg2xx_game_doraphone_state,empty_init, "VTech", "Dora the Explorer - Dora TV Explorer Phone / Boots's Special Day", MACHINE_IMPERFECT_SOUND )
+
// ROM checksum fails, but is expecting 0 as a result? shows 'CopyRight' when booting normally? protection?
CONS( 200?, jouet, 0, 0, spg2xx, spg2xx, spg2xx_game_state, empty_init, "", "10 Jeux Interactifs / Jeux Pour Filles (France)", MACHINE_NOT_WORKING )
diff --git a/src/mame/includes/spg2xx.h b/src/mame/includes/spg2xx.h
index 22ad763c53a..4b43955bac2 100644
--- a/src/mame/includes/spg2xx.h
+++ b/src/mame/includes/spg2xx.h
@@ -335,6 +335,26 @@ private:
required_ioport m_io_p1_extra;
};
+class spg2xx_game_doraphone_state : public spg2xx_game_state
+{
+public:
+ spg2xx_game_doraphone_state(const machine_config &mconfig, device_type type, const char *tag) :
+ spg2xx_game_state(mconfig, type, tag),
+ m_portb_data(0),
+ m_io_p1_rows(*this, "P1_ROW%u", 1U)
+ { }
+
+ void doraphone(machine_config &config);
+
+private:
+ uint16_t porta_r(offs_t offset, uint16_t mem_mask = ~0);
+
+ void portb_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0) override;
+ uint16_t m_portb_data;
+
+ required_ioport_array<6> m_io_p1_rows;
+};
+
#endif // MAME_INCLUDES_SPG2XX_H
diff --git a/src/mame/mame.lst b/src/mame/mame.lst
index 1dc7dfd0f4e..684618d9586 100644
--- a/src/mame/mame.lst
+++ b/src/mame/mame.lst
@@ -32517,6 +32517,7 @@ msiwwea
msidd
msimpac
msimm2
+msinamco
msisinv
msifrog
rcapnp
@@ -38511,6 +38512,7 @@ tmntbftc
gssytts
senwfit
jjstrip
+doraphon // (c) 2006 VTech
vtechtvssp // (c) 2006 VTech
vtechtvsgr // (c) 2006 VTech
tmntmutm