#include #include #include "keyboard.h" unsigned char keystateBits[16]; struct KeyboardKeydownState keyboardKeydownState; void far (interrupt *int9Save)(); void populateKeyboardKeydownState() { keyboardKeydownState.KEY_W = keystateBits[2] & 0x02; keyboardKeydownState.KEY_A = keystateBits[3] & 0x40; keyboardKeydownState.KEY_S = keystateBits[3] & 0x80; keyboardKeydownState.KEY_D = keystateBits[4] & 0x01; keyboardKeydownState.KEY_I = keystateBits[2] & 0x80; keyboardKeydownState.KEY_O = keystateBits[3] & 0x01; keyboardKeydownState.KEY_P = keystateBits[3] & 0x02; keyboardKeydownState.KEY_ESC = keystateBits[0] & 0x02; } void far interrupt keyboardHandler(void) { unsigned char rawcode, scancode, ksbByte, temp; unsigned char mask = 1; _disable(); rawcode = inp(0x60); scancode = rawcode & 0x7f; mask = 1 << (scancode & 0x07); ksbByte = scancode >> 3; // https://github.com/id-Software/wolf3d/blob/05167784ef009d0d0daefe8d012b027f39dc8541/WOLFSRC/ID_IN.C#L152-L154 outp(0x61, (temp = inp(0x61)) | 0x80); outp(0x61, temp); /* break */ if (rawcode & 0x80) { mask = 0xff - mask; keystateBits[ksbByte] &= mask; /* make */ } else { keystateBits[ksbByte] |= mask; } // acknowledge we're done with the interrupt outp(0x20, 0x20); _enable(); } void installKeyboardHandler() { int9Save = _dos_getvect(9); _dos_setvect(9, keyboardHandler); } void uninstallKeyboardHandler() { _dos_setvect(9, int9Save); }