trunk/src/emu/bus/pci/southbridge.c
| r29422 | r29423 | |
| 33 | 33 | { 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) } |
| 34 | 34 | }; |
| 35 | 35 | |
| 36 | | static const at_keyboard_controller_interface keyboard_controller_intf = |
| 37 | | { |
| 38 | | DEVCB_CPU_INPUT_LINE(":maincpu", INPUT_LINE_RESET), |
| 39 | | DEVCB_CPU_INPUT_LINE(":maincpu", INPUT_LINE_A20), |
| 40 | | DEVCB_DEVICE_LINE_MEMBER("pic8259_master", pic8259_device, ir1_w), |
| 41 | | DEVCB_NULL, |
| 42 | | DEVCB_DEVICE_LINE_MEMBER("pc_kbdc", pc_kbdc_device, clock_write_from_mb), |
| 43 | | DEVCB_DEVICE_LINE_MEMBER("pc_kbdc", pc_kbdc_device, data_write_from_mb) |
| 44 | | }; |
| 45 | | |
| 46 | 36 | static const pc_kbdc_interface pc_kbdc_intf = |
| 47 | 37 | { |
| 48 | 38 | DEVCB_DEVICE_LINE_MEMBER("keybc", at_keyboard_controller_device, keyboard_clock_w), |
| r29422 | r29423 | |
| 97 | 87 | MCFG_PIC8259_ADD( "pic8259_master", INPUTLINE(":maincpu", 0), VCC, READ8(southbridge_device, get_slave_ack) ) |
| 98 | 88 | MCFG_PIC8259_ADD( "pic8259_slave", DEVWRITELINE("pic8259_master", pic8259_device, ir2_w), GND, NULL ) |
| 99 | 89 | |
| 100 | | MCFG_AT_KEYBOARD_CONTROLLER_ADD("keybc", XTAL_12MHz, keyboard_controller_intf) |
| 90 | MCFG_DEVICE_ADD("keybc", AT_KEYBOARD_CONTROLLER, XTAL_12MHz) |
| 91 | MCFG_AT_KEYBOARD_CONTROLLER_SYSTEM_RESET_CB(INPUTLINE(":maincpu", INPUT_LINE_RESET)) |
| 92 | MCFG_AT_KEYBOARD_CONTROLLER_GATE_A20_CB(INPUTLINE(":maincpu", INPUT_LINE_A20)) |
| 93 | MCFG_AT_KEYBOARD_CONTROLLER_INPUT_BUFFER_FULL_CB(DEVWRITELINE("pic8259_master", pic8259_device, ir1_w)) |
| 94 | MCFG_AT_KEYBOARD_CONTROLLER_KEYBOARD_CLOCK_CB(DEVWRITELINE("pc_kbdc", pc_kbdc_device, clock_write_from_mb)) |
| 95 | MCFG_AT_KEYBOARD_CONTROLLER_KEYBOARD_DATA_CB(DEVWRITELINE("pc_kbdc", pc_kbdc_device, data_write_from_mb)) |
| 101 | 96 | MCFG_PC_KBDC_ADD("pc_kbdc", pc_kbdc_intf) |
| 102 | 97 | MCFG_PC_KBDC_SLOT_ADD("pc_kbdc", "kbd", pc_at_keyboards, STR_KBD_MICROSOFT_NATURAL) |
| 103 | 98 | |
trunk/src/emu/machine/at_keybc.c
| r29422 | r29423 | |
| 49 | 49 | |
| 50 | 50 | at_keyboard_controller_device::at_keyboard_controller_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) |
| 51 | 51 | : device_t(mconfig, AT_KEYBOARD_CONTROLLER, "AT Keyboard Controller", tag, owner, clock, "at_keybc", __FILE__), |
| 52 | | m_cpu(NULL) |
| 52 | m_cpu(NULL), |
| 53 | m_system_reset_cb(*this), |
| 54 | m_gate_a20_cb(*this), |
| 55 | m_input_buffer_full_cb(*this), |
| 56 | m_output_buffer_empty_cb(*this), |
| 57 | m_keyboard_clock_cb(*this), |
| 58 | m_keyboard_data_cb(*this) |
| 53 | 59 | { |
| 54 | 60 | } |
| 55 | 61 | |
| r29422 | r29423 | |
| 73 | 79 | return MACHINE_CONFIG_NAME(at_keybc); |
| 74 | 80 | } |
| 75 | 81 | |
| 76 | | //------------------------------------------------- |
| 77 | | // device_config_complete - perform any |
| 78 | | // operations now that the configuration is |
| 79 | | // complete |
| 80 | | //------------------------------------------------- |
| 81 | | |
| 82 | | void at_keyboard_controller_device::device_config_complete() |
| 83 | | { |
| 84 | | // inherit a copy of the static data |
| 85 | | const at_keyboard_controller_interface *intf = reinterpret_cast<const at_keyboard_controller_interface *>(static_config()); |
| 86 | | |
| 87 | | if (intf != NULL) |
| 88 | | { |
| 89 | | *static_cast<at_keyboard_controller_interface *>(this) = *intf; |
| 90 | | } |
| 91 | | |
| 92 | | // or initialize to defaults if none provided |
| 93 | | else |
| 94 | | { |
| 95 | | memset(&m_system_reset_cb, 0, sizeof(m_system_reset_cb)); |
| 96 | | memset(&m_gate_a20_cb, 0, sizeof(m_gate_a20_cb)); |
| 97 | | memset(&m_input_buffer_full_cb, 0, sizeof(m_input_buffer_full_cb)); |
| 98 | | memset(&m_output_buffer_empty_cb, 0, sizeof(m_output_buffer_empty_cb)); |
| 99 | | memset(&m_keyboard_clock_cb, 0, sizeof(m_keyboard_clock_cb)); |
| 100 | | memset(&m_keyboard_data_cb, 0, sizeof(m_keyboard_data_cb)); |
| 101 | | } |
| 102 | | } |
| 103 | | |
| 104 | 82 | /*------------------------------------------------- |
| 105 | 83 | device_start - device-specific startup |
| 106 | 84 | -------------------------------------------------*/ |
| r29422 | r29423 | |
| 111 | 89 | m_cpu = downcast<upi41_cpu_device *>(subdevice("at_keybc")); |
| 112 | 90 | |
| 113 | 91 | // resolve callbacks |
| 114 | | m_system_reset_func.resolve(m_system_reset_cb, *this); |
| 115 | | m_gate_a20_func.resolve(m_gate_a20_cb, *this); |
| 116 | | m_input_buffer_full_func.resolve(m_input_buffer_full_cb, *this); |
| 117 | | m_output_buffer_empty_func.resolve(m_output_buffer_empty_cb, *this); |
| 118 | | m_keyboard_clock_func.resolve(m_keyboard_clock_cb, *this); |
| 119 | | m_keyboard_data_func.resolve(m_keyboard_data_cb, *this); |
| 92 | m_system_reset_cb.resolve_safe(); |
| 93 | m_gate_a20_cb.resolve_safe(); |
| 94 | m_input_buffer_full_cb.resolve_safe(); |
| 95 | m_output_buffer_empty_cb.resolve_safe(); |
| 96 | m_keyboard_clock_cb.resolve_safe(); |
| 97 | m_keyboard_data_cb.resolve_safe(); |
| 120 | 98 | |
| 121 | 99 | // register for save states |
| 122 | 100 | save_item(NAME(m_clock_signal)); |
| r29422 | r29423 | |
| 180 | 158 | */ |
| 181 | 159 | WRITE8_MEMBER( at_keyboard_controller_device::p2_w ) |
| 182 | 160 | { |
| 183 | | m_system_reset_func(BIT(data, 0) ? CLEAR_LINE : ASSERT_LINE); |
| 184 | | m_gate_a20_func(BIT(data, 1) ? ASSERT_LINE : CLEAR_LINE); |
| 185 | | m_input_buffer_full_func(BIT(data, 4) ? ASSERT_LINE : CLEAR_LINE); |
| 186 | | m_output_buffer_empty_func(BIT(data, 5) ? ASSERT_LINE : CLEAR_LINE); |
| 161 | m_system_reset_cb(BIT(data, 0) ? CLEAR_LINE : ASSERT_LINE); |
| 162 | m_gate_a20_cb(BIT(data, 1) ? ASSERT_LINE : CLEAR_LINE); |
| 163 | m_input_buffer_full_cb(BIT(data, 4) ? ASSERT_LINE : CLEAR_LINE); |
| 164 | m_output_buffer_empty_cb(BIT(data, 5) ? ASSERT_LINE : CLEAR_LINE); |
| 187 | 165 | |
| 188 | 166 | m_clock_signal = !BIT(data, 6); |
| 189 | 167 | m_data_signal = BIT(data, 7); |
| 190 | 168 | |
| 191 | | m_keyboard_data_func(m_data_signal); |
| 192 | | m_keyboard_clock_func(m_clock_signal); |
| 169 | m_keyboard_data_cb(m_data_signal); |
| 170 | m_keyboard_clock_cb(m_clock_signal); |
| 193 | 171 | } |
| 194 | 172 | |
| 195 | 173 | |
trunk/src/emu/machine/at_keybc.h
| r29422 | r29423 | |
| 17 | 17 | // INTERFACE CONFIGURATION MACROS |
| 18 | 18 | //************************************************************************** |
| 19 | 19 | |
| 20 | | #define MCFG_AT_KEYBOARD_CONTROLLER_ADD(_tag, _clock, _interface) \ |
| 21 | | MCFG_DEVICE_ADD(_tag, AT_KEYBOARD_CONTROLLER, _clock) \ |
| 22 | | MCFG_DEVICE_CONFIG(_interface) |
| 20 | #define MCFG_AT_KEYBOARD_CONTROLLER_SYSTEM_RESET_CB(_devcb) \ |
| 21 | devcb = &at_keyboard_controller_device::set_system_reset_callback(*device, DEVCB2_##_devcb); |
| 23 | 22 | |
| 23 | #define MCFG_AT_KEYBOARD_CONTROLLER_GATE_A20_CB(_devcb) \ |
| 24 | devcb = &at_keyboard_controller_device::set_gate_a20_callback(*device, DEVCB2_##_devcb); |
| 24 | 25 | |
| 26 | #define MCFG_AT_KEYBOARD_CONTROLLER_INPUT_BUFFER_FULL_CB(_devcb) \ |
| 27 | devcb = &at_keyboard_controller_device::set_input_buffer_full_callback(*device, DEVCB2_##_devcb); |
| 28 | |
| 29 | #define MCFG_AT_KEYBOARD_CONTROLLER_OUTPUT_BUFFER_EMPTY_CB(_devcb) \ |
| 30 | devcb = &at_keyboard_controller_device::set_output_buffer_empty_callback(*device, DEVCB2_##_devcb); |
| 31 | |
| 32 | #define MCFG_AT_KEYBOARD_CONTROLLER_KEYBOARD_CLOCK_CB(_devcb) \ |
| 33 | devcb = &at_keyboard_controller_device::set_keyboard_clock_callback(*device, DEVCB2_##_devcb); |
| 34 | |
| 35 | #define MCFG_AT_KEYBOARD_CONTROLLER_KEYBOARD_DATA_CB(_devcb) \ |
| 36 | devcb = &at_keyboard_controller_device::set_keyboard_data_callback(*device, DEVCB2_##_devcb); |
| 37 | |
| 25 | 38 | //************************************************************************** |
| 26 | 39 | // TYPE DEFINITIONS |
| 27 | 40 | //************************************************************************** |
| 28 | 41 | |
| 29 | | // ======================> at_keyboard_controller_interface |
| 30 | | |
| 31 | | struct at_keyboard_controller_interface |
| 32 | | { |
| 33 | | // interface to the host pc |
| 34 | | devcb_write_line m_system_reset_cb; |
| 35 | | devcb_write_line m_gate_a20_cb; |
| 36 | | devcb_write_line m_input_buffer_full_cb; |
| 37 | | devcb_write_line m_output_buffer_empty_cb; |
| 38 | | |
| 39 | | // interface to the keyboard |
| 40 | | devcb_write_line m_keyboard_clock_cb; |
| 41 | | devcb_write_line m_keyboard_data_cb; |
| 42 | | }; |
| 43 | | |
| 44 | 42 | // ======================> at_keyboard_controller_device |
| 45 | 43 | |
| 46 | | class at_keyboard_controller_device : public device_t, |
| 47 | | public at_keyboard_controller_interface |
| 44 | class at_keyboard_controller_device : public device_t |
| 48 | 45 | { |
| 49 | 46 | public: |
| 50 | 47 | // construction/destruction |
| 51 | 48 | at_keyboard_controller_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); |
| 52 | 49 | |
| 50 | 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); } |
| 51 | 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); } |
| 52 | 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); } |
| 53 | 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); } |
| 54 | 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); } |
| 55 | 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); } |
| 56 | |
| 53 | 57 | // internal 8042 interface |
| 54 | 58 | DECLARE_READ8_MEMBER( t0_r ); |
| 55 | 59 | DECLARE_READ8_MEMBER( t1_r ); |
| r29422 | r29423 | |
| 71 | 75 | // device-level overrides |
| 72 | 76 | virtual void device_start(); |
| 73 | 77 | virtual void device_reset(); |
| 74 | | virtual void device_config_complete(); |
| 75 | 78 | |
| 76 | 79 | virtual const rom_entry *device_rom_region() const; |
| 77 | 80 | virtual machine_config_constructor device_mconfig_additions() const; |
| 81 | |
| 78 | 82 | private: |
| 79 | 83 | // internal state |
| 80 | 84 | upi41_cpu_device *m_cpu; |
| 81 | 85 | |
| 82 | | devcb_resolved_write_line m_system_reset_func; |
| 83 | | devcb_resolved_write_line m_gate_a20_func; |
| 84 | | devcb_resolved_write_line m_input_buffer_full_func; |
| 85 | | devcb_resolved_write_line m_output_buffer_empty_func; |
| 86 | | devcb_resolved_write_line m_keyboard_clock_func; |
| 87 | | devcb_resolved_write_line m_keyboard_data_func; |
| 86 | // interface to the host pc |
| 87 | devcb2_write_line m_system_reset_cb; |
| 88 | devcb2_write_line m_gate_a20_cb; |
| 89 | devcb2_write_line m_input_buffer_full_cb; |
| 90 | devcb2_write_line m_output_buffer_empty_cb; |
| 88 | 91 | |
| 92 | // interface to the keyboard |
| 93 | devcb2_write_line m_keyboard_clock_cb; |
| 94 | devcb2_write_line m_keyboard_data_cb; |
| 95 | |
| 89 | 96 | UINT8 m_clock_signal; |
| 90 | 97 | UINT8 m_data_signal; |
| 91 | 98 | }; |
trunk/src/mess/drivers/ct486.c
| r29422 | r29423 | |
| 102 | 102 | // MACHINE DRIVERS |
| 103 | 103 | //************************************************************************** |
| 104 | 104 | |
| 105 | | static const at_keyboard_controller_interface keybc_intf = |
| 106 | | { |
| 107 | | DEVCB_DEVICE_LINE_MEMBER("cs4031", cs4031_device, kbrst_w), |
| 108 | | DEVCB_DEVICE_LINE_MEMBER("cs4031", cs4031_device, gatea20_w), |
| 109 | | DEVCB_DEVICE_LINE_MEMBER("cs4031", cs4031_device, irq01_w), |
| 110 | | DEVCB_NULL, |
| 111 | | DEVCB_DEVICE_LINE_MEMBER("pc_kbdc", pc_kbdc_device, clock_write_from_mb), |
| 112 | | DEVCB_DEVICE_LINE_MEMBER("pc_kbdc", pc_kbdc_device, data_write_from_mb) |
| 113 | | }; |
| 114 | | |
| 115 | 105 | static const pc_kbdc_interface pc_kbdc_intf = |
| 116 | 106 | { |
| 117 | 107 | DEVCB_DEVICE_LINE_MEMBER("keybc", at_keyboard_controller_device, keyboard_clock_w), |
| r29422 | r29423 | |
| 163 | 153 | MCFG_RAM_DEFAULT_SIZE("4M") |
| 164 | 154 | MCFG_RAM_EXTRA_OPTIONS("1M,2M,8M,16M,32M,64M") |
| 165 | 155 | |
| 166 | | MCFG_AT_KEYBOARD_CONTROLLER_ADD("keybc", XTAL_12MHz, keybc_intf) |
| 156 | MCFG_DEVICE_ADD("keybc", AT_KEYBOARD_CONTROLLER, XTAL_12MHz) |
| 157 | MCFG_AT_KEYBOARD_CONTROLLER_SYSTEM_RESET_CB(DEVWRITELINE("cs4031", cs4031_device, kbrst_w)) |
| 158 | MCFG_AT_KEYBOARD_CONTROLLER_GATE_A20_CB(DEVWRITELINE("cs4031", cs4031_device, gatea20_w)) |
| 159 | MCFG_AT_KEYBOARD_CONTROLLER_INPUT_BUFFER_FULL_CB(DEVWRITELINE("cs4031", cs4031_device, irq01_w)) |
| 160 | MCFG_AT_KEYBOARD_CONTROLLER_KEYBOARD_CLOCK_CB(DEVWRITELINE("pc_kbdc", pc_kbdc_device, clock_write_from_mb)) |
| 161 | MCFG_AT_KEYBOARD_CONTROLLER_KEYBOARD_DATA_CB(DEVWRITELINE("pc_kbdc", pc_kbdc_device, data_write_from_mb)) |
| 167 | 162 | MCFG_PC_KBDC_ADD("pc_kbdc", pc_kbdc_intf) |
| 168 | 163 | MCFG_PC_KBDC_SLOT_ADD("pc_kbdc", "kbd", pc_at_keyboards, STR_KBD_MICROSOFT_NATURAL) |
| 169 | 164 | |
trunk/src/mess/drivers/at.c
| r29422 | r29423 | |
| 273 | 273 | PORT_DIPSETTING( 0x01, DEF_STR( Yes ) ) |
| 274 | 274 | INPUT_PORTS_END |
| 275 | 275 | |
| 276 | | static const at_keyboard_controller_interface keyboard_controller_intf = |
| 277 | | { |
| 278 | | DEVCB_CPU_INPUT_LINE("maincpu", INPUT_LINE_RESET), |
| 279 | | DEVCB_CPU_INPUT_LINE("maincpu", INPUT_LINE_A20), |
| 280 | | DEVCB_DEVICE_LINE_MEMBER("pic8259_master", pic8259_device, ir1_w), |
| 281 | | DEVCB_NULL, |
| 282 | | DEVCB_DEVICE_LINE_MEMBER("pc_kbdc", pc_kbdc_device, clock_write_from_mb), |
| 283 | | DEVCB_DEVICE_LINE_MEMBER("pc_kbdc", pc_kbdc_device, data_write_from_mb) |
| 284 | | }; |
| 285 | | |
| 286 | 276 | static const pc_kbdc_interface pc_kbdc_intf = |
| 287 | 277 | { |
| 288 | 278 | DEVCB_DEVICE_LINE_MEMBER("keybc", at_keyboard_controller_device, keyboard_clock_w), |
| r29422 | r29423 | |
| 349 | 339 | MCFG_PIC8259_ADD( "pic8259_master", INPUTLINE("maincpu", 0), VCC, READ8(at_state, get_slave_ack) ) |
| 350 | 340 | MCFG_PIC8259_ADD( "pic8259_slave", DEVWRITELINE("pic8259_master", pic8259_device, ir2_w), GND, NULL ) |
| 351 | 341 | |
| 352 | | MCFG_AT_KEYBOARD_CONTROLLER_ADD("keybc", XTAL_12MHz, keyboard_controller_intf) |
| 342 | MCFG_DEVICE_ADD("keybc", AT_KEYBOARD_CONTROLLER, XTAL_12MHz) |
| 343 | MCFG_AT_KEYBOARD_CONTROLLER_SYSTEM_RESET_CB(INPUTLINE("maincpu", INPUT_LINE_RESET)) |
| 344 | MCFG_AT_KEYBOARD_CONTROLLER_GATE_A20_CB(INPUTLINE("maincpu", INPUT_LINE_A20)) |
| 345 | MCFG_AT_KEYBOARD_CONTROLLER_INPUT_BUFFER_FULL_CB(DEVWRITELINE("pic8259_master", pic8259_device, ir1_w)) |
| 346 | MCFG_AT_KEYBOARD_CONTROLLER_KEYBOARD_CLOCK_CB(DEVWRITELINE("pc_kbdc", pc_kbdc_device, clock_write_from_mb)) |
| 347 | MCFG_AT_KEYBOARD_CONTROLLER_KEYBOARD_DATA_CB(DEVWRITELINE("pc_kbdc", pc_kbdc_device, data_write_from_mb)) |
| 353 | 348 | MCFG_PC_KBDC_ADD("pc_kbdc", pc_kbdc_intf) |
| 354 | 349 | |
| 355 | 350 | MCFG_MC146818_ADD( "rtc", XTAL_32_768kHz ) |