mirror of
https://github.com/holub/mame
synced 2025-04-22 08:22:15 +03:00
tms34061_device: converted to devcb2 (nw)
This commit is contained in:
parent
6f86608136
commit
926294f15c
@ -30,7 +30,9 @@ const device_type TMS34061 = &device_creator<tms34061_device>;
|
||||
tms34061_device::tms34061_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
|
||||
: device_t(mconfig, TMS34061, "tms34061", tag, owner, clock, "tms34061", __FILE__),
|
||||
device_video_interface(mconfig, *this),
|
||||
//m_regs[TMS34061_REGCOUNT],
|
||||
m_rowshift(0),
|
||||
m_vramsize(0),
|
||||
m_interrupt_cb(*this),
|
||||
m_xmask(0),
|
||||
m_yshift(0),
|
||||
m_vrammask(0),
|
||||
@ -39,35 +41,9 @@ tms34061_device::tms34061_device(const machine_config &mconfig, const char *tag,
|
||||
m_latchdata(0),
|
||||
m_shiftreg(NULL),
|
||||
m_timer(NULL)
|
||||
//m_display.blanked(0),
|
||||
//m_display.vram(NULL),
|
||||
//m_display.latchram(NULL),
|
||||
//m_display.regs(NULL),
|
||||
//m_display.dispstart(0),
|
||||
//m_display.screen(NULL)
|
||||
{
|
||||
}
|
||||
|
||||
//-------------------------------------------------
|
||||
// device_config_complete - perform any
|
||||
// operations now that the configuration is
|
||||
// complete
|
||||
//-------------------------------------------------
|
||||
|
||||
void tms34061_device::device_config_complete()
|
||||
{
|
||||
// inherit a copy of the static data
|
||||
const tms34061_interface *intf = reinterpret_cast<const tms34061_interface *>(static_config());
|
||||
if (intf != NULL)
|
||||
*static_cast<tms34061_interface *>(this) = *intf;
|
||||
|
||||
// or initialize to defaults if none provided
|
||||
else
|
||||
{
|
||||
m_rowshift = 0;
|
||||
m_vramsize = 0;
|
||||
//(*m_interrupt)(int state)
|
||||
}
|
||||
memset(m_regs, 0, sizeof(m_regs));
|
||||
memset(&m_display, 0, sizeof(m_display));
|
||||
}
|
||||
|
||||
//-------------------------------------------------
|
||||
@ -76,6 +52,9 @@ void tms34061_device::device_config_complete()
|
||||
|
||||
void tms34061_device::device_start()
|
||||
{
|
||||
/* resolve callbak */
|
||||
m_interrupt_cb.resolve();
|
||||
|
||||
/* reset the data */
|
||||
m_vrammask = m_vramsize - 1;
|
||||
|
||||
@ -151,13 +130,13 @@ static const char *const regnames[] =
|
||||
void tms34061_device::update_interrupts()
|
||||
{
|
||||
/* if we have a callback, process it */
|
||||
if (m_interrupt)
|
||||
if (!m_interrupt_cb.isnull())
|
||||
{
|
||||
/* if the status bit is set, and ints are enabled, turn it on */
|
||||
if ((m_regs[TMS34061_STATUS] & 0x0001) && (m_regs[TMS34061_CONTROL1] & 0x0400))
|
||||
(*m_interrupt)(m_screen->machine(), ASSERT_LINE);
|
||||
m_interrupt_cb(ASSERT_LINE);
|
||||
else
|
||||
(*m_interrupt)(m_screen->machine(), CLEAR_LINE);
|
||||
m_interrupt_cb(CLEAR_LINE);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -11,6 +11,17 @@
|
||||
#ifndef __TMS34061_H__
|
||||
#define __TMS34061_H__
|
||||
|
||||
|
||||
#define MCFG_TMS34061_ROWSHIFT(_shift) \
|
||||
tms34061_device::set_rowshift(*device, _shift);
|
||||
|
||||
#define MCFG_TMS34061_VRAM_SIZE(_size) \
|
||||
tms34061_device::set_vram_size(*device, _size);
|
||||
|
||||
#define MCFG_TMS34061_INTERRUPT_CB(_devcb) \
|
||||
devcb = &tms34061_device::set_interrupt_callback(*device, DEVCB2_##_devcb);
|
||||
|
||||
|
||||
/* register constants */
|
||||
enum
|
||||
{
|
||||
@ -35,14 +46,6 @@ enum
|
||||
TMS34061_REGCOUNT
|
||||
};
|
||||
|
||||
/* interface structure */
|
||||
struct tms34061_interface
|
||||
{
|
||||
UINT8 m_rowshift; /* VRAM address is (row << rowshift) | col */
|
||||
UINT32 m_vramsize; /* size of video RAM */
|
||||
void (*m_interrupt)(running_machine &machine, int state); /* interrupt gen callback */
|
||||
};
|
||||
|
||||
/* display state structure */
|
||||
struct tms34061_display
|
||||
{
|
||||
@ -59,12 +62,15 @@ struct tms34061_display
|
||||
// ======================> tms34061_device
|
||||
|
||||
class tms34061_device : public device_t,
|
||||
public device_video_interface,
|
||||
public tms34061_interface
|
||||
public device_video_interface
|
||||
{
|
||||
public:
|
||||
// construction/destruction
|
||||
tms34061_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
|
||||
|
||||
static void set_rowshift(device_t &device, UINT8 rowshift) { downcast<tms34061_device &>(device).m_rowshift = rowshift; }
|
||||
static void set_vram_size(device_t &device, UINT32 vramsize) { downcast<tms34061_device &>(device).m_vramsize = vramsize; }
|
||||
template<class _Object> static devcb2_base &set_interrupt_callback(device_t &device, _Object object) { return downcast<tms34061_device &>(device).m_interrupt_cb.set_callback(object); }
|
||||
|
||||
/* reads/writes to the 34061 */
|
||||
UINT8 read(address_space &space, int col, int row, int func);
|
||||
@ -81,11 +87,14 @@ public:
|
||||
|
||||
protected:
|
||||
// device-level overrides
|
||||
virtual void device_config_complete();
|
||||
virtual void device_start();
|
||||
virtual void device_reset();
|
||||
|
||||
private:
|
||||
UINT8 m_rowshift; /* VRAM address is (row << rowshift) | col */
|
||||
UINT32 m_vramsize; /* size of video RAM */
|
||||
devcb2_write_line m_interrupt_cb; /* interrupt gen callback */
|
||||
|
||||
UINT16 m_regs[TMS34061_REGCOUNT];
|
||||
UINT16 m_xmask;
|
||||
UINT8 m_yshift;
|
||||
@ -108,8 +117,4 @@ private:
|
||||
// device type definition
|
||||
extern const device_type TMS34061;
|
||||
|
||||
#define MCFG_TMS34061_ADD(_tag, _interface) \
|
||||
MCFG_DEVICE_ADD(_tag, TMS34061, 0) \
|
||||
MCFG_DEVICE_CONFIG(_interface)
|
||||
|
||||
#endif
|
||||
|
@ -322,21 +322,11 @@ static const ay8910_interface ay8910_config =
|
||||
*
|
||||
*************************************/
|
||||
|
||||
static void generate_interrupt( running_machine &machine, int state )
|
||||
WRITE_LINE_MEMBER(capbowl_state::generate_tms34061_interrupt)
|
||||
{
|
||||
capbowl_state *driver = machine.driver_data<capbowl_state>();
|
||||
driver->m_maincpu->set_input_line(M6809_FIRQ_LINE, state);
|
||||
m_maincpu->set_input_line(M6809_FIRQ_LINE, state);
|
||||
}
|
||||
|
||||
static const struct tms34061_interface tms34061intf =
|
||||
{
|
||||
8, /* VRAM address is (row << rowshift) | col */
|
||||
0x10000, /* size of video RAM */
|
||||
generate_interrupt /* interrupt gen callback */
|
||||
};
|
||||
|
||||
|
||||
|
||||
/*************************************
|
||||
*
|
||||
* Machine driver
|
||||
@ -383,7 +373,10 @@ static MACHINE_CONFIG_START( capbowl, capbowl_state )
|
||||
MCFG_SCREEN_REFRESH_RATE(57)
|
||||
MCFG_SCREEN_UPDATE_DRIVER(capbowl_state, screen_update_capbowl)
|
||||
|
||||
MCFG_TMS34061_ADD("tms34061", tms34061intf)
|
||||
MCFG_DEVICE_ADD("tms34061", TMS34061, 0)
|
||||
MCFG_TMS34061_ROWSHIFT(8) /* VRAM address is (row << rowshift) | col */
|
||||
MCFG_TMS34061_VRAM_SIZE(0x10000) /* size of video RAM */
|
||||
MCFG_TMS34061_INTERRUPT_CB(WRITELINE(capbowl_state, generate_tms34061_interrupt)) /* interrupt gen callback */
|
||||
|
||||
/* sound hardware */
|
||||
MCFG_SPEAKER_STANDARD_MONO("mono")
|
||||
|
@ -91,6 +91,7 @@ public:
|
||||
struct ef9369 m_pal;
|
||||
emu_timer *m_fdc_timer;
|
||||
struct wd1770 m_fdc;
|
||||
DECLARE_WRITE_LINE_MEMBER(generate_tms34061_interrupt);
|
||||
DECLARE_WRITE16_MEMBER(guab_tms34061_w);
|
||||
DECLARE_READ16_MEMBER(guab_tms34061_r);
|
||||
DECLARE_WRITE16_MEMBER(ef9369_w);
|
||||
@ -138,20 +139,11 @@ static const ptm6840_interface ptm_intf =
|
||||
* TMS34061 CRTC
|
||||
*****************/
|
||||
|
||||
static void tms_interrupt(running_machine &machine, int state)
|
||||
WRITE_LINE_MEMBER(guab_state::generate_tms34061_interrupt)
|
||||
{
|
||||
guab_state *drvstate = machine.driver_data<guab_state>();
|
||||
drvstate->m_maincpu->set_input_line(INT_TMS34061, state);
|
||||
m_maincpu->set_input_line(INT_TMS34061, state);
|
||||
}
|
||||
|
||||
static const struct tms34061_interface tms34061intf =
|
||||
{
|
||||
8, /* VRAM address is (row << rowshift) | col */
|
||||
0x40000, /* Size of video RAM */
|
||||
tms_interrupt /* Interrupt gen callback */
|
||||
};
|
||||
|
||||
|
||||
WRITE16_MEMBER(guab_state::guab_tms34061_w)
|
||||
{
|
||||
int func = (offset >> 19) & 3;
|
||||
@ -810,7 +802,10 @@ static MACHINE_CONFIG_START( guab, guab_state )
|
||||
|
||||
MCFG_PALETTE_ADD("palette", 16)
|
||||
|
||||
MCFG_TMS34061_ADD("tms34061", tms34061intf)
|
||||
MCFG_DEVICE_ADD("tms34061", TMS34061, 0)
|
||||
MCFG_TMS34061_ROWSHIFT(8) /* VRAM address is (row << rowshift) | col */
|
||||
MCFG_TMS34061_VRAM_SIZE(0x40000) /* size of video RAM */
|
||||
MCFG_TMS34061_INTERRUPT_CB(WRITELINE(guab_state, generate_tms34061_interrupt)) /* interrupt gen callback */
|
||||
|
||||
MCFG_SPEAKER_STANDARD_MONO("mono")
|
||||
|
||||
|
@ -1608,24 +1608,13 @@ static const ay8910_interface ay8910_config =
|
||||
*
|
||||
*************************************/
|
||||
|
||||
void itech8_state::static_generate_interrupt(running_machine &machine, int state_num) { machine.driver_data<itech8_state>()->generate_interrupt(state_num); }
|
||||
void itech8_state::generate_interrupt(int state_num)
|
||||
WRITE_LINE_MEMBER(itech8_state::generate_tms34061_interrupt)
|
||||
{
|
||||
itech8_update_interrupts(-1, state_num, -1);
|
||||
itech8_update_interrupts(-1, state, -1);
|
||||
|
||||
if (FULL_LOGGING && state_num) logerror("------------ DISPLAY INT (%d) --------------\n", m_screen->vpos());
|
||||
if (FULL_LOGGING && state) logerror("------------ DISPLAY INT (%d) --------------\n", m_screen->vpos());
|
||||
}
|
||||
|
||||
|
||||
static const struct tms34061_interface tms34061intf =
|
||||
{
|
||||
8, /* VRAM address is (row << rowshift) | col */
|
||||
0x40000, /* size of video RAM */
|
||||
&itech8_state::static_generate_interrupt /* interrupt gen callback */
|
||||
};
|
||||
|
||||
|
||||
|
||||
/*************************************
|
||||
*
|
||||
* Machine driver
|
||||
@ -1653,7 +1642,10 @@ static MACHINE_CONFIG_START( itech8_core_lo, itech8_state )
|
||||
MCFG_SCREEN_REFRESH_RATE(60)
|
||||
MCFG_SCREEN_SIZE(512, 263)
|
||||
|
||||
MCFG_TMS34061_ADD("tms34061", tms34061intf)
|
||||
MCFG_DEVICE_ADD("tms34061", TMS34061, 0)
|
||||
MCFG_TMS34061_ROWSHIFT(8) /* VRAM address is (row << rowshift) | col */
|
||||
MCFG_TMS34061_VRAM_SIZE(0x40000) /* size of video RAM */
|
||||
MCFG_TMS34061_INTERRUPT_CB(WRITELINE(itech8_state, generate_tms34061_interrupt)) /* interrupt gen callback */
|
||||
|
||||
/* sound hardware */
|
||||
MCFG_SPEAKER_STANDARD_MONO("mono")
|
||||
|
@ -61,19 +61,11 @@ enum int_levels
|
||||
*
|
||||
*************************************/
|
||||
|
||||
static void tms_interrupt(running_machine &machine, int state)
|
||||
WRITE_LINE_MEMBER(jpmsys5_state::generate_tms34061_interrupt)
|
||||
{
|
||||
jpmsys5_state *drvstate = machine.driver_data<jpmsys5_state>();
|
||||
drvstate->m_maincpu->set_input_line(INT_TMS34061, state);
|
||||
m_maincpu->set_input_line(INT_TMS34061, state);
|
||||
}
|
||||
|
||||
static const struct tms34061_interface tms34061intf =
|
||||
{
|
||||
8, /* VRAM address is (row << rowshift) | col */
|
||||
0x40000, /* Size of video RAM - FIXME: Should be 128kB + 32kB */
|
||||
tms_interrupt /* Interrupt gen callback */
|
||||
};
|
||||
|
||||
WRITE16_MEMBER(jpmsys5_state::sys5_tms34061_w)
|
||||
{
|
||||
int func = (offset >> 19) & 3;
|
||||
@ -663,7 +655,10 @@ static MACHINE_CONFIG_START( jpmsys5v, jpmsys5_state )
|
||||
MCFG_SCREEN_RAW_PARAMS(XTAL_40MHz / 4, 676, 20*4, 147*4, 256, 0, 254)
|
||||
MCFG_SCREEN_UPDATE_DRIVER(jpmsys5_state, screen_update_jpmsys5v)
|
||||
|
||||
MCFG_TMS34061_ADD("tms34061", tms34061intf)
|
||||
MCFG_DEVICE_ADD("tms34061", TMS34061, 0)
|
||||
MCFG_TMS34061_ROWSHIFT(8) /* VRAM address is (row << rowshift) | col */
|
||||
MCFG_TMS34061_VRAM_SIZE(0x40000) /* size of video RAM */
|
||||
MCFG_TMS34061_INTERRUPT_CB(WRITELINE(jpmsys5_state, generate_tms34061_interrupt)) /* interrupt gen callback */
|
||||
|
||||
MCFG_PALETTE_ADD("palette", 16)
|
||||
|
||||
|
@ -55,6 +55,7 @@ public:
|
||||
TIMER_CALLBACK_MEMBER(capbowl_update);
|
||||
inline rgb_t pen_for_pixel( UINT8 *src, UINT8 pix );
|
||||
DECLARE_WRITE_LINE_MEMBER(firqhandler);
|
||||
DECLARE_WRITE_LINE_MEMBER(generate_tms34061_interrupt);
|
||||
|
||||
protected:
|
||||
virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr);
|
||||
|
@ -69,8 +69,7 @@ public:
|
||||
UINT8 m_grmatch_palcontrol;
|
||||
UINT8 m_grmatch_xscroll;
|
||||
rgb_t m_grmatch_palette[2][16];
|
||||
static void static_generate_interrupt(running_machine &machine, int state_num);
|
||||
void generate_interrupt(int state_num);
|
||||
DECLARE_WRITE_LINE_MEMBER(generate_tms34061_interrupt);
|
||||
DECLARE_WRITE8_MEMBER(itech8_nmi_ack_w);
|
||||
DECLARE_WRITE8_MEMBER(blitter_w);
|
||||
DECLARE_WRITE8_MEMBER(rimrockn_bank_w);
|
||||
|
@ -53,6 +53,7 @@ public:
|
||||
UINT8 m_a0_data_out;
|
||||
UINT8 m_a1_data_out;
|
||||
UINT8 m_a2_data_out;
|
||||
DECLARE_WRITE_LINE_MEMBER(generate_tms34061_interrupt);
|
||||
DECLARE_WRITE16_MEMBER(sys5_tms34061_w);
|
||||
DECLARE_READ16_MEMBER(sys5_tms34061_r);
|
||||
DECLARE_WRITE16_MEMBER(ramdac_w);
|
||||
|
Loading…
Reference in New Issue
Block a user