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