diff --git a/src/emu/video/huc6260.c b/src/emu/video/huc6260.c index 60b5ffe455c..2c821119d6d 100644 --- a/src/emu/video/huc6260.c +++ b/src/emu/video/huc6260.c @@ -43,27 +43,13 @@ PALETTE_INIT_MEMBER(huc6260_device, huc6260) const device_type HUC6260 = &device_creator; -void huc6260_device::device_config_complete() -{ - const huc6260_interface *intf = reinterpret_cast(static_config()); - - if ( intf != NULL ) - { - *static_cast(this) = *intf; - } - else - { - memset(&m_get_next_pixel_data, 0, sizeof(m_get_next_pixel_data)); - memset(&m_get_time_til_next_event, 0, sizeof(m_get_time_til_next_event)); - memset(&m_hsync_changed, 0, sizeof(m_hsync_changed)); - memset(&m_vsync_changed, 0, sizeof(m_vsync_changed)); - } -} - - huc6260_device::huc6260_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) : device_t(mconfig, HUC6260, "HuC6260 VCE", tag, owner, clock, "huc6260", __FILE__), - device_video_interface(mconfig, *this) + device_video_interface(mconfig, *this), + m_next_pixel_data_cb(*this), + m_time_til_next_event_cb(*this), + m_vsync_changed_cb(*this), + m_hsync_changed_cb(*this) { } @@ -82,7 +68,7 @@ void huc6260_device::device_timer(emu_timer &timer, device_timer_id id, int para { g_profiler.start( PROFILER_VIDEO ); /* Get next pixel information */ - m_pixel_data = m_get_next_pixel_data( 0, 0xffff ); + m_pixel_data = m_next_pixel_data_cb( 0, 0xffff ); g_profiler.stop(); if ( m_greyscales ) { @@ -97,7 +83,7 @@ void huc6260_device::device_timer(emu_timer &timer, device_timer_id id, int para switch( h ) { case HUC6260_HSYNC_START: /* Start of HSync */ - m_hsync_changed( 0 ); + m_hsync_changed_cb( 0 ); // if ( v == 0 ) // { // /* Check if the screen should be resized */ @@ -118,7 +104,7 @@ void huc6260_device::device_timer(emu_timer &timer, device_timer_id id, int para break; case 0: /* End of HSync */ - m_hsync_changed( 1 ); + m_hsync_changed_cb( 1 ); m_pixel_clock = 0; v = ( v + 1 ) % m_height; bitmap_line = &m_bmp->pix16(v); @@ -127,7 +113,7 @@ void huc6260_device::device_timer(emu_timer &timer, device_timer_id id, int para case HUC6260_HSYNC_START + 30: /* End/Start of VSync */ if ( v>= m_height - 4 ) { - m_vsync_changed( ( v >= m_height - 4 && v < m_height - 1 ) ? 0 : 1 ); + m_vsync_changed_cb( ( v >= m_height - 4 && v < m_height - 1 ) ? 0 : 1 ); } break; } @@ -158,7 +144,7 @@ void huc6260_device::device_timer(emu_timer &timer, device_timer_id id, int para /* Ask our slave device for time until next possible event */ { - UINT16 next_event_clocks = m_get_time_til_next_event( 0, 0xffff ); + UINT16 next_event_clocks = m_time_til_next_event_cb( 0, 0xffff ); int event_hpos, event_vpos; /* Adjust for pixel clocks per pixel */ @@ -255,16 +241,16 @@ void huc6260_device::device_start() m_bmp = auto_bitmap_ind16_alloc( machine(), HUC6260_WPF, HUC6260_LPF ); /* Resolve callbacks */ - m_hsync_changed.resolve( hsync_changed, *this ); - m_vsync_changed.resolve( vsync_changed, *this ); - m_get_next_pixel_data.resolve( get_next_pixel_data, *this ); - m_get_time_til_next_event.resolve( get_time_til_next_event, *this ); + m_hsync_changed_cb.resolve(); + m_vsync_changed_cb.resolve(); + m_next_pixel_data_cb.resolve(); + m_time_til_next_event_cb.resolve(); /* We want to have a valid screen and valid callbacks */ - assert( ! m_hsync_changed.isnull() ); - assert( ! m_vsync_changed.isnull() ); - assert( ! m_get_next_pixel_data.isnull() ); - assert( ! m_get_time_til_next_event.isnull() ); + assert( ! m_hsync_changed_cb.isnull() ); + assert( ! m_vsync_changed_cb.isnull() ); + assert( ! m_next_pixel_data_cb.isnull() ); + assert( ! m_time_til_next_event_cb.isnull() ); save_item(NAME(m_last_h)); save_item(NAME(m_last_v)); diff --git a/src/emu/video/huc6260.h b/src/emu/video/huc6260.h index 79eb1ab7254..3527eb65407 100644 --- a/src/emu/video/huc6260.h +++ b/src/emu/video/huc6260.h @@ -18,36 +18,31 @@ #define HUC6260_LPF 263 /* max number of lines in a single frame */ -#define MCFG_HUC6260_ADD( _tag, clock, _intrf ) \ - MCFG_DEVICE_ADD( _tag, HUC6260, clock ) \ - MCFG_DEVICE_CONFIG( _intrf ) - - -struct huc6260_interface -{ - /* Callback function to retrieve pixel data */ - devcb_read16 get_next_pixel_data; - - /* TODO: Choose proper types */ - /* Callback function to get time until next event */ - devcb_read16 get_time_til_next_event; - - /* Callback function which gets called when vsync changes */ - devcb_write_line vsync_changed; - - /* Callback function which gets called when hsync changes */ - devcb_write_line hsync_changed; -}; - +#define MCFG_HUC6260_NEXT_PIXEL_DATA_CB(_devcb) \ + devcb = &huc6260_device::set_next_pixel_data_callback(*device, DEVCB2_##_devcb); + +#define MCFG_HUC6260_TIME_TIL_NEXT_EVENT_CB(_devcb) \ + devcb = &huc6260_device::set_time_til_next_event_callback(*device, DEVCB2_##_devcb); + +#define MCFG_HUC6260_VSYNC_CHANGED_CB(_devcb) \ + devcb = &huc6260_device::set_vsync_changed_callback(*device, DEVCB2_##_devcb); + +#define MCFG_HUC6260_HSYNC_CHANGED_CB(_devcb) \ + devcb = &huc6260_device::set_hsync_changed_callback(*device, DEVCB2_##_devcb); + class huc6260_device : public device_t, - public device_video_interface, - public huc6260_interface + public device_video_interface { public: // construction/destruction huc6260_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); + template static devcb2_base &set_next_pixel_data_callback(device_t &device, _Object object) { return downcast(device).m_next_pixel_data_cb.set_callback(object); } + template static devcb2_base &set_time_til_next_event_callback(device_t &device, _Object object) { return downcast(device).m_time_til_next_event_cb.set_callback(object); } + template static devcb2_base &set_vsync_changed_callback(device_t &device, _Object object) { return downcast(device).m_vsync_changed_cb.set_callback(object); } + template static devcb2_base &set_hsync_changed_callback(device_t &device, _Object object) { return downcast(device).m_hsync_changed_cb.set_callback(object); } + void video_update(bitmap_ind16 &bitmap, const rectangle &cliprect); DECLARE_READ8_MEMBER( read ); DECLARE_WRITE8_MEMBER( write ); @@ -55,7 +50,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); @@ -67,10 +61,18 @@ private: int m_height; /* callbacks */ - devcb_resolved_read16 m_get_next_pixel_data; - devcb_resolved_read16 m_get_time_til_next_event; - devcb_resolved_write_line m_hsync_changed; - devcb_resolved_write_line m_vsync_changed; + /* Callback function to retrieve pixel data */ + devcb2_read16 m_next_pixel_data_cb; + + /* TODO: Choose proper types */ + /* Callback function to get time until next event */ + devcb2_read16 m_time_til_next_event_cb; + + /* Callback function which gets called when vsync changes */ + devcb2_write_line m_vsync_changed_cb; + + /* Callback function which gets called when hsync changes */ + devcb2_write_line m_hsync_changed_cb; UINT16 m_palette[512]; UINT16 m_address; diff --git a/src/mame/drivers/ggconnie.c b/src/mame/drivers/ggconnie.c index 1b90135345b..bfa46d205c2 100644 --- a/src/mame/drivers/ggconnie.c +++ b/src/mame/drivers/ggconnie.c @@ -197,14 +197,6 @@ static const huc6202_interface sgx_huc6202_config = }; -static const huc6260_interface sgx_huc6260_config = -{ - DEVCB_DEVICE_MEMBER16( "huc6202", huc6202_device, next_pixel ), - DEVCB_DEVICE_MEMBER16( "huc6202", huc6202_device, time_until_next_event ), - DEVCB_DEVICE_LINE_MEMBER( "huc6202", huc6202_device, vsync_changed ), - DEVCB_DEVICE_LINE_MEMBER( "huc6202", huc6202_device, hsync_changed ) -}; - static MACHINE_CONFIG_START( ggconnie, ggconnie_state ) /* basic machine hardware */ MCFG_CPU_ADD("maincpu", H6280, PCE_MAIN_CLOCK/3) @@ -217,7 +209,11 @@ static MACHINE_CONFIG_START( ggconnie, ggconnie_state ) MCFG_SCREEN_UPDATE_DRIVER( ggconnie_state, screen_update ) MCFG_SCREEN_PALETTE("huc6260:palette") - MCFG_HUC6260_ADD( "huc6260", PCE_MAIN_CLOCK/3, sgx_huc6260_config ) + MCFG_DEVICE_ADD( "huc6260", HUC6260, PCE_MAIN_CLOCK/3 ) + MCFG_HUC6260_NEXT_PIXEL_DATA_CB(DEVREAD16("huc6202", huc6202_device, next_pixel)) + MCFG_HUC6260_TIME_TIL_NEXT_EVENT_CB(DEVREAD16("huc6202", huc6202_device, time_until_next_event)) + MCFG_HUC6260_VSYNC_CHANGED_CB(DEVWRITELINE("huc6202", huc6202_device, vsync_changed)) + MCFG_HUC6260_HSYNC_CHANGED_CB(DEVWRITELINE("huc6202", huc6202_device, hsync_changed)) MCFG_DEVICE_ADD( "huc6270_0", HUC6270, 0 ) MCFG_HUC6270_VRAM_SIZE(0x10000) MCFG_HUC6270_IRQ_CHANGED_CB(WRITELINE(pce_common_state, pce_irq_changed)) diff --git a/src/mame/drivers/paranoia.c b/src/mame/drivers/paranoia.c index 9bb44e07c7b..fb488362353 100644 --- a/src/mame/drivers/paranoia.c +++ b/src/mame/drivers/paranoia.c @@ -174,14 +174,6 @@ static const c6280_interface c6280_config = "maincpu" }; -static const huc6260_interface pce_huc6260_config = -{ - DEVCB_DEVICE_MEMBER16( "huc6270", huc6270_device, next_pixel ), - DEVCB_DEVICE_MEMBER16( "huc6270", huc6270_device, time_until_next_event ), - DEVCB_DEVICE_LINE_MEMBER( "huc6270", huc6270_device, vsync_changed ), - DEVCB_DEVICE_LINE_MEMBER( "huc6270", huc6270_device, hsync_changed ) -}; - static MACHINE_CONFIG_START( paranoia, paranoia_state ) /* basic machine hardware */ MCFG_CPU_ADD("maincpu", H6280, PCE_MAIN_CLOCK/3) @@ -205,7 +197,11 @@ static MACHINE_CONFIG_START( paranoia, paranoia_state ) MCFG_SCREEN_UPDATE_DRIVER( pce_common_state, screen_update ) MCFG_SCREEN_PALETTE("huc6260:palette") - MCFG_HUC6260_ADD( "huc6260", PCE_MAIN_CLOCK, pce_huc6260_config ) + MCFG_DEVICE_ADD( "huc6260", HUC6260, PCE_MAIN_CLOCK ) + MCFG_HUC6260_NEXT_PIXEL_DATA_CB(DEVREAD16("huc6270", huc6270_device, next_pixel)) + MCFG_HUC6260_TIME_TIL_NEXT_EVENT_CB(DEVREAD16("huc6270", huc6270_device, time_until_next_event)) + MCFG_HUC6260_VSYNC_CHANGED_CB(DEVWRITELINE("huc6270", huc6270_device, vsync_changed)) + MCFG_HUC6260_HSYNC_CHANGED_CB(DEVWRITELINE("huc6270", huc6270_device, hsync_changed)) MCFG_DEVICE_ADD( "huc6270", HUC6270, 0 ) MCFG_HUC6270_VRAM_SIZE(0x10000) MCFG_HUC6270_IRQ_CHANGED_CB(WRITELINE(pce_common_state, pce_irq_changed)) diff --git a/src/mame/drivers/tourvis.c b/src/mame/drivers/tourvis.c index f0e5e0c2924..06a5a14288b 100644 --- a/src/mame/drivers/tourvis.c +++ b/src/mame/drivers/tourvis.c @@ -368,15 +368,6 @@ WRITE_LINE_MEMBER(tourvision_state::pce_irq_changed) m_maincpu->set_input_line(0, state); } - -static const huc6260_interface pce_huc6260_config = -{ - DEVCB_DEVICE_MEMBER16( "huc6270", huc6270_device, next_pixel ), - DEVCB_DEVICE_MEMBER16( "huc6270", huc6270_device, time_until_next_event ), - DEVCB_DEVICE_LINE_MEMBER( "huc6270", huc6270_device, vsync_changed ), - DEVCB_DEVICE_LINE_MEMBER( "huc6270", huc6270_device, hsync_changed ) -}; - static MACHINE_CONFIG_START( tourvision, tourvision_state ) /* basic machine hardware */ MCFG_CPU_ADD("maincpu", H6280, PCE_MAIN_CLOCK/3) @@ -393,7 +384,11 @@ static MACHINE_CONFIG_START( tourvision, tourvision_state ) MCFG_SCREEN_UPDATE_DRIVER( pce_common_state, screen_update ) MCFG_SCREEN_PALETTE("huc6260:palette") - MCFG_HUC6260_ADD( "huc6260", PCE_MAIN_CLOCK, pce_huc6260_config ) + MCFG_DEVICE_ADD( "huc6260", HUC6260, PCE_MAIN_CLOCK ) + MCFG_HUC6260_NEXT_PIXEL_DATA_CB(DEVREAD16("huc6270", huc6270_device, next_pixel)) + MCFG_HUC6260_TIME_TIL_NEXT_EVENT_CB(DEVREAD16("huc6270", huc6270_device, time_until_next_event)) + MCFG_HUC6260_VSYNC_CHANGED_CB(DEVWRITELINE("huc6270", huc6270_device, vsync_changed)) + MCFG_HUC6260_HSYNC_CHANGED_CB(DEVWRITELINE("huc6270", huc6270_device, hsync_changed)) MCFG_DEVICE_ADD( "huc6270", HUC6270, 0 ) MCFG_HUC6270_VRAM_SIZE(0x10000) MCFG_HUC6270_IRQ_CHANGED_CB(WRITELINE(tourvision_state, pce_irq_changed)) diff --git a/src/mame/drivers/uapce.c b/src/mame/drivers/uapce.c index efefb7e593a..a28f726fae2 100644 --- a/src/mame/drivers/uapce.c +++ b/src/mame/drivers/uapce.c @@ -311,13 +311,6 @@ WRITE_LINE_MEMBER(uapce_state::pce_irq_changed) } -static const huc6260_interface pce_huc6260_config = -{ - DEVCB_DEVICE_MEMBER16( "huc6270", huc6270_device, next_pixel ), - DEVCB_DEVICE_MEMBER16( "huc6270", huc6270_device, time_until_next_event ), - DEVCB_DEVICE_LINE_MEMBER( "huc6270", huc6270_device, vsync_changed ), - DEVCB_DEVICE_LINE_MEMBER( "huc6270", huc6270_device, hsync_changed ) -}; static MACHINE_CONFIG_START( uapce, uapce_state ) /* basic machine hardware */ MCFG_CPU_ADD("maincpu", H6280, PCE_MAIN_CLOCK/3) @@ -335,7 +328,11 @@ static MACHINE_CONFIG_START( uapce, uapce_state ) MCFG_SCREEN_UPDATE_DRIVER( pce_common_state, screen_update ) MCFG_SCREEN_PALETTE("huc6260:palette") - MCFG_HUC6260_ADD( "huc6260", PCE_MAIN_CLOCK, pce_huc6260_config ) + MCFG_DEVICE_ADD( "huc6260", HUC6260, PCE_MAIN_CLOCK ) + MCFG_HUC6260_NEXT_PIXEL_DATA_CB(DEVREAD16("huc6270", huc6270_device, next_pixel)) + MCFG_HUC6260_TIME_TIL_NEXT_EVENT_CB(DEVREAD16("huc6270", huc6270_device, time_until_next_event)) + MCFG_HUC6260_VSYNC_CHANGED_CB(DEVWRITELINE("huc6270", huc6270_device, vsync_changed)) + MCFG_HUC6260_HSYNC_CHANGED_CB(DEVWRITELINE("huc6270", huc6270_device, hsync_changed)) MCFG_DEVICE_ADD( "huc6270", HUC6270, 0 ) MCFG_HUC6270_VRAM_SIZE(0x10000) MCFG_HUC6270_IRQ_CHANGED_CB(WRITELINE(uapce_state, pce_irq_changed)) diff --git a/src/mess/drivers/pce.c b/src/mess/drivers/pce.c index c4b7c9ad8a8..6b19e560633 100644 --- a/src/mess/drivers/pce.c +++ b/src/mess/drivers/pce.c @@ -302,15 +302,6 @@ WRITE_LINE_MEMBER(pce_state::pce_irq_changed) } -static const huc6260_interface pce_huc6260_config = -{ - DEVCB_DEVICE_MEMBER16( "huc6270", huc6270_device, next_pixel ), - DEVCB_DEVICE_MEMBER16( "huc6270", huc6270_device, time_until_next_event ), - DEVCB_DEVICE_LINE_MEMBER( "huc6270", huc6270_device, vsync_changed ), - DEVCB_DEVICE_LINE_MEMBER( "huc6270", huc6270_device, hsync_changed ) -}; - - static const huc6202_interface sgx_huc6202_config = { DEVCB_DEVICE_MEMBER16( "huc6270_0", huc6270_device, next_pixel ), @@ -328,15 +319,6 @@ static const huc6202_interface sgx_huc6202_config = }; -static const huc6260_interface sgx_huc6260_config = -{ - DEVCB_DEVICE_MEMBER16( "huc6202", huc6202_device, next_pixel ), - DEVCB_DEVICE_MEMBER16( "huc6202", huc6202_device, time_until_next_event ), - DEVCB_DEVICE_LINE_MEMBER( "huc6202", huc6202_device, vsync_changed ), - DEVCB_DEVICE_LINE_MEMBER( "huc6202", huc6202_device, hsync_changed ) -}; - - static SLOT_INTERFACE_START(pce_cart) SLOT_INTERFACE_INTERNAL("rom", PCE_ROM_STD) SLOT_INTERFACE_INTERNAL("cdsys3u", PCE_ROM_CDSYS3) @@ -361,7 +343,11 @@ static MACHINE_CONFIG_START( pce_common, pce_state ) MCFG_SCREEN_UPDATE_DRIVER( pce_state, screen_update ) MCFG_SCREEN_PALETTE("huc6260:palette") - MCFG_HUC6260_ADD( "huc6260", MAIN_CLOCK, pce_huc6260_config ) + MCFG_DEVICE_ADD( "huc6260", HUC6260, MAIN_CLOCK ) + MCFG_HUC6260_NEXT_PIXEL_DATA_CB(DEVREAD16("huc6270", huc6270_device, next_pixel)) + MCFG_HUC6260_TIME_TIL_NEXT_EVENT_CB(DEVREAD16("huc6270", huc6270_device, time_until_next_event)) + MCFG_HUC6260_VSYNC_CHANGED_CB(DEVWRITELINE("huc6270", huc6270_device, vsync_changed)) + MCFG_HUC6260_HSYNC_CHANGED_CB(DEVWRITELINE("huc6270", huc6270_device, hsync_changed)) MCFG_DEVICE_ADD( "huc6270", HUC6270, 0 ) MCFG_HUC6270_VRAM_SIZE(0x10000) MCFG_HUC6270_IRQ_CHANGED_CB(WRITELINE(pce_state, pce_irq_changed)) @@ -406,7 +392,11 @@ static MACHINE_CONFIG_START( sgx, pce_state ) MCFG_SCREEN_UPDATE_DRIVER( pce_state, screen_update ) MCFG_SCREEN_PALETTE("huc6260:palette") - MCFG_HUC6260_ADD( "huc6260", MAIN_CLOCK, sgx_huc6260_config ) + MCFG_DEVICE_ADD( "huc6260", HUC6260, MAIN_CLOCK ) + MCFG_HUC6260_NEXT_PIXEL_DATA_CB(DEVREAD16("huc6202", huc6202_device, next_pixel)) + MCFG_HUC6260_TIME_TIL_NEXT_EVENT_CB(DEVREAD16("huc6202", huc6202_device, time_until_next_event)) + MCFG_HUC6260_VSYNC_CHANGED_CB(DEVWRITELINE("huc6202", huc6202_device, vsync_changed)) + MCFG_HUC6260_HSYNC_CHANGED_CB(DEVWRITELINE("huc6202", huc6202_device, hsync_changed)) MCFG_DEVICE_ADD( "huc6270_0", HUC6270, 0 ) MCFG_HUC6270_VRAM_SIZE(0x10000) MCFG_HUC6270_IRQ_CHANGED_CB(WRITELINE(pce_state, pce_irq_changed))