1 // license:BSD-3-Clause
2 // copyright-holders:R. Belmont
3 
4 #ifndef MAME_MACHINE_DC7085_H
5 #define MAME_MACHINE_DC7085_H
6 
7 #pragma once
8 
9 #include "diserial.h"
10 
11 #define DC7085_RX_FIFO_SIZE (64)
12 
13 // forward declaration
14 class dc7085_device;
15 
16 class dc7085_channel : public device_t, public device_serial_interface
17 {
18 public:
19 	dc7085_channel(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
20 
21 	// device-level overrides
22 	virtual void device_start() override;
23 	virtual void device_reset() override;
24 
25 	// device_serial overrides
26 	virtual void rcv_complete() override;    // Rx completed receiving byte
27 	virtual void tra_complete() override;    // Tx completed sending byte
28 	virtual void tra_callback() override;    // Tx send bit
29 
30 	void set_baud_rate(int baud);
31 	void set_format(int data_bits, int parity, int stop_bits);
32 	void clear();
33 	void set_tx_enable(bool bEnabled);
34 	void set_rx_enable(bool bEnabled);
35 	void write_TX(uint8_t data);
is_tx_ready()36 	bool is_tx_ready()
37 	{
38 		if (!tx_enabled)
39 		{
40 			return false;
41 		}
42 
43 		return tx_ready ? true : false;
44 	}
45 
46 private:
47 	/* Receiver */
48 	u8 rx_enabled;
49 
50 	/* Shared */
51 	int baud_rate;
52 	int m_ch;
53 
54 	/* Transmitter */
55 	u8 tx_enabled;
56 	u8 tx_data;
57 	u8 tx_ready;
58 
59 	dc7085_device *m_base;
60 };
61 
62 class dc7085_device : public device_t
63 {
64 	friend class dc7085_channel;
65 
66 public:
67 	required_device<dc7085_channel> m_chan0, m_chan1, m_chan2, m_chan3;
68 
69 	dc7085_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
70 
71 	void map(address_map &map);
72 
int_cb()73 	auto int_cb() { return m_int_cb.bind(); }
ch0_tx_cb()74 	auto ch0_tx_cb() { return write_0_tx.bind(); }
ch1_tx_cb()75 	auto ch1_tx_cb() { return write_1_tx.bind(); }
ch2_tx_cb()76 	auto ch2_tx_cb() { return write_2_tx.bind(); }
ch3_tx_cb()77 	auto ch3_tx_cb() { return write_3_tx.bind(); }
78 
79 protected:
80 	// standard device_interface overrides
81 	virtual void device_start() override;
82 	virtual void device_reset() override;
83 	virtual void device_add_mconfig(machine_config &config) override;
84 
85 	void rx_fifo_push(uint16_t data, uint16_t errors);
86 	void recalc_irqs();
87 
88 	devcb_write_line m_int_cb;
89 	devcb_write_line write_0_tx, write_1_tx, write_2_tx, write_3_tx;
90 
91 	u16 m_status;
92 
93 	u16 status_r();
94 	u16 rxbuffer_r();
95 	u16 txparams_r();
96 	u16 modem_status_r();
97 	void control_w(u16 data);
98 	void lineparams_w(u16 data);
99 	void txparams_w(u16 data);
100 	void txdata_w(u16 data);
101 
get_ch(dc7085_channel * ch)102 	int get_ch(dc7085_channel *ch)
103 	{
104 		if (ch == m_chan0)
105 		{
106 			return 0;
107 		}
108 		else if (ch == m_chan1)
109 		{
110 			return 1;
111 		}
112 		else if (ch == m_chan2)
113 		{
114 			return 2;
115 		}
116 
117 		return 3;
118 	}
119 
120 private:
121 	u16 rx_fifo[DC7085_RX_FIFO_SIZE];
122 	int rx_fifo_read_ptr;
123 	int rx_fifo_write_ptr;
124 	int rx_fifo_num;
125 
126 	enum control_status_mask : u16
127 	{
128 		CTRL_TRDY           = 0x8000,
129 		CTRL_TX_IRQ_ENABLE  = 0x4000,
130 		CTRL_LINE_MASK      = 0x0300,
131 		CTRL_RX_DONE        = 0x0080,
132 		CTRL_RX_IRQ_ENABLE  = 0x0040,
133 		CTRL_MASTER_SCAN    = 0x0020,
134 		CTRL_MASTER_CLEAR   = 0x0010,
135 		CTRL_LOOPBACK       = 0x0008
136 	};
137 
138 	enum rx_buffer_mask : u16
139 	{
140 		RXMASK_DATA_VALID   = 0x8000,
141 		RXMASK_OVERRUN_ERR  = 0x4000,
142 		RXMASK_FRAMING_ERR  = 0x2000,
143 		RXMASK_PARITY_ERR   = 0x1000,
144 		RXMASK_LINE_MASK    = 0x0300,
145 		RXMASK_DATA_MASK    = 0x00ff
146 	};
147 
148 	enum line_param_mask : u16
149 	{
150 		LPARAM_RX_ENABLE    = 0x1000,
151 		LPARAM_BAUD_MASK    = 0x0f00,
152 		LPARAM_ODD_PARITY   = 0x0080,
153 		LPARAM_PARITY_ENB   = 0x0040,
154 		LPARAM_STOP_BITS    = 0x0020,
155 		LPARAM_CHARLEN_MASK = 0x0018,
156 		LPARAM_LINE_MASK    = 0x0003
157 	};
158 
159 	enum tx_control_mask : u16
160 	{
161 		TXCTRL_DTR2         = 0x0400,
162 		TXCTRL_LINE3_ENB    = 0x0008,
163 		TXCTRL_LINE2_ENB    = 0x0004,
164 		TXCTRL_LINE1_ENB    = 0x0002,
165 		TXCTRL_LINE0_ENB    = 0x0001
166 	};
167 
168 	enum modem_status_mask : u16
169 	{
170 		MSTAT_DSR2          = 0x0400
171 	};
172 
173 	enum tx_data_mask : u16
174 	{
175 		TXDATA_LINE3_BREAK  = 0x0800,
176 		TXDATA_LINE2_BREAK  = 0x0400,
177 		TXDATA_LINE1_BREAK  = 0x0200,
178 		TXDATA_LINE0_BREAK  = 0x0100,
179 		TXDATA_DATA_MASK    = 0x00ff
180 	};
181 };
182 
183 DECLARE_DEVICE_TYPE(DC7085, dc7085_device)
184 DECLARE_DEVICE_TYPE(DC7085_CHANNEL, dc7085_channel)
185 
186 #endif // MAME_MACHINE_DC7085_H
187