diff options
Diffstat (limited to 'src/mame/machine/ngen_kb.cpp')
-rw-r--r-- | src/mame/machine/ngen_kb.cpp | 197 |
1 files changed, 37 insertions, 160 deletions
diff --git a/src/mame/machine/ngen_kb.cpp b/src/mame/machine/ngen_kb.cpp index 4c901ea5d41..960cc97f3c7 100644 --- a/src/mame/machine/ngen_kb.cpp +++ b/src/mame/machine/ngen_kb.cpp @@ -1,12 +1,19 @@ // license:BSD-3-Clause // copyright-holders:Barry Rodewald // Convergent NGEN keyboard device +/* + TODO: represent the real layout/scancodes for this keyboard. The + current HLE just sends ASCII and hopes, with an additional 0xc0 + "last key up" code. We're also inheriting typematic behaviour from + the serial keyboard which may not be desirable. +*/ #include "ngen_kb.h" -ngen_keyboard_device::ngen_keyboard_device(const machine_config& mconfig, const char* tag, device_t* owner, UINT32 clock) : - serial_keyboard_device(mconfig, NGEN_KEYBOARD, "NGEN Keyboard", tag, owner, 0, "ngen_keyboard", __FILE__), - m_keys_down(false) +ngen_keyboard_device::ngen_keyboard_device(const machine_config& mconfig, const char* tag, device_t* owner, UINT32 clock) + : serial_keyboard_device(mconfig, NGEN_KEYBOARD, "NGEN Keyboard", tag, owner, 0, "ngen_keyboard", __FILE__) + , m_keys_down(0U) + , m_last_reset(0U) { } @@ -21,164 +28,12 @@ void ngen_keyboard_device::write(UINT8 data) logerror("KB: received character %02x\n",data); switch(data) { - case 0x92: // reset(?) - m_last_reset = true; - break; + case 0x92U: // reset(?) + m_last_reset = 0x01U; + break; } } -UINT8 ngen_keyboard_device::row_number(UINT8 code) -{ - if BIT(code,0) return 0; - if BIT(code,1) return 1; - if BIT(code,2) return 2; - if BIT(code,3) return 3; - if BIT(code,4) return 4; - if BIT(code,5) return 5; - if BIT(code,6) return 6; - if BIT(code,7) return 7; - return 0; -} - -UINT8 ngen_keyboard_device::keyboard_handler(UINT8 last_code, UINT8 *scan_line) -{ - int i; - UINT8 code = 0; - UINT8 key_code = 0; - UINT8 retVal = 0x00; - UINT8 shift = BIT(m_io_kbdc->read(), 1); - UINT8 caps = BIT(m_io_kbdc->read(), 2); - UINT8 ctrl = BIT(m_io_kbdc->read(), 0); - i = *scan_line; - { - if (i == 0) code = m_io_kbd0->read(); - else - if (i == 1) code = m_io_kbd1->read(); - else - if (i == 2) code = m_io_kbd2->read(); - else - if (i == 3) code = m_io_kbd3->read(); - else - if (i == 4) code = m_io_kbd4->read(); - else - if (i == 5) code = m_io_kbd5->read(); - else - if (i == 6) code = m_io_kbd6->read(); - else - if (i == 7) code = m_io_kbd7->read(); - else - if (i == 8) code = m_io_kbd8->read(); - else - if (i == 9) code = m_io_kbd9->read(); - - if (code != 0) - { - if (i==0 && shift==0) { - key_code = 0x30 + row_number(code) + 8*i; // for numbers and some signs - } - if (i==0 && shift==1) { - key_code = 0x20 + row_number(code) + 8*i; // for shifted numbers - } - if (i==1 && shift==0) { - if (row_number(code) < 4) { - key_code = 0x30 + row_number(code) + 8*i; // for numbers and some signs - } else { - key_code = 0x20 + row_number(code) + 8*i; // for numbers and some signs - } - } - if (i==1 && shift==1) { - if (row_number(code) < 4) { - key_code = 0x20 + row_number(code) + 8*i; // for numbers and some signs - } else { - key_code = 0x30 + row_number(code) + 8*i; // for numbers and some signs - } - } - if (i>=2 && i<=4 && (shift ^ caps)==0 && ctrl==0) { - key_code = 0x60 + row_number(code) + (i-2)*8; // for small letters - } - if (i>=2 && i<=4 && (shift ^ caps)==1 && ctrl==0) { - key_code = 0x40 + row_number(code) + (i-2)*8; // for big letters - } - if (i>=2 && i<=5 && ctrl==1) { - key_code = 0x00 + row_number(code) + (i-2)*8; // for CTRL + letters - } - if (i==5 && shift==1 && ctrl==0) { - if (row_number(code)<7) { - if (row_number(code)<3) { - key_code = (caps ? 0x60 : 0x40) + row_number(code) + (i-2)*8; // for big letters - } else { - key_code = 0x60 + row_number(code) + (i-2)*8; // for upper symbols letters - } - } else { - key_code = 0x40 + row_number(code) + (i-2)*8; // for DEL it is switched - } - } - if (i==5 && shift==0 && ctrl==0) { - if (row_number(code)<7) { - if (row_number(code)<3) { - key_code = (caps ? 0x40 : 0x60) + row_number(code) + (i-2)*8; // for small letters - } else { - key_code = 0x40 + row_number(code) + (i-2)*8; // for lower symbols letters - } - } else { - key_code = 0x60 + row_number(code) + (i-2)*8; // for DEL it is switched - } - } - - if (i==6) { - switch(row_number(code)) - { -/* case 0: key_code = 0x11; break; - case 1: key_code = 0x12; break; - case 2: key_code = 0x13; break; - case 3: key_code = 0x14; break;*/ - case 4: key_code = 0x20; break; // Space - case 5: key_code = 0x0A; break; // LineFeed - case 6: key_code = 0x09; break; // TAB - case 7: key_code = 0x0D; break; // Enter - } - } - if (i==7) - { - switch(row_number(code)) - { - case 0: key_code = 0x1B; break; // Escape - case 1: key_code = 0x08; break; // Backspace - } - } - else - if (i==8) - { - key_code = row_number(code)+0x81; - if (ctrl) key_code+=0x10; - if (shift) key_code+=0x20; - } - else - if (i==9) - { - key_code = row_number(code)+0x89; - if (ctrl) key_code+=0x10; - if (shift) key_code+=0x20; - } - m_keys_down = true; - m_last_reset = false; - retVal = key_code; - } - else - { - *scan_line += 1; - if (*scan_line==10) - *scan_line = 0; - if(m_keys_down) - { - retVal = 0xc0; - m_keys_down = false; - } - } - } - return retVal; -} - static INPUT_PORTS_START( ngen_keyboard ) PORT_INCLUDE(generic_keyboard) @@ -212,14 +67,19 @@ ioport_constructor ngen_keyboard_device::device_input_ports() const void ngen_keyboard_device::device_start() { serial_keyboard_device::device_start(); + + save_item(NAME(m_keys_down)); + save_item(NAME(m_last_reset)); + set_rcv_rate(19200); } void ngen_keyboard_device::device_reset() { serial_keyboard_device::device_reset(); - m_keys_down = false; - m_last_reset = true; + + m_keys_down = UINT8(~0U); + m_last_reset = 0U; } void ngen_keyboard_device::rcv_complete() @@ -228,4 +88,21 @@ void ngen_keyboard_device::rcv_complete() write(get_received_char()); } +void ngen_keyboard_device::key_make(UINT8 row, UINT8 column) +{ + serial_keyboard_device::key_make(row, column); + m_keys_down = UINT8((row << 4) | column); + m_last_reset = 0U; +} + +void ngen_keyboard_device::key_break(UINT8 row, UINT8 column) +{ + serial_keyboard_device::key_break(row, column); + if (m_keys_down == UINT8((row << 4) | column)) + { + m_keys_down = UINT8(~0U); + send_key(0xc0U); + } +} + const device_type NGEN_KEYBOARD = &device_creator<ngen_keyboard_device>; |