vsmile: add skeleton controller bus

This commit is contained in:
Vas Crabb 2019-01-20 01:25:44 +11:00
parent 84e83a8bbc
commit 57d9f16115
6 changed files with 338 additions and 1 deletions

View File

@ -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

View File

@ -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
}

View File

@ -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

View File

@ -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<vsmile_ctrl_port_device *>(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<device_vsmile_ctrl_interface *>(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<device_vsmile_ctrl_interface *>(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);
}

View File

@ -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 <typename T>
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

View File

@ -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<vsmile_cart_slot_device> m_cart;
required_device_array<vsmile_ctrl_port_device, 2> 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");
}