summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/machine/mc68681.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/machine/mc68681.h')
-rw-r--r--src/devices/machine/mc68681.h87
1 files changed, 70 insertions, 17 deletions
diff --git a/src/devices/machine/mc68681.h b/src/devices/machine/mc68681.h
index f2093fc66cc..6577d1be552 100644
--- a/src/devices/machine/mc68681.h
+++ b/src/devices/machine/mc68681.h
@@ -11,28 +11,38 @@
MCFG_DEVICE_REPLACE(_tag, MC68681, _clock)
#define MCFG_MC68681_IRQ_CALLBACK(_cb) \
- devcb = &mc68681_device::set_irq_cb(*device, DEVCB_##_cb);
+ devcb = &mc68681_base_device::set_irq_cb(*device, DEVCB_##_cb);
#define MCFG_MC68681_A_TX_CALLBACK(_cb) \
- devcb = &mc68681_device::set_a_tx_cb(*device, DEVCB_##_cb);
+ devcb = &mc68681_base_device::set_a_tx_cb(*device, DEVCB_##_cb);
#define MCFG_MC68681_B_TX_CALLBACK(_cb) \
- devcb = &mc68681_device::set_b_tx_cb(*device, DEVCB_##_cb);
+ devcb = &mc68681_base_device::set_b_tx_cb(*device, DEVCB_##_cb);
// deprecated: use ipX_w() instead
#define MCFG_MC68681_INPORT_CALLBACK(_cb) \
- devcb = &mc68681_device::set_inport_cb(*device, DEVCB_##_cb);
+ devcb = &mc68681_base_device::set_inport_cb(*device, DEVCB_##_cb);
#define MCFG_MC68681_OUTPORT_CALLBACK(_cb) \
- devcb = &mc68681_device::set_outport_cb(*device, DEVCB_##_cb);
+ devcb = &mc68681_base_device::set_outport_cb(*device, DEVCB_##_cb);
#define MCFG_MC68681_SET_EXTERNAL_CLOCKS(_a, _b, _c, _d) \
- mc68681_device::static_set_clocks(*device, _a, _b, _c, _d);
+ mc68681_base_device::static_set_clocks(*device, _a, _b, _c, _d);
+
+// SC28C94 specific callbacks
+#define MCFG_SC28C94_ADD(_tag, _clock) \
+ MCFG_DEVICE_ADD(_tag, SC28C94, _clock)
+
+#define MCFG_SC28C94_C_TX_CALLBACK(_cb) \
+ devcb = &sc28c94_device::set_c_tx_cb(*device, DEVCB_##_cb);
+
+#define MCFG_SC28C94_D_TX_CALLBACK(_cb) \
+ devcb = &sc28c94_device::set_d_tx_cb(*device, DEVCB_##_cb);
#define MC68681_RX_FIFO_SIZE 3
// forward declaration
-class mc68681_device;
+class mc68681_base_device;
// mc68681_channel class
class mc68681_channel : public device_t, public device_serial_interface
@@ -86,7 +96,7 @@ private:
uint8_t tx_data;
uint8_t tx_ready;
- mc68681_device *m_uart;
+ mc68681_base_device *m_uart;
void write_MR(uint8_t data);
void write_CR(uint8_t data);
@@ -94,15 +104,17 @@ private:
void recalc_framing();
};
-class mc68681_device : public device_t
+class mc68681_base_device : public device_t
{
friend class mc68681_channel;
public:
- mc68681_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ mc68681_base_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, const char *shortname, const char *source);
required_device<mc68681_channel> m_chanA;
required_device<mc68681_channel> m_chanB;
+ optional_device<mc68681_channel> m_chanC;
+ optional_device<mc68681_channel> m_chanD;
// inline configuration helpers
static void static_set_clocks(device_t &device, int clk3, int clk4, int clk5, int clk6);
@@ -115,13 +127,13 @@ public:
DECLARE_WRITE_LINE_MEMBER( rx_a_w ) { m_chanA->device_serial_interface::rx_w((uint8_t)state); }
DECLARE_WRITE_LINE_MEMBER( rx_b_w ) { m_chanB->device_serial_interface::rx_w((uint8_t)state); }
- template<class _Object> static devcb_base &set_irq_cb(device_t &device, _Object object) { return downcast<mc68681_device &>(device).write_irq.set_callback(object); }
- template<class _Object> static devcb_base &set_a_tx_cb(device_t &device, _Object object) { return downcast<mc68681_device &>(device).write_a_tx.set_callback(object); }
- template<class _Object> static devcb_base &set_b_tx_cb(device_t &device, _Object object) { return downcast<mc68681_device &>(device).write_b_tx.set_callback(object); }
- template<class _Object> static devcb_base &set_inport_cb(device_t &device, _Object object) { return downcast<mc68681_device &>(device).read_inport.set_callback(object); }
- template<class _Object> static devcb_base &set_outport_cb(device_t &device, _Object object) { return downcast<mc68681_device &>(device).write_outport.set_callback(object); }
+ template<class _Object> static devcb_base &set_irq_cb(device_t &device, _Object object) { return downcast<mc68681_base_device &>(device).write_irq.set_callback(object); }
+ template<class _Object> static devcb_base &set_a_tx_cb(device_t &device, _Object object) { return downcast<mc68681_base_device &>(device).write_a_tx.set_callback(object); }
+ template<class _Object> static devcb_base &set_b_tx_cb(device_t &device, _Object object) { return downcast<mc68681_base_device &>(device).write_b_tx.set_callback(object); }
+ template<class _Object> static devcb_base &set_inport_cb(device_t &device, _Object object) { return downcast<mc68681_base_device &>(device).read_inport.set_callback(object); }
+ template<class _Object> static devcb_base &set_outport_cb(device_t &device, _Object object) { return downcast<mc68681_base_device &>(device).write_outport.set_callback(object); }
- devcb_write_line write_irq, write_a_tx, write_b_tx;
+ devcb_write_line write_irq, write_a_tx, write_b_tx, write_c_tx, write_d_tx;
devcb_read8 read_inport;
devcb_write8 write_outport;
int32_t ip3clk, ip4clk, ip5clk, ip6clk;
@@ -166,15 +178,56 @@ private:
uint16_t duart68681_get_ct_count();
void duart68681_start_ct(int count);
int calc_baud(int ch, uint8_t data);
- int get_ch(mc68681_channel *ch) { return (ch == m_chanA) ? 0 : 1; }
void clear_ISR_bits(int mask);
void set_ISR_bits(int mask);
void update_interrupts();
+ int get_ch(mc68681_channel *ch)
+ {
+ if (ch == m_chanA)
+ {
+ return 0;
+ }
+ else if (ch == m_chanB)
+ {
+ return 1;
+ }
+ else if (ch == m_chanC)
+ {
+ return 2;
+ }
+
+ return 3;
+ }
+
mc68681_channel *get_channel(int chan);
};
+class mc68681_device : public mc68681_base_device
+{
+public:
+ mc68681_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+};
+
+class sc28c94_device : public mc68681_base_device
+{
+public:
+ sc28c94_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+
+ template<class _Object> static devcb_base &set_c_tx_cb(device_t &device, _Object object) { return downcast<mc68681_base_device &>(device).write_c_tx.set_callback(object); }
+ template<class _Object> static devcb_base &set_d_tx_cb(device_t &device, _Object object) { return downcast<mc68681_base_device &>(device).write_d_tx.set_callback(object); }
+
+ DECLARE_WRITE_LINE_MEMBER( rx_c_w ) { m_chanC->device_serial_interface::rx_w((uint8_t)state); }
+ DECLARE_WRITE_LINE_MEMBER( rx_d_w ) { m_chanD->device_serial_interface::rx_w((uint8_t)state); }
+
+protected:
+ virtual machine_config_constructor device_mconfig_additions() const override;
+
+private:
+};
+
extern const device_type MC68681;
+extern const device_type SC28C94;
extern const device_type MC68681_CHANNEL;
#endif //_N68681_H