diff options
-rw-r--r-- | src/emu/video/huc6202.c | 114 | ||||
-rw-r--r-- | src/emu/video/huc6202.h | 105 | ||||
-rw-r--r-- | src/mame/drivers/ggconnie.c | 31 | ||||
-rw-r--r-- | src/mess/drivers/pce.c | 31 |
4 files changed, 142 insertions, 139 deletions
diff --git a/src/emu/video/huc6202.c b/src/emu/video/huc6202.c index 00fc6d6da10..18ac32daf9c 100644 --- a/src/emu/video/huc6202.c +++ b/src/emu/video/huc6202.c @@ -12,34 +12,20 @@ const device_type HUC6202 = &device_creator<huc6202_device>; -void huc6202_device::device_config_complete() -{ - const huc6202_interface *intf = reinterpret_cast<const huc6202_interface *>(static_config()); - - if ( intf != NULL ) - { - *static_cast<huc6202_interface *>(this) = *intf; - } - else - { - memset(&m_next_pixel_0, 0, sizeof(m_next_pixel_0)); - memset(&m_get_time_til_next_event_0, 0, sizeof(m_get_time_til_next_event_0)); - memset(&m_hsync_changed_0, 0, sizeof(m_hsync_changed_0)); - memset(&m_vsync_changed_0, 0, sizeof(m_vsync_changed_0)); - memset(&m_read_0, 0, sizeof(m_read_0)); - memset(&m_write_0, 0, sizeof(m_write_0)); - memset(&m_next_pixel_1, 0, sizeof(m_next_pixel_1)); - memset(&m_get_time_til_next_event_1, 0, sizeof(m_get_time_til_next_event_1)); - memset(&m_hsync_changed_1, 0, sizeof(m_hsync_changed_1)); - memset(&m_vsync_changed_1, 0, sizeof(m_vsync_changed_1)); - memset(&m_read_1, 0, sizeof(m_read_1)); - memset(&m_write_1, 0, sizeof(m_write_1)); - } -} - - huc6202_device::huc6202_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) - : device_t(mconfig, HUC6202, "HuC6202 VPC", tag, owner, clock, "huc6202", __FILE__) + : device_t(mconfig, HUC6202, "HuC6202 VPC", tag, owner, clock, "huc6202", __FILE__), + m_next_pixel_0_cb(*this), + m_time_til_next_event_0_cb(*this), + m_vsync_changed_0_cb(*this), + m_hsync_changed_0_cb(*this), + m_read_0_cb(*this), + m_write_0_cb(*this), + m_next_pixel_1_cb(*this), + m_time_til_next_event_1_cb(*this), + m_vsync_changed_1_cb(*this), + m_hsync_changed_1_cb(*this), + m_read_1_cb(*this), + m_write_1_cb(*this) { } @@ -48,8 +34,8 @@ READ16_MEMBER( huc6202_device::next_pixel ) { UINT16 data = huc6270_device::HUC6270_BACKGROUND; - UINT16 data_0 = m_next_pixel_0( 0, 0xffff ); - UINT16 data_1 = m_next_pixel_1( 0, 0xffff ); + UINT16 data_0 = m_next_pixel_0_cb( 0, 0xffff ); + UINT16 data_1 = m_next_pixel_1_cb( 0, 0xffff ); if ( data_0 == huc6270_device::HUC6270_SPRITE && data_1 == huc6270_device::HUC6270_SPRITE ) { @@ -164,8 +150,8 @@ READ16_MEMBER( huc6202_device::next_pixel ) READ16_MEMBER( huc6202_device::time_until_next_event ) { - UINT16 next_event_clocks_0 = m_get_time_til_next_event_0( 0, 0xffff ); - UINT16 next_event_clocks_1 = m_get_time_til_next_event_1( 0, 0xffff ); + UINT16 next_event_clocks_0 = m_time_til_next_event_0_cb( 0, 0xffff ); + UINT16 next_event_clocks_1 = m_time_til_next_event_1_cb( 0, 0xffff ); return MIN( next_event_clocks_0, next_event_clocks_1 ); } @@ -173,15 +159,15 @@ READ16_MEMBER( huc6202_device::time_until_next_event ) WRITE_LINE_MEMBER( huc6202_device::vsync_changed ) { - m_vsync_changed_0( state ); - m_vsync_changed_1( state ); + m_vsync_changed_0_cb( state ); + m_vsync_changed_1_cb( state ); } WRITE_LINE_MEMBER( huc6202_device::hsync_changed ) { - m_hsync_changed_0( state ); - m_hsync_changed_1( state ); + m_hsync_changed_0_cb( state ); + m_hsync_changed_1_cb( state ); } @@ -283,11 +269,11 @@ READ8_MEMBER( huc6202_device::io_read ) { if ( m_io_device ) { - return m_read_1( offset ); + return m_read_1_cb( offset ); } else { - return m_read_0( offset ); + return m_read_0_cb( offset ); } } @@ -296,11 +282,11 @@ WRITE8_MEMBER( huc6202_device::io_write ) { if ( m_io_device ) { - m_write_1( offset, data ); + m_write_1_cb( offset, data ); } else { - m_write_0( offset, data ); + m_write_0_cb( offset, data ); } } @@ -308,33 +294,33 @@ WRITE8_MEMBER( huc6202_device::io_write ) void huc6202_device::device_start() { /* Resolve callbacks */ - m_next_pixel_0.resolve( device_0_next_pixel, *this ); - m_get_time_til_next_event_0.resolve( get_time_til_next_event_0, *this ); - m_hsync_changed_0.resolve( hsync_0_changed, *this ); - m_vsync_changed_0.resolve( vsync_0_changed, *this ); - m_read_0.resolve( read_0, *this ); - m_write_0.resolve( write_0, *this ); - - m_next_pixel_1.resolve( device_1_next_pixel, *this ); - m_get_time_til_next_event_1.resolve( get_time_til_next_event_1, *this ); - m_hsync_changed_1.resolve( hsync_1_changed, *this ); - m_vsync_changed_1.resolve( vsync_1_changed, *this ); - m_read_1.resolve( read_1, *this ); - m_write_1.resolve( write_1, *this ); + m_next_pixel_0_cb.resolve(); + m_time_til_next_event_0_cb.resolve(); + m_hsync_changed_0_cb.resolve(); + m_vsync_changed_0_cb.resolve(); + m_read_0_cb.resolve(); + m_write_0_cb.resolve(); + + m_next_pixel_1_cb.resolve(); + m_time_til_next_event_1_cb.resolve(); + m_hsync_changed_1_cb.resolve(); + m_vsync_changed_1_cb.resolve(); + m_read_1_cb.resolve(); + m_write_1_cb.resolve(); /* We want all our callbacks to be resolved */ - assert( ! m_next_pixel_0.isnull() ); - assert( ! m_get_time_til_next_event_0.isnull() ); - assert( ! m_hsync_changed_0.isnull() ); - assert( ! m_vsync_changed_0.isnull() ); - assert( ! m_read_0.isnull() ); - assert( ! m_write_0.isnull() ); - assert( ! m_next_pixel_1.isnull() ); - assert( ! m_get_time_til_next_event_1.isnull() ); - assert( ! m_hsync_changed_1.isnull() ); - assert( ! m_vsync_changed_1.isnull() ); - assert( ! m_read_1.isnull() ); - assert( ! m_write_1.isnull() ); + assert( ! m_next_pixel_0_cb.isnull() ); + assert( ! m_time_til_next_event_0_cb.isnull() ); + assert( ! m_hsync_changed_0_cb.isnull() ); + assert( ! m_vsync_changed_0_cb.isnull() ); + assert( ! m_read_0_cb.isnull() ); + assert( ! m_write_0_cb.isnull() ); + assert( ! m_next_pixel_1_cb.isnull() ); + assert( ! m_time_til_next_event_1_cb.isnull() ); + assert( ! m_hsync_changed_1_cb.isnull() ); + assert( ! m_vsync_changed_1_cb.isnull() ); + assert( ! m_read_1_cb.isnull() ); + assert( ! m_write_1_cb.isnull() ); /* Register save items */ save_item(NAME(m_prio[0].prio_type)); diff --git a/src/emu/video/huc6202.h b/src/emu/video/huc6202.h index 343786d2fbb..07a0317caeb 100644 --- a/src/emu/video/huc6202.h +++ b/src/emu/video/huc6202.h @@ -10,46 +10,62 @@ #include "emu.h" -#define MCFG_HUC6202_ADD( _tag, _intrf ) \ - MCFG_DEVICE_ADD( _tag, HUC6202, 0 ) \ - MCFG_DEVICE_CONFIG( _intrf ) +#define MCFG_HUC6202_NEXT_PIXEL_0_CB(_devcb) \ + devcb = &huc6202_device::set_next_pixel_0_callback(*device, DEVCB2_##_devcb); +#define MCFG_HUC6202_TIME_TIL_NEXT_EVENT_0_CB(_devcb) \ + devcb = &huc6202_device::set_time_til_next_event_0_callback(*device, DEVCB2_##_devcb); -struct huc6202_interface -{ - /* First gfx input device */ - devcb_read16 device_0_next_pixel; +#define MCFG_HUC6202_VSYNC_CHANGED_0_CB(_devcb) \ + devcb = &huc6202_device::set_vsync_changed_0_callback(*device, DEVCB2_##_devcb); - /* TODO: Choose proper types */ - /* Callback function to get time until next event */ - devcb_read16 get_time_til_next_event_0; +#define MCFG_HUC6202_HSYNC_CHANGED_0_CB(_devcb) \ + devcb = &huc6202_device::set_hsync_changed_0_callback(*device, DEVCB2_##_devcb); - devcb_write_line vsync_0_changed; - devcb_write_line hsync_0_changed; - devcb_read8 read_0; - devcb_write8 write_0; +#define MCFG_HUC6202_READ_0_CB(_devcb) \ + devcb = &huc6202_device::set_read_0_callback(*device, DEVCB2_##_devcb); +#define MCFG_HUC6202_WRITE_0_CB(_devcb) \ + devcb = &huc6202_device::set_write_0_callback(*device, DEVCB2_##_devcb); - /* Second gfx input device */ - devcb_read16 device_1_next_pixel; +#define MCFG_HUC6202_NEXT_PIXEL_1_CB(_devcb) \ + devcb = &huc6202_device::set_next_pixel_1_callback(*device, DEVCB2_##_devcb); - /* TODO: Choose proper types */ - /* Callback function to get time until next event */ - devcb_read16 get_time_til_next_event_1; +#define MCFG_HUC6202_TIME_TIL_NEXT_EVENT_1_CB(_devcb) \ + devcb = &huc6202_device::set_time_til_next_event_1_callback(*device, DEVCB2_##_devcb); - devcb_write_line vsync_1_changed; - devcb_write_line hsync_1_changed; - devcb_read8 read_1; - devcb_write8 write_1; -}; +#define MCFG_HUC6202_VSYNC_CHANGED_1_CB(_devcb) \ + devcb = &huc6202_device::set_vsync_changed_1_callback(*device, DEVCB2_##_devcb); + +#define MCFG_HUC6202_HSYNC_CHANGED_1_CB(_devcb) \ + devcb = &huc6202_device::set_hsync_changed_1_callback(*device, DEVCB2_##_devcb); +#define MCFG_HUC6202_READ_1_CB(_devcb) \ + devcb = &huc6202_device::set_read_1_callback(*device, DEVCB2_##_devcb); -class huc6202_device : public device_t, - public huc6202_interface +#define MCFG_HUC6202_WRITE_1_CB(_devcb) \ + devcb = &huc6202_device::set_write_1_callback(*device, DEVCB2_##_devcb); + + +class huc6202_device : public device_t { public: // construction/destruction huc6202_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); + + template<class _Object> static devcb2_base &set_next_pixel_0_callback(device_t &device, _Object object) { return downcast<huc6202_device &>(device).m_next_pixel_0_cb.set_callback(object); } + template<class _Object> static devcb2_base &set_time_til_next_event_0_callback(device_t &device, _Object object) { return downcast<huc6202_device &>(device).m_time_til_next_event_0_cb.set_callback(object); } + template<class _Object> static devcb2_base &set_vsync_changed_0_callback(device_t &device, _Object object) { return downcast<huc6202_device &>(device).m_vsync_changed_0_cb.set_callback(object); } + template<class _Object> static devcb2_base &set_hsync_changed_0_callback(device_t &device, _Object object) { return downcast<huc6202_device &>(device).m_hsync_changed_0_cb.set_callback(object); } + template<class _Object> static devcb2_base &set_read_0_callback(device_t &device, _Object object) { return downcast<huc6202_device &>(device).m_read_0_cb.set_callback(object); } + template<class _Object> static devcb2_base &set_write_0_callback(device_t &device, _Object object) { return downcast<huc6202_device &>(device).m_write_0_cb.set_callback(object); } + template<class _Object> static devcb2_base &set_next_pixel_1_callback(device_t &device, _Object object) { return downcast<huc6202_device &>(device).m_next_pixel_1_cb.set_callback(object); } + template<class _Object> static devcb2_base &set_time_til_next_event_1_callback(device_t &device, _Object object) { return downcast<huc6202_device &>(device).m_time_til_next_event_1_cb.set_callback(object); } + template<class _Object> static devcb2_base &set_vsync_changed_1_callback(device_t &device, _Object object) { return downcast<huc6202_device &>(device).m_vsync_changed_1_cb.set_callback(object); } + template<class _Object> static devcb2_base &set_hsync_changed_1_callback(device_t &device, _Object object) { return downcast<huc6202_device &>(device).m_hsync_changed_1_cb.set_callback(object); } + template<class _Object> static devcb2_base &set_read_1_callback(device_t &device, _Object object) { return downcast<huc6202_device &>(device).m_read_1_cb.set_callback(object); } + template<class _Object> static devcb2_base &set_write_1_callback(device_t &device, _Object object) { return downcast<huc6202_device &>(device).m_write_1_cb.set_callback(object); } + DECLARE_READ8_MEMBER( read ); DECLARE_WRITE8_MEMBER( write ); DECLARE_READ8_MEMBER( io_read ); @@ -61,24 +77,35 @@ public: protected: // device-level overrides - virtual void device_config_complete(); virtual void device_start(); virtual void device_reset(); private: /* callbacks */ - devcb_resolved_read16 m_next_pixel_0; - devcb_resolved_read16 m_get_time_til_next_event_0; - devcb_resolved_write_line m_hsync_changed_0; - devcb_resolved_write_line m_vsync_changed_0; - devcb_resolved_read8 m_read_0; - devcb_resolved_write8 m_write_0; - devcb_resolved_read16 m_next_pixel_1; - devcb_resolved_read16 m_get_time_til_next_event_1; - devcb_resolved_write_line m_hsync_changed_1; - devcb_resolved_write_line m_vsync_changed_1; - devcb_resolved_read8 m_read_1; - devcb_resolved_write8 m_write_1; + /* First gfx input device */ + devcb2_read16 m_next_pixel_0_cb; + + /* TODO: Choose proper types */ + /* Callback function to get time until next event */ + devcb2_read16 m_time_til_next_event_0_cb; + + devcb2_write_line m_vsync_changed_0_cb; + devcb2_write_line m_hsync_changed_0_cb; + devcb2_read8 m_read_0_cb; + devcb2_write8 m_write_0_cb; + + + /* Second gfx input device */ + devcb2_read16 m_next_pixel_1_cb; + + /* TODO: Choose proper types */ + /* Callback function to get time until next event */ + devcb2_read16 m_time_til_next_event_1_cb; + + devcb2_write_line m_vsync_changed_1_cb; + devcb2_write_line m_hsync_changed_1_cb; + devcb2_read8 m_read_1_cb; + devcb2_write8 m_write_1_cb; struct { UINT8 prio_type; diff --git a/src/mame/drivers/ggconnie.c b/src/mame/drivers/ggconnie.c index 68b7242b8d8..20531e985b0 100644 --- a/src/mame/drivers/ggconnie.c +++ b/src/mame/drivers/ggconnie.c @@ -180,23 +180,6 @@ static const c6280_interface c6280_config = "maincpu" }; -static const huc6202_interface sgx_huc6202_config = -{ - DEVCB_DEVICE_MEMBER16( "huc6270_0", huc6270_device, next_pixel ), - DEVCB_DEVICE_MEMBER16( "huc6270_0", huc6270_device, time_until_next_event ), - DEVCB_DEVICE_LINE_MEMBER( "huc6270_0", huc6270_device, vsync_changed ), - DEVCB_DEVICE_LINE_MEMBER( "huc6270_0", huc6270_device, hsync_changed ), - DEVCB_DEVICE_MEMBER( "huc6270_0", huc6270_device, read ), - DEVCB_DEVICE_MEMBER( "huc6270_0", huc6270_device, write ), - DEVCB_DEVICE_MEMBER16( "huc6270_1", huc6270_device, next_pixel ), - DEVCB_DEVICE_MEMBER16( "huc6270_1", huc6270_device, time_until_next_event ), - DEVCB_DEVICE_LINE_MEMBER( "huc6270_1", huc6270_device, vsync_changed ), - DEVCB_DEVICE_LINE_MEMBER( "huc6270_1", huc6270_device, hsync_changed ), - DEVCB_DEVICE_MEMBER( "huc6270_1", huc6270_device, read ), - DEVCB_DEVICE_MEMBER( "huc6270_1", huc6270_device, write ), -}; - - static MACHINE_CONFIG_START( ggconnie, ggconnie_state ) /* basic machine hardware */ MCFG_CPU_ADD("maincpu", H6280, PCE_MAIN_CLOCK/3) @@ -220,7 +203,19 @@ static MACHINE_CONFIG_START( ggconnie, ggconnie_state ) MCFG_DEVICE_ADD( "huc6270_1", HUC6270, 0 ) MCFG_HUC6270_VRAM_SIZE(0x10000) MCFG_HUC6270_IRQ_CHANGED_CB(WRITELINE(pce_common_state, pce_irq_changed)) - MCFG_HUC6202_ADD( "huc6202", sgx_huc6202_config ) + MCFG_DEVICE_ADD( "huc6202", HUC6202, 0 ) + MCFG_HUC6202_NEXT_PIXEL_0_CB(DEVREAD16("huc6270_0", huc6270_device, next_pixel)) + MCFG_HUC6202_TIME_TIL_NEXT_EVENT_0_CB(DEVREAD16("huc6270_0", huc6270_device, time_until_next_event)) + MCFG_HUC6202_VSYNC_CHANGED_0_CB(DEVWRITELINE("huc6270_0", huc6270_device, vsync_changed)) + MCFG_HUC6202_HSYNC_CHANGED_0_CB(DEVWRITELINE("huc6270_0", huc6270_device, hsync_changed)) + MCFG_HUC6202_READ_0_CB(DEVREAD8("huc6270_0", huc6270_device, read)) + MCFG_HUC6202_WRITE_0_CB(DEVWRITE8("huc6270_0", huc6270_device, write)) + MCFG_HUC6202_NEXT_PIXEL_1_CB(DEVREAD16("huc6270_1", huc6270_device, next_pixel)) + MCFG_HUC6202_TIME_TIL_NEXT_EVENT_1_CB(DEVREAD16("huc6270_1", huc6270_device, time_until_next_event)) + MCFG_HUC6202_VSYNC_CHANGED_1_CB(DEVWRITELINE("huc6270_1", huc6270_device, vsync_changed)) + MCFG_HUC6202_HSYNC_CHANGED_1_CB(DEVWRITELINE("huc6270_1", huc6270_device, hsync_changed)) + MCFG_HUC6202_READ_1_CB(DEVREAD8("huc6270_1", huc6270_device, read)) + MCFG_HUC6202_WRITE_1_CB(DEVWRITE8("huc6270_1", huc6270_device, write)) MCFG_DEVICE_ADD("rtc", MSM6242, XTAL_32_768kHz) diff --git a/src/mess/drivers/pce.c b/src/mess/drivers/pce.c index 6b19e560633..306ebb35a2b 100644 --- a/src/mess/drivers/pce.c +++ b/src/mess/drivers/pce.c @@ -302,23 +302,6 @@ WRITE_LINE_MEMBER(pce_state::pce_irq_changed) } -static const huc6202_interface sgx_huc6202_config = -{ - DEVCB_DEVICE_MEMBER16( "huc6270_0", huc6270_device, next_pixel ), - DEVCB_DEVICE_MEMBER16( "huc6270_0", huc6270_device, time_until_next_event ), - DEVCB_DEVICE_LINE_MEMBER( "huc6270_0", huc6270_device, vsync_changed ), - DEVCB_DEVICE_LINE_MEMBER( "huc6270_0", huc6270_device, hsync_changed ), - DEVCB_DEVICE_MEMBER( "huc6270_0", huc6270_device, read ), - DEVCB_DEVICE_MEMBER( "huc6270_0", huc6270_device, write ), - DEVCB_DEVICE_MEMBER16( "huc6270_1", huc6270_device, next_pixel ), - DEVCB_DEVICE_MEMBER16( "huc6270_1", huc6270_device, time_until_next_event ), - DEVCB_DEVICE_LINE_MEMBER( "huc6270_1", huc6270_device, vsync_changed ), - DEVCB_DEVICE_LINE_MEMBER( "huc6270_1", huc6270_device, hsync_changed ), - DEVCB_DEVICE_MEMBER( "huc6270_1", huc6270_device, read ), - DEVCB_DEVICE_MEMBER( "huc6270_1", huc6270_device, write ), -}; - - static SLOT_INTERFACE_START(pce_cart) SLOT_INTERFACE_INTERNAL("rom", PCE_ROM_STD) SLOT_INTERFACE_INTERNAL("cdsys3u", PCE_ROM_CDSYS3) @@ -403,7 +386,19 @@ static MACHINE_CONFIG_START( sgx, pce_state ) MCFG_DEVICE_ADD( "huc6270_1", HUC6270, 0 ) MCFG_HUC6270_VRAM_SIZE(0x10000) MCFG_HUC6270_IRQ_CHANGED_CB(WRITELINE(pce_state, pce_irq_changed)) - MCFG_HUC6202_ADD( "huc6202", sgx_huc6202_config ) + MCFG_DEVICE_ADD( "huc6202", HUC6202, 0 ) + MCFG_HUC6202_NEXT_PIXEL_0_CB(DEVREAD16("huc6270_0", huc6270_device, next_pixel)) + MCFG_HUC6202_TIME_TIL_NEXT_EVENT_0_CB(DEVREAD16("huc6270_0", huc6270_device, time_until_next_event)) + MCFG_HUC6202_VSYNC_CHANGED_0_CB(DEVWRITELINE("huc6270_0", huc6270_device, vsync_changed)) + MCFG_HUC6202_HSYNC_CHANGED_0_CB(DEVWRITELINE("huc6270_0", huc6270_device, hsync_changed)) + MCFG_HUC6202_READ_0_CB(DEVREAD8("huc6270_0", huc6270_device, read)) + MCFG_HUC6202_WRITE_0_CB(DEVWRITE8("huc6270_0", huc6270_device, write)) + MCFG_HUC6202_NEXT_PIXEL_1_CB(DEVREAD16("huc6270_1", huc6270_device, next_pixel)) + MCFG_HUC6202_TIME_TIL_NEXT_EVENT_1_CB(DEVREAD16("huc6270_1", huc6270_device, time_until_next_event)) + MCFG_HUC6202_VSYNC_CHANGED_1_CB(DEVWRITELINE("huc6270_1", huc6270_device, vsync_changed)) + MCFG_HUC6202_HSYNC_CHANGED_1_CB(DEVWRITELINE("huc6270_1", huc6270_device, hsync_changed)) + MCFG_HUC6202_READ_1_CB(DEVREAD8("huc6270_1", huc6270_device, read)) + MCFG_HUC6202_WRITE_1_CB(DEVWRITE8("huc6270_1", huc6270_device, write)) MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker") MCFG_SOUND_ADD(C6280_TAG, C6280, MAIN_CLOCK/6) |