summaryrefslogtreecommitdiffstatshomepage
path: root/src
diff options
context:
space:
mode:
author Curt Coder <curtcoder@mail.com>2014-03-11 13:36:53 +0000
committer Curt Coder <curtcoder@mail.com>2014-03-11 13:36:53 +0000
commit22b1da4b2c41ecbbf4f2fe19625a7659afde31d7 (patch)
tree9c4984ca414f5d83a221d34b2ac6ea98dce02999 /src
parent64772070164be1d61395a8636e83396b6e19df08 (diff)
(MESS) mc6852: devcb2 + diserial. (nw)
Diffstat (limited to 'src')
-rw-r--r--src/emu/bus/c64/tdos.c17
-rw-r--r--src/emu/machine/mc6852.c208
-rw-r--r--src/emu/machine/mc6852.h95
-rw-r--r--src/mess/drivers/victor9k.c14
4 files changed, 119 insertions, 215 deletions
diff --git a/src/emu/bus/c64/tdos.c b/src/emu/bus/c64/tdos.c
index 027b9fe886b..27753f8db98 100644
--- a/src/emu/bus/c64/tdos.c
+++ b/src/emu/bus/c64/tdos.c
@@ -152,26 +152,11 @@ const device_type C64_TDOS = &device_creator<c64_tdos_cartridge_device>;
//-------------------------------------------------
-// MC6852_INTERFACE( ssda_intf )
-//-------------------------------------------------
-
-static MC6852_INTERFACE( ssda_intf )
-{
- 0,
- 0,
- DEVCB_NULL,
- DEVCB_NULL,
- DEVCB_NULL,
- DEVCB_NULL
-};
-
-
-//-------------------------------------------------
// MACHINE_CONFIG_FRAGMENT( c64_multiscreen )
//-------------------------------------------------
static MACHINE_CONFIG_FRAGMENT( c64_tdos )
- MCFG_MC6852_ADD(MC68A52P_TAG, XTAL_6_5MHz, ssda_intf)
+ MCFG_DEVICE_ADD(MC68A52P_TAG, MC6852, XTAL_6_5MHz)
MCFG_C64_PASSTHRU_EXPANSION_SLOT_ADD()
MACHINE_CONFIG_END
diff --git a/src/emu/machine/mc6852.c b/src/emu/machine/mc6852.c
index 485e4ffd0b4..a5da9f68b62 100644
--- a/src/emu/machine/mc6852.c
+++ b/src/emu/machine/mc6852.c
@@ -24,14 +24,17 @@
*/
-#include "emu.h"
#include "mc6852.h"
-// device type definition
+//**************************************************************************
+// DEVICE DEFINITIONS
+//**************************************************************************
+
const device_type MC6852 = &device_creator<mc6852_device>;
+
//**************************************************************************
// MACROS / CONSTANTS
//**************************************************************************
@@ -84,19 +87,6 @@ const device_type MC6852 = &device_creator<mc6852_device>;
#define C3_CTUF 0x08
-//**************************************************************************
-// INLINE HELPERS
-//**************************************************************************
-
-inline void mc6852_device::receive()
-{
-}
-
-inline void mc6852_device::transmit()
-{
-}
-
-
//**************************************************************************
// LIVE DEVICE
@@ -106,59 +96,34 @@ inline void mc6852_device::transmit()
// mc6852_device - constructor
//-------------------------------------------------
-mc6852_device::mc6852_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
- : device_t(mconfig, MC6852, "MC6852", tag, owner, clock, "mc6852", __FILE__)
+mc6852_device::mc6852_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) :
+ device_t(mconfig, MC6852, "MC6852", tag, owner, clock, "mc6852", __FILE__),
+ device_serial_interface(mconfig, *this),
+ m_write_tx_data(*this),
+ m_write_irq(*this),
+ m_write_sm_dtr(*this),
+ m_write_tuf(*this),
+ m_rx_clock(0),
+ m_tx_clock(0),
+ m_cts(1),
+ m_dcd(1),
+ m_sm_dtr(0),
+ m_tuf(0)
{
}
//-------------------------------------------------
-// device_config_complete - perform any
-// operations now that the configuration is
-// complete
-//-------------------------------------------------
-
-void mc6852_device::device_config_complete()
-{
- // inherit a copy of the static data
- const mc6852_interface *intf = reinterpret_cast<const mc6852_interface *>(static_config());
- if (intf != NULL)
- *static_cast<mc6852_interface *>(this) = *intf;
-
- // or initialize to defaults if none provided
- else
- {
- memset(&m_out_tx_data_cb, 0, sizeof(m_out_tx_data_cb));
- memset(&m_out_irq_cb, 0, sizeof(m_out_irq_cb));
- memset(&m_out_sm_dtr_cb, 0, sizeof(m_out_sm_dtr_cb));
- memset(&m_out_tuf_cb, 0, sizeof(m_out_tuf_cb));
- }
-}
-
-
-//-------------------------------------------------
// device_start - device-specific startup
//-------------------------------------------------
void mc6852_device::device_start()
{
// resolve callbacks
- m_out_tx_data_func.resolve(m_out_tx_data_cb, *this);
- m_out_irq_func.resolve(m_out_irq_cb, *this);
- m_out_sm_dtr_func.resolve(m_out_sm_dtr_cb, *this);
- m_out_tuf_func.resolve(m_out_tuf_cb, *this);
-
- if (m_rx_clock > 0)
- {
- m_rx_timer = timer_alloc(TIMER_RX);
- m_rx_timer->adjust(attotime::zero, 0, attotime::from_hz(m_rx_clock));
- }
-
- if (m_tx_clock > 0)
- {
- m_tx_timer = timer_alloc(TIMER_TX);
- m_tx_timer->adjust(attotime::zero, 0, attotime::from_hz(m_tx_clock));
- }
+ m_write_tx_data.resolve_safe();
+ m_write_irq.resolve_safe();
+ m_write_sm_dtr.resolve_safe();
+ m_write_tuf.resolve_safe();
// register for state saving
save_item(NAME(m_status));
@@ -183,6 +148,15 @@ void mc6852_device::device_start()
void mc6852_device::device_reset()
{
+ m_rx_fifo = std::queue<UINT8>();
+ m_tx_fifo = std::queue<UINT8>();
+
+ transmit_register_reset();
+ receive_register_reset();
+
+ set_rcv_rate(m_rx_clock);
+ set_tra_rate(m_tx_clock);
+
/* set receiver shift register to all 1's */
m_rsr = 0xff;
@@ -197,16 +171,37 @@ void mc6852_device::device_reset()
void mc6852_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
{
- switch (id)
- {
- case TIMER_RX:
- receive();
- break;
+ device_serial_interface::device_timer(timer, id, param, ptr);
+}
- case TIMER_TX:
- transmit();
- break;
- }
+
+//-------------------------------------------------
+// tra_callback -
+//-------------------------------------------------
+
+void mc6852_device::tra_callback()
+{
+ m_write_tx_data(transmit_register_get_data_bit());
+}
+
+
+//-------------------------------------------------
+// tra_complete -
+//-------------------------------------------------
+
+void mc6852_device::tra_complete()
+{
+ // TODO
+}
+
+
+//-------------------------------------------------
+// rcv_complete -
+//-------------------------------------------------
+
+void mc6852_device::rcv_complete()
+{
+ // TODO
}
@@ -220,11 +215,14 @@ READ8_MEMBER( mc6852_device::read )
if (BIT(offset, 0))
{
- /* receive data FIFO */
+ if (m_rx_fifo.size() > 0)
+ {
+ data = m_rx_fifo.front();
+ m_rx_fifo.pop();
+ }
}
else
{
- /* status */
data = m_status;
}
@@ -259,6 +257,10 @@ WRITE8_MEMBER( mc6852_device::write )
case C1_AC_TX_FIFO:
/* transmit data FIFO */
+ if (m_tx_fifo.size() < 3)
+ {
+ m_tx_fifo.push(data);
+ }
break;
}
}
@@ -303,73 +305,3 @@ WRITE8_MEMBER( mc6852_device::write )
m_cr[0] = data;
}
}
-
-
-//-------------------------------------------------
-// rx_clk_w -
-//-------------------------------------------------
-
-WRITE_LINE_MEMBER( mc6852_device::rx_clk_w )
-{
- if (state) receive();
-}
-
-
-//-------------------------------------------------
-// tx_clk_w -
-//-------------------------------------------------
-
-WRITE_LINE_MEMBER( mc6852_device::tx_clk_w )
-{
- if (state) transmit();
-}
-
-
-//-------------------------------------------------
-// cts_w -
-//-------------------------------------------------
-
-WRITE_LINE_MEMBER( mc6852_device::cts_w )
-{
- m_cts = state;
-}
-
-
-//-------------------------------------------------
-// dcd_w -
-//-------------------------------------------------
-
-WRITE_LINE_MEMBER( mc6852_device::dcd_w )
-{
- m_dcd = state;
-}
-
-
-//-------------------------------------------------
-// sm_dtr_r -
-//-------------------------------------------------
-
-READ_LINE_MEMBER( mc6852_device::sm_dtr_r )
-{
- return m_sm_dtr;
-}
-
-
-//-------------------------------------------------
-// tuf_r -
-//-------------------------------------------------
-
-READ_LINE_MEMBER( mc6852_device::tuf_r )
-{
- return m_tuf;
-}
-
-
-//-------------------------------------------------
-// write_rx -
-//-------------------------------------------------
-
-WRITE_LINE_MEMBER( mc6852_device::write_rx )
-{
- m_rxd = state;
-}
diff --git a/src/emu/machine/mc6852.h b/src/emu/machine/mc6852.h
index 6ebb447a292..2cde8a92366 100644
--- a/src/emu/machine/mc6852.h
+++ b/src/emu/machine/mc6852.h
@@ -30,6 +30,7 @@
#define __MC6852__
#include "emu.h"
+#include <queue>
@@ -37,98 +38,92 @@
// INTERFACE CONFIGURATION MACROS
//**************************************************************************
-#define MCFG_MC6852_ADD(_tag, _clock, _config) \
- MCFG_DEVICE_ADD((_tag), MC6852, _clock) \
- MCFG_DEVICE_CONFIG(_config)
+#define MCFG_MC6852_RX_CLOCK(_clock) \
+ mc6852_device::set_rx_clock(*device, _clock);
-#define MC6852_INTERFACE(name) \
- const mc6852_interface (name) =
+#define MCFG_MC6852_TX_CLOCK(_clock) \
+ mc6852_device::set_tx_clock(*device, _clock);
+#define MCFG_MC6852_TX_DATA_CALLBACK(_write) \
+ devcb = &mc6852_device::set_tx_data_wr_callback(*device, DEVCB2_##_write);
+#define MCFG_MC6852_IRQ_CALLBACK(_write) \
+ devcb = &mc6852_device::set_irq_wr_callback(*device, DEVCB2_##_write);
-//**************************************************************************
-// TYPE DEFINITIONS
-//**************************************************************************
-
-// ======================> mc6852_interface
+#define MCFG_MC6852_SM_DTR_CALLBACK(_write) \
+ devcb = &mc6852_device::set_sm_dtr_wr_callback(*device, DEVCB2_##_write);
-struct mc6852_interface
-{
- UINT32 m_rx_clock;
- UINT32 m_tx_clock;
-
- devcb_write_line m_out_tx_data_cb;
+#define MCFG_MC6852_TUF_CALLBACK(_write) \
+ devcb = &mc6852_device::set_tuf_wr_callback(*device, DEVCB2_##_write);
- devcb_write_line m_out_irq_cb;
- devcb_write_line m_out_sm_dtr_cb;
- devcb_write_line m_out_tuf_cb;
-};
+//**************************************************************************
+// TYPE DEFINITIONS
+//**************************************************************************
// ======================> mc6852_device
class mc6852_device : public device_t,
- public mc6852_interface
+ public device_serial_interface
{
public:
// construction/destruction
mc6852_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
+ static void set_rx_clock(device_t &device, int clock) { downcast<mc6852_device &>(device).m_rx_clock = clock; }
+ static void set_tx_clock(device_t &device, int clock) { downcast<mc6852_device &>(device).m_tx_clock = clock; }
+ template<class _Object> static devcb2_base &set_tx_data_wr_callback(device_t &device, _Object object) { return downcast<mc6852_device &>(device).m_write_tx_data.set_callback(object); }
+ template<class _Object> static devcb2_base &set_irq_wr_callback(device_t &device, _Object object) { return downcast<mc6852_device &>(device).m_write_irq.set_callback(object); }
+ template<class _Object> static devcb2_base &set_sm_dtr_wr_callback(device_t &device, _Object object) { return downcast<mc6852_device &>(device).m_write_sm_dtr.set_callback(object); }
+ template<class _Object> static devcb2_base &set_tuf_wr_callback(device_t &device, _Object object) { return downcast<mc6852_device &>(device).m_write_tuf.set_callback(object); }
+
DECLARE_READ8_MEMBER( read );
DECLARE_WRITE8_MEMBER( write );
- DECLARE_WRITE_LINE_MEMBER( write_rx );
- DECLARE_WRITE_LINE_MEMBER( rx_clk_w );
- DECLARE_WRITE_LINE_MEMBER( tx_clk_w );
- DECLARE_WRITE_LINE_MEMBER( cts_w );
- DECLARE_WRITE_LINE_MEMBER( dcd_w );
+ DECLARE_WRITE_LINE_MEMBER( rx_data_w ) { device_serial_interface::rx_w(state); }
+ DECLARE_WRITE_LINE_MEMBER( rx_clk_w ) { rx_clock_w(state); }
+ DECLARE_WRITE_LINE_MEMBER( tx_clk_w ) { tx_clock_w(state); }
+ DECLARE_WRITE_LINE_MEMBER( cts_w ) { m_cts = state; }
+ DECLARE_WRITE_LINE_MEMBER( dcd_w ) { m_dcd = state; }
- DECLARE_READ_LINE_MEMBER( sm_dtr_r );
- DECLARE_READ_LINE_MEMBER( tuf_r );
+ DECLARE_READ_LINE_MEMBER( sm_dtr_r ) { return m_sm_dtr; }
+ DECLARE_READ_LINE_MEMBER( tuf_r ) { return m_tuf; }
protected:
// device-level overrides
- virtual void device_config_complete();
virtual void device_start();
virtual void device_reset();
virtual void device_timer(emu_timer &timer, device_timer_id id, int m_param, void *ptr);
-private:
- static const device_timer_id TIMER_RX = 0;
- static const device_timer_id TIMER_TX = 1;
-
- inline void receive();
- inline void transmit();
+ // device_serial_interface overrides
+ virtual void tra_callback();
+ virtual void tra_complete();
+ virtual void rcv_complete();
- devcb_resolved_read_line m_in_rx_data_func;
- devcb_resolved_write_line m_out_tx_data_func;
- devcb_resolved_write_line m_out_irq_func;
- devcb_resolved_read_line m_in_cts_func;
- devcb_resolved_read_line m_in_dcd_func;
- devcb_resolved_write_line m_out_sm_dtr_func;
- devcb_resolved_write_line m_out_tuf_func;
+private:
+ devcb2_write_line m_write_tx_data;
+ devcb2_write_line m_write_irq;
+ devcb2_write_line m_write_sm_dtr;
+ devcb2_write_line m_write_tuf;
- // registers
UINT8 m_status; // status register
UINT8 m_cr[3]; // control registers
UINT8 m_scr; // sync code register
- UINT8 m_rx_fifo[3]; // receiver FIFO
- UINT8 m_tx_fifo[3]; // transmitter FIFO
UINT8 m_tdr; // transmit data register
UINT8 m_tsr; // transmit shift register
UINT8 m_rdr; // receive data register
UINT8 m_rsr; // receive shift register
- int m_rxd;
+ std::queue<UINT8> m_rx_fifo;
+ std::queue<UINT8> m_tx_fifo;
+
+ int m_rx_clock;
+ int m_tx_clock;
int m_cts; // clear to send
int m_dcd; // data carrier detect
int m_sm_dtr; // sync match/data terminal ready
int m_tuf; // transmitter underflow
-
- // timers
- emu_timer *m_rx_timer;
- emu_timer *m_tx_timer;
};
diff --git a/src/mess/drivers/victor9k.c b/src/mess/drivers/victor9k.c
index a8b1b7e47bb..4676a77608b 100644
--- a/src/mess/drivers/victor9k.c
+++ b/src/mess/drivers/victor9k.c
@@ -393,16 +393,6 @@ WRITE_LINE_MEMBER( victor9k_state::ssda_irq_w )
m_pic->ir3_w(m_ssda_irq || m_via1_irq || m_via2_irq || m_via3_irq || m_via4_irq || m_via5_irq || m_via6_irq);
}
-static MC6852_INTERFACE( ssda_intf )
-{
- 0,
- 0,
- DEVCB_DEVICE_LINE_MEMBER(HC55516_TAG, hc55516_device, digit_w),
- DEVCB_DRIVER_LINE_MEMBER(victor9k_state, ssda_irq_w),
- DEVCB_NULL,
- DEVCB_NULL
-};
-
WRITE8_MEMBER( victor9k_state::via1_pa_w )
{
@@ -981,7 +971,9 @@ static MACHINE_CONFIG_START( victor9k, victor9k_state )
MCFG_PIT8253_OUT2_HANDLER(DEVWRITELINE(I8259A_TAG, pic8259_device, ir2_w))
MCFG_UPD7201_ADD(UPD7201_TAG, XTAL_30MHz/30, mpsc_intf)
- MCFG_MC6852_ADD(MC6852_TAG, XTAL_30MHz/30, ssda_intf)
+ MCFG_DEVICE_ADD(MC6852_TAG, MC6852, XTAL_30MHz/30)
+ MCFG_MC6852_TX_DATA_CALLBACK(DEVWRITELINE(HC55516_TAG, hc55516_device, digit_w))
+ MCFG_MC6852_IRQ_CALLBACK(WRITELINE(victor9k_state, ssda_irq_w))
MCFG_DEVICE_ADD(M6522_1_TAG, VIA6522, XTAL_30MHz/30)
MCFG_VIA6522_READPA_HANDLER(DEVREAD8(IEEE488_TAG, ieee488_device, dio_r))