summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/machine/at_keybc.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/machine/at_keybc.cpp')
-rw-r--r--src/devices/machine/at_keybc.cpp60
1 files changed, 33 insertions, 27 deletions
diff --git a/src/devices/machine/at_keybc.cpp b/src/devices/machine/at_keybc.cpp
index 80cea51d4d2..d4beb3ce68e 100644
--- a/src/devices/machine/at_keybc.cpp
+++ b/src/devices/machine/at_keybc.cpp
@@ -90,7 +90,6 @@
#include "emu.h"
#include "at_keybc.h"
-#define LOG_GENERAL (1U << 0)
#define LOG_COMMAND (1U << 1)
#define LOG_STATUS (1U << 2)
@@ -147,14 +146,14 @@ DEFINE_DEVICE_TYPE(PS2_KEYBOARD_CONTROLLER, ps2_keyboard_controller_device, "ps2
uint8_t at_kbc_device_base::data_r()
{
- u8 const data = m_mcu->upi41_master_r(machine().dummy_space(), 0U);
+ u8 const data = m_mcu->upi41_master_r(0U);
LOG("data_r 0x%02x (%s)\n", data, machine().describe_context());
return data;
}
uint8_t at_kbc_device_base::status_r()
{
- u8 const data = m_mcu->upi41_master_r(machine().dummy_space(), 1U);
+ u8 const data = m_mcu->upi41_master_r(1U);
LOGMASKED(LOG_STATUS, "status_r 0x%02x%s%s%s%s%s%s%s%s (%s)\n", data,
BIT(data, 7) ? " PER" : "", BIT(data, 6) ? " RTO" : "",
BIT(data, 5) ? " TTO" : "", BIT(data, 4) ? "" : " INH",
@@ -272,12 +271,12 @@ void at_kbc_device_base::command_w(uint8_t data)
machine().scheduler().synchronize(timer_expired_delegate(FUNC(at_kbc_device_base::write_command), this), unsigned(data));
}
-WRITE_LINE_MEMBER(at_kbc_device_base::kbd_clk_w)
+void at_kbc_device_base::kbd_clk_w(int state)
{
machine().scheduler().synchronize(timer_expired_delegate(FUNC(at_kbc_device_base::set_kbd_clk_in), this), state);
}
-WRITE_LINE_MEMBER(at_kbc_device_base::kbd_data_w)
+void at_kbc_device_base::kbd_data_w(int state)
{
machine().scheduler().synchronize(timer_expired_delegate(FUNC(at_kbc_device_base::set_kbd_data_in), this), state);
}
@@ -292,13 +291,8 @@ at_kbc_device_base::at_kbc_device_base(machine_config const &mconfig, device_typ
{
}
-void at_kbc_device_base::device_resolve_objects()
+at_kbc_device_base::~at_kbc_device_base()
{
- m_hot_res_cb.resolve_safe();
- m_gate_a20_cb.resolve_safe();
- m_kbd_irq_cb.resolve_safe();
- m_kbd_clk_cb.resolve_safe();
- m_kbd_data_cb.resolve_safe();
}
void at_kbc_device_base::device_start()
@@ -358,12 +352,12 @@ inline u8 at_kbc_device_base::kbd_data_r() const
TIMER_CALLBACK_MEMBER(at_kbc_device_base::write_data)
{
- m_mcu->upi41_master_w(machine().dummy_space(), 0U, u8(u32(param)));
+ m_mcu->upi41_master_w(0U, u8(u32(param)));
}
TIMER_CALLBACK_MEMBER(at_kbc_device_base::write_command)
{
- m_mcu->upi41_master_w(machine().dummy_space(), 1U, u8(u32(param)));
+ m_mcu->upi41_master_w(1U, u8(u32(param)));
}
TIMER_CALLBACK_MEMBER(at_kbc_device_base::set_kbd_clk_in)
@@ -386,6 +380,10 @@ at_keyboard_controller_device::at_keyboard_controller_device(machine_config cons
{
}
+at_keyboard_controller_device::~at_keyboard_controller_device()
+{
+}
+
tiny_rom_entry const *at_keyboard_controller_device::device_rom_region() const
{
return ROM_NAME(at_kbc);
@@ -425,14 +423,14 @@ uint8_t ps2_keyboard_controller_device::data_r()
{
set_kbd_irq(0U);
set_aux_irq(0U);
- u8 const data = m_mcu->upi41_master_r(machine().dummy_space(), 0U);
+ u8 const data = m_mcu->upi41_master_r(0U);
LOG("data_r 0x%02x (%s)\n", data, machine().describe_context());
return data;
}
uint8_t ps2_keyboard_controller_device::status_r()
{
- u8 const data = m_mcu->upi41_master_r(machine().dummy_space(), 1U);
+ u8 const data = m_mcu->upi41_master_r(1U);
LOGMASKED(LOG_STATUS, "status_r 0x%02x%s%s%s%s%s%s%s%s (%s)\n", data,
BIT(data, 7) ? " PER" : "", BIT(data, 6) ? " GTO" : "",
BIT(data, 5) ? " AUX_OBF" : "", BIT(data, 4) ? "" : " INH",
@@ -442,12 +440,12 @@ uint8_t ps2_keyboard_controller_device::status_r()
return data;
}
-WRITE_LINE_MEMBER(ps2_keyboard_controller_device::aux_clk_w)
+void ps2_keyboard_controller_device::aux_clk_w(int state)
{
machine().scheduler().synchronize(timer_expired_delegate(FUNC(ps2_keyboard_controller_device::set_aux_clk_in), this), state);
}
-WRITE_LINE_MEMBER(ps2_keyboard_controller_device::aux_data_w)
+void ps2_keyboard_controller_device::aux_data_w(int state)
{
machine().scheduler().synchronize(timer_expired_delegate(FUNC(ps2_keyboard_controller_device::set_aux_data_in), this), state);
}
@@ -462,6 +460,10 @@ ps2_keyboard_controller_device::ps2_keyboard_controller_device(machine_config co
{
}
+ps2_keyboard_controller_device::~ps2_keyboard_controller_device()
+{
+}
+
tiny_rom_entry const *ps2_keyboard_controller_device::device_rom_region() const
{
return ROM_NAME(ps2_kbc);
@@ -478,19 +480,12 @@ void ps2_keyboard_controller_device::device_add_mconfig(machine_config &config)
m_mcu->t1_in_cb().set([this] () { return aux_clk_r(); });
}
-void ps2_keyboard_controller_device::device_resolve_objects()
-{
- at_kbc_device_base::device_resolve_objects();
-
- m_aux_irq_cb.resolve_safe();
- m_aux_clk_cb.resolve_safe();
- m_aux_data_cb.resolve_safe();
-}
-
void ps2_keyboard_controller_device::device_start()
{
at_kbc_device_base::device_start();
+ m_aux_irq_timer = timer_alloc(FUNC(ps2_keyboard_controller_device::set_aux_irq_timer_callback), this);
+
save_item(NAME(m_aux_irq));
save_item(NAME(m_aux_clk_in));
save_item(NAME(m_aux_clk_out));
@@ -559,6 +554,17 @@ void ps2_keyboard_controller_device::p2_w(uint8_t data)
if (BIT(data & ~m_p2_data, 4))
set_kbd_irq(1U);
if (BIT(data & ~m_p2_data, 5))
- set_aux_irq(1U);
+ {
+ // HACK: delay raising the aux irq until compaq queues the data
+ if (m_mcu->pcbase() == 0x7ba)
+ m_aux_irq_timer->adjust(attotime::from_hz(clock() / 16));
+ else
+ set_aux_irq(1U);
+ }
m_p2_data = data;
}
+
+TIMER_CALLBACK_MEMBER(ps2_keyboard_controller_device::set_aux_irq_timer_callback)
+{
+ set_aux_irq(1U);
+}