279 lines
8.2 KiB
C
Executable File
279 lines
8.2 KiB
C
Executable File
/*
|
||
-----------------------------------------------------
|
||
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.
|