summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/drivers/vsmileb.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/drivers/vsmileb.cpp')
-rw-r--r--src/mame/drivers/vsmileb.cpp164
1 files changed, 164 insertions, 0 deletions
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 )