at_keybc.c: converted to devcb2 (nw)

This commit is contained in:
Ivan Vangelista 2014-04-07 17:38:59 +00:00
parent 1e59725e47
commit 6e996a4c96
5 changed files with 71 additions and 101 deletions

View File

@ -33,16 +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 at_keyboard_controller_interface keyboard_controller_intf =
{
DEVCB_CPU_INPUT_LINE(":maincpu", INPUT_LINE_RESET),
DEVCB_CPU_INPUT_LINE(":maincpu", INPUT_LINE_A20),
DEVCB_DEVICE_LINE_MEMBER("pic8259_master", pic8259_device, ir1_w),
DEVCB_NULL,
DEVCB_DEVICE_LINE_MEMBER("pc_kbdc", pc_kbdc_device, clock_write_from_mb),
DEVCB_DEVICE_LINE_MEMBER("pc_kbdc", pc_kbdc_device, data_write_from_mb)
};
static const pc_kbdc_interface pc_kbdc_intf =
{
DEVCB_DEVICE_LINE_MEMBER("keybc", at_keyboard_controller_device, keyboard_clock_w),
@ -97,7 +87,12 @@ static MACHINE_CONFIG_FRAGMENT( southbridge )
MCFG_PIC8259_ADD( "pic8259_master", INPUTLINE(":maincpu", 0), VCC, READ8(southbridge_device, get_slave_ack) )
MCFG_PIC8259_ADD( "pic8259_slave", DEVWRITELINE("pic8259_master", pic8259_device, ir2_w), GND, NULL )
MCFG_AT_KEYBOARD_CONTROLLER_ADD("keybc", XTAL_12MHz, keyboard_controller_intf)
MCFG_DEVICE_ADD("keybc", AT_KEYBOARD_CONTROLLER, XTAL_12MHz)
MCFG_AT_KEYBOARD_CONTROLLER_SYSTEM_RESET_CB(INPUTLINE(":maincpu", INPUT_LINE_RESET))
MCFG_AT_KEYBOARD_CONTROLLER_GATE_A20_CB(INPUTLINE(":maincpu", INPUT_LINE_A20))
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_PC_KBDC_SLOT_ADD("pc_kbdc", "kbd", pc_at_keyboards, STR_KBD_MICROSOFT_NATURAL)

View File

@ -49,7 +49,13 @@ ROM_END
at_keyboard_controller_device::at_keyboard_controller_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
: device_t(mconfig, AT_KEYBOARD_CONTROLLER, "AT Keyboard Controller", tag, owner, clock, "at_keybc", __FILE__),
m_cpu(NULL)
m_cpu(NULL),
m_system_reset_cb(*this),
m_gate_a20_cb(*this),
m_input_buffer_full_cb(*this),
m_output_buffer_empty_cb(*this),
m_keyboard_clock_cb(*this),
m_keyboard_data_cb(*this)
{
}
@ -73,34 +79,6 @@ machine_config_constructor at_keyboard_controller_device::device_mconfig_additio
return MACHINE_CONFIG_NAME(at_keybc);
}
//-------------------------------------------------
// device_config_complete - perform any
// operations now that the configuration is
// complete
//-------------------------------------------------
void at_keyboard_controller_device::device_config_complete()
{
// inherit a copy of the static data
const at_keyboard_controller_interface *intf = reinterpret_cast<const at_keyboard_controller_interface *>(static_config());
if (intf != NULL)
{
*static_cast<at_keyboard_controller_interface *>(this) = *intf;
}
// or initialize to defaults if none provided
else
{
memset(&m_system_reset_cb, 0, sizeof(m_system_reset_cb));
memset(&m_gate_a20_cb, 0, sizeof(m_gate_a20_cb));
memset(&m_input_buffer_full_cb, 0, sizeof(m_input_buffer_full_cb));
memset(&m_output_buffer_empty_cb, 0, sizeof(m_output_buffer_empty_cb));
memset(&m_keyboard_clock_cb, 0, sizeof(m_keyboard_clock_cb));
memset(&m_keyboard_data_cb, 0, sizeof(m_keyboard_data_cb));
}
}
/*-------------------------------------------------
device_start - device-specific startup
-------------------------------------------------*/
@ -111,12 +89,12 @@ void at_keyboard_controller_device::device_start()
m_cpu = downcast<upi41_cpu_device *>(subdevice("at_keybc"));
// resolve callbacks
m_system_reset_func.resolve(m_system_reset_cb, *this);
m_gate_a20_func.resolve(m_gate_a20_cb, *this);
m_input_buffer_full_func.resolve(m_input_buffer_full_cb, *this);
m_output_buffer_empty_func.resolve(m_output_buffer_empty_cb, *this);
m_keyboard_clock_func.resolve(m_keyboard_clock_cb, *this);
m_keyboard_data_func.resolve(m_keyboard_data_cb, *this);
m_system_reset_cb.resolve_safe();
m_gate_a20_cb.resolve_safe();
m_input_buffer_full_cb.resolve_safe();
m_output_buffer_empty_cb.resolve_safe();
m_keyboard_clock_cb.resolve_safe();
m_keyboard_data_cb.resolve_safe();
// register for save states
save_item(NAME(m_clock_signal));
@ -180,16 +158,16 @@ READ8_MEMBER( at_keyboard_controller_device::p2_r )
*/
WRITE8_MEMBER( at_keyboard_controller_device::p2_w )
{
m_system_reset_func(BIT(data, 0) ? CLEAR_LINE : ASSERT_LINE);
m_gate_a20_func(BIT(data, 1) ? ASSERT_LINE : CLEAR_LINE);
m_input_buffer_full_func(BIT(data, 4) ? ASSERT_LINE : CLEAR_LINE);
m_output_buffer_empty_func(BIT(data, 5) ? ASSERT_LINE : CLEAR_LINE);
m_system_reset_cb(BIT(data, 0) ? CLEAR_LINE : ASSERT_LINE);
m_gate_a20_cb(BIT(data, 1) ? ASSERT_LINE : CLEAR_LINE);
m_input_buffer_full_cb(BIT(data, 4) ? ASSERT_LINE : CLEAR_LINE);
m_output_buffer_empty_cb(BIT(data, 5) ? ASSERT_LINE : CLEAR_LINE);
m_clock_signal = !BIT(data, 6);
m_data_signal = BIT(data, 7);
m_keyboard_data_func(m_data_signal);
m_keyboard_clock_func(m_clock_signal);
m_keyboard_data_cb(m_data_signal);
m_keyboard_clock_cb(m_clock_signal);
}

View File

@ -17,39 +17,43 @@
// INTERFACE CONFIGURATION MACROS
//**************************************************************************
#define MCFG_AT_KEYBOARD_CONTROLLER_ADD(_tag, _clock, _interface) \
MCFG_DEVICE_ADD(_tag, AT_KEYBOARD_CONTROLLER, _clock) \
MCFG_DEVICE_CONFIG(_interface)
#define MCFG_AT_KEYBOARD_CONTROLLER_SYSTEM_RESET_CB(_devcb) \
devcb = &at_keyboard_controller_device::set_system_reset_callback(*device, DEVCB2_##_devcb);
#define MCFG_AT_KEYBOARD_CONTROLLER_GATE_A20_CB(_devcb) \
devcb = &at_keyboard_controller_device::set_gate_a20_callback(*device, DEVCB2_##_devcb);
#define MCFG_AT_KEYBOARD_CONTROLLER_INPUT_BUFFER_FULL_CB(_devcb) \
devcb = &at_keyboard_controller_device::set_input_buffer_full_callback(*device, DEVCB2_##_devcb);
#define MCFG_AT_KEYBOARD_CONTROLLER_OUTPUT_BUFFER_EMPTY_CB(_devcb) \
devcb = &at_keyboard_controller_device::set_output_buffer_empty_callback(*device, DEVCB2_##_devcb);
#define MCFG_AT_KEYBOARD_CONTROLLER_KEYBOARD_CLOCK_CB(_devcb) \
devcb = &at_keyboard_controller_device::set_keyboard_clock_callback(*device, DEVCB2_##_devcb);
#define MCFG_AT_KEYBOARD_CONTROLLER_KEYBOARD_DATA_CB(_devcb) \
devcb = &at_keyboard_controller_device::set_keyboard_data_callback(*device, DEVCB2_##_devcb);
//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
// ======================> at_keyboard_controller_interface
struct at_keyboard_controller_interface
{
// interface to the host pc
devcb_write_line m_system_reset_cb;
devcb_write_line m_gate_a20_cb;
devcb_write_line m_input_buffer_full_cb;
devcb_write_line m_output_buffer_empty_cb;
// interface to the keyboard
devcb_write_line m_keyboard_clock_cb;
devcb_write_line m_keyboard_data_cb;
};
// ======================> at_keyboard_controller_device
class at_keyboard_controller_device : public device_t,
public at_keyboard_controller_interface
class at_keyboard_controller_device : public device_t
{
public:
// construction/destruction
at_keyboard_controller_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
template<class _Object> static devcb2_base &set_system_reset_callback(device_t &device, _Object object) { return downcast<at_keyboard_controller_device &>(device).m_system_reset_cb.set_callback(object); }
template<class _Object> static devcb2_base &set_gate_a20_callback(device_t &device, _Object object) { return downcast<at_keyboard_controller_device &>(device).m_gate_a20_cb.set_callback(object); }
template<class _Object> static devcb2_base &set_input_buffer_full_callback(device_t &device, _Object object) { return downcast<at_keyboard_controller_device &>(device).m_input_buffer_full_cb.set_callback(object); }
template<class _Object> static devcb2_base &set_output_buffer_empty_callback(device_t &device, _Object object) { return downcast<at_keyboard_controller_device &>(device).m_output_buffer_empty_cb.set_callback(object); }
template<class _Object> static devcb2_base &set_keyboard_clock_callback(device_t &device, _Object object) { return downcast<at_keyboard_controller_device &>(device).m_keyboard_clock_cb.set_callback(object); }
template<class _Object> static devcb2_base &set_keyboard_data_callback(device_t &device, _Object object) { return downcast<at_keyboard_controller_device &>(device).m_keyboard_data_cb.set_callback(object); }
// internal 8042 interface
DECLARE_READ8_MEMBER( t0_r );
DECLARE_READ8_MEMBER( t1_r );
@ -71,20 +75,23 @@ protected:
// device-level overrides
virtual void device_start();
virtual void device_reset();
virtual void device_config_complete();
virtual const rom_entry *device_rom_region() const;
virtual machine_config_constructor device_mconfig_additions() const;
private:
// internal state
upi41_cpu_device *m_cpu;
devcb_resolved_write_line m_system_reset_func;
devcb_resolved_write_line m_gate_a20_func;
devcb_resolved_write_line m_input_buffer_full_func;
devcb_resolved_write_line m_output_buffer_empty_func;
devcb_resolved_write_line m_keyboard_clock_func;
devcb_resolved_write_line m_keyboard_data_func;
// interface to the host pc
devcb2_write_line m_system_reset_cb;
devcb2_write_line m_gate_a20_cb;
devcb2_write_line m_input_buffer_full_cb;
devcb2_write_line m_output_buffer_empty_cb;
// interface to the keyboard
devcb2_write_line m_keyboard_clock_cb;
devcb2_write_line m_keyboard_data_cb;
UINT8 m_clock_signal;
UINT8 m_data_signal;

View File

@ -273,16 +273,6 @@ static INPUT_PORTS_START( atvga )
PORT_DIPSETTING( 0x01, DEF_STR( Yes ) )
INPUT_PORTS_END
static const at_keyboard_controller_interface keyboard_controller_intf =
{
DEVCB_CPU_INPUT_LINE("maincpu", INPUT_LINE_RESET),
DEVCB_CPU_INPUT_LINE("maincpu", INPUT_LINE_A20),
DEVCB_DEVICE_LINE_MEMBER("pic8259_master", pic8259_device, ir1_w),
DEVCB_NULL,
DEVCB_DEVICE_LINE_MEMBER("pc_kbdc", pc_kbdc_device, clock_write_from_mb),
DEVCB_DEVICE_LINE_MEMBER("pc_kbdc", pc_kbdc_device, data_write_from_mb)
};
static const pc_kbdc_interface pc_kbdc_intf =
{
DEVCB_DEVICE_LINE_MEMBER("keybc", at_keyboard_controller_device, keyboard_clock_w),
@ -349,7 +339,12 @@ static MACHINE_CONFIG_FRAGMENT( at_motherboard )
MCFG_PIC8259_ADD( "pic8259_master", INPUTLINE("maincpu", 0), VCC, READ8(at_state, get_slave_ack) )
MCFG_PIC8259_ADD( "pic8259_slave", DEVWRITELINE("pic8259_master", pic8259_device, ir2_w), GND, NULL )
MCFG_AT_KEYBOARD_CONTROLLER_ADD("keybc", XTAL_12MHz, keyboard_controller_intf)
MCFG_DEVICE_ADD("keybc", AT_KEYBOARD_CONTROLLER, XTAL_12MHz)
MCFG_AT_KEYBOARD_CONTROLLER_SYSTEM_RESET_CB(INPUTLINE("maincpu", INPUT_LINE_RESET))
MCFG_AT_KEYBOARD_CONTROLLER_GATE_A20_CB(INPUTLINE("maincpu", INPUT_LINE_A20))
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_MC146818_ADD( "rtc", XTAL_32_768kHz )

View File

@ -102,16 +102,6 @@ ADDRESS_MAP_END
// MACHINE DRIVERS
//**************************************************************************
static const at_keyboard_controller_interface keybc_intf =
{
DEVCB_DEVICE_LINE_MEMBER("cs4031", cs4031_device, kbrst_w),
DEVCB_DEVICE_LINE_MEMBER("cs4031", cs4031_device, gatea20_w),
DEVCB_DEVICE_LINE_MEMBER("cs4031", cs4031_device, irq01_w),
DEVCB_NULL,
DEVCB_DEVICE_LINE_MEMBER("pc_kbdc", pc_kbdc_device, clock_write_from_mb),
DEVCB_DEVICE_LINE_MEMBER("pc_kbdc", pc_kbdc_device, data_write_from_mb)
};
static const pc_kbdc_interface pc_kbdc_intf =
{
DEVCB_DEVICE_LINE_MEMBER("keybc", at_keyboard_controller_device, keyboard_clock_w),
@ -163,7 +153,12 @@ static MACHINE_CONFIG_START( ct486, ct486_state )
MCFG_RAM_DEFAULT_SIZE("4M")
MCFG_RAM_EXTRA_OPTIONS("1M,2M,8M,16M,32M,64M")
MCFG_AT_KEYBOARD_CONTROLLER_ADD("keybc", XTAL_12MHz, keybc_intf)
MCFG_DEVICE_ADD("keybc", AT_KEYBOARD_CONTROLLER, XTAL_12MHz)
MCFG_AT_KEYBOARD_CONTROLLER_SYSTEM_RESET_CB(DEVWRITELINE("cs4031", cs4031_device, kbrst_w))
MCFG_AT_KEYBOARD_CONTROLLER_GATE_A20_CB(DEVWRITELINE("cs4031", cs4031_device, gatea20_w))
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_PC_KBDC_SLOT_ADD("pc_kbdc", "kbd", pc_at_keyboards, STR_KBD_MICROSOFT_NATURAL)