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 "includes/vsmile.h" -#include "cpu/unsp/unsp.h" - -#include "machine/bankdev.h" -#include "machine/spg2xx.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 m_spg; - required_device m_maincpu; - required_device m_screen; - required_device m_bankdev; - required_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 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 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 @@ -286,70 +156,6 @@ void vsmile_state::banked_map(address_map &map) map(0x1b00000, 0x1bfffff).r(FUNC(vsmile_state::bank3_r)); } -/************************************ - * - * 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 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 m_spg; + required_device m_maincpu; + required_device m_screen; + required_device m_bankdev; + required_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 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 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 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