diff --git a/scripts/src/bus.lua b/scripts/src/bus.lua index bb729f34c3c..ccd0c53c959 100644 --- a/scripts/src/bus.lua +++ b/scripts/src/bus.lua @@ -3270,7 +3270,7 @@ end --------------------------------------------------- -- ---@src/devices/bus/vsmile/vsmile_slot.h,BUSES["VSMILE"] = true +--@src/devices/bus/vsmile/vsmile_slot.h,BUSES["VSMILE_SLOT"] = true --------------------------------------------------- if (BUSES["VSMILE"]~=null) then @@ -3282,6 +3282,25 @@ if (BUSES["VSMILE"]~=null) then } end +--------------------------------------------------- +-- +--@src/devices/bus/vsmile/vsmile_ctrl.h,BUSES["VSMILE"] = true +--@src/devices/bus/vsmile/vsmile_slot.h,BUSES["VSMILE"] = true +--------------------------------------------------- + +if (BUSES["VSMILE"]~=null) then + files { + MAME_DIR .. "src/devices/bus/vsmile/vsmile_ctrl.cpp", + MAME_DIR .. "src/devices/bus/vsmile/vsmile_ctrl.h", + MAME_DIR .. "src/devices/bus/vsmile/vsmile_slot.cpp", + MAME_DIR .. "src/devices/bus/vsmile/vsmile_slot.h", + MAME_DIR .. "src/devices/bus/vsmile/joystick.cpp", + MAME_DIR .. "src/devices/bus/vsmile/joystick.h", + MAME_DIR .. "src/devices/bus/vsmile/rom.cpp", + MAME_DIR .. "src/devices/bus/vsmile/rom.h", + } +end + --------------------------------------------------- -- --@src/devices/bus/vtech/memexp/memexp.h,BUSES["VTECH_MEMEXP"] = true diff --git a/src/devices/bus/vsmile/joystick.cpp b/src/devices/bus/vsmile/joystick.cpp new file mode 100644 index 00000000000..b3be2f25ce3 --- /dev/null +++ b/src/devices/bus/vsmile/joystick.cpp @@ -0,0 +1,46 @@ +// license:BSD-3-Clause +// copyright-holders:Ryan Holtz + +#include "emu.h" +#include "joystick.h" + + +//************************************************************************** +// GLOBAL VARIABLES +//************************************************************************** + +DEFINE_DEVICE_TYPE(VSMILE_JOYSTICK, vsmile_joystick_device, "vsmile_joystick", "V.Smile Joystick Controller") + + +//************************************************************************** +// V.Smile joystick controller +//************************************************************************** + +vsmile_joystick_device::vsmile_joystick_device( + machine_config const &mconfig, + char const *tag, + device_t *owner, + uint32_t clock) + : device_t(mconfig, VSMILE_JOYSTICK, tag, owner, clock) + , device_vsmile_ctrl_interface(mconfig, *this) +{ +} + +vsmile_joystick_device::~vsmile_joystick_device() +{ +} + +void vsmile_joystick_device::device_start() +{ + // TODO: initialise and register save state +} + +void vsmile_joystick_device::cts_w(int state) +{ + // TODO: CTS input changed +} + +void vsmile_joystick_device::data_w(uint8_t data) +{ + // TODO: data arrived +} diff --git a/src/devices/bus/vsmile/joystick.h b/src/devices/bus/vsmile/joystick.h new file mode 100644 index 00000000000..4fde270925f --- /dev/null +++ b/src/devices/bus/vsmile/joystick.h @@ -0,0 +1,39 @@ +// license:BSD-3-Clause +// copyright-holders:Ryan Holtz +#ifndef MAME_BUS_VSMILE_JOYSTICK_H +#define MAME_BUS_VSMILE_JOYSTICK_H + +#pragma once + +#include "vsmile_ctrl.h" + +/*************************************************************************** + TYPE DEFINITIONS + ***************************************************************************/ + +// ======================> vsmile_joystick_device + +class vsmile_joystick_device : public device_t, public device_vsmile_ctrl_interface +{ +public: + // construction/destruction + vsmile_joystick_device(machine_config const &mconfig, char const *tag, device_t *owner, uint32_t clock = 0U); + virtual ~vsmile_joystick_device(); + +protected: + // device_t implementation + virtual void device_start() override; + + // device_vsmile_ctrl_interface implementation + virtual void cts_w(int state) override; + virtual void data_w(uint8_t data) override; +}; + + +/*************************************************************************** + DEVICE TYPES + ***************************************************************************/ + +DECLARE_DEVICE_TYPE(VSMILE_JOYSTICK, vsmile_joystick_device) + +#endif // MAME_BUS_VSMILE_JOYSTICK_H diff --git a/src/devices/bus/vsmile/vsmile_ctrl.cpp b/src/devices/bus/vsmile/vsmile_ctrl.cpp new file mode 100644 index 00000000000..c30f47384d9 --- /dev/null +++ b/src/devices/bus/vsmile/vsmile_ctrl.cpp @@ -0,0 +1,111 @@ +// license:BSD-3-Clause +// copyright-holders:Ryan Holtz + +#include "emu.h" +#include "vsmile_ctrl.h" + + +//************************************************************************** +// GLOBAL VARIABLES +//************************************************************************** + +DEFINE_DEVICE_TYPE(VSMILE_CTRL_PORT, vsmile_ctrl_port_device, "vsmile_ctrl_port", "V.Smile Controller Port") + + +//************************************************************************** +// V.Smile controller interface +//************************************************************************** + +device_vsmile_ctrl_interface::device_vsmile_ctrl_interface(const machine_config &mconfig, device_t &device) + : device_slot_card_interface(mconfig, device) + , m_port(dynamic_cast(device.owner())) +{ +} + +device_vsmile_ctrl_interface::~device_vsmile_ctrl_interface() +{ +} + +void device_vsmile_ctrl_interface::interface_validity_check(validity_checker &valid) const +{ + device_slot_card_interface::interface_validity_check(valid); + + if (device().owner() && !m_port) + { + osd_printf_error( + "Owner device %s (%s) is not a vsmile_ctrl_port_device\n", + device().owner()->tag(), + device().owner()->name()); + } +} + +void device_vsmile_ctrl_interface::interface_pre_start() +{ + device_slot_card_interface::interface_pre_start(); + + if (m_port && !m_port->started()) + throw device_missing_dependencies(); +} + + +//************************************************************************** +// V.Smile controller port +//************************************************************************** + +vsmile_ctrl_port_device::vsmile_ctrl_port_device( + machine_config const &mconfig, + char const *tag, + device_t *owner, + uint32_t clock) + : device_t(mconfig, VSMILE_CTRL_PORT, tag, owner, clock) + , device_slot_interface(mconfig, *this) + , m_rts_cb(*this) + , m_data_cb(*this) +{ +} + +vsmile_ctrl_port_device::~vsmile_ctrl_port_device() +{ +} + +void vsmile_ctrl_port_device::device_validity_check(validity_checker &valid) const +{ + device_t *const card(get_card_device()); + if (card && !dynamic_cast(card)) + { + osd_printf_error( + "Card device %s (%s) does not implement device_vsmile_ctrl_interface\n", + card->tag(), + card->name()); + } +} + +void vsmile_ctrl_port_device::device_resolve_objects() +{ + device_vsmile_ctrl_interface *const card(dynamic_cast(get_card_device())); + if (card) + m_device = card; + + m_rts_cb.resolve_safe(); + m_data_cb.resolve_safe(); +} + +void vsmile_ctrl_port_device::device_start() +{ + device_t *const card(get_card_device()); + if (card && !m_device) + { + throw emu_fatalerror( + "vsmile_ctrl_port_device: card device %s (%s) does not implement device_vsmile_ctrl_interface\n", + card->tag(), + card->name()); + } +} + + +#include "joystick.h" + +void vsmile_controllers(device_slot_interface &device) +{ + device.option_add("joy", VSMILE_JOYSTICK); +} diff --git a/src/devices/bus/vsmile/vsmile_ctrl.h b/src/devices/bus/vsmile/vsmile_ctrl.h new file mode 100644 index 00000000000..9a1fdf13125 --- /dev/null +++ b/src/devices/bus/vsmile/vsmile_ctrl.h @@ -0,0 +1,111 @@ +// license:BSD-3-Clause +// copyright-holders:Ryan Holtz +#ifndef MAME_BUS_VSMILE_VSMILE_CTRL_H +#define MAME_BUS_VSMILE_VSMILE_CTRL_H + +#pragma once + + +/*************************************************************************** + FORWARD DECLARATIONS + ***************************************************************************/ + +class vsmile_ctrl_port_device; + + +/*************************************************************************** + TYPE DEFINITIONS + ***************************************************************************/ + +// ======================> device_vsmile_ctrl_interface + +class device_vsmile_ctrl_interface : public device_slot_card_interface +{ +public: + virtual ~device_vsmile_ctrl_interface(); + +protected: + device_vsmile_ctrl_interface(machine_config const &mconfig, device_t &device); + + // device_interface implementation + virtual void interface_validity_check(validity_checker &valid) const override ATTR_COLD; + virtual void interface_pre_start() override; + + // otuput signals + void rts_out(int state); + void data_out(uint8_t data); + +private: + // input signal handlers for implementataions to override + virtual void cts_w(int state) = 0; + virtual void data_w(uint8_t data) = 0; + + vsmile_ctrl_port_device *const m_port; + + friend class vsmile_ctrl_port_device; +}; + + +// ======================> vsmile_ctrl_port_device + +class vsmile_ctrl_port_device : public device_t, public device_slot_interface +{ +public: + // configuration + auto rts_cb() { return m_rts_cb.bind(); } + auto data_cb() { return m_data_cb.bind(); } + + // construction/destruction + template + vsmile_ctrl_port_device(machine_config const &mconfig, char const *tag, device_t *owner, T &&opts, char const *dflt) + : vsmile_ctrl_port_device(mconfig, tag, owner, 0U) + { + option_reset(); + opts(*this); + set_default_option(dflt); + set_fixed(false); + } + vsmile_ctrl_port_device(machine_config const &mconfig, char const *tag, device_t *owner, uint32_t clock = 0U); + virtual ~vsmile_ctrl_port_device(); + + // input signals + void cts_w(int state) { if (m_device) m_device->cts_w(state); } + void data_w(uint8_t data) { if (m_device) m_device->data_w(data); } + +protected: + // device_t implementation + virtual void device_validity_check(validity_checker &valid) const override ATTR_COLD; + virtual void device_resolve_objects() override; + virtual void device_start() override; + +private: + device_vsmile_ctrl_interface *m_device; + devcb_write_line m_rts_cb; + devcb_write8 m_data_cb; + + friend class device_vsmile_ctrl_interface; +}; + + +/*************************************************************************** + INLINE FUNCTIONS + ***************************************************************************/ + +inline void device_vsmile_ctrl_interface::rts_out(int state) { m_port->m_rts_cb(state); } +inline void device_vsmile_ctrl_interface::data_out(uint8_t data) { m_port->m_data_cb(data); } + + +/*************************************************************************** + FUNCTIONS + ***************************************************************************/ + +void vsmile_controllers(device_slot_interface &device); + + +/*************************************************************************** + DEVICE TYPES + ***************************************************************************/ + +DECLARE_DEVICE_TYPE(VSMILE_CTRL_PORT, vsmile_ctrl_port_device) + +#endif // MAME_BUS_VSMILE_VSMILE_CTRL_H diff --git a/src/mame/drivers/vsmile.cpp b/src/mame/drivers/vsmile.cpp index dbf61382002..ea4a64c4b79 100644 --- a/src/mame/drivers/vsmile.cpp +++ b/src/mame/drivers/vsmile.cpp @@ -21,6 +21,7 @@ #include "bus/generic/slot.h" #include "bus/generic/carts.h" +#include "bus/vsmile/vsmile_ctrl.h" #include "bus/vsmile/vsmile_slot.h" #include "bus/vsmile/rom.h" @@ -63,6 +64,7 @@ public: vsmile_state(const machine_config &mconfig, device_type type, const char *tag) : vsmile_base_state(mconfig, type, tag) , m_cart(*this, "cartslot") + , m_ctrl(*this, "ctrl%u", 1U) , m_io_joy(*this, "JOY") , m_io_colors(*this, "COLORS") , m_io_buttons(*this, "BUTTONS") @@ -123,6 +125,7 @@ private: }; required_device m_cart; + required_device_array m_ctrl; required_ioport m_io_joy; required_ioport m_io_colors; required_ioport m_io_buttons; @@ -602,6 +605,14 @@ void vsmile_state::vsmile(machine_config &config) VSMILE_CART_SLOT(config, m_cart, vsmile_cart, nullptr); + VSMILE_CTRL_PORT(config, m_ctrl[0], vsmile_controllers, "joy"); + m_ctrl[0]->rts_cb().set([this] (int state) { logerror("controller 1 RTS: %d\n", state); }); + m_ctrl[0]->data_cb().set([this] (int data) { logerror("controller 1 data: %02X\n", data); }); + + VSMILE_CTRL_PORT(config, m_ctrl[1], vsmile_controllers, nullptr); + m_ctrl[1]->rts_cb().set([this] (int state) { logerror("controller 2 RTS: %d\n", state); }); + m_ctrl[1]->data_cb().set([this] (int data) { logerror("controller 2 data: %02X\n", data); }); + SOFTWARE_LIST(config, "cart_list").set_original("vsmile_cart"); SOFTWARE_LIST(config, "cart_list2").set_original("vsmilem_cart"); }