first commit

This commit is contained in:
2022-08-14 15:36:56 +02:00
commit 3f53e503af
3 changed files with 832 additions and 0 deletions

278
keyboard.h Executable file
View 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.