diff options
author | 2014-03-11 13:36:53 +0000 | |
---|---|---|
committer | 2014-03-11 13:36:53 +0000 | |
commit | 22b1da4b2c41ecbbf4f2fe19625a7659afde31d7 (patch) | |
tree | 9c4984ca414f5d83a221d34b2ac6ea98dce02999 /src | |
parent | 64772070164be1d61395a8636e83396b6e19df08 (diff) |
(MESS) mc6852: devcb2 + diserial. (nw)
Diffstat (limited to 'src')
-rw-r--r-- | src/emu/bus/c64/tdos.c | 17 | ||||
-rw-r--r-- | src/emu/machine/mc6852.c | 208 | ||||
-rw-r--r-- | src/emu/machine/mc6852.h | 95 | ||||
-rw-r--r-- | src/mess/drivers/victor9k.c | 14 |
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)) |