1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
|
// 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_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_single_card_slot_interface<device_vsmile_ctrl_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_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
|