Converted mc68901_device to devcb2 (nw)

This commit is contained in:
Ivan Vangelista 2014-03-15 10:13:08 +00:00
parent 6d8bb6ece0
commit aa8f18efa3
7 changed files with 142 additions and 201 deletions

View File

@ -184,11 +184,11 @@ inline void mc68901_device::check_interrupts()
{
if (m_ipr & m_imr)
{
m_out_irq_func(ASSERT_LINE);
m_out_irq_cb(ASSERT_LINE);
}
else
{
m_out_irq_func(CLEAR_LINE);
m_out_irq_cb(CLEAR_LINE);
}
}
@ -228,10 +228,10 @@ inline void mc68901_device::timer_count(int index)
switch (index)
{
case TIMER_A: m_out_tao_func(m_to[index]); break;
case TIMER_B: m_out_tbo_func(m_to[index]); break;
case TIMER_C: m_out_tco_func(m_to[index]); break;
case TIMER_D: m_out_tdo_func(m_to[index]); break;
case TIMER_A: m_out_tao_cb(m_to[index]); break;
case TIMER_B: m_out_tbo_cb(m_to[index]); break;
case TIMER_C: m_out_tco_cb(m_to[index]); break;
case TIMER_D: m_out_tdo_cb(m_to[index]); break;
}
if (m_ier & INT_MASK_TIMER[index])
@ -323,7 +323,7 @@ void mc68901_device::gpio_output()
if (m_gpio_output != new_gpio_output)
{
m_gpio_output = new_gpio_output;
m_out_gpio_func(0, m_gpio_output);
m_out_gpio_cb((offs_t)0, m_gpio_output);
}
}
@ -338,6 +338,18 @@ void mc68901_device::gpio_output()
mc68901_device::mc68901_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
: device_t(mconfig, MC68901, "Motorola MC68901", tag, owner, clock, "mc68901", __FILE__),
device_serial_interface(mconfig, *this),
m_timer_clock(0),
m_rx_clock(0),
m_tx_clock(0),
m_out_irq_cb(*this),
m_out_gpio_cb(*this),
m_out_tao_cb(*this),
m_out_tbo_cb(*this),
m_out_tco_cb(*this),
m_out_tdo_cb(*this),
m_out_so_cb(*this),
//m_out_rr_cb(*this),
//m_out_tr_cb(*this),
m_aer(0),
m_ier(0),
m_gpio_input(0),
@ -346,27 +358,6 @@ mc68901_device::mc68901_device(const machine_config &mconfig, const char *tag, d
}
//-------------------------------------------------
// device_config_complete - perform any
// operations now that the configuration is
// complete
//-------------------------------------------------
void mc68901_device::device_config_complete()
{
// inherit a copy of the static data
const mc68901_interface *intf = reinterpret_cast<const mc68901_interface *>(static_config());
if (intf != NULL)
*static_cast<mc68901_interface *>(this) = *intf;
// or initialize to defaults if none provided
else
{
// memset(&in_pa_cb, 0, sizeof(in_pa_cb));
}
}
//-------------------------------------------------
// device_start - device-specific startup
//-------------------------------------------------
@ -376,13 +367,15 @@ void mc68901_device::device_start()
m_start_bit_hack_for_external_clocks = true;
/* resolve callbacks */
m_out_gpio_func.resolve(m_out_gpio_cb, *this);
m_out_so_func.resolve(m_out_so_cb, *this);
m_out_tao_func.resolve(m_out_tao_cb, *this);
m_out_tbo_func.resolve(m_out_tbo_cb, *this);
m_out_tco_func.resolve(m_out_tco_cb, *this);
m_out_tdo_func.resolve(m_out_tdo_cb, *this);
m_out_irq_func.resolve(m_out_irq_cb, *this);
m_out_irq_cb.resolve_safe();
m_out_gpio_cb.resolve_safe();
m_out_tao_cb.resolve_safe();
m_out_tbo_cb.resolve_safe();
m_out_tco_cb.resolve_safe();
m_out_tdo_cb.resolve_safe();
m_out_so_cb.resolve_safe();
//m_out_rr_cb.resolve_safe();
//m_out_tr_cb.resolve_safe();
/* create the timers */
m_timer[TIMER_A] = timer_alloc(TIMER_A);
@ -492,7 +485,7 @@ void mc68901_device::device_timer(emu_timer &timer, device_timer_id id, int para
void mc68901_device::tra_callback()
{
m_out_so_func(transmit_register_get_data_bit());
m_out_so_cb(transmit_register_get_data_bit());
}
@ -740,7 +733,7 @@ void mc68901_device::register_w(offs_t offset, UINT8 data)
m_to[TIMER_A] = 0;
m_out_tao_func(m_to[TIMER_A]);
m_out_tao_cb(m_to[TIMER_A]);
}
break;
@ -795,7 +788,7 @@ void mc68901_device::register_w(offs_t offset, UINT8 data)
m_to[TIMER_B] = 0;
m_out_tbo_func(m_to[TIMER_B]);
m_out_tbo_cb(m_to[TIMER_B]);
}
break;

View File

@ -44,64 +44,73 @@
#include "emu.h"
//**************************************************************************
// MACROS / CONSTANTS
//**************************************************************************
//**************************************************************************
// INTERFACE CONFIGURATION MACROS
//**************************************************************************
#define MCFG_MC68901_ADD(_tag, _clock, _config) \
MCFG_DEVICE_ADD((_tag), MC68901, _clock) \
MCFG_DEVICE_CONFIG(_config)
#define MCFG_MC68901_TIMER_CLOCK(_clk) \
mc68901_device::set_timer_clock(*device, _clk);
#define MC68901_INTERFACE(name) \
const mc68901_interface (name) =
#define MCFG_MC68901_RX_CLOCK(_clk) \
mc68901_device::set_rx_clock(*device, _clk);
#define MCFG_MC68901_TX_CLOCK(_clk) \
mc68901_device::set_tx_clock(*device, _clk);
#define MCFG_MC68901_OUT_IRQ_CB(_devcb) \
devcb = &mc68901_device::set_out_irq_callback(*device, DEVCB2_##_devcb);
#define MCFG_MC68901_OUT_GPIO_CB(_devcb) \
devcb = &mc68901_device::set_out_gpio_callback(*device, DEVCB2_##_devcb);
#define MCFG_MC68901_OUT_TAO_CB(_devcb) \
devcb = &mc68901_device::set_out_tao_callback(*device, DEVCB2_##_devcb);
#define MCFG_MC68901_OUT_TBO_CB(_devcb) \
devcb = &mc68901_device::set_out_tbo_callback(*device, DEVCB2_##_devcb);
#define MCFG_MC68901_OUT_TCO_CB(_devcb) \
devcb = &mc68901_device::set_out_tco_callback(*device, DEVCB2_##_devcb);
#define MCFG_MC68901_OUT_TDO_CB(_devcb) \
devcb = &mc68901_device::set_out_tdo_callback(*device, DEVCB2_##_devcb);
#define MCFG_MC68901_OUT_SO_CB(_devcb) \
devcb = &mc68901_device::set_out_so_callback(*device, DEVCB2_##_devcb);
/*#define MCFG_MC68901_OUT_RR_CB(_devcb) \
devcb = &mc68901_device::set_out_rr_callback(*device, DEVCB2_##_devcb);
#define MCFG_MC68901_OUT_TR_CB(_devcb) \
devcb = &mc68901_device::set_out_tr_callback(*device, DEVCB2_##_devcb);*/
//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
// ======================> mc68901_interface
struct mc68901_interface
{
int m_timer_clock; /* timer clock */
int m_rx_clock; /* serial receive clock */
int m_tx_clock; /* serial transmit clock */
devcb_write_line m_out_irq_cb;
devcb_write8 m_out_gpio_cb;
devcb_write_line m_out_tao_cb;
devcb_write_line m_out_tbo_cb;
devcb_write_line m_out_tco_cb;
devcb_write_line m_out_tdo_cb;
devcb_write_line m_out_so_cb;
devcb_write_line m_out_rr_cb;
devcb_write_line m_out_tr_cb;
};
// ======================> mc68901_device
class mc68901_device : public device_t,
public device_serial_interface,
public mc68901_interface
public device_serial_interface
{
public:
// construction/destruction
mc68901_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
static void set_timer_clock(device_t &device, int timer_clock) { downcast<mc68901_device &>(device).m_timer_clock = timer_clock; }
static void set_rx_clock(device_t &device, int rx_clock) { downcast<mc68901_device &>(device).m_rx_clock = rx_clock; }
static void set_tx_clock(device_t &device, int tx_clock) { downcast<mc68901_device &>(device).m_tx_clock = tx_clock; }
template<class _Object> static devcb2_base &set_out_irq_callback(device_t &device, _Object object) { return downcast<mc68901_device &>(device).m_out_irq_cb.set_callback(object); }
template<class _Object> static devcb2_base &set_out_gpio_callback(device_t &device, _Object object) { return downcast<mc68901_device &>(device).m_out_gpio_cb.set_callback(object); }
template<class _Object> static devcb2_base &set_out_tao_callback(device_t &device, _Object object) { return downcast<mc68901_device &>(device).m_out_tao_cb.set_callback(object); }
template<class _Object> static devcb2_base &set_out_tbo_callback(device_t &device, _Object object) { return downcast<mc68901_device &>(device).m_out_tbo_cb.set_callback(object); }
template<class _Object> static devcb2_base &set_out_tco_callback(device_t &device, _Object object) { return downcast<mc68901_device &>(device).m_out_tco_cb.set_callback(object); }
template<class _Object> static devcb2_base &set_out_tdo_callback(device_t &device, _Object object) { return downcast<mc68901_device &>(device).m_out_tdo_cb.set_callback(object); }
template<class _Object> static devcb2_base &set_out_so_callback(device_t &device, _Object object) { return downcast<mc68901_device &>(device).m_out_so_cb.set_callback(object); }
//template<class _Object> static devcb2_base &set_rr_callback(device_t &device, _Object object) { return downcast<mc68901_device &>(device).m_out_rr_cb.set_callback(object); }
//template<class _Object> static devcb2_base &set_tr_callback(device_t &device, _Object object) { return downcast<mc68901_device &>(device).m_out_tr_cb.set_callback(object); }
DECLARE_READ8_MEMBER( read );
DECLARE_WRITE8_MEMBER( write );
@ -124,7 +133,6 @@ public:
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 param, void *ptr);
@ -235,13 +243,22 @@ private:
static const int GPIO_TIMER[];
static const int PRESCALER[];
devcb_resolved_write8 m_out_gpio_func;
devcb_resolved_write_line m_out_so_func;
devcb_resolved_write_line m_out_tao_func;
devcb_resolved_write_line m_out_tbo_func;
devcb_resolved_write_line m_out_tco_func;
devcb_resolved_write_line m_out_tdo_func;
devcb_resolved_write_line m_out_irq_func;
int m_timer_clock; /* timer clock */
int m_rx_clock; /* serial receive clock */
int m_tx_clock; /* serial transmit clock */
devcb2_write_line m_out_irq_cb;
devcb2_write8 m_out_gpio_cb;
devcb2_write_line m_out_tao_cb;
devcb2_write_line m_out_tbo_cb;
devcb2_write_line m_out_tco_cb;
devcb2_write_line m_out_tdo_cb;
devcb2_write_line m_out_so_cb;
//devcb2_write_line m_out_rr_cb;
//devcb2_write_line m_out_tr_cb;
//int m_device_type; /* device type */

View File

@ -307,22 +307,6 @@ static const duart68681_config micro3d_duart68681_config =
micro3d_duart_output_w
};
static MC68901_INTERFACE( mfp_intf )
{
4000000, /* timer clock */
0, /* receive clock */
0, /* transmit clock */
DEVCB_CPU_INPUT_LINE("maincpu", M68K_IRQ_4), /* interrupt */
DEVCB_NULL, /* GPIO write */
DEVCB_NULL, /* TAO */
DEVCB_NULL, /* TBO */
DEVCB_NULL, /* TCO */
DEVCB_NULL, /* TDO */
DEVCB_NULL, /* serial output */
DEVCB_NULL,
DEVCB_NULL
};
/*************************************
*
@ -349,7 +333,12 @@ static MACHINE_CONFIG_START( micro3d, micro3d_state )
MCFG_CPU_IO_MAP(soundmem_io)
MCFG_DUART68681_ADD("duart68681", XTAL_3_6864MHz, micro3d_duart68681_config)
MCFG_MC68901_ADD("mc68901", 4000000, mfp_intf)
MCFG_DEVICE_ADD("mc68901", MC68901, 4000000)
MCFG_MC68901_TIMER_CLOCK(4000000)
MCFG_MC68901_RX_CLOCK(0)
MCFG_MC68901_TX_CLOCK(0)
MCFG_MC68901_OUT_IRQ_CB(INPUTLINE("maincpu", M68K_IRQ_4))
MCFG_NVRAM_ADD_0FILL("nvram")
MCFG_QUANTUM_TIME(attotime::from_hz(3000))

View File

@ -1864,72 +1864,11 @@ WRITE_LINE_MEMBER(st_state::write_acia_clock)
}
//-------------------------------------------------
// MC68901_INTERFACE( mfp_intf )
//-------------------------------------------------
WRITE_LINE_MEMBER( st_state::mfp_tdo_w )
{
m_mfp->clock_w(state);
}
static MC68901_INTERFACE( mfp_intf )
{
Y1, /* timer clock */
0, /* receive clock */
0, /* transmit clock */
DEVCB_CPU_INPUT_LINE(M68000_TAG, M68K_IRQ_6), /* interrupt */
DEVCB_NULL, /* GPIO write */
DEVCB_NULL, /* TAO */
DEVCB_NULL, /* TBO */
DEVCB_NULL, /* TCO */
DEVCB_DRIVER_LINE_MEMBER(st_state, mfp_tdo_w), /* TDO */
DEVCB_DEVICE_LINE_MEMBER(RS232_TAG, rs232_port_device, write_txd)
};
//-------------------------------------------------
// MC68901_INTERFACE( atariste_mfp_intf )
//-------------------------------------------------
static MC68901_INTERFACE( atariste_mfp_intf )
{
Y1, /* timer clock */
0, /* receive clock */
0, /* transmit clock */
DEVCB_CPU_INPUT_LINE(M68000_TAG, M68K_IRQ_6), /* interrupt */
DEVCB_NULL, /* GPIO write */
DEVCB_NULL, /* TAO */
DEVCB_NULL, /* TBO */
DEVCB_NULL, /* TCO */
DEVCB_DRIVER_LINE_MEMBER(st_state, mfp_tdo_w), /* TDO */
DEVCB_DEVICE_LINE_MEMBER(RS232_TAG, rs232_port_device, write_txd)
};
//-------------------------------------------------
// MC68901_INTERFACE( stbook_mfp_intf )
//-------------------------------------------------
// TODO power alarms (i7_w)
#if 0
static MC68901_INTERFACE( stbook_mfp_intf )
{
Y1, /* timer clock */
0, /* receive clock */
0, /* transmit clock */
DEVCB_CPU_INPUT_LINE(M68000_TAG, M68K_IRQ_6), /* interrupt */
DEVCB_NULL, /* GPIO write */
DEVCB_NULL, /* TAO */
DEVCB_NULL, /* TBO */
DEVCB_NULL, /* TCO */
DEVCB_DRIVER_LINE_MEMBER(st_state, mfp_tdo_w), /* TDO */
DEVCB_DEVICE_LINE_MEMBER(RS232_TAG, rs232_port_device, write_txd)
};
#endif
void st_state::fdc_intrq_w(bool state)
{
m_mfp->i5_w(!state);
@ -2209,7 +2148,13 @@ static MACHINE_CONFIG_START( st, st_state )
MCFG_CENTRONICS_OUTPUT_LATCH_ADD("cent_data_out", "centronics")
MCFG_MC68901_ADD(MC68901_TAG, Y2/8, mfp_intf)
MCFG_DEVICE_ADD(MC68901_TAG, MC68901, Y2/8)
MCFG_MC68901_TIMER_CLOCK(Y1)
MCFG_MC68901_RX_CLOCK(0)
MCFG_MC68901_TX_CLOCK(0)
MCFG_MC68901_OUT_IRQ_CB(INPUTLINE(M68000_TAG, M68K_IRQ_6))
MCFG_MC68901_OUT_TDO_CB(WRITELINE(st_state, mfp_tdo_w))
MCFG_MC68901_OUT_SO_CB(DEVWRITELINE(RS232_TAG, rs232_port_device, write_txd))
MCFG_RS232_PORT_ADD(RS232_TAG, default_rs232_devices, NULL)
MCFG_RS232_RXD_HANDLER(DEVWRITELINE(MC68901_TAG, mc68901_device, write_rx))
@ -2288,7 +2233,13 @@ static MACHINE_CONFIG_START( megast, megast_state )
MCFG_CENTRONICS_OUTPUT_LATCH_ADD("cent_data_out", "centronics")
MCFG_MC68901_ADD(MC68901_TAG, Y2/8, mfp_intf)
MCFG_DEVICE_ADD(MC68901_TAG, MC68901, Y2/8)
MCFG_MC68901_TIMER_CLOCK(Y1)
MCFG_MC68901_RX_CLOCK(0)
MCFG_MC68901_TX_CLOCK(0)
MCFG_MC68901_OUT_IRQ_CB(INPUTLINE(M68000_TAG, M68K_IRQ_6))
MCFG_MC68901_OUT_TDO_CB(WRITELINE(st_state, mfp_tdo_w))
MCFG_MC68901_OUT_SO_CB(DEVWRITELINE(RS232_TAG, rs232_port_device, write_txd))
MCFG_RS232_PORT_ADD(RS232_TAG, default_rs232_devices, NULL)
MCFG_RS232_RXD_HANDLER(DEVWRITELINE(MC68901_TAG, mc68901_device, write_rx))
@ -2374,7 +2325,13 @@ static MACHINE_CONFIG_START( ste, ste_state )
MCFG_CENTRONICS_OUTPUT_LATCH_ADD("cent_data_out", "centronics")
MCFG_MC68901_ADD(MC68901_TAG, Y2/8, atariste_mfp_intf)
MCFG_DEVICE_ADD(MC68901_TAG, MC68901, Y2/8)
MCFG_MC68901_TIMER_CLOCK(Y1)
MCFG_MC68901_RX_CLOCK(0)
MCFG_MC68901_TX_CLOCK(0)
MCFG_MC68901_OUT_IRQ_CB(INPUTLINE(M68000_TAG, M68K_IRQ_6))
MCFG_MC68901_OUT_TDO_CB(WRITELINE(st_state, mfp_tdo_w))
MCFG_MC68901_OUT_SO_CB(DEVWRITELINE(RS232_TAG, rs232_port_device, write_txd))
MCFG_RS232_PORT_ADD(RS232_TAG, default_rs232_devices, NULL)
MCFG_RS232_RXD_HANDLER(DEVWRITELINE(MC68901_TAG, mc68901_device, write_rx))
@ -2458,7 +2415,14 @@ static MACHINE_CONFIG_START( stbook, stbook_state )
MCFG_SOUND_CONFIG(stbook_psg_intf)
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00)
MCFG_MC68901_ADD(MC68901_TAG, U517/8, stbook_mfp_intf)
MCFG_DEVICE_ADD(MC68901_TAG, MC68901, U517/8)
MCFG_MC68901_TIMER_CLOCK(Y1)
MCFG_MC68901_RX_CLOCK(0)
MCFG_MC68901_TX_CLOCK(0)
MCFG_MC68901_OUT_IRQ_CB(INPUTLINE(M68000_TAG, M68K_IRQ_6))
MCFG_MC68901_OUT_TDO_CB(WRITELINE(st_state, mfp_tdo_w))
MCFG_MC68901_OUT_SO_CB(DEVWRITELINE(RS232_TAG, rs232_port_device, write_txd))
MCFG_WD1772x_ADD(WD1772_TAG, U517/2)
MCFG_FLOPPY_DRIVE_ADD(WD1772_TAG ":0", atari_floppies, "35dd", 0, st_state::floppy_formats)
MCFG_FLOPPY_DRIVE_ADD(WD1772_TAG ":1", atari_floppies, 0, 0, st_state::floppy_formats)

View File

@ -98,22 +98,6 @@ SLOT_INTERFACE_START( indiana_isa_cards )
SLOT_INTERFACE("ide", ISA16_IDE)
SLOT_INTERFACE_END
static MC68901_INTERFACE( mfp_interface )
{
XTAL_16MHz/4, /* timer clock */
0, /* receive clock */
0, /* transmit clock */
DEVCB_NULL, /* interrupt */
DEVCB_NULL, /* GPIO write */
DEVCB_NULL, /* TAO */
DEVCB_NULL, /* TBO */
DEVCB_NULL, /* TCO */
DEVCB_NULL, /* TDO */
DEVCB_DEVICE_LINE_MEMBER("keyboard", serial_keyboard_device, input_txd), /* serial output */
DEVCB_NULL,
DEVCB_NULL
};
static struct serial_keyboard_interface keyboard_interface =
{
DEVCB_DEVICE_LINE_MEMBER(MFP_TAG, mc68901_device, write_rx)
@ -131,7 +115,12 @@ static MACHINE_CONFIG_START( indiana, indiana_state )
MCFG_ISA16_SLOT_ADD(ISABUS_TAG, "isa3", indiana_isa_cards, "comat", false)
MCFG_ISA16_SLOT_ADD(ISABUS_TAG, "isa4", indiana_isa_cards, "ide", false)
MCFG_MC68901_ADD(MFP_TAG, XTAL_16MHz/4, mfp_interface)
MCFG_DEVICE_ADD(MFP_TAG, MC68901, XTAL_16MHz/4)
MCFG_MC68901_TIMER_CLOCK(XTAL_16MHz/4)
MCFG_MC68901_RX_CLOCK(0)
MCFG_MC68901_TX_CLOCK(0)
MCFG_MC68901_OUT_SO_CB(DEVWRITELINE("keyboard", serial_keyboard_device, input_txd))
MCFG_SERIAL_KEYBOARD_ADD("keyboard", keyboard_interface, 1200)
MACHINE_CONFIG_END

View File

@ -1409,22 +1409,6 @@ WRITE_LINE_MEMBER( x68k_state::mfp_tbo_w )
m_mfpdev->clock_w(state);
}
static MC68901_INTERFACE( mfp_interface )
{
4000000, /* timer clock */
0, /* receive clock */
0, /* transmit clock */
DEVCB_DRIVER_LINE_MEMBER(x68k_state,mfp_irq_callback), /* interrupt */
DEVCB_NULL, /* GPIO write */
DEVCB_NULL, /* TAO */
DEVCB_DRIVER_LINE_MEMBER(x68k_state, mfp_tbo_w), /* TBO */
DEVCB_NULL, /* TCO */
DEVCB_NULL, /* TDO */
DEVCB_DEVICE_LINE_MEMBER("keyboard", serial_keyboard_device, input_txd), /* serial output */
DEVCB_NULL,
DEVCB_NULL
};
static struct serial_keyboard_interface x68k_keyboard_interface =
{
DEVCB_DEVICE_LINE_MEMBER(MC68901_TAG, mc68901_device, write_rx)
@ -1929,7 +1913,13 @@ static MACHINE_CONFIG_FRAGMENT( x68000_base )
MCFG_MACHINE_RESET_OVERRIDE(x68k_state, x68000 )
/* device hardware */
MCFG_MC68901_ADD(MC68901_TAG, 4000000, mfp_interface)
MCFG_DEVICE_ADD(MC68901_TAG, MC68901, 4000000)
MCFG_MC68901_TIMER_CLOCK(4000000)
MCFG_MC68901_RX_CLOCK(0)
MCFG_MC68901_TX_CLOCK(0)
MCFG_MC68901_OUT_IRQ_CB(WRITELINE(x68k_state, mfp_irq_callback))
MCFG_MC68901_OUT_TBO_CB(WRITELINE(x68k_state, mfp_tbo_w))
MCFG_MC68901_OUT_SO_CB(DEVWRITELINE("keyboard", serial_keyboard_device, input_txd))
MCFG_X68K_KEYBOARD_ADD("keyboard", x68k_keyboard_interface)

View File

@ -13,7 +13,6 @@
#include "emu.h"
#include "cpu/m68000/m68000.h"
#include "machine/mc68901.h"
#include "machine/ram.h"
#include "video/atarist.h"
#include "includes/atarist.h"