227 lines
8.5 KiB
C
Executable File
227 lines
8.5 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 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;
|
||
}
|