diff --git a/src/emu/bus/pc_kbd/pc_kbdc.c b/src/emu/bus/pc_kbd/pc_kbdc.c index 2928259261b..856e1a34761 100644 --- a/src/emu/bus/pc_kbd/pc_kbdc.c +++ b/src/emu/bus/pc_kbd/pc_kbdc.c @@ -69,6 +69,8 @@ const device_type PC_KBDC = &device_creator; //------------------------------------------------- pc_kbdc_device::pc_kbdc_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) : device_t(mconfig, PC_KBDC, "PC_KBDC", tag, owner, clock, "pc_kbdc", __FILE__), + m_out_clock_cb(*this), + m_out_data_cb(*this), m_clock_state(-1), m_data_state(-1), m_kb_clock_state(1), @@ -77,30 +79,6 @@ pc_kbdc_device::pc_kbdc_device(const machine_config &mconfig, const char *tag, d { } - -//------------------------------------------------- -// device_config_complete - perform any -// operations now that the configuration is -// complete -//------------------------------------------------- -void pc_kbdc_device::device_config_complete() -{ - // inherit a copy of the static data - const pc_kbdc_interface *intf = reinterpret_cast(static_config()); - if (intf != NULL) - { - *static_cast(this) = *intf; - } - - // or initialize to defaults if none provided - else - { - memset(&m_out_clock_cb, 0, sizeof(m_out_clock_cb)); - memset(&m_out_data_cb, 0, sizeof(m_out_data_cb)); - } -} - - void pc_kbdc_device::set_keyboard( device_pc_kbd_interface *keyboard ) { m_keyboard = keyboard; @@ -113,8 +91,8 @@ void pc_kbdc_device::set_keyboard( device_pc_kbd_interface *keyboard ) void pc_kbdc_device::device_start() { // resolve callbacks - m_out_clock_func.resolve(m_out_clock_cb, *this); - m_out_data_func.resolve(m_out_data_cb, *this); + m_out_clock_cb.resolve_safe(); + m_out_data_cb.resolve_safe(); } @@ -144,7 +122,7 @@ void pc_kbdc_device::update_clock_state() m_clock_state = new_clock_state; // Send state to keyboard interface logic on mainboard - m_out_clock_func( m_clock_state ); + m_out_clock_cb( m_clock_state ); // Send state to keyboard if ( m_keyboard ) @@ -165,7 +143,7 @@ void pc_kbdc_device::update_data_state() m_data_state = new_data_state; // Send state to keyboard interface logic on mainboard - m_out_data_func( m_data_state ); + m_out_data_cb( m_data_state ); // Send state to keyboard if ( m_keyboard ) diff --git a/src/emu/bus/pc_kbd/pc_kbdc.h b/src/emu/bus/pc_kbd/pc_kbdc.h index 7e2fda1e8ef..dcbb6cd362f 100644 --- a/src/emu/bus/pc_kbd/pc_kbdc.h +++ b/src/emu/bus/pc_kbd/pc_kbdc.h @@ -19,9 +19,12 @@ set the data line and then set the clock line. // INTERFACE CONFIGURATION MACROS //************************************************************************** -#define MCFG_PC_KBDC_ADD(_tag, _config) \ - MCFG_DEVICE_ADD(_tag, PC_KBDC, 0) \ - MCFG_DEVICE_CONFIG(_config) +#define MCFG_PC_KBDC_OUT_CLOCK_CB(_devcb) \ + devcb = &pc_kbdc_device::set_out_clock_callback(*device, DEVCB2_##_devcb); + +#define MCFG_PC_KBDC_OUT_DATA_CB(_devcb) \ + devcb = &pc_kbdc_device::set_out_data_callback(*device, DEVCB2_##_devcb); + #define MCFG_PC_KBDC_SLOT_ADD(_kbdc_tag, _tag, _slot_intf, _def_slot) \ MCFG_DEVICE_ADD(_tag, PC_KBDC_SLOT, 0 ) \ MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, false) \ @@ -54,22 +57,17 @@ protected: extern const device_type PC_KBDC_SLOT; -struct pc_kbdc_interface -{ - devcb_write_line m_out_clock_cb; - devcb_write_line m_out_data_cb; -}; - - class device_pc_kbd_interface; -class pc_kbdc_device : public device_t, - public pc_kbdc_interface +class pc_kbdc_device : public device_t { public: // construction/destruction pc_kbdc_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); + template static devcb2_base &set_out_clock_callback(device_t &device, _Object object) { return downcast(device).m_out_clock_cb.set_callback(object); } + template static devcb2_base &set_out_data_callback(device_t &device, _Object object) { return downcast(device).m_out_data_cb.set_callback(object); } + void set_keyboard(device_pc_kbd_interface *keyboard); int clock_signal() { return m_clock_state; } @@ -84,13 +82,12 @@ protected: // device-level overrides virtual void device_start(); virtual void device_reset(); - virtual void device_config_complete(); void update_clock_state(); void update_data_state(); - devcb_resolved_write_line m_out_clock_func; - devcb_resolved_write_line m_out_data_func; + devcb2_write_line m_out_clock_cb; + devcb2_write_line m_out_data_cb; int m_clock_state; int m_data_state; diff --git a/src/emu/bus/pci/southbridge.c b/src/emu/bus/pci/southbridge.c index db6c5d6fa09..105fde9c992 100644 --- a/src/emu/bus/pci/southbridge.c +++ b/src/emu/bus/pci/southbridge.c @@ -33,12 +33,6 @@ I8237_INTERFACE( at_dma8237_2_config ) { DEVCB_DEVICE_LINE_MEMBER(DEVICE_SELF_OWNER, southbridge_device, pc_dack4_w), DEVCB_DEVICE_LINE_MEMBER(DEVICE_SELF_OWNER, southbridge_device, pc_dack5_w), DEVCB_DEVICE_LINE_MEMBER(DEVICE_SELF_OWNER, southbridge_device, pc_dack6_w), DEVCB_DEVICE_LINE_MEMBER(DEVICE_SELF_OWNER, southbridge_device, pc_dack7_w) } }; -static const pc_kbdc_interface pc_kbdc_intf = -{ - DEVCB_DEVICE_LINE_MEMBER("keybc", at_keyboard_controller_device, keyboard_clock_w), - DEVCB_DEVICE_LINE_MEMBER("keybc", at_keyboard_controller_device, keyboard_data_w) -}; - static SLOT_INTERFACE_START(pc_isa_onboard) SLOT_INTERFACE("comat", ISA8_COM_AT) SLOT_INTERFACE("lpt", ISA8_LPT) @@ -66,7 +60,9 @@ static MACHINE_CONFIG_FRAGMENT( southbridge ) MCFG_AT_KEYBOARD_CONTROLLER_INPUT_BUFFER_FULL_CB(DEVWRITELINE("pic8259_master", pic8259_device, ir1_w)) MCFG_AT_KEYBOARD_CONTROLLER_KEYBOARD_CLOCK_CB(DEVWRITELINE("pc_kbdc", pc_kbdc_device, clock_write_from_mb)) MCFG_AT_KEYBOARD_CONTROLLER_KEYBOARD_DATA_CB(DEVWRITELINE("pc_kbdc", pc_kbdc_device, data_write_from_mb)) - MCFG_PC_KBDC_ADD("pc_kbdc", pc_kbdc_intf) + MCFG_DEVICE_ADD("pc_kbdc", PC_KBDC, 0) + MCFG_PC_KBDC_OUT_CLOCK_CB(DEVWRITELINE("keybc", at_keyboard_controller_device, keyboard_clock_w)) + MCFG_PC_KBDC_OUT_DATA_CB(DEVWRITELINE("keybc", at_keyboard_controller_device, keyboard_data_w)) MCFG_PC_KBDC_SLOT_ADD("pc_kbdc", "kbd", pc_at_keyboards, STR_KBD_MICROSOFT_NATURAL) MCFG_DS12885_ADD("rtc") diff --git a/src/mess/drivers/at.c b/src/mess/drivers/at.c index a9c65e3c98a..27b0f280ea8 100644 --- a/src/mess/drivers/at.c +++ b/src/mess/drivers/at.c @@ -273,12 +273,6 @@ static INPUT_PORTS_START( atvga ) PORT_DIPSETTING( 0x01, DEF_STR( Yes ) ) INPUT_PORTS_END -static const pc_kbdc_interface pc_kbdc_intf = -{ - DEVCB_DEVICE_LINE_MEMBER("keybc", at_keyboard_controller_device, keyboard_clock_w), - DEVCB_DEVICE_LINE_MEMBER("keybc", at_keyboard_controller_device, keyboard_data_w) -}; - WRITE_LINE_MEMBER( at_state::at_mc146818_irq ) { m_pic8259_slave->ir0_w((state) ? 0 : 1); @@ -339,7 +333,9 @@ static MACHINE_CONFIG_FRAGMENT( at_motherboard ) MCFG_AT_KEYBOARD_CONTROLLER_INPUT_BUFFER_FULL_CB(DEVWRITELINE("pic8259_master", pic8259_device, ir1_w)) MCFG_AT_KEYBOARD_CONTROLLER_KEYBOARD_CLOCK_CB(DEVWRITELINE("pc_kbdc", pc_kbdc_device, clock_write_from_mb)) MCFG_AT_KEYBOARD_CONTROLLER_KEYBOARD_DATA_CB(DEVWRITELINE("pc_kbdc", pc_kbdc_device, data_write_from_mb)) - MCFG_PC_KBDC_ADD("pc_kbdc", pc_kbdc_intf) + MCFG_DEVICE_ADD("pc_kbdc", PC_KBDC, 0) + MCFG_PC_KBDC_OUT_CLOCK_CB(DEVWRITELINE("keybc", at_keyboard_controller_device, keyboard_clock_w)) + MCFG_PC_KBDC_OUT_DATA_CB(DEVWRITELINE("keybc", at_keyboard_controller_device, keyboard_data_w)) MCFG_MC146818_ADD( "rtc", XTAL_32_768kHz ) MCFG_MC146818_IRQ_HANDLER(WRITELINE(at_state, at_mc146818_irq)) diff --git a/src/mess/drivers/ct486.c b/src/mess/drivers/ct486.c index ecbff75c467..6502b5e7c48 100644 --- a/src/mess/drivers/ct486.c +++ b/src/mess/drivers/ct486.c @@ -102,12 +102,6 @@ ADDRESS_MAP_END // MACHINE DRIVERS //************************************************************************** -static const pc_kbdc_interface pc_kbdc_intf = -{ - DEVCB_DEVICE_LINE_MEMBER("keybc", at_keyboard_controller_device, keyboard_clock_w), - DEVCB_DEVICE_LINE_MEMBER("keybc", at_keyboard_controller_device, keyboard_data_w) -}; - static MACHINE_CONFIG_START( ct486, ct486_state ) MCFG_CPU_ADD("maincpu", I486, XTAL_25MHz) MCFG_CPU_PROGRAM_MAP(ct486_map) @@ -137,7 +131,9 @@ static MACHINE_CONFIG_START( ct486, ct486_state ) MCFG_AT_KEYBOARD_CONTROLLER_INPUT_BUFFER_FULL_CB(DEVWRITELINE("cs4031", cs4031_device, irq01_w)) MCFG_AT_KEYBOARD_CONTROLLER_KEYBOARD_CLOCK_CB(DEVWRITELINE("pc_kbdc", pc_kbdc_device, clock_write_from_mb)) MCFG_AT_KEYBOARD_CONTROLLER_KEYBOARD_DATA_CB(DEVWRITELINE("pc_kbdc", pc_kbdc_device, data_write_from_mb)) - MCFG_PC_KBDC_ADD("pc_kbdc", pc_kbdc_intf) + MCFG_DEVICE_ADD("pc_kbdc", PC_KBDC, 0) + MCFG_PC_KBDC_OUT_CLOCK_CB(DEVWRITELINE("keybc", at_keyboard_controller_device, keyboard_clock_w)) + MCFG_PC_KBDC_OUT_DATA_CB(DEVWRITELINE("keybc", at_keyboard_controller_device, keyboard_data_w)) MCFG_PC_KBDC_SLOT_ADD("pc_kbdc", "kbd", pc_at_keyboards, STR_KBD_MICROSOFT_NATURAL) MCFG_DEVICE_ADD("isabus", ISA16, 0) diff --git a/src/mess/drivers/pt68k4.c b/src/mess/drivers/pt68k4.c index ddf2d2084b5..7ceac21c52d 100644 --- a/src/mess/drivers/pt68k4.c +++ b/src/mess/drivers/pt68k4.c @@ -235,12 +235,6 @@ SLOT_INTERFACE_START( pt68k4_isa8_cards ) SLOT_INTERFACE("xtide", ISA8_XTIDE) // Monk only SLOT_INTERFACE_END -static const pc_kbdc_interface pc_kbdc_intf = -{ - DEVCB_DRIVER_LINE_MEMBER(pt68k4_state, keyboard_clock_w), - DEVCB_DRIVER_LINE_MEMBER(pt68k4_state, keyboard_data_w) -}; - static MACHINE_CONFIG_START( pt68k4, pt68k4_state ) /* basic machine hardware */ MCFG_CPU_ADD(M68K_TAG, M68000, XTAL_16MHz) @@ -253,7 +247,9 @@ static MACHINE_CONFIG_START( pt68k4, pt68k4_state ) MCFG_MC68681_ADD("duart2", XTAL_16MHz / 4) - MCFG_PC_KBDC_ADD(KBDC_TAG, pc_kbdc_intf) + MCFG_DEVICE_ADD(KBDC_TAG, PC_KBDC, 0) + MCFG_PC_KBDC_OUT_CLOCK_CB(WRITELINE(pt68k4_state, keyboard_clock_w)) + MCFG_PC_KBDC_OUT_DATA_CB(WRITELINE(pt68k4_state, keyboard_data_w)) MCFG_PC_KBDC_SLOT_ADD(KBDC_TAG, "kbd", pc_xt_keyboards, STR_KBD_IBM_PC_XT_83) MCFG_M48T02_ADD(TIMEKEEPER_TAG) diff --git a/src/mess/machine/genpc.c b/src/mess/machine/genpc.c index e8d27d68114..77a9ddfac09 100644 --- a/src/mess/machine/genpc.c +++ b/src/mess/machine/genpc.c @@ -412,24 +412,6 @@ I8255A_INTERFACE( pc_ppi8255_interface ) DEVCB_NULL }; -static const pc_kbdc_interface pc_kbdc_intf = -{ - DEVCB_DEVICE_LINE_MEMBER(DEVICE_SELF_OWNER, ibm5160_mb_device, keyboard_clock_w), - DEVCB_DEVICE_LINE_MEMBER(DEVICE_SELF_OWNER, ibm5160_mb_device, keyboard_data_w) -}; - -static const pc_kbdc_interface pc_kbdc_intf_5150 = -{ - DEVCB_DEVICE_LINE_MEMBER(DEVICE_SELF_OWNER, ibm5150_mb_device, keyboard_clock_w), - DEVCB_DEVICE_LINE_MEMBER(DEVICE_SELF_OWNER, ibm5160_mb_device, keyboard_data_w) -}; - -static const pc_kbdc_interface pc_kbdc_intf_ec1841 = -{ - DEVCB_DEVICE_LINE_MEMBER(DEVICE_SELF_OWNER, ec1841_mb_device, keyboard_clock_w), - DEVCB_DEVICE_LINE_MEMBER(DEVICE_SELF_OWNER, ibm5160_mb_device, keyboard_data_w) -}; - /********************************************************** * * NMI handling @@ -478,7 +460,9 @@ static MACHINE_CONFIG_FRAGMENT( ibm5160_mb_config ) MCFG_ISA_OUT_DRQ2_CB(DEVWRITELINE("dma8237", am9517a_device, dreq2_w)) MCFG_ISA_OUT_DRQ3_CB(DEVWRITELINE("dma8237", am9517a_device, dreq3_w)) - MCFG_PC_KBDC_ADD("pc_kbdc", pc_kbdc_intf) + MCFG_DEVICE_ADD("pc_kbdc", PC_KBDC, 0) + MCFG_PC_KBDC_OUT_CLOCK_CB(WRITELINE(ibm5160_mb_device, keyboard_clock_w)) + MCFG_PC_KBDC_OUT_DATA_CB(WRITELINE(ibm5160_mb_device, keyboard_data_w)) /* sound hardware */ MCFG_SPEAKER_STANDARD_MONO("mono") @@ -653,8 +637,8 @@ static const cassette_interface ibm5150_cassette_interface = static MACHINE_CONFIG_FRAGMENT( ibm5150_mb_config ) MCFG_FRAGMENT_ADD(ibm5160_mb_config) - MCFG_DEVICE_REMOVE("pc_kbdc") - MCFG_PC_KBDC_ADD("pc_kbdc", pc_kbdc_intf_5150) + MCFG_DEVICE_MODIFY("pc_kbdc") + MCFG_PC_KBDC_OUT_CLOCK_CB(WRITELINE(ibm5150_mb_device, keyboard_clock_w)) MCFG_CASSETTE_ADD( "cassette", ibm5150_cassette_interface ) MACHINE_CONFIG_END @@ -836,8 +820,8 @@ const device_type EC1841_MOTHERBOARD = &device_creator; static MACHINE_CONFIG_FRAGMENT( ec1841_mb_config ) MCFG_FRAGMENT_ADD(ibm5160_mb_config) - MCFG_DEVICE_REMOVE("pc_kbdc") - MCFG_PC_KBDC_ADD("pc_kbdc", pc_kbdc_intf_ec1841) + MCFG_DEVICE_MODIFY("pc_kbdc") + MCFG_PC_KBDC_OUT_CLOCK_CB(WRITELINE(ec1841_mb_device, keyboard_clock_w)) MACHINE_CONFIG_END