summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/bus/vsmile/vsmile_ctrl.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/bus/vsmile/vsmile_ctrl.h')
-rw-r--r--src/devices/bus/vsmile/vsmile_ctrl.h153
1 files changed, 153 insertions, 0 deletions
diff --git a/src/devices/bus/vsmile/vsmile_ctrl.h b/src/devices/bus/vsmile/vsmile_ctrl.h
new file mode 100644
index 00000000000..66921ce817a
--- /dev/null
+++ b/src/devices/bus/vsmile/vsmile_ctrl.h
@@ -0,0 +1,153 @@
+// license:BSD-3-Clause
+// copyright-holders:Vas Crabb
+#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 select_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 select_w(int state) { if (m_device) m_device->select_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;
+};
+
+
+// ======================> vsmile_ctrl_device_base
+
+class vsmile_ctrl_device_base : public device_t, public device_vsmile_ctrl_interface
+{
+public:
+ // destruction
+ virtual ~vsmile_ctrl_device_base();
+
+protected:
+ // construction
+ vsmile_ctrl_device_base(machine_config const &mconfig, device_type type, char const *tag, device_t *owner, uint32_t clock);
+
+ // device_t implementation
+ virtual void device_start() override;
+
+ // UART simulation helpers
+ bool is_tx_empty() const { return m_tx_fifo_empty; }
+ bool queue_tx(uint8_t data);
+
+private:
+ // device_vsmile_ctrl_interfaceA implementation
+ virtual void select_w(int state) override;
+ virtual void data_w(uint8_t data) override;
+
+ // UART simulation handlers
+ virtual void tx_complete() = 0;
+ virtual void tx_timeout() = 0;
+ virtual void rx_complete(uint8_t data, bool select) = 0;
+
+ // internal helpers
+ TIMER_CALLBACK_MEMBER(tx_timer_expired);
+ TIMER_CALLBACK_MEMBER(rts_timer_expired);
+
+ emu_timer *m_tx_timer, *m_rts_timer;
+
+ uint8_t m_tx_fifo[32];
+ uint8_t m_tx_fifo_head, m_tx_fifo_tail;
+ bool m_tx_fifo_empty, m_tx_active;
+ bool m_select;
+};
+
+
+/***************************************************************************
+ 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