Files
csteroids/keyboard.h

227 lines
8.5 KiB
C
Executable File
Raw Permalink Blame History

/*
-----------------------------------------------------
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 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", "<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-}
*/
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;
}