/* ----------------------------------------------------- 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 0x45 #define keyScrollLock 0x46 #define keyLeftCtrl 0x1D #define keyLeftAlt 0x38 #define keyLeftShift 0x2A #define keyRightCtrl 0x9D #define keyAltGr 0xB8 #define keyRightShift 0x36 #define keyEsc 0x01 #define keyBackspace 0x0E #define keyEnter 0x1C #define keySpace 0x39 #define keyTab 0x0F #define keyF1 0x3B #define keyF2 0x3C #define keyF3 0x3D #define keyF4 0x3E #define keyF5 0x3F #define keyF6 0x40 #define keyF7 0x41 #define keyF8 0x42 #define keyF9 0x43 #define keyF10 0x44 #define keyF11 0x57 #define keyF12 0x58 #define keyA 0x1E #define keyB 0x30 #define keyC 0x2E #define keyD 0x20 #define keyE 0x12 #define keyF 0x21 #define keyG 0x22 #define keyH 0x23 #define keyI 0x17 #define keyJ 0x24 #define keyK 0x25 #define keyL 0x26 #define keyM 0x32 #define keyN 0x31 #define keyO 0x18 #define keyP 0x19 #define keyQ 0x10 #define keyR 0x13 #define keyS 0x1F #define keyT 0x14 #define keyU 0x16 #define keyV 0x2F #define keyW 0x11 #define keyX 0x2D #define keyY 0x15 #define keyZ 0x2C #define key1 0x02 #define key2 0x03 #define key3 0x04 #define key4 0x05 #define key5 0x06 #define key6 0x07 #define key7 0x08 #define key8 0x09 #define key9 0x0A #define key0 0x0B #define keyMinus 0x0C #define keyEqual 0x0D #define keyLBracket 0x1A #define keyRBracket 0x1B #define keySemicolon 0x27 #define keyTick 0x28 #define keyApostrophe 0x29 #define keyBackslash 0x2B #define keyComma 0x33 #define keyPeriod 0x34 #define keySlash 0x35 #define keyInsert 0xD2 #define keyDelete 0xD3 #define keyHome 0xC7 #define keyEnd 0xCF #define keyPageUp 0xC9 #define keyArrowLeft 0xCB #define keyArrowRight 0xCD #define keyArrowUp 0xC8 #define keyArrowDown 0xD0 #define keyKeypad0 0x52 #define keyKeypad1 0x4F #define keyKeypad2 0x50 #define keyKeypad3 0x51 #define keyKeypad4 0x4B #define keyKeypad5 0x4C #define keyKeypad6 0x4D #define keyKeypad7 0x47 #define keyKeypad8 0x48 #define keyKeypad9 0x49 #define keyKeypadComma 0x53 #define keyKeypadStar 0x37 #define keyKeypadMinus 0x4A #define keyKeypadPlus 0x4E #define keyKeypadEnter 0x9C #define keyCtrlPrtScr 0xB7 #define keyShiftPrtScr 0xB7 #define keyKeypadSlash 0xB5 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-} procedure InstalarKb; begin GetIntVec( $09, uOldInt9); { save old location of INT 09 handler } SetIntVec( $09, Addr( NewInt9)); { point to new routine } FillChar( uKeys, SizeOf( uKeys), 0); { clear the keys array } end; procedure DesinstalarKb; begin SetIntVec( $09, uOldInt9); { point back to original routine } uOldInt9 := nil; end; function TeclaPuls( b : byte ) : Boolean; begin TeclaPuls := uKeys[b]; end; function QTeclaPuls : Boolean; var b : Integer; begin QTeclaPuls := True; for b := 0 to 255 do if uKeys[b] and (keyNames[b] <> nil) then Exit; QTeclaPuls := False; end; function AgarrarTecla : Byte; var b : Integer; begin AgarrarTecla := 0; for b := 1 to 255 do if uKeys[b] and (keyNames[b] <> nil) then begin AgarrarTecla := b; Exit; end; end; procedure BorrarKb; begin FillChar( uKeys, SizeOf( uKeys), 0); { clear the keys array } end; {$F+} procedure CleanUp; begin ExitProc := uExitProc; if uOldInt9 <> nil then DesinstalarKb; end; procedure EscriuKb; var b:byte; begin for b := 0 to 255 do if uKeys[b] and (keyNames[b] <> nil) then write(keyNames[b],' | '); writeln; end; {$F-} begin uExitProc := ExitProc; ExitProc := @CleanUp; uOldInt9 := nil; end.