diff options
Diffstat (limited to 'src/devices/machine/myb3k_kbd.cpp')
-rw-r--r-- | src/devices/machine/myb3k_kbd.cpp | 59 |
1 files changed, 27 insertions, 32 deletions
diff --git a/src/devices/machine/myb3k_kbd.cpp b/src/devices/machine/myb3k_kbd.cpp index b1a1c626cd7..0eb63868aff 100644 --- a/src/devices/machine/myb3k_kbd.cpp +++ b/src/devices/machine/myb3k_kbd.cpp @@ -124,7 +124,6 @@ #include "emu.h" #include "myb3k_kbd.h" -//#define LOG_GENERAL (1U << 0) //defined in logmacro.h already #define LOG_MOD (1U << 1) #define LOG_BYTES (1U << 2) @@ -336,8 +335,10 @@ myb3k_keyboard_device::myb3k_keyboard_device( device_t *owner, u32 clock) : device_t(mconfig, type, tag, owner, clock) - , m_keyboard_cb() + , m_keyboard_cb(*this) , m_io_kbd_t(*this, "MYB3K_T%X", 0U) + , m_x(0) + , m_y(0) { } @@ -353,21 +354,22 @@ ioport_constructor myb3k_keyboard_device::device_input_ports() const void myb3k_keyboard_device::device_start() { - m_keyboard_cb.bind_relative_to(*owner()); - device_reset(); + m_keyboard_cb.resolve_safe(); + m_scan_timer = timer_alloc(FUNC(myb3k_keyboard_device::scan_keys), this); + m_first_byte_timer = timer_alloc(FUNC(myb3k_keyboard_device::send_first_byte), this); + m_second_byte_timer = timer_alloc(FUNC(myb3k_keyboard_device::send_second_byte), this); } void myb3k_keyboard_device::device_reset() { m_modifier_keys = 0; memset(m_io_kbd_state, 0, sizeof(m_io_kbd_state)); - timer_set(attotime::from_msec(100), TIMER_ID_SCAN_KEYS); + m_scan_timer->adjust(attotime::from_msec(100)); m_modifier_keys = 0; } void myb3k_keyboard_device::send_byte(u8 code) { - assert(!m_keyboard_cb.isnull()); m_keyboard_cb(code); } @@ -390,7 +392,7 @@ void myb3k_keyboard_device::key_changed(int x, int y, bool pressed) (y & 0x7); } -void myb3k_keyboard_device::scan_keys() +TIMER_CALLBACK_MEMBER(myb3k_keyboard_device::scan_keys) { // Iterate over all columns (m_x) // and for each column iterate over all rows (m_y) @@ -407,7 +409,7 @@ void myb3k_keyboard_device::scan_keys() update_modifiers(m_y, bit); } - timer_set(attotime::from_msec(3), TIMER_ID_FIRST_BYTE); + m_first_byte_timer->adjust(attotime::from_msec(3)); wait_for_timer = true; } @@ -419,7 +421,7 @@ void myb3k_keyboard_device::scan_keys() m_y = 0; // Done scanning the matrix. Now sleep for a while, // then start scanning again. Scan ~50 times per second. - timer_set(attotime::from_msec(20), TIMER_ID_SCAN_KEYS); + m_scan_timer->adjust(attotime::from_msec(20)); wait_for_timer = true; // (The final switch x=11 y=7 is not electrically connected. // Thus if we get here, then there can be no key changed @@ -455,31 +457,24 @@ void myb3k_keyboard_device::update_modifiers(int y, bool down) m_modifier_keys = (m_modifier_keys & mask) | (down?bit:0); } -void myb3k_keyboard_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) +TIMER_CALLBACK_MEMBER(myb3k_keyboard_device::send_first_byte) { - switch (id) - { - case TIMER_ID_SCAN_KEYS: - scan_keys(); - break; + LOGBYTES("FIRST_BYTE %02x %s (with modifiers %s%s%s%s%s)\n", m_first_byte, + (m_first_byte&MYB3K_KEY_ON)?"Pressed":"Released", + (m_first_byte&MYB3K_KEY_CTRL)?"CTRL ":"", + (m_first_byte&MYB3K_KEY_GRAPH)?"GRAPH ":"", + (m_first_byte&MYB3K_KEY_LSHIFT)?"LSHIFT ":"", + (m_first_byte&MYB3K_KEY_RSHIFT)?"RSHIFT ":"", + (m_first_byte&MYB3K_KEY_CAP)?"CAP ":""); + send_byte(m_first_byte); + m_second_byte_timer->adjust(attotime::from_msec(3)); +} - case TIMER_ID_FIRST_BYTE: - LOGBYTES("FIRST_BYTE %02x %s (with modifiers %s%s%s%s%s)\n", m_first_byte, - (m_first_byte&MYB3K_KEY_ON)?"Pressed":"Released", - (m_first_byte&MYB3K_KEY_CTRL)?"CTRL ":"", - (m_first_byte&MYB3K_KEY_GRAPH)?"GRAPH ":"", - (m_first_byte&MYB3K_KEY_LSHIFT)?"LSHIFT ":"", - (m_first_byte&MYB3K_KEY_RSHIFT)?"RSHIFT ":"", - (m_first_byte&MYB3K_KEY_CAP)?"CAP ":""); - send_byte(m_first_byte); - timer_set(attotime::from_msec(3), TIMER_ID_SECOND_BYTE); - break; - case TIMER_ID_SECOND_BYTE: - LOGBYTES("SECOND_BYTE %02x x=%d y=%d \n\n\n", m_second_byte, (m_second_byte >> 3)&0xf, (m_second_byte)&0x7); - send_byte(m_second_byte); - timer_set(attotime::from_msec(10), TIMER_ID_SCAN_KEYS); - break; - } +TIMER_CALLBACK_MEMBER(myb3k_keyboard_device::send_second_byte) +{ + LOGBYTES("SECOND_BYTE %02x x=%d y=%d \n\n\n", m_second_byte, (m_second_byte >> 3)&0xf, (m_second_byte)&0x7); + send_byte(m_second_byte); + m_scan_timer->adjust(attotime::from_msec(10)); } stepone_keyboard_device::stepone_keyboard_device( |