/* ----------------------------------------------------- File: Keyboard.Pas By: Ronny Wester, ronny@rat.se Passat a C by: JailDoctor Unit to check up/down status of individual key flags. Written from code I got off rec.games.programmer. Sorry, I lost the name of the poster. As most of this code is scancode-dependent some keys may not be where they "should" on your keyboard. ----------------------------------------------------- */ /* unit Keyboard; interface uses Dos; */ #include //const #define keySysReq SDL_SCANCODE_SYSREQ #define keyCapsLock SDL_SCANCODE_CAPSLOCK #define keyNumLock SDL_SCANCODE_NUMLOCKCLEAR #define keyScrollLock SDL_SCANCODE_SCROLLLOCK #define keyLeftCtrl SDL_SCANCODE_LCTRL #define keyLeftAlt SDL_SCANCODE_LALT #define keyLeftShift SDL_SCANCODE_LSHIFT #define keyRightCtrl SDL_SCANCODE_RCTRL #define keyAltGr SDL_SCANCODE_RALT #define keyRightShift SDL_SCANCODE_RSHIFT #define keyEsc SDL_SCANCODE_ESCAPE #define keyBackspace SDL_SCANCODE_BACKSPACE #define keyEnter SDL_SCANCODE_RETURN #define keySpace SDL_SCANCODE_SPACE #define keyTab SDL_SCANCODE_TAB #define keyF1 SDL_SCANCODE_F1 #define keyF2 SDL_SCANCODE_F2 #define keyF3 SDL_SCANCODE_F3 #define keyF4 SDL_SCANCODE_F4 #define keyF5 SDL_SCANCODE_F5 #define keyF6 SDL_SCANCODE_F6 #define keyF7 SDL_SCANCODE_F7 #define keyF8 SDL_SCANCODE_F8 #define keyF9 SDL_SCANCODE_F9 #define keyF10 SDL_SCANCODE_F10 #define keyF11 SDL_SCANCODE_F11 #define keyF12 SDL_SCANCODE_F12 #define keyA SDL_SCANCODE_A #define keyB SDL_SCANCODE_B #define keyC SDL_SCANCODE_C #define keyD SDL_SCANCODE_D #define keyE SDL_SCANCODE_E #define keyF SDL_SCANCODE_F #define keyG SDL_SCANCODE_G #define keyH SDL_SCANCODE_H #define keyI SDL_SCANCODE_I #define keyJ SDL_SCANCODE_J #define keyK SDL_SCANCODE_K #define keyL SDL_SCANCODE_L #define keyM SDL_SCANCODE_M #define keyN SDL_SCANCODE_N #define keyO SDL_SCANCODE_O #define keyP SDL_SCANCODE_P #define keyQ SDL_SCANCODE_Q #define keyR SDL_SCANCODE_R #define keyS SDL_SCANCODE_S #define keyT SDL_SCANCODE_T #define keyU SDL_SCANCODE_U #define keyV SDL_SCANCODE_V #define keyW SDL_SCANCODE_W #define keyX SDL_SCANCODE_X #define keyY SDL_SCANCODE_Y #define keyZ SDL_SCANCODE_Z #define key1 SDL_SCANCODE_1 #define key2 SDL_SCANCODE_2 #define key3 SDL_SCANCODE_3 #define key4 SDL_SCANCODE_4 #define key5 SDL_SCANCODE_5 #define key6 SDL_SCANCODE_6 #define key7 SDL_SCANCODE_7 #define key8 SDL_SCANCODE_8 #define key9 SDL_SCANCODE_9 #define key0 SDL_SCANCODE_0 #define keyMinus SDL_SCANCODE_MINUS #define keyEqual SDL_SCANCODE_EQUALS #define keyLBracket SDL_SCANCODE_LEFTBRACKET #define keyRBracket SDL_SCANCODE_RIGHTBRACKET #define keySemicolon SDL_SCANCODE_SEMICOLON #define keyTick SDL_SCANCODE_GRAVE #define keyApostrophe SDL_SCANCODE_APOSTROPHE #define keyBackslash SDL_SCANCODE_BACKSLASH #define keyComma SDL_SCANCODE_COMMA #define keyPeriod SDL_SCANCODE_PERIOD #define keySlash SDL_SCANCODE_SLASH #define keyInsert SDL_SCANCODE_INSERT #define keyDelete SDL_SCANCODE_DELETE #define keyHome SDL_SCANCODE_HOME #define keyEnd SDL_SCANCODE_END #define keyPageUp SDL_SCANCODE_PAGEUP #define keyArrowLeft SDL_SCANCODE_LEFT #define keyArrowRight SDL_SCANCODE_RIGHT #define keyArrowUp SDL_SCANCODE_UP #define keyArrowDown SDL_SCANCODE_DOWN #define keyKeypad0 SDL_SCANCODE_KP_0 #define keyKeypad1 SDL_SCANCODE_KP_1 #define keyKeypad2 SDL_SCANCODE_KP_2 #define keyKeypad3 SDL_SCANCODE_KP_3 #define keyKeypad4 SDL_SCANCODE_KP_4 #define keyKeypad5 SDL_SCANCODE_KP_5 #define keyKeypad6 SDL_SCANCODE_KP_6 #define keyKeypad7 SDL_SCANCODE_KP_7 #define keyKeypad8 SDL_SCANCODE_KP_8 #define keyKeypad9 SDL_SCANCODE_KP_9 #define keyKeypadComma SDL_SCANCODE_KP_COMMA #define keyKeypadStar SDL_SCANCODE_KP_MULTIPLY #define keyKeypadMinus SDL_SCANCODE_KP_MINUS #define keyKeypadPlus SDL_SCANCODE_KP_PLUS #define keyKeypadEnter SDL_SCANCODE_KP_ENTER #define keyCtrlPrtScr SDL_SCANCODE_PRINTSCREEN #define keyShiftPrtScr SDL_SCANCODE_PAUSE #define keyKeypadSlash SDL_SCANCODE_KP_DIVIDE const char *keyNames[256] { /* $00 */ NULL, "Esc", "1", "2", "3", "4", "5", "6", /* $08 */ "7", "8", "9", "0", "+", "Apostrophe", "Backspace", "Tab", /* $10 */ "Q", "W", "E", "R", "T", "Y", "U", "I", /* $18 */ "O", "P", "�", "?", "Enter", "Left Ctrl", "A", "S", /* $20 */ "D", "F", "G", "H", "J", "K", "L", "�", /* $28 */ "�", "'", "Left shift", "<", "Z", "X", "C", "V", /* $30 */ "B", "N", "M", ",", ".", "-", "Right shift", "* (pad)", /* $38 */ "Alt", "Space", "Caps Lock", "F1", "F2", "F3", "F4", "F5", /* $40 */ "F6", "F7", "F8", "F9", "F10", "Num Lock", "Scroll Lock", "7 (pad)", /* $48 */ "8 (pad)", "9 (pad)", "- (pad)", "4 (pad)", "5 (pad)", "6 (pad)", "+ (pad)", "1 (pad)", /* $50 */ "2 (pad)", "3 (pad)", "0 (pad)", ", (pad)", "SysRq", NULL, NULL, "F11", "F12", /* $59 */ NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* $60 */ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* $70 */ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* $80 */ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* $90 */ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "Enter (pad)", "Right Ctrl", NULL, NULL, /* $A0 */ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* $B0 */ NULL, NULL, NULL, NULL, NULL, "/ (pad)", NULL, "PrtScr", "Alt Gr", NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* $C0 */ NULL, NULL, NULL, NULL, NULL, NULL, NULL, "Home", /* $C8 */ "Up arrow", "Page Up", NULL, "Left arrow", NULL, "Right arrow", NULL, "End", /* $D0 */ "Down arrow", NULL, "Insert", "Delete", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* $E0 */ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* $F0 */ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }; /* procedure InstalarKb; procedure DesinstalarKb; function TeclaPuls( b : byte ) : Boolean; function QTeclaPuls : Boolean; function AgarrarTecla : Byte; procedure BorrarKb; procedure EscriuKb; implementation var uOldInt9 : Pointer; { saves location of old OldInt9 vector } uKeys : array [0..255] of Boolean; { array that holds key values } e0Flag : Byte; uExitProc : Pointer; {$F+} procedure NewInt9; interrupt; assembler; asm cli in al, $60 { get scan code from keyboard port } cmp al, $E0 { al = $E0 key ? } jne @@SetScanCode mov [e0Flag], 128 mov al, 20h { Send 'generic' EOI to PIC } out 20h, al jmp @@exit @@SetScanCode: mov bl, al { Save scancode in BL } and bl, 01111111b add bl, [e0Flag] xor bh, bh and al, 10000000b { keep break bit, if set } xor al, 10000000b { flip bit, 1 means pressed, 0 no } rol al, 1 { move breakbit to bit 0 } mov [offset uKeys + bx], al mov [e0Flag], 0 mov al, 20h { send EOI to PIC } out 20h, al @@exit: sti end; {$F-} */ const Uint8 *uKeys; void instalarkb() { uKeys = SDL_GetKeyboardState(NULL); } void desinstalarkb() { // Res que vore ací, dispersensé... } bool teclapuls( unsigned char b ) { return uKeys[b] == 1; } bool keypressed() { for (int i=0;i<256;++i) if (uKeys[i]==1) return true; return false; } unsigned char agarrartecla() { for (int i=0;i<256;++i) if (uKeys[i]==1) return i; return 0; }