trunk/src/emu/machine/8042kbdc.c
| r29537 | r29538 | |
| 197 | 197 | kbdc8042_device::kbdc8042_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) |
| 198 | 198 | : device_t(mconfig, KBDC8042, "Keyboard Controller 8042", tag, owner, clock, "kbdc8042", __FILE__) |
| 199 | 199 | , m_keyboard_dev(*this, "at_keyboard") |
| 200 | , m_system_reset_cb(*this) |
| 201 | , m_gate_a20_cb(*this) |
| 202 | , m_input_buffer_full_cb(*this) |
| 203 | , m_output_buffer_empty_cb(*this) |
| 204 | , m_speaker_cb(*this) |
| 200 | 205 | { |
| 201 | 206 | } |
| 202 | 207 | |
| r29537 | r29538 | |
| 209 | 214 | return MACHINE_CONFIG_NAME( keyboard ); |
| 210 | 215 | } |
| 211 | 216 | |
| 212 | | //------------------------------------------------- |
| 213 | | // device_config_complete - perform any |
| 214 | | // operations now that the configuration is |
| 215 | | // complete |
| 216 | | //------------------------------------------------- |
| 217 | | |
| 218 | | void kbdc8042_device::device_config_complete() |
| 219 | | { |
| 220 | | // inherit a copy of the static data |
| 221 | | const kbdc8042_interface *intf = reinterpret_cast<const kbdc8042_interface *>(static_config()); |
| 222 | | |
| 223 | | if (intf != NULL) |
| 224 | | { |
| 225 | | *static_cast<kbdc8042_interface *>(this) = *intf; |
| 226 | | } |
| 227 | | |
| 228 | | // or initialize to defaults if none provided |
| 229 | | else |
| 230 | | { |
| 231 | | memset(&m_system_reset_cb, 0, sizeof(m_system_reset_cb)); |
| 232 | | memset(&m_gate_a20_cb, 0, sizeof(m_gate_a20_cb)); |
| 233 | | memset(&m_input_buffer_full_func, 0, sizeof(m_input_buffer_full_func)); |
| 234 | | memset(&m_output_buffer_empty_cb, 0, sizeof(m_output_buffer_empty_cb)); |
| 235 | | memset(&m_speaker_cb, 0, sizeof(m_speaker_cb)); |
| 236 | | } |
| 237 | | } |
| 238 | | |
| 239 | 217 | /*------------------------------------------------- |
| 240 | 218 | device_start - device-specific startup |
| 241 | 219 | -------------------------------------------------*/ |
| r29537 | r29538 | |
| 243 | 221 | void kbdc8042_device::device_start() |
| 244 | 222 | { |
| 245 | 223 | // resolve callbacks |
| 246 | | m_system_reset_func.resolve(m_system_reset_cb, *this); |
| 247 | | m_gate_a20_func.resolve(m_gate_a20_cb, *this); |
| 248 | | m_input_buffer_full_func.resolve(m_input_buffer_full_cb, *this); |
| 249 | | m_output_buffer_empty_func.resolve(m_output_buffer_empty_cb, *this); |
| 250 | | m_speaker_func.resolve(m_speaker_cb, *this); |
| 224 | m_system_reset_cb.resolve_safe(); |
| 225 | m_gate_a20_cb.resolve(); |
| 226 | m_input_buffer_full_cb.resolve(); |
| 227 | m_output_buffer_empty_cb.resolve_safe(); |
| 228 | m_speaker_cb.resolve(); |
| 251 | 229 | m_operation_write_state = 0; /* first write to 0x60 might occur before anything can set this */ |
| 252 | 230 | } |
| 253 | 231 | |
| r29537 | r29538 | |
| 271 | 249 | m_outport = data; |
| 272 | 250 | if (change & 0x02) |
| 273 | 251 | { |
| 274 | | if (!m_gate_a20_func.isnull()) |
| 275 | | m_gate_a20_func(data & 0x02 ? 1 : 0); |
| 252 | if (!m_gate_a20_cb.isnull()) |
| 253 | m_gate_a20_cb(data & 0x02 ? 1 : 0); |
| 276 | 254 | } |
| 277 | 255 | } |
| 278 | 256 | |
| r29537 | r29538 | |
| 286 | 264 | { |
| 287 | 265 | /* Lets 8952's timers do their job before clear the interrupt line, */ |
| 288 | 266 | /* else Keyboard interrupt never happens. */ |
| 289 | | m_input_buffer_full_func(0); |
| 267 | m_input_buffer_full_cb(0); |
| 290 | 268 | } |
| 291 | 269 | |
| 292 | 270 | void kbdc8042_device::at_8042_receive(UINT8 data) |
| r29537 | r29538 | |
| 297 | 275 | m_data = data; |
| 298 | 276 | m_keyboard.received = 1; |
| 299 | 277 | |
| 300 | | if (!m_input_buffer_full_func.isnull()) |
| 278 | if (!m_input_buffer_full_cb.isnull()) |
| 301 | 279 | { |
| 302 | | m_input_buffer_full_func(1); |
| 280 | m_input_buffer_full_cb(1); |
| 303 | 281 | /* Lets 8952's timers do their job before clear the interrupt line, */ |
| 304 | 282 | /* else Keyboard interrupt never happens. */ |
| 305 | 283 | machine().scheduler().timer_set(attotime::from_usec(2), timer_expired_delegate(FUNC(kbdc8042_device::kbdc8042_clr_int),this)); |
| r29537 | r29538 | |
| 515 | 493 | |
| 516 | 494 | case 1: |
| 517 | 495 | m_speaker = data; |
| 518 | | if (!m_speaker_func.isnull()) |
| 519 | | m_speaker_func(0, m_speaker); |
| 496 | if (!m_speaker_cb.isnull()) |
| 497 | m_speaker_cb((offs_t)0, m_speaker); |
| 520 | 498 | |
| 521 | 499 | break; |
| 522 | 500 | |
| r29537 | r29538 | |
| 617 | 595 | * the bits low set in the command byte. The only pulse that has |
| 618 | 596 | * an effect currently is bit 0, which pulses the CPU's reset line |
| 619 | 597 | */ |
| 620 | | m_system_reset_func(PULSE_LINE); |
| 598 | m_system_reset_cb(PULSE_LINE); |
| 621 | 599 | at_8042_set_outport(m_outport | 0x02, 0); |
| 622 | 600 | break; |
| 623 | 601 | } |
trunk/src/emu/machine/8042kbdc.h
| r29537 | r29538 | |
| 24 | 24 | // INTERFACE CONFIGURATION MACROS |
| 25 | 25 | //************************************************************************** |
| 26 | 26 | |
| 27 | | #define MCFG_KBDC8042_ADD(_tag, _interface) \ |
| 28 | | MCFG_DEVICE_ADD(_tag, KBDC8042, 0) \ |
| 29 | | MCFG_DEVICE_CONFIG(_interface) |
| 27 | #define MCFG_KBDC8042_KEYBOARD_TYPE(_kbdt) \ |
| 28 | kbdc8042_device::set_keyboard_type(*device, _kbdt); |
| 30 | 29 | |
| 30 | #define MCFG_KBDC8042_SYSTEM_RESET_CB(_devcb) \ |
| 31 | devcb = &kbdc8042_device::set_system_reset_callback(*device, DEVCB2_##_devcb); |
| 31 | 32 | |
| 33 | #define MCFG_KBDC8042_GATE_A20_CB(_devcb) \ |
| 34 | devcb = &kbdc8042_device::set_gate_a20_callback(*device, DEVCB2_##_devcb); |
| 35 | |
| 36 | #define MCFG_KBDC8042_INPUT_BUFFER_FULL_CB(_devcb) \ |
| 37 | devcb = &kbdc8042_device::set_input_buffer_full_callback(*device, DEVCB2_##_devcb); |
| 38 | |
| 39 | #define MCFG_KBDC8042_OUTPUT_BUFFER_EMPTY_CB(_devcb) \ |
| 40 | devcb = &kbdc8042_device::set_output_buffer_empty_callback(*device, DEVCB2_##_devcb); |
| 41 | |
| 42 | #define MCFG_KBDC8042_SPEAKER_CB(_devcb) \ |
| 43 | devcb = &kbdc8042_device::set_speaker_callback(*device, DEVCB2_##_devcb); |
| 44 | |
| 32 | 45 | //************************************************************************** |
| 33 | 46 | // TYPE DEFINITIONS |
| 34 | 47 | //************************************************************************** |
| 35 | 48 | |
| 36 | | // ======================> kbdc8042_interface |
| 37 | | |
| 38 | | struct kbdc8042_interface |
| 39 | | { |
| 40 | | kbdc8042_type_t m_keybtype; |
| 41 | | // interface to the host pc |
| 42 | | devcb_write_line m_system_reset_cb; |
| 43 | | devcb_write_line m_gate_a20_cb; |
| 44 | | devcb_write_line m_input_buffer_full_cb; |
| 45 | | devcb_write_line m_output_buffer_empty_cb; |
| 46 | | |
| 47 | | devcb_write8 m_speaker_cb; |
| 48 | | }; |
| 49 | | |
| 50 | 49 | // ======================> kbdc8042_device |
| 51 | 50 | |
| 52 | | class kbdc8042_device : public device_t, |
| 53 | | public kbdc8042_interface |
| 51 | class kbdc8042_device : public device_t |
| 54 | 52 | { |
| 55 | 53 | public: |
| 56 | 54 | // construction/destruction |
| 57 | 55 | kbdc8042_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); |
| 58 | 56 | |
| 59 | 57 | virtual machine_config_constructor device_mconfig_additions() const; |
| 58 | |
| 59 | static void set_keyboard_type(device_t &device, kbdc8042_type_t keybtype) { downcast<kbdc8042_device &>(device).m_keybtype = keybtype; } |
| 60 | template<class _Object> static devcb2_base &set_system_reset_callback(device_t &device, _Object object) { return downcast<kbdc8042_device &>(device).m_system_reset_cb.set_callback(object); } |
| 61 | template<class _Object> static devcb2_base &set_gate_a20_callback(device_t &device, _Object object) { return downcast<kbdc8042_device &>(device).m_gate_a20_cb.set_callback(object); } |
| 62 | template<class _Object> static devcb2_base &set_input_buffer_full_callback(device_t &device, _Object object) { return downcast<kbdc8042_device &>(device).m_input_buffer_full_cb.set_callback(object); } |
| 63 | template<class _Object> static devcb2_base &set_output_buffer_empty_callback(device_t &device, _Object object) { return downcast<kbdc8042_device &>(device).m_output_buffer_empty_cb.set_callback(object); } |
| 64 | template<class _Object> static devcb2_base &set_speaker_callback(device_t &device, _Object object) { return downcast<kbdc8042_device &>(device).m_speaker_cb.set_callback(object); } |
| 60 | 65 | |
| 61 | 66 | DECLARE_READ8_MEMBER( data_r ); |
| 62 | 67 | DECLARE_WRITE8_MEMBER( data_w ); |
| r29537 | r29538 | |
| 74 | 79 | // device-level overrides |
| 75 | 80 | virtual void device_start(); |
| 76 | 81 | virtual void device_reset(); |
| 77 | | virtual void device_config_complete(); |
| 78 | 82 | |
| 79 | 83 | UINT8 m_inport, m_outport, m_data, m_command; |
| 80 | 84 | |
| r29537 | r29538 | |
| 104 | 108 | |
| 105 | 109 | required_device<at_keyboard_device> m_keyboard_dev; |
| 106 | 110 | |
| 107 | | devcb_resolved_write_line m_system_reset_func; |
| 108 | | devcb_resolved_write_line m_gate_a20_func; |
| 109 | | devcb_resolved_write_line m_input_buffer_full_func; |
| 110 | | devcb_resolved_write_line m_output_buffer_empty_func; |
| 111 | kbdc8042_type_t m_keybtype; |
| 112 | |
| 113 | devcb2_write_line m_system_reset_cb; |
| 114 | devcb2_write_line m_gate_a20_cb; |
| 115 | devcb2_write_line m_input_buffer_full_cb; |
| 116 | devcb2_write_line m_output_buffer_empty_cb; |
| 111 | 117 | |
| 112 | | devcb_resolved_write8 m_speaker_func; |
| 118 | devcb2_write8 m_speaker_cb; |
| 113 | 119 | }; |
| 114 | 120 | |
| 115 | 121 | // device type definition |
trunk/src/mess/drivers/ip22.c
| r29537 | r29538 | |
| 1488 | 1488 | machine().device<nvram_device>("nvram")->set_base(m_RTC.nRAM, 0x200); |
| 1489 | 1489 | } |
| 1490 | 1490 | |
| 1491 | | static const struct kbdc8042_interface at8042 = |
| 1492 | | { |
| 1493 | | KBDC8042_STANDARD, |
| 1494 | | DEVCB_CPU_INPUT_LINE("maincpu", INPUT_LINE_RESET), |
| 1495 | | DEVCB_NULL, |
| 1496 | | DEVCB_NULL, |
| 1497 | | DEVCB_NULL, |
| 1498 | | |
| 1499 | | DEVCB_NULL |
| 1500 | | }; |
| 1501 | | |
| 1502 | 1491 | DRIVER_INIT_MEMBER(ip22_state,ip225015) |
| 1503 | 1492 | { |
| 1504 | 1493 | // IP22 uses 2 pieces of PC-compatible hardware: the 8042 PS/2 keyboard/mouse |
| r29537 | r29538 | |
| 1643 | 1632 | MCFG_SOUND_ROUTE(ALL_OUTPUTS, "^^^lspeaker", 1.0) |
| 1644 | 1633 | MCFG_SOUND_ROUTE(ALL_OUTPUTS, "^^^rspeaker", 1.0) |
| 1645 | 1634 | |
| 1646 | | MCFG_KBDC8042_ADD("kbdc", at8042) |
| 1635 | MCFG_DEVICE_ADD("kbdc", KBDC8042, 0) |
| 1636 | MCFG_KBDC8042_KEYBOARD_TYPE(KBDC8042_STANDARD) |
| 1637 | MCFG_KBDC8042_SYSTEM_RESET_CB(INPUTLINE("maincpu", INPUT_LINE_RESET)) |
| 1647 | 1638 | MACHINE_CONFIG_END |
| 1648 | 1639 | |
| 1649 | 1640 | static MACHINE_CONFIG_DERIVED( ip224613, ip225015 ) |
trunk/src/mess/drivers/bebox.c
| r29537 | r29538 | |
| 21 | 21 | #include "bus/pci/pci.h" |
| 22 | 22 | #include "machine/am9517a.h" |
| 23 | 23 | #include "machine/pckeybrd.h" |
| 24 | | #include "machine/8042kbdc.h" |
| 25 | 24 | #include "machine/idectrl.h" |
| 26 | 25 | #include "bus/pci/mpc105.h" |
| 27 | 26 | #include "machine/intelfsh.h" |
| r29537 | r29538 | |
| 155 | 154 | m_pic8259_1->ir1_w(state); |
| 156 | 155 | } |
| 157 | 156 | |
| 158 | | static const struct kbdc8042_interface bebox_8042_interface = |
| 159 | | { |
| 160 | | KBDC8042_STANDARD, |
| 161 | | DEVCB_CPU_INPUT_LINE("ppc1", INPUT_LINE_RESET), |
| 162 | | DEVCB_NULL, |
| 163 | | DEVCB_DRIVER_LINE_MEMBER(bebox_state,bebox_keyboard_interrupt), |
| 164 | | DEVCB_NULL, |
| 165 | | |
| 166 | | DEVCB_NULL |
| 167 | | }; |
| 168 | | |
| 169 | 157 | static SLOT_INTERFACE_START( pci_devices ) |
| 170 | 158 | SLOT_INTERFACE_INTERNAL("mpc105", MPC105) |
| 171 | 159 | SLOT_INTERFACE("cirrus", CIRRUS) |
| r29537 | r29538 | |
| 235 | 223 | |
| 236 | 224 | MCFG_MC146818_ADD( "rtc", XTAL_32_768kHz ) |
| 237 | 225 | |
| 238 | | MCFG_KBDC8042_ADD("kbdc", bebox_8042_interface) |
| 226 | MCFG_DEVICE_ADD("kbdc", KBDC8042, 0) |
| 227 | MCFG_KBDC8042_KEYBOARD_TYPE(KBDC8042_STANDARD) |
| 228 | MCFG_KBDC8042_SYSTEM_RESET_CB(INPUTLINE("ppc1", INPUT_LINE_RESET)) |
| 229 | MCFG_KBDC8042_INPUT_BUFFER_FULL_CB(WRITELINE(bebox_state, bebox_keyboard_interrupt)) |
| 230 | |
| 239 | 231 | /* internal ram */ |
| 240 | 232 | MCFG_RAM_ADD(RAM_TAG) |
| 241 | 233 | MCFG_RAM_DEFAULT_SIZE("32M") |
trunk/src/mame/machine/pcshare.c
| r29537 | r29538 | |
| 164 | 164 | m_kbdc->write_out2(state); |
| 165 | 165 | } |
| 166 | 166 | |
| 167 | | /************************************************************* |
| 168 | | * |
| 169 | | * Keyboard |
| 170 | | * |
| 171 | | *************************************************************/ |
| 172 | 167 | |
| 173 | | static const struct kbdc8042_interface at8042 = |
| 174 | | { |
| 175 | | KBDC8042_AT386, |
| 176 | | DEVCB_CPU_INPUT_LINE("maincpu", INPUT_LINE_RESET), |
| 177 | | DEVCB_CPU_INPUT_LINE("maincpu", INPUT_LINE_A20), |
| 178 | | DEVCB_DEVICE_LINE_MEMBER("pic8259_1", pic8259_device, ir1_w), |
| 179 | | DEVCB_NULL, |
| 180 | | |
| 181 | | DEVCB_NULL |
| 182 | | }; |
| 183 | | |
| 184 | | ADDRESS_MAP_START( pcat32_io_common, AS_IO, 32, pcat_base_state ) |
| 168 | ADDRESS_MAP_START( pcat32_io_common, AS_IO, 32, pcat_base_state ) |
| 185 | 169 | AM_RANGE(0x0000, 0x001f) AM_DEVREADWRITE8("dma8237_1", am9517a_device, read, write, 0xffffffff) |
| 186 | 170 | AM_RANGE(0x0020, 0x003f) AM_DEVREADWRITE8("pic8259_1", pic8259_device, read, write, 0xffffffff) |
| 187 | 171 | AM_RANGE(0x0040, 0x005f) AM_DEVREADWRITE8("pit8254", pit8254_device, read, write, 0xffffffff) |
| r29537 | r29538 | |
| 209 | 193 | MCFG_MC146818_IRQ_HANDLER(DEVWRITELINE("pic8259_2", pic8259_device, ir0_w)) |
| 210 | 194 | MCFG_MC146818_CENTURY_INDEX(0x32) |
| 211 | 195 | |
| 212 | | MCFG_KBDC8042_ADD("kbdc", at8042) |
| 196 | MCFG_DEVICE_ADD("kbdc", KBDC8042, 0) |
| 197 | MCFG_KBDC8042_KEYBOARD_TYPE(KBDC8042_AT386) |
| 198 | MCFG_KBDC8042_SYSTEM_RESET_CB(INPUTLINE("maincpu", INPUT_LINE_RESET)) |
| 199 | MCFG_KBDC8042_GATE_A20_CB(INPUTLINE("maincpu", INPUT_LINE_A20)) |
| 200 | MCFG_KBDC8042_INPUT_BUFFER_FULL_CB(DEVWRITELINE("pic8259_1", pic8259_device, ir1_w)) |
| 213 | 201 | MACHINE_CONFIG_END |