summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author Ryan Holtz <ryan.holtz@arrowheadgs.com>2019-01-23 01:31:24 +0100
committer Ryan Holtz <ryan.holtz@arrowheadgs.com>2019-01-23 01:31:54 +0100
commit796f6c402f5b274debad2cece19c66bacdf097d7 (patch)
tree1036f0a491e32b112b0a0819e6707261c4238a6d
parentecadb2d95234d83142c73732e730d6d2922d270c (diff)
Machines promoted to working
---------------------------- V.Smile Baby (US) [Ryan Holtz] New working clones -------------------- V.Smile Baby (Sweden) [Ryan Holtz, Sean Ridde, Clawgrip] -vsmileb: Split into a separate CPP file. Identified input codes and hooked up inputs. [Ryan Holtz, bmx]
-rw-r--r--scripts/target/mame/mess.lua2
-rw-r--r--src/devices/machine/spg2xx.cpp4
-rw-r--r--src/mame/drivers/vsmile.cpp247
-rw-r--r--src/mame/drivers/vsmileb.cpp164
-rw-r--r--src/mame/includes/vsmile.h160
5 files changed, 339 insertions, 238 deletions
diff --git a/scripts/target/mame/mess.lua b/scripts/target/mame/mess.lua
index 700b01376ae..87239e7d969 100644
--- a/scripts/target/mame/mess.lua
+++ b/scripts/target/mame/mess.lua
@@ -3622,7 +3622,9 @@ files {
MAME_DIR .. "src/mame/audio/socrates.cpp",
MAME_DIR .. "src/mame/audio/socrates.h",
MAME_DIR .. "src/mame/drivers/inteladv.cpp",
+ MAME_DIR .. "src/mame/includes/vsmile.h",
MAME_DIR .. "src/mame/drivers/vsmile.cpp",
+ MAME_DIR .. "src/mame/drivers/vsmileb.cpp",
MAME_DIR .. "src/mame/drivers/clickstart.cpp",
MAME_DIR .. "src/mame/drivers/storio.cpp",
}
diff --git a/src/devices/machine/spg2xx.cpp b/src/devices/machine/spg2xx.cpp
index 2ec30541781..3b9d4ae3dd6 100644
--- a/src/devices/machine/spg2xx.cpp
+++ b/src/devices/machine/spg2xx.cpp
@@ -52,8 +52,8 @@ DEFINE_DEVICE_TYPE(SPG28X, spg28x_device, "spg28x", "SPG280-series System-on-a-C
#define LOG_PPU (LOG_PPU_READS | LOG_PPU_WRITES | LOG_UNKNOWN_PPU)
#define LOG_ALL (LOG_IO | LOG_SPU | LOG_PPU | LOG_VLINES | LOG_SEGMENT | LOG_FIQ)
-//#define VERBOSE (LOG_ALL & ~LOG_SPU)
-#define VERBOSE (0)
+#define VERBOSE (LOG_ALL & ~LOG_SPU)
+//#define VERBOSE (0)
#include "logmacro.h"
#define SPG_DEBUG_VIDEO (0)
diff --git a/src/mame/drivers/vsmile.cpp b/src/mame/drivers/vsmile.cpp
index 38d6b623b58..8c36fae0cdd 100644
--- a/src/mame/drivers/vsmile.cpp
+++ b/src/mame/drivers/vsmile.cpp
@@ -3,146 +3,16 @@
/******************************************************************************
V-Tech V.Smile console emulation
- V-Tech V.Smile Baby console emulation
-
- Similar Systems:
-
- V.Smile Pocket
- V.Smile Cyber Pocket
- V.Smile PC Pal
- V-Motion Active Learning System
- V.Flash
- V.Baby
- Leapfrog Leapster
*******************************************************************************/
#include "emu.h"
-#include "bus/vsmile/vsmile_ctrl.h"
-#include "bus/vsmile/vsmile_slot.h"
-#include "bus/vsmile/rom.h"
-
-#include "cpu/unsp/unsp.h"
-
-#include "machine/bankdev.h"
-#include "machine/spg2xx.h"
+#include "includes/vsmile.h"
-#include "screen.h"
#include "softlist.h"
#include "speaker.h"
-
-class vsmile_base_state : public driver_device
-{
-public:
- vsmile_base_state(const machine_config &mconfig, device_type type, const char *tag)
- : driver_device(mconfig, type, tag)
- , m_spg(*this, "spg")
- , m_maincpu(*this, "maincpu")
- , m_screen(*this, "screen")
- , m_bankdev(*this, "bank")
- , m_cart(*this, "cartslot")
- , m_system_region(*this, "maincpu")
- { }
-
- void vsmile_base(machine_config &config);
-
-protected:
- virtual void machine_start() override;
-
- void mem_map(address_map &map);
-
- DECLARE_WRITE8_MEMBER(chip_sel_w);
-
- DECLARE_READ16_MEMBER(bank3_r);
-
- required_device<spg2xx_device> m_spg;
- required_device<unsp_device> m_maincpu;
- required_device<screen_device> m_screen;
- required_device<address_map_bank_device> m_bankdev;
- required_device<vsmile_cart_slot_device> m_cart;
- required_memory_region m_system_region;
-};
-
-class vsmile_state : public vsmile_base_state
-{
-public:
- vsmile_state(const machine_config &mconfig, device_type type, const char *tag)
- : vsmile_base_state(mconfig, type, tag)
- , m_ctrl(*this, "ctrl%u", 1U)
- , m_dsw_region(*this, "REGION")
- { }
-
- void vsmile(machine_config &config);
- void vsmilep(machine_config &config);
-
-private:
- virtual void machine_start() override;
- virtual void machine_reset() override;
-
- void banked_map(address_map &map);
-
- DECLARE_WRITE8_MEMBER(ctrl_tx_w);
- template <int Which> DECLARE_WRITE_LINE_MEMBER(ctrl_rts_w);
-
- DECLARE_READ16_MEMBER(portb_r);
- DECLARE_READ16_MEMBER(portc_r);
- DECLARE_WRITE16_MEMBER(portc_w);
-
- DECLARE_WRITE8_MEMBER(uart_rx);
-
- enum
- {
- VSMILE_PORTB_CS1 = 0x01,
- VSMILE_PORTB_CS2 = 0x02,
- VSMILE_PORTB_CART = 0x04,
- VSMILE_PORTB_RESET = 0x08,
- VSMILE_PORTB_FRONT24 = 0x10,
- VSMILE_PORTB_OFF = 0x20,
- VSMILE_PORTB_OFF_SW = 0x40,
- VSMILE_PORTB_ON_SW = 0x80,
-
- VSMILE_PORTC_VER = 0x0f,
- VSMILE_PORTC_LOGO = 0x10,
- VSMILE_PORTC_TEST = 0x20,
- VSMILE_PORTC_AMP = 0x40,
- VSMILE_PORTC_SYSRESET = 0x80,
- };
-
- required_device_array<vsmile_ctrl_port_device, 2> m_ctrl;
- required_ioport m_dsw_region;
-
- bool m_ctrl_rts[2];
- bool m_ctrl_select[2];
-};
-
-class vsmileb_state : public vsmile_base_state
-{
-public:
- vsmileb_state(const machine_config &mconfig, device_type type, const char *tag)
- : vsmile_base_state(mconfig, type, tag)
- , m_io_logo(*this, "LOGO")
- { }
-
- void vsmileb(machine_config &config);
- void vsmilebp(machine_config &config);
-
-private:
- virtual void machine_start() override;
-
- void banked_map(address_map &map);
-
- DECLARE_READ16_MEMBER(porta_r);
- DECLARE_READ16_MEMBER(portb_r);
- DECLARE_READ16_MEMBER(portc_r);
- DECLARE_WRITE16_MEMBER(porta_w);
- DECLARE_WRITE16_MEMBER(portb_w);
- DECLARE_WRITE16_MEMBER(portc_w);
-
- required_ioport m_io_logo;
-};
-
/************************************
*
* Common
@@ -288,70 +158,6 @@ void vsmile_state::banked_map(address_map &map)
/************************************
*
- * V.Smile Baby
- *
- ************************************/
-
-void vsmileb_state::machine_start()
-{
- vsmile_base_state::machine_start();
-}
-
-READ16_MEMBER(vsmileb_state::porta_r)
-{
- uint16_t data = 0x0302 | (m_io_logo->read() ? 0x0080 : 0x0000);
- logerror("%s: GPIO Port A Read: %04x\n", machine().describe_context(), data);
- return data;
-}
-
-READ16_MEMBER(vsmileb_state::portb_r)
-{
- uint16_t data = 0x0080;
- logerror("%s: GPIO Port B Read: %04x\n", machine().describe_context(), data);
- return data;
-}
-
-READ16_MEMBER(vsmileb_state::portc_r)
-{
- uint16_t data = 0;
- logerror("%s: GPIO Port C Read: %04x\n", machine().describe_context(), data);
- return data;
-}
-
-WRITE16_MEMBER(vsmileb_state::porta_w)
-{
- logerror("%s: GPIO Port A Write: %04x & %04x = %04x\n", machine().describe_context(), data, mem_mask, data & mem_mask);
-}
-
-WRITE16_MEMBER(vsmileb_state::portb_w)
-{
- logerror("%s: GPIO Port B Write: %04x & %04x = %04x\n", machine().describe_context(), data, mem_mask, data & mem_mask);
-}
-
-WRITE16_MEMBER(vsmileb_state::portc_w)
-{
- logerror("%s: GPIO Port C Write: %04x & %04x = %04x\n", machine().describe_context(), data, mem_mask, data & mem_mask);
-}
-
-void vsmileb_state::banked_map(address_map &map)
-{
- map(0x0000000, 0x03fffff).rom().region("maincpu", 0);
- map(0x0400000, 0x07fffff).rom().region("maincpu", 0);
- map(0x0800000, 0x0bfffff).rom().region("maincpu", 0);
-
- map(0x1000000, 0x13fffff).rw(m_cart, FUNC(vsmile_cart_slot_device::bank0_r), FUNC(vsmile_cart_slot_device::bank0_w));
-
- map(0x1400000, 0x15fffff).rw(m_cart, FUNC(vsmile_cart_slot_device::bank0_r), FUNC(vsmile_cart_slot_device::bank0_w));
- map(0x1600000, 0x17fffff).rw(m_cart, FUNC(vsmile_cart_slot_device::bank2_r), FUNC(vsmile_cart_slot_device::bank2_w));
-
- map(0x1800000, 0x18fffff).rw(m_cart, FUNC(vsmile_cart_slot_device::bank0_r), FUNC(vsmile_cart_slot_device::bank0_w));
- map(0x1900000, 0x19fffff).rw(m_cart, FUNC(vsmile_cart_slot_device::bank1_r), FUNC(vsmile_cart_slot_device::bank1_w));
- map(0x1a00000, 0x1afffff).rw(m_cart, FUNC(vsmile_cart_slot_device::bank2_r), FUNC(vsmile_cart_slot_device::bank2_w));
- map(0x1b00000, 0x1bfffff).r(FUNC(vsmileb_state::bank3_r));
-}
-
-/************************************
- *
* Inputs
*
************************************/
@@ -372,13 +178,11 @@ static INPUT_PORTS_START( vsmile )
PORT_BIT( 0xe0, 0x00, IPT_UNUSED )
INPUT_PORTS_END
-static INPUT_PORTS_START( vsmileb )
- PORT_START("LOGO")
- PORT_DIPNAME( 0x10, 0x10, "VTech Intro" )
- PORT_DIPSETTING( 0x00, "Off" )
- PORT_DIPSETTING( 0x10, "On" )
- PORT_BIT( 0xe0, 0x00, IPT_UNUSED )
-INPUT_PORTS_END
+/************************************
+ *
+ * Machine Configs
+ *
+ ************************************/
static void vsmile_cart(device_slot_interface &device)
{
@@ -445,27 +249,11 @@ void vsmile_state::vsmilep(machine_config &config)
m_spg->set_pal(true);
}
-void vsmileb_state::vsmileb(machine_config &config)
-{
- vsmile_base(config);
-
- m_bankdev->set_addrmap(AS_PROGRAM, &vsmileb_state::banked_map);
-
- m_spg->porta_in().set(FUNC(vsmileb_state::porta_r));
- m_spg->portb_in().set(FUNC(vsmileb_state::portb_r));
- m_spg->portc_in().set(FUNC(vsmileb_state::portc_r));
- m_spg->porta_out().set(FUNC(vsmileb_state::porta_w));
- m_spg->portb_out().set(FUNC(vsmileb_state::portb_w));
- m_spg->portc_out().set(FUNC(vsmileb_state::portc_w));
-
- SOFTWARE_LIST(config, "cart_list").set_original("vsmileb_cart");
-}
-
-void vsmileb_state::vsmilebp(machine_config &config)
-{
- vsmileb(config);
- m_spg->set_pal(true);
-}
+/************************************
+ *
+ * ROM Loading
+ *
+ ************************************/
// TODO: decide on a dump endian, these likely differ in endianess due to different dumping technqiues
ROM_START( vsmile )
@@ -483,20 +271,7 @@ ROM_START( vsmilef )
ROM_LOAD16_WORD_SWAP( "sysrom_france", 0x000000, 0x200000, CRC(0cd0bdf5) SHA1(5c8d1eada1b6b545555b8d2b09325d7127681af8) )
ROM_END
-ROM_START( vsmileb )
- ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASEFF )
- ROM_LOAD( "vbabybios.bin", 0x000000, 0x800000, CRC(ddc7f845) SHA1(2c17d0f54200070176d03d44a40c7923636e596a) )
-ROM_END
-
-ROM_START( vsmilebsw )
- ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASEFF )
- ROM_LOAD16_WORD_SWAP( "vsmileswedenbios.bin", 0x000000, 0x800000, CRC(8b464b19) SHA1(cea304ba886c39e86906aad3dce17d5fff7cfcbe) )
-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 (US)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS )
CONS( 2005, vsmileg, vsmile, 0, vsmilep, vsmile, vsmile_state, empty_init, "VTech", "V.Smile (Germany)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS )
CONS( 2005, vsmilef, vsmile, 0, vsmilep, vsmile, vsmile_state, empty_init, "VTech", "V.Smile (France)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS )
-
-CONS( 2005, vsmileb, 0, 0, vsmileb, vsmileb, vsmileb_state, empty_init, "VTech", "V.Smile Baby (US)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS )
-CONS( 2005, vsmilebsw ,vsmileb, 0, vsmilebp,vsmileb, vsmileb_state, empty_init, "VTech", "V.Smile Baby (Sweden)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS )
diff --git a/src/mame/drivers/vsmileb.cpp b/src/mame/drivers/vsmileb.cpp
new file mode 100644
index 00000000000..782c88f3054
--- /dev/null
+++ b/src/mame/drivers/vsmileb.cpp
@@ -0,0 +1,164 @@
+// license:BSD-3-Clause
+// copyright-holders:Ryan Holtz
+/******************************************************************************
+
+ V-Tech V.Smile Baby console emulation
+
+*******************************************************************************/
+
+#include "emu.h"
+
+#include "includes/vsmile.h"
+
+#include "softlist.h"
+#include "speaker.h"
+
+
+/************************************
+ *
+ * V.Smile Baby
+ *
+ ************************************/
+
+void vsmileb_state::machine_start()
+{
+ vsmile_base_state::machine_start();
+
+ save_item(NAME(m_mode));
+}
+
+void vsmileb_state::machine_reset()
+{
+ m_mode = 0x0400;
+}
+
+READ16_MEMBER(vsmileb_state::porta_r)
+{
+ return 0x0302 | (m_io_logo->read() ? 0x0080 : 0x0000);
+}
+
+READ16_MEMBER(vsmileb_state::portb_r)
+{
+ return 0x0080;
+}
+
+INPUT_CHANGED_MEMBER(vsmileb_state::pad_button_changed)
+{
+ uint16_t value = m_mode;
+ if (newval == 0)
+ {
+ value |= 0x0080;
+ }
+ else
+ {
+ value |= (uint16_t)(uintptr_t)param;
+ }
+ m_spg->uart_rx((uint8_t)(value >> 8));
+ m_spg->uart_rx((uint8_t)value);
+}
+
+template <uint16_t V> INPUT_CHANGED_MEMBER(vsmileb_state::sw_mode)
+{
+ if (!newval && oldval)
+ {
+ m_mode = V;
+ const uint16_t value = m_mode | 0x0080;
+ m_spg->uart_rx((uint8_t)(value >> 8));
+ m_spg->uart_rx((uint8_t)value);
+ }
+}
+
+void vsmileb_state::banked_map(address_map &map)
+{
+ map(0x0000000, 0x03fffff).rom().region("maincpu", 0);
+ map(0x0400000, 0x07fffff).rom().region("maincpu", 0);
+ map(0x0800000, 0x0bfffff).rom().region("maincpu", 0);
+
+ map(0x1000000, 0x13fffff).rw(m_cart, FUNC(vsmile_cart_slot_device::bank0_r), FUNC(vsmile_cart_slot_device::bank0_w));
+
+ map(0x1400000, 0x15fffff).rw(m_cart, FUNC(vsmile_cart_slot_device::bank0_r), FUNC(vsmile_cart_slot_device::bank0_w));
+ map(0x1600000, 0x17fffff).rw(m_cart, FUNC(vsmile_cart_slot_device::bank2_r), FUNC(vsmile_cart_slot_device::bank2_w));
+
+ map(0x1800000, 0x18fffff).rw(m_cart, FUNC(vsmile_cart_slot_device::bank0_r), FUNC(vsmile_cart_slot_device::bank0_w));
+ map(0x1900000, 0x19fffff).rw(m_cart, FUNC(vsmile_cart_slot_device::bank1_r), FUNC(vsmile_cart_slot_device::bank1_w));
+ map(0x1a00000, 0x1afffff).rw(m_cart, FUNC(vsmile_cart_slot_device::bank2_r), FUNC(vsmile_cart_slot_device::bank2_w));
+ map(0x1b00000, 0x1bfffff).r(FUNC(vsmileb_state::bank3_r));
+}
+
+/************************************
+ *
+ * Inputs
+ *
+ ************************************/
+
+static INPUT_PORTS_START( vsmileb )
+ PORT_START("BUTTONS")
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, vsmileb_state, pad_button_changed, vsmileb_state::BUTTON_YELLOW) PORT_NAME("Yellow")
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_MEMBER(DEVICE_SELF, vsmileb_state, pad_button_changed, vsmileb_state::BUTTON_BLUE) PORT_NAME("Blue")
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_CHANGED_MEMBER(DEVICE_SELF, vsmileb_state, pad_button_changed, vsmileb_state::BUTTON_ORANGE) PORT_NAME("Orange")
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_CHANGED_MEMBER(DEVICE_SELF, vsmileb_state, pad_button_changed, vsmileb_state::BUTTON_GREEN) PORT_NAME("Green")
+ PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_BUTTON5 ) PORT_CHANGED_MEMBER(DEVICE_SELF, vsmileb_state, pad_button_changed, vsmileb_state::BUTTON_RED) PORT_NAME("Red")
+ PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_BUTTON6 ) PORT_CHANGED_MEMBER(DEVICE_SELF, vsmileb_state, pad_button_changed, vsmileb_state::BUTTON_CLOUD) PORT_NAME("Cloud")
+ PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_BUTTON7 ) PORT_CHANGED_MEMBER(DEVICE_SELF, vsmileb_state, pad_button_changed, vsmileb_state::BUTTON_BALL) PORT_NAME("Ball")
+ PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_BUTTON8 ) PORT_CHANGED_MEMBER(DEVICE_SELF, vsmileb_state, pad_button_changed, vsmileb_state::BUTTON_EXIT) PORT_NAME("Exit")
+
+ PORT_START("MODE")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("Play Time") PORT_CHANGED_MEMBER(DEVICE_SELF, vsmileb_state, sw_mode<0x0400>, nullptr) // three-position function switch
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("Watch & Learn") PORT_CHANGED_MEMBER(DEVICE_SELF, vsmileb_state, sw_mode<0x0800>, nullptr)
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("Learn & Explore") PORT_CHANGED_MEMBER(DEVICE_SELF, vsmileb_state, sw_mode<0x0c00>, nullptr)
+
+ PORT_START("LOGO")
+ PORT_DIPNAME( 0x10, 0x10, "VTech Intro" )
+ PORT_DIPSETTING( 0x00, DEF_STR(Off) )
+ PORT_DIPSETTING( 0x10, DEF_STR(On) )
+ PORT_BIT( 0xef, 0x00, IPT_UNUSED )
+INPUT_PORTS_END
+
+/************************************
+ *
+ * Machine Configs
+ *
+ ************************************/
+
+void vsmileb_state::vsmileb(machine_config &config)
+{
+ vsmile_base(config);
+
+ m_bankdev->set_addrmap(AS_PROGRAM, &vsmileb_state::banked_map);
+
+ SPG28X(config.replace(), m_spg, XTAL(27'000'000), m_maincpu, m_screen);
+ m_spg->chip_select().set(FUNC(vsmileb_state::chip_sel_w));
+ m_spg->add_route(ALL_OUTPUTS, "lspeaker", 0.5);
+ m_spg->add_route(ALL_OUTPUTS, "rspeaker", 0.5);
+ m_spg->porta_in().set(FUNC(vsmileb_state::porta_r));
+ m_spg->portb_in().set(FUNC(vsmileb_state::portb_r));
+
+ SOFTWARE_LIST(config, "cart_list").set_original("vsmileb_cart");
+}
+
+void vsmileb_state::vsmilebp(machine_config &config)
+{
+ vsmileb(config);
+ m_spg->set_pal(true);
+}
+
+/************************************
+ *
+ * ROM Loading
+ *
+ ************************************/
+
+// TODO: decide on a dump endian, these likely differ in endianess due to different dumping technqiues
+ROM_START( vsmileb )
+ ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASEFF )
+ ROM_LOAD( "vbabybios.bin", 0x000000, 0x800000, CRC(ddc7f845) SHA1(2c17d0f54200070176d03d44a40c7923636e596a) )
+ROM_END
+
+ROM_START( vsmilebsw )
+ ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASEFF )
+ ROM_LOAD16_WORD_SWAP( "vsmileswedenbios.bin", 0x000000, 0x800000, CRC(8b464b19) SHA1(cea304ba886c39e86906aad3dce17d5fff7cfcbe) )
+ROM_END
+
+// year, name, parent, compat, machine, input, class, init, company, fullname, flags
+CONS( 2005, vsmileb, 0, 0, vsmileb, vsmileb, vsmileb_state, empty_init, "VTech", "V.Smile Baby (US)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS )
+CONS( 2005, vsmilebsw ,vsmileb, 0, vsmilebp,vsmileb, vsmileb_state, empty_init, "VTech", "V.Smile Baby (Sweden)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS )
diff --git a/src/mame/includes/vsmile.h b/src/mame/includes/vsmile.h
new file mode 100644
index 00000000000..672eb334381
--- /dev/null
+++ b/src/mame/includes/vsmile.h
@@ -0,0 +1,160 @@
+// license:BSD-3-Clause
+// copyright-holders:Ryan Holtz
+/******************************************************************************
+
+ V-Tech V.Smile console emulation
+ V-Tech V.Smile Baby console emulation
+
+ Similar Systems:
+
+ V.Smile Pocket
+ V.Smile Cyber Pocket
+ V.Smile PC Pal
+ V-Motion Active Learning System
+ V.Flash
+ V.Baby
+ Leapfrog Leapster
+
+*******************************************************************************/
+
+#ifndef MAME_INCLUDES_VSMILE_H
+#define MAME_INCLUDES_VSMILE_H
+
+#include "bus/vsmile/vsmile_ctrl.h"
+#include "bus/vsmile/vsmile_slot.h"
+#include "bus/vsmile/rom.h"
+
+#include "cpu/unsp/unsp.h"
+
+#include "machine/bankdev.h"
+#include "machine/spg2xx.h"
+
+#include "screen.h"
+
+class vsmile_base_state : public driver_device
+{
+public:
+ vsmile_base_state(const machine_config &mconfig, device_type type, const char *tag)
+ : driver_device(mconfig, type, tag)
+ , m_spg(*this, "spg")
+ , m_maincpu(*this, "maincpu")
+ , m_screen(*this, "screen")
+ , m_bankdev(*this, "bank")
+ , m_cart(*this, "cartslot")
+ , m_system_region(*this, "maincpu")
+ { }
+
+ void vsmile_base(machine_config &config);
+
+protected:
+ virtual void machine_start() override;
+
+ void mem_map(address_map &map);
+
+ DECLARE_WRITE8_MEMBER(chip_sel_w);
+
+ DECLARE_READ16_MEMBER(bank3_r);
+
+ required_device<spg2xx_device> m_spg;
+ required_device<unsp_device> m_maincpu;
+ required_device<screen_device> m_screen;
+ required_device<address_map_bank_device> m_bankdev;
+ required_device<vsmile_cart_slot_device> m_cart;
+ required_memory_region m_system_region;
+};
+
+class vsmile_state : public vsmile_base_state
+{
+public:
+ vsmile_state(const machine_config &mconfig, device_type type, const char *tag)
+ : vsmile_base_state(mconfig, type, tag)
+ , m_ctrl(*this, "ctrl%u", 1U)
+ , m_dsw_region(*this, "REGION")
+ { }
+
+ void vsmile(machine_config &config);
+ void vsmilep(machine_config &config);
+
+private:
+ virtual void machine_start() override;
+ virtual void machine_reset() override;
+
+ void banked_map(address_map &map);
+
+ DECLARE_WRITE8_MEMBER(ctrl_tx_w);
+ template <int Which> DECLARE_WRITE_LINE_MEMBER(ctrl_rts_w);
+
+ DECLARE_READ16_MEMBER(portb_r);
+ DECLARE_READ16_MEMBER(portc_r);
+ DECLARE_WRITE16_MEMBER(portc_w);
+
+ DECLARE_WRITE8_MEMBER(uart_rx);
+
+ enum
+ {
+ VSMILE_PORTB_CS1 = 0x01,
+ VSMILE_PORTB_CS2 = 0x02,
+ VSMILE_PORTB_CART = 0x04,
+ VSMILE_PORTB_RESET = 0x08,
+ VSMILE_PORTB_FRONT24 = 0x10,
+ VSMILE_PORTB_OFF = 0x20,
+ VSMILE_PORTB_OFF_SW = 0x40,
+ VSMILE_PORTB_ON_SW = 0x80,
+
+ VSMILE_PORTC_VER = 0x0f,
+ VSMILE_PORTC_LOGO = 0x10,
+ VSMILE_PORTC_TEST = 0x20,
+ VSMILE_PORTC_AMP = 0x40,
+ VSMILE_PORTC_SYSRESET = 0x80,
+ };
+
+ required_device_array<vsmile_ctrl_port_device, 2> m_ctrl;
+ required_ioport m_dsw_region;
+
+ bool m_ctrl_rts[2];
+ bool m_ctrl_select[2];
+};
+
+class vsmileb_state : public vsmile_base_state
+{
+public:
+ vsmileb_state(const machine_config &mconfig, device_type type, const char *tag)
+ : vsmile_base_state(mconfig, type, tag)
+ , m_io_logo(*this, "LOGO")
+ { }
+
+ void vsmileb(machine_config &config);
+ void vsmilebp(machine_config &config);
+
+ enum : uint16_t
+ {
+ BUTTON_YELLOW = 0x01fe,
+ BUTTON_BLUE = 0x03ee,
+ BUTTON_ORANGE = 0x03de,
+ BUTTON_GREEN = 0x03be,
+ BUTTON_RED = 0x02fe,
+ BUTTON_CLOUD = 0x03f6,
+ BUTTON_BALL = 0x03fa,
+ BUTTON_EXIT = 0x03fc
+ };
+
+ DECLARE_INPUT_CHANGED_MEMBER(pad_button_changed);
+
+ // make slide switches usable on a keyboard
+ template <uint16_t V> DECLARE_INPUT_CHANGED_MEMBER(sw_mode);
+
+private:
+ virtual void machine_start() override;
+ virtual void machine_reset() override;
+
+ void banked_map(address_map &map);
+
+ DECLARE_READ16_MEMBER(porta_r);
+ DECLARE_READ16_MEMBER(portb_r);
+
+ required_ioport m_io_logo;
+
+ uint16_t m_mode;
+};
+
+#endif // MAME_INCLUDES_VSMILE_H \ No newline at end of file