void KeyboardHandler(Registers* registers) { char c; BYTE key = IoReadPortByte(KB_DATA_REGISTER); if(key & KEY_RELEASED_MASK) { key = key - 128; c = keyCodes[key]; if(c == LSHIFT) controlKeyState &= ~CONTROL_KEY_SHIFT; /*AddKeyToBuffer(c);*/ } else { c = keyCodes[key]; if(c == LSHIFT) { controlKeyState |= CONTROL_KEY_SHIFT; // fixme - might want to add this to buffer and handle shift at a higher level... return; } if(controlKeyState & CONTROL_KEY_SHIFT) c = shiftKeyCodes[key]; AddKeyToBuffer(c); } /*AddKeyToBuffer(c);*/ }
static hvm_status i8042ReadKeyboardData(Bit8u* pc, hvm_bool* pisMouse) { Bit8u port_status; port_status = IoReadPortByte(KEYB_REGISTER_STATUS); if (port_status & KEYB_STATUS_OBUFFER_FULL) { /* Data is available */ *pc = IoReadPortByte(KEYB_REGISTER_DATA); /* Check if data is valid (i.e., no timeout, no parity error) */ if ((port_status & KEYB_STATUS_PARITY_ERROR) == 0) { /* Check if this is a mouse event or not */ *pisMouse = (port_status & KEYB_STATUS_TRANSMIT_TIMEOUT) != 0; return HVM_STATUS_SUCCESS; } } return HVM_STATUS_UNSUCCESSFUL; }
static hvm_bool i8042WriteKeyboardData(Bit16u addr, Bit8u data) { Bit32u counter; counter = POLL_STATUS_ITERATIONS; while ((KEYB_STATUS_IBUFFER_FULL & IoReadPortByte(KEYB_REGISTER_STATUS)) && (counter--)) { CmSleep(1); } if (counter) { IoWritePortByte(addr, data); return TRUE; } return FALSE; }
/* Inspired from ReactOS's i8042 keyboard driver */ hvm_status KeyboardReadKeystroke(Bit8u* pc, hvm_bool unget, hvm_bool* pisMouse) { Bit32u counter; Bit8u port_status, scancode; hvm_status r; counter = POLL_STATUS_ITERATIONS; while (counter) { port_status = IoReadPortByte(KEYB_REGISTER_STATUS); r = i8042ReadKeyboardData(&scancode, pisMouse); if (r == HVM_STATUS_SUCCESS) { break; } CmSleep(1); counter--; } if (counter == 0) { return HVM_STATUS_UNSUCCESSFUL; } if (unget) { /* Echo back the scancode */ i8042WriteKeyboardData(KEYB_REGISTER_COMMAND, KEYB_COMMAND_DISABLE_KEYBOARD); i8042WriteKeyboardData(KEYB_REGISTER_COMMAND, KEYB_COMMAND_WRITE_OUTPUT); i8042WriteKeyboardData(KEYB_REGISTER_DATA, scancode); i8042WriteKeyboardData(KEYB_REGISTER_COMMAND, KEYB_COMMAND_ENABLE_KEYBOARD); } *pc = scancode; return HVM_STATUS_SUCCESS; }