first commit
This commit is contained in:
278
keyboard.h
Executable file
278
keyboard.h
Executable file
@@ -0,0 +1,278 @@
|
||||
/*
|
||||
-----------------------------------------------------
|
||||
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 <SDL2/SDL.h>
|
||||
//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", "<EFBFBD>", "?", "Enter", "Left Ctrl", "A", "S",
|
||||
/* $20 */ "D", "F", "G", "H", "J", "K", "L", "<EFBFBD>",
|
||||
/* $28 */ "<EFBFBD>", "'", "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.
|
||||
Reference in New Issue
Block a user