summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authornickysn <nickysn@3ad0048d-3df7-0310-abae-a5850022a9f2>2017-06-20 00:23:32 +0000
committernickysn <nickysn@3ad0048d-3df7-0310-abae-a5850022a9f2>2017-06-20 00:23:32 +0000
commit0c8b182b35dbd8a7b4b694573c696c2c419c67f4 (patch)
tree772824fa4eefb03078e3e8a90605dbaefc39f7b6
parentc6078519c65b91cf743231b7f43f9af4401357e5 (diff)
downloadfpc-0c8b182b35dbd8a7b4b694573c696c2c419c67f4.tar.gz
* merged all changes from ptc trunk from sourceforge; adds support for different
keyboard input modes in ptccrt (TP7 compatible, GO32 CRT compatible and WIN32 CRT compatible mode) git-svn-id: https://svn.freepascal.org/svn/fpc/trunk@36555 3ad0048d-3df7-0310-abae-a5850022a9f2
-rw-r--r--packages/graph/src/ptcgraph/ptccrt.pp200
-rw-r--r--packages/ptc/docs/CHANGES.txt24
-rw-r--r--packages/ptc/src/core/keyeventd.inc2
-rw-r--r--packages/ptc/src/win32/base/win32kbd.inc21
-rw-r--r--packages/ptc/src/x11/x11displayi.inc6
-rw-r--r--packages/ptc/tests/crtkeys/crtkeys.pas19
-rw-r--r--packages/ptc/tests/crtkeys/crtkeys_fpwincrt.txt124
-rw-r--r--packages/ptc/tests/crtkeys/crtkeys_go32v2.txt117
-rw-r--r--packages/ptc/tests/crtkeys/crtkeys_tp7.txt116
-rw-r--r--packages/ptc/tests/crtkeys/ptccrtkeys.pas33
10 files changed, 654 insertions, 8 deletions
diff --git a/packages/graph/src/ptcgraph/ptccrt.pp b/packages/graph/src/ptcgraph/ptccrt.pp
index cae870aea5..65c478f891 100644
--- a/packages/graph/src/ptcgraph/ptccrt.pp
+++ b/packages/graph/src/ptcgraph/ptccrt.pp
@@ -1,6 +1,6 @@
{
This file is part of the Free Pascal run time library.
- Copyright (c) 2010, 2011, 2013 by Nikolay Nikolov (nickysn@users.sourceforge.net)
+ Copyright (c) 2010, 2011, 2013, 2017 by Nikolay Nikolov (nickysn@users.sourceforge.net)
This file implements keyboard input support for ptcgraph
@@ -35,10 +35,12 @@ type
{$ELSE HasCRT}
tcrtcoord = 1..255;
{$ENDIF HasCRT}
+ tkeymode = (kmTP7, kmGO32, kmFPWINCRT);
var
DirectVideo: Boolean {$IFDEF HasCRT}absolute crt.DirectVideo{$ENDIF HasCRT};
TextAttr: Byte {$IFDEF HasCRT}absolute crt.TextAttr{$ENDIF HasCRT};
+ KeyMode: TKeyMode = kmTP7;
function KeyPressed: Boolean;
function ReadKey: Char;
@@ -132,6 +134,9 @@ begin
if KeyEv.Alt then
begin
case KeyEv.Code of
+ PTCKEY_ESCAPE:
+ if KeyMode = kmGO32 then
+ KeyBufAdd(#0#1);
PTCKEY_F1: KeyBufAdd(#0#104);
PTCKEY_F2: KeyBufAdd(#0#105);
PTCKEY_F3: KeyBufAdd(#0#106);
@@ -142,6 +147,12 @@ begin
PTCKEY_F8: KeyBufAdd(#0#111);
PTCKEY_F9: KeyBufAdd(#0#112);
PTCKEY_F10: KeyBufAdd(#0#113);
+ PTCKEY_F11:
+ if KeyMode in [kmGO32, kmFPWINCRT] then
+ KeyBufAdd(#0#139);
+ PTCKEY_F12:
+ if KeyMode in [kmGO32, kmFPWINCRT] then
+ KeyBufAdd(#0#140);
PTCKEY_ONE: KeyBufAdd(#0#120);
PTCKEY_TWO: KeyBufAdd(#0#121);
PTCKEY_THREE: KeyBufAdd(#0#122);
@@ -180,6 +191,89 @@ begin
PTCKEY_B: KeyBufAdd(#0#48);
PTCKEY_N: KeyBufAdd(#0#49);
PTCKEY_M: KeyBufAdd(#0#50);
+ PTCKEY_BACKQUOTE:
+ if KeyMode in [kmGO32, kmFPWINCRT] then
+ KeyBufAdd(#0#41);
+ PTCKEY_BACKSPACE:
+ if KeyMode in [kmGO32, kmFPWINCRT] then
+ KeyBufAdd(#0#14);
+ PTCKEY_TAB:
+ if KeyMode = kmGO32 then
+ KeyBufAdd(#0#165);
+ PTCKEY_OPENBRACKET:
+ if KeyMode in [kmGO32, kmFPWINCRT] then
+ KeyBufAdd(#0#26);
+ PTCKEY_CLOSEBRACKET:
+ if KeyMode in [kmGO32, kmFPWINCRT] then
+ KeyBufAdd(#0#27);
+ PTCKEY_BACKSLASH:
+ if KeyMode in [kmGO32, kmFPWINCRT] then
+ KeyBufAdd(#0#43);
+ PTCKEY_SEMICOLON:
+ if KeyMode in [kmGO32, kmFPWINCRT] then
+ KeyBufAdd(#0#39);
+ PTCKEY_QUOTE:
+ if KeyMode in [kmGO32, kmFPWINCRT] then
+ KeyBufAdd(#0#40);
+ PTCKEY_ENTER:
+ if KeyMode = kmGO32 then
+ if pmkNumPadKey in KeyEv.ModifierKeys then
+ KeyBufAdd(#0#166)
+ else
+ KeyBufAdd(#0#28);
+ PTCKEY_COMMA:
+ if KeyMode in [kmGO32, kmFPWINCRT] then
+ KeyBufAdd(#0#51);
+ PTCKEY_PERIOD:
+ if KeyMode in [kmGO32, kmFPWINCRT] then
+ KeyBufAdd(#0#52);
+ PTCKEY_SLASH:
+ if KeyMode = kmFPWINCRT then
+ KeyBufAdd(#0#164)
+ else if KeyMode = kmGO32 then
+ KeyBufAdd(#0#53);
+ PTCKEY_INSERT:
+ if KeyMode in [kmGO32, kmFPWINCRT] then
+ KeyBufAdd(#0#162);
+ PTCKEY_DELETE:
+ if KeyMode in [kmGO32, kmFPWINCRT] then
+ KeyBufAdd(#0#163);
+ PTCKEY_HOME:
+ if KeyMode in [kmGO32, kmFPWINCRT] then
+ KeyBufAdd(#0#151);
+ PTCKEY_END:
+ if KeyMode in [kmGO32, kmFPWINCRT] then
+ KeyBufAdd(#0#159);
+ PTCKEY_PAGEUP:
+ if KeyMode in [kmGO32, kmFPWINCRT] then
+ KeyBufAdd(#0#153);
+ PTCKEY_PAGEDOWN:
+ if KeyMode in [kmGO32, kmFPWINCRT] then
+ KeyBufAdd(#0#161);
+ PTCKEY_UP:
+ if KeyMode in [kmGO32, kmFPWINCRT] then
+ KeyBufAdd(#0#152);
+ PTCKEY_LEFT:
+ if KeyMode in [kmGO32, kmFPWINCRT] then
+ KeyBufAdd(#0#155);
+ PTCKEY_RIGHT:
+ if KeyMode in [kmGO32, kmFPWINCRT] then
+ KeyBufAdd(#0#157);
+ PTCKEY_DOWN:
+ if KeyMode in [kmGO32, kmFPWINCRT] then
+ KeyBufAdd(#0#160);
+ PTCKEY_DIVIDE:
+ if KeyMode in [kmGO32, kmFPWINCRT] then
+ KeyBufAdd(#0#164);
+ PTCKEY_MULTIPLY:
+ if KeyMode in [kmGO32, kmFPWINCRT] then
+ KeyBufAdd(#0#55);
+ PTCKEY_SUBTRACT:
+ if KeyMode in [kmGO32, kmFPWINCRT] then
+ KeyBufAdd(#0#74);
+ PTCKEY_ADD:
+ if KeyMode in [kmGO32, kmFPWINCRT] then
+ KeyBufAdd(#0#78);
end;
end
else
@@ -197,7 +291,50 @@ begin
PTCKEY_F8: KeyBufAdd(#0#101);
PTCKEY_F9: KeyBufAdd(#0#102);
PTCKEY_F10: KeyBufAdd(#0#103);
+ PTCKEY_F11:
+ if KeyMode in [kmGO32, kmFPWINCRT] then
+ KeyBufAdd(#0#137);
+ PTCKEY_F12:
+ if KeyMode in [kmGO32, kmFPWINCRT] then
+ KeyBufAdd(#0#138);
+ PTCKEY_ONE:
+ if KeyMode = kmFPWINCRT then
+ KeyBufAdd(#0#2);
PTCKEY_TWO: KeyBufAdd(#0#3);
+ PTCKEY_THREE:
+ if KeyMode = kmFPWINCRT then
+ KeyBufAdd(#0#4);
+ PTCKEY_FOUR:
+ if KeyMode = kmFPWINCRT then
+ KeyBufAdd(#0#5);
+ PTCKEY_FIVE:
+ if KeyMode = kmFPWINCRT then
+ KeyBufAdd(#0#6);
+ PTCKEY_SIX:
+ if KeyMode = kmFPWINCRT then
+ KeyBufAdd(#0#7)
+ else
+ KeyBufAdd(#30);
+ PTCKEY_SEVEN:
+ if KeyMode = kmFPWINCRT then
+ KeyBufAdd(#0#8);
+ PTCKEY_EIGHT:
+ if KeyMode = kmFPWINCRT then
+ KeyBufAdd(#0#9);
+ PTCKEY_NINE:
+ if KeyMode = kmFPWINCRT then
+ KeyBufAdd(#0#10);
+ PTCKEY_ZERO:
+ if KeyMode = kmFPWINCRT then
+ KeyBufAdd(#0#11);
+ PTCKEY_MINUS:
+ if KeyMode = kmFPWINCRT then
+ KeyBufAdd(#0#12)
+ else
+ KeyBufAdd(#31);
+ PTCKEY_EQUALS:
+ if KeyMode = kmFPWINCRT then
+ KeyBufAdd(#0#13);
PTCKEY_BACKSPACE: KeyBufAdd(#127);
PTCKEY_A: KeyBufAdd(#1);
PTCKEY_B: KeyBufAdd(#2);
@@ -228,8 +365,6 @@ begin
PTCKEY_OPENBRACKET: KeyBufAdd(#27);
PTCKEY_BACKSLASH: KeyBufAdd(#28);
PTCKEY_CLOSEBRACKET: KeyBufAdd(#29);
- PTCKEY_SIX: KeyBufAdd(#30);
- PTCKEY_MINUS: KeyBufAdd(#31);
PTCKEY_ENTER: KeyBufAdd(#10);
PTCKEY_LEFT: KeyBufAdd(#0#115);
PTCKEY_RIGHT: KeyBufAdd(#0#116);
@@ -237,6 +372,53 @@ begin
PTCKEY_END: KeyBufAdd(#0#117);
PTCKEY_PAGEUP: KeyBufAdd(#0#132);
PTCKEY_PAGEDOWN: KeyBufAdd(#0#118);
+ PTCKEY_BACKQUOTE:
+ if KeyMode = kmFPWINCRT then
+ KeyBufAdd(#0#41);
+ PTCKEY_TAB:
+ if KeyMode in [kmGO32, kmFPWINCRT] then
+ KeyBufAdd(#0#148);
+ PTCKEY_SEMICOLON:
+ if KeyMode = kmFPWINCRT then
+ KeyBufAdd(#0#39);
+ PTCKEY_QUOTE:
+ if KeyMode = kmFPWINCRT then
+ KeyBufAdd(#0#40);
+ PTCKEY_COMMA:
+ if KeyMode = kmFPWINCRT then
+ KeyBufAdd(#0#51);
+ PTCKEY_PERIOD:
+ if KeyMode = kmFPWINCRT then
+ KeyBufAdd(#0#52);
+ PTCKEY_SLASH:
+ if KeyMode = kmFPWINCRT then
+ KeyBufAdd(#0#149);
+ PTCKEY_INSERT:
+ if KeyMode in [kmGO32, kmFPWINCRT] then
+ KeyBufAdd(#0#146);
+ PTCKEY_DELETE:
+ if KeyMode in [kmGO32, kmFPWINCRT] then
+ KeyBufAdd(#0#147);
+ PTCKEY_UP:
+ if KeyMode in [kmGO32, kmFPWINCRT] then
+ KeyBufAdd(#0#141);
+ PTCKEY_DOWN:
+ if KeyMode in [kmGO32, kmFPWINCRT] then
+ KeyBufAdd(#0#145);
+ PTCKEY_DIVIDE:
+ if KeyMode in [kmGO32, kmFPWINCRT] then
+ KeyBufAdd(#0#149);
+ PTCKEY_MULTIPLY:
+ if KeyMode in [kmGO32, kmFPWINCRT] then
+ KeyBufAdd(#0#150);
+ PTCKEY_SUBTRACT:
+ if KeyMode in [kmGO32, kmFPWINCRT] then
+ KeyBufAdd(#0#142);
+ PTCKEY_ADD:
+ if KeyMode = kmFPWINCRT then
+ KeyBufAdd(#0#78)
+ else if KeyMode = kmGO32 then
+ KeyBufAdd(#0#144);
end;
end
else
@@ -254,6 +436,12 @@ begin
PTCKEY_F8: KeyBufAdd(#0#91);
PTCKEY_F9: KeyBufAdd(#0#92);
PTCKEY_F10: KeyBufAdd(#0#93);
+ PTCKEY_F11:
+ if KeyMode in [kmGO32, kmFPWINCRT] then
+ KeyBufAdd(#0#135);
+ PTCKEY_F12:
+ if KeyMode in [kmGO32, kmFPWINCRT] then
+ KeyBufAdd(#0#136);
PTCKEY_BACKSPACE: KeyBufAdd(#8);
PTCKEY_TAB: KeyBufAdd(#0#15);
PTCKEY_ENTER: KeyBufAdd(#13);
@@ -286,6 +474,12 @@ begin
PTCKEY_F8: KeyBufAdd(#0#66);
PTCKEY_F9: KeyBufAdd(#0#67);
PTCKEY_F10: KeyBufAdd(#0#68);
+ PTCKEY_F11:
+ if KeyMode in [kmGO32, kmFPWINCRT] then
+ KeyBufAdd(#0#133);
+ PTCKEY_F12:
+ if KeyMode in [kmGO32, kmFPWINCRT] then
+ KeyBufAdd(#0#134);
PTCKEY_BACKSPACE: KeyBufAdd(#8);
PTCKEY_TAB: KeyBufAdd(#9);
PTCKEY_ENTER: KeyBufAdd(#13);
diff --git a/packages/ptc/docs/CHANGES.txt b/packages/ptc/docs/CHANGES.txt
index 4672a10be7..c414a657ec 100644
--- a/packages/ptc/docs/CHANGES.txt
+++ b/packages/ptc/docs/CHANGES.txt
@@ -12,16 +12,18 @@
then focusing back to it with a mouse click.
- new key modifiers added for distinguishing between left and right shift,
control and alt, the status of num lock, caps lock and scroll lock and for
- distinguishing numpad keys and dead keys. All of them are implemented as
- elements in the ModifierKeys set, which was added to IPTCKeyEvent. They can
- be checked, for example, with:
+ distinguishing right keys (e.g. right shift, right alt, right ctrl),
+ numpad keys and dead keys. All of them are implemented as elements in the
+ ModifierKeys set, which was added to IPTCKeyEvent. They can be checked,
+ for example, with:
if pmkNumLockActive in key_event.ModifierKeys then
...
The following modifiers are available:
pmkAlt, pmkShift, pmkControl, pmkLeftAlt, pmkRightAlt, pmkLeftShift,
pmkRightShift, pmkLeftControl, pmkRightControl, pmkNumLockActive,
pmkNumLockPressed, pmkCapsLockActive, pmkCapsLockPressed,
- pmkScrollLockActive, pmkScrollLockPressed, pmkNumPadKey, pmkDeadKey
+ pmkScrollLockActive, pmkScrollLockPressed, pmkRightKey, pmkNumPadKey,
+ pmkDeadKey
- there is now a MoveMouseTo method, added to the console. It can be used to
warp the mouse cursor to a different location.
- added support for a relative mouse mode. It supports continuous mouse
@@ -43,6 +45,20 @@
PTCMouseButton9 - "forward" button ("X button 2")
The remaining mouse buttons are hardware specific and will vary, depending
on the actual mouse (provided it has that many buttons at all).
+ - ptccrt now supports several keyboard input modes, which can be set by
+ changing the new global variable KeyMode. The following values are supported:
+ kmTP7 - behaves like Turbo Pascal 7's CRT unit under DOS. This is the
+ default value. Previous versions of ptccrt always behaved this
+ way. Since TP7's CRT unit doesn't support the Enhanced
+ Keyboard, several keys (e.g. F11 and F12) and key combinations
+ are intentionally not recognized for compatibility reasons.
+ kmGO32 - behaves like Free Pascal's CRT unit under DOS (GO32V2). It has
+ Enhanced Keyboard support.
+ kmFPWINCRT - behaves like Free Pascal's CRT unit under Windows. Similar to
+ kmGO32, but emulates several incompatibilities that the
+ Windows CRT unit has with the GO32V2 CRT unit. Not all of them
+ are emulated though, since some of them can be considered
+ bugs.
- ptcgraph now has a global string variable WindowTitle, which allows you to
set the window title, before calling InitGraph
- ptcgraph was extended to also support resolutions, different than the ones,
diff --git a/packages/ptc/src/core/keyeventd.inc b/packages/ptc/src/core/keyeventd.inc
index 1e268ee0a5..add306b39f 100644
--- a/packages/ptc/src/core/keyeventd.inc
+++ b/packages/ptc/src/core/keyeventd.inc
@@ -36,7 +36,7 @@ type
pmkNumLockActive, pmkNumLockPressed,
pmkCapsLockActive, pmkCapsLockPressed,
pmkScrollLockActive, pmkScrollLockPressed,
- pmkNumPadKey,pmkDeadKey);
+ pmkRightKey, pmkNumPadKey, pmkDeadKey);
TPTCModifierKeys = set of TPTCModifierKey;
IPTCKeyEvent = interface(IPTCEvent)
['{9BD1CD41-1DF6-4392-99DC-885EADB6D85A}']
diff --git a/packages/ptc/src/win32/base/win32kbd.inc b/packages/ptc/src/win32/base/win32kbd.inc
index 1f00599a42..6b5c648f9a 100644
--- a/packages/ptc/src/win32/base/win32kbd.inc
+++ b/packages/ptc/src/win32/base/win32kbd.inc
@@ -82,8 +82,10 @@ var
TranslatedCharacters, TranslatedWideCharacters: Integer;
WideStr: WideString;
KeyCode: Integer;
+ ScanCodeB: Byte;
ExtendedKey, DeadKey: Boolean;
ModifierKeys: TPTCModifierKeys;
+ tmpUINT: UINT;
begin
Result := 0;
{ check enabled flag }
@@ -94,6 +96,7 @@ begin
if (message = WM_KEYDOWN) or (message = WM_KEYUP) or (message = WM_SYSKEYDOWN) or (message = WM_SYSKEYUP) then
begin
press := (message = WM_KEYDOWN) or (message = WM_SYSKEYDOWN);
+ ScanCodeB := Byte(lParam shr 16);
ExtendedKey := (lParam and (1 shl 24)) <> 0;
ModifierKeys := [];
@@ -187,6 +190,24 @@ begin
if ExtendedKey then
Include(ModifierKeys, pmkNumPadKey);
end;
+ if wParam = VK_SHIFT then
+ begin
+ tmpUINT := MapVirtualKey(ScanCodeB, MAPVK_VSC_TO_VK_EX);
+ if tmpUINT <> 0 then
+ begin
+ { Windows NT 4.0/2000+ }
+ if tmpUINT = VK_RSHIFT then
+ Include(ModifierKeys, pmkRightKey);
+ end
+ else
+ begin
+ { Windows 98 }
+ if ScanCodeB = 54 then
+ Include(ModifierKeys, pmkRightKey);
+ end;
+ end;
+ if ExtendedKey and (wParam in [VK_MENU,VK_CONTROL]) then
+ Include(ModifierKeys, pmkRightKey);
if not ExtendedKey and
(wParam in [VK_LEFT,VK_RIGHT,VK_UP,VK_DOWN,VK_INSERT,VK_DELETE,
VK_HOME,VK_END,VK_PRIOR,VK_NEXT]) then
diff --git a/packages/ptc/src/x11/x11displayi.inc b/packages/ptc/src/x11/x11displayi.inc
index 48543f5965..010a097633 100644
--- a/packages/ptc/src/x11/x11displayi.inc
+++ b/packages/ptc/src/x11/x11displayi.inc
@@ -410,6 +410,7 @@ begin
FNormalKeys[$FF and XK_semicolon] := Integer(PTCKEY_SEMICOLON);
FNormalKeys[$FF and XK_equal] := Integer(PTCKEY_EQUALS);
FNormalKeys[$FF and XK_grave] := Integer(PTCKEY_BACKQUOTE);
+ FNormalKeys[$FF and XK_apostrophe] := Integer(PTCKEY_QUOTE);
FNormalKeys[$FF and XK_bracketleft] := Integer(PTCKEY_OPENBRACKET);
FNormalKeys[$FF and XK_backslash] := Integer(PTCKEY_BACKSLASH);
@@ -492,6 +493,11 @@ begin
press := False;
uni := -1;
end;
+ if (sym_modded = XK_Shift_R) or
+ (sym_modded = XK_Control_R) or
+ (sym_modded = XK_Meta_R) or
+ (sym_modded = XK_Alt_R) then
+ Include(modkeys, pmkRightKey);
if (sym_modded = XK_KP_Insert) or
(sym_modded = XK_KP_Delete) or
(sym_modded = XK_KP_Home) or
diff --git a/packages/ptc/tests/crtkeys/crtkeys.pas b/packages/ptc/tests/crtkeys/crtkeys.pas
new file mode 100644
index 0000000000..d933bbb763
--- /dev/null
+++ b/packages/ptc/tests/crtkeys/crtkeys.pas
@@ -0,0 +1,19 @@
+program crtkeys;
+uses
+ crt;
+var
+ Ch, Ex: Char;
+ Done: Boolean;
+begin
+ Done := False;
+ repeat
+ Ch := ReadKey;
+ if Ch = #0 then
+ Ex := ReadKey
+ else
+ Ex := #0;
+ Writeln(Ord(Ch), ' ', Ord(Ex));
+ if Ch = 'q' then
+ Done := True;
+ until Done;
+end.
diff --git a/packages/ptc/tests/crtkeys/crtkeys_fpwincrt.txt b/packages/ptc/tests/crtkeys/crtkeys_fpwincrt.txt
new file mode 100644
index 0000000000..124ededad7
--- /dev/null
+++ b/packages/ptc/tests/crtkeys/crtkeys_fpwincrt.txt
@@ -0,0 +1,124 @@
+Test results from the Win32 crt unit (from FPC 3.0.2), run under 32-bit Windows 7, US keyboard:
+
+Ctrl in the table means: Ctrl or Ctrl+Shift
+Alt in the table means: Alt or Alt+Shift or Alt+Ctrl or Alt+Ctrl+Shift
+
+key | - |Shift|Ctrl |Alt |NumLk|NumLk|NumLk|NumLk|
+ | | | | | |Shift|Ctrl |Alt |
+-------------------+-----+-----+-----+-----+-----+-----+-----+-----+
+Esc |27 0 |27 0 |*WIN*|*WIN*|27 0 |27 0 |*WIN*|*WIN*|
+F1 |0 59 |0 84 |0 94 |0 104|0 59 |0 84 |0 94 |0 104|
+F2 |0 60 |0 85 |0 95 |0 105|0 60 |0 85 |0 95 |0 105|
+F3 |0 61 |0 86 |0 96 |0 106|0 61 |0 86 |0 96 |0 106|
+F4 |0 62 |0 87 |0 97 |0 107|0 62 |0 87 |0 97 |0 107|
+F5 |0 63 |0 88 |0 98 |0 108|0 63 |0 88 |0 98 |0 108|
+F6 |0 64 |0 89 |0 99 |0 109|0 64 |0 89 |0 99 |0 109|
+F7 |0 65 |0 90 |0 100|0 110|0 65 |0 90 |0 100|0 110|
+F8 |0 66 |0 91 |0 101|0 111|0 66 |0 91 |0 101|0 111|
+F9 |0 67 |0 92 |0 102|0 112|0 67 |0 92 |0 102|0 112|
+F10 |0 68 |0 93 |0 103|0 113|0 68 |0 93 |0 103|0 113|
+F11 |0 133|0 135|0 137|0 139|0 133|0 135|0 137|0 139|
+F12 |0 134|0 136|0 138|0 140|0 134|0 136|0 138|0 140|
+Print Screen/SysRq | | | | | | | | |
+Scroll Lock | | |*BRK*| | | |*BRK*| |
+Pause/Break | | |*BRK*| | | |*BRK*| |
+` |96 0 |126 0|0 41 |0 41 |96 0 |126 0|0 41 |0 41 |
+1 |49 0 |33 0 |0 2 |0 120|49 0 |33 0 |0 2 |0 120|
+2 |50 0 |64 0 |0 3 |0 121|50 0 |64 0 |0 3 |0 121|
+3 |51 0 |35 0 |0 4 |0 122|51 0 |35 0 |0 4 |0 122|
+4 |52 0 |36 0 |0 5 |0 123|52 0 |36 0 |0 5 |0 123|
+5 |53 0 |37 0 |0 6 |0 124|53 0 |37 0 |0 6 |0 124|
+6 |54 0 |94 0 |0 7 |0 125|54 0 |94 0 |0 7 |0 125|
+7 |55 0 |38 0 |0 8 |0 126|55 0 |38 0 |0 8 |0 126|
+8 |56 0 |42 0 |0 9 |0 127|56 0 |42 0 |0 9 |0 127|
+9 |57 0 |40 0 |0 10 |0 128|57 0 |40 0 |0 10 |0 128|
+0 |48 0 |41 0 |0 11 |0 129|48 0 |41 0 |0 11 |0 129|
+- |45 0 |95 0 |0 12 |0 130|45 0 |95 0 |0 12 |0 130|
+= |61 0 |43 0 |0 13 |0 131|61 0 |43 0 |0 13 |0 131|
+<- Backspace |8 0 |8 0 |127 0|0 14 |8 0 |8 0 |127 0|0 14 |
+Tab |9 0 |0 15 |0 148|*WIN*|9 0 |0 15 |0 148|*WIN*|
+q |113 0|81 0 |17 0 |0 16 |113 0|81 0 |17 0 |0 16 |
+w |119 0|87 0 |23 0 |0 17 |119 0|87 0 |23 0 |0 17 |
+e |101 0|69 0 |5 0 |0 18 |101 0|69 0 |5 0 |0 18 |
+r |114 0|82 0 |18 0 |0 19 |114 0|82 0 |18 0 |0 19 |
+t |116 0|84 0 |20 0 |0 20 |116 0|84 0 |20 0 |0 20 |
+y |121 0|89 0 |25 0 |0 21 |121 0|89 0 |25 0 |0 21 |
+u |117 0|85 0 |21 0 |0 22 |117 0|85 0 |21 0 |0 22 |
+i |105 0|73 0 |9 0 |0 23 |105 0|73 0 |9 0 |0 23 |
+o |111 0|79 0 |15 0 |0 24 |111 0|79 0 |15 0 |0 24 |
+p |112 0|80 0 |16 0 |0 25 |112 0|80 0 |16 0 |0 25 |
+[ |91 0 |123 0|27 0 |0 26 |91 0 |123 0|27 0 |0 26 |
+] |93 0 |125 0|29 0 |0 27 |93 0 |125 0|29 0 |0 27 |
+\ |92 0 |124 0|28 0 |0 43 |92 0 |124 0|28 0 |0 43 |
+Caps Lock | | | | | | | | |
+a |97 0 |65 0 |1 0 |0 30 |97 0 |65 0 |1 0 |0 30 |
+s |115 0|83 0 |PAUSE|0 31 |115 0|83 0 |PAUSE|0 31 |
+d |100 0|68 0 |4 0 |0 32 |100 0|68 0 |4 0 |0 32 |
+f |102 0|70 0 |6 0 |0 33 |102 0|70 0 |6 0 |0 33 |
+g |103 0|71 0 |7 0 |0 34 |103 0|71 0 |7 0 |0 34 |
+h |104 0|72 0 |8 0 |0 35 |104 0|72 0 |8 0 |0 35 |
+j |106 0|74 0 |10 0 |0 36 |106 0|74 0 |10 0 |0 36 |
+k |107 0|75 0 |11 0 |0 37 |107 0|75 0 |11 0 |0 37 |
+l |108 0|76 0 |12 0 |0 38 |108 0|76 0 |12 0 |0 38 |
+; |59 0 |58 0 |0 39 |0 39 |59 0 |58 0 |0 39 |0 39 |
+' |39 0 |34 0 |0 40 |0 40 |39 0 |34 0 |0 40 |0 40 |
+Enter |13 0 |13 0 |10 0 |*WIN*|13 0 |13 0 |10 0 |*WIN*|
+Left Shift | | | | | | | | |
+z |122 0|90 0 |26 0 |0 44 |122 0|90 0 |26 0 |0 44 |
+x |120 0|88 0 |24 0 |0 45 |120 0|88 0 |24 0 |0 45 |
+c |99 0 |67 0 |*BRK*|0 46 |99 0 |67 0 |*BRK*|0 46 |
+v |118 0|86 0 |22 0 |0 47 |118 0|86 0 |22 0 |0 47 |
+b |98 0 |66 0 |2 0 |0 48 |98 0 |66 0 |2 0 |0 48 |
+n |110 0|78 0 |14 0 |0 49 |110 0|78 0 |14 0 |0 49 |
+m |109 0|77 0 |13 0 |0 50 |109 0|77 0 |13 0 |0 50 |
+, |44 0 |60 0 |0 51 |0 51 |44 0 |60 0 |0 51 |0 51 |
+. |46 0 |62 0 |0 52 |0 52 |46 0 |62 0 |0 52 |0 52 |
+/ |47 0 |63 0 |0 149|0 164|47 0 |63 0 |0 149|0 164|
+Right Shift | | | | | | | | |
+Left Ctrl | | | | | | | | |
+Left Alt | | | | | | | | |
+Space |32 0 |32 0 |32 0 |*WIN*|32 0 |32 0 |32 0 |*WIN*|
+Right Alt | | | | | | | | |
+Right Ctrl | | | | | | | | |
+Insert |0 82 |0 82 |0 146|NUMSC|0 82 |0 82 |0 146|NUMSC|
+Delete |0 83 |0 83 |0 147|0 163|0 83 |0 83 |0 147|0 163|
+Home |0 71 |0 71 |0 119|NUMSC|0 71 |0 71 |0 119|NUMSC|
+End |0 79 |0 79 |0 117|NUMSC|0 79 |0 79 |0 117|NUMSC|
+Page Up |0 73 |0 73 |0 132|NUMSC|0 73 |0 73 |0 132|NUMSC|
+Page Down |0 81 |0 81 |0 118|NUMSC|0 81 |0 81 |0 118|NUMSC|
+Up Arrow |0 72 |0 72 |0 141|NUMSC|0 72 |0 72 |0 141|NUMSC|
+Left Arrow |0 75 |0 75 |0 115|NUMSC|0 75 |0 75 |0 115|NUMSC|
+Right Arrow |0 77 |0 77 |0 116|NUMSC|0 77 |0 77 |0 116|NUMSC|
+Down Arrow |0 80 |0 80 |0 145|NUMSC|0 80 |0 80 |0 145|NUMSC|
+Num Lock | | | | | | | | |
+Num / |0 53 |0 53 |0 149|0 164|0 53 |0 53 |0 149|0 164|
+Num * |42 0 |42 0 |0 150|0 55 |42 0 |42 0 |0 150|0 55 |
+Num - |45 0 |45 0 |0 142|0 74 |45 0 |45 0 |0 142|0 74 |
+Num + |43 0 |43 0 |0 78 |0 78 |43 0 |43 0 |0 78 |0 78 |
+Num Enter |13 0 |13 0 |10 0 |*WIN*|13 0 |13 0 |10 0 |*WIN*|
+Num 0/Ins |0 82 |0 82 |0 146|NUMSC|48 0 |0 82 |0 146|NUMSC|
+Num ./Del |0 83 |0 83 |0 147|0 163|46 0 |0 83 |0 147|0 163|
+Num 1/End |0 79 |0 79 |0 117|NUMSC|49 0 |0 79 |0 117|NUMSC|
+Num 2/Down Arrow |0 80 |0 80 |0 145|NUMSC|50 0 |0 80 |0 145|NUMSC|
+Num 3/PgDn |0 81 |0 81 |0 118|NUMSC|51 0 |0 81 |0 118|NUMSC|
+Num 4/Left Arrow |0 75 |0 75 |0 115|NUMSC|52 0 |0 75 |0 115|NUMSC|
+Num 5 |0 76 |0 76 |0 143|NUMSC|53 0 |0 76 |0 143|NUMSC|
+Num 6/Right Arrow |0 77 |0 77 |0 116|NUMSC|54 0 |0 77 |0 116|NUMSC|
+Num 7/Home |0 71 |0 71 |0 119|NUMSC|55 0 |0 71 |0 119|NUMSC|
+Num 8/Up Arrow |0 72 |0 72 |0 141|NUMSC|56 0 |0 72 |0 141|NUMSC|
+Num 9/PgUp |0 73 |0 73 |0 132|NUMSC|57 0 |0 73 |0 132|NUMSC|
+
+
+Special:
+ Ctrl+Shift+6: 30 0
+ Ctrl+Shift+-: 31 0
+ Ctrl+Shift+Backspace: 0 14
+ Ctrl+Shift+Space: 0 57
+ Alt+Ctrl+Space: 0 57
+ Alt+Ctrl+Shift+Space: 0 57
+ Alt+Ctrl+Enter: 0 166
+ Alt+Ctrl+Shift+Enter: 0 166
+
+*WIN* = Windows special key
+*BRK* = Ctrl+Break
+NUMSC = Numeric ASCII entry
diff --git a/packages/ptc/tests/crtkeys/crtkeys_go32v2.txt b/packages/ptc/tests/crtkeys/crtkeys_go32v2.txt
new file mode 100644
index 0000000000..7b3f779d38
--- /dev/null
+++ b/packages/ptc/tests/crtkeys/crtkeys_go32v2.txt
@@ -0,0 +1,117 @@
+Test results from the GO32V2 crt unit, run under DOS, on a PS/2 Model 76, 101-key US keyboard:
+
+Ctrl in the table means: Ctrl or Ctrl+Shift
+Alt in the table means: Alt or Alt+Shift or Alt+Ctrl or Alt+Ctrl+Shift
+
+key | - |Shift|Ctrl |Alt |NumLk|NumLk|NumLk|NumLk|
+ | | | | | |Shift|Ctrl |Alt |
+-------------------+-----+-----+-----+-----+-----+-----+-----+-----+
+Esc |27 0 |27 0 |27 0 |0 1 |27 0 |27 0 |27 0 |0 1 |
+F1 |0 59 |0 84 |0 94 |0 104|0 59 |0 84 |0 94 |0 104|
+F2 |0 60 |0 85 |0 95 |0 105|0 60 |0 85 |0 95 |0 105|
+F3 |0 61 |0 86 |0 96 |0 106|0 61 |0 86 |0 96 |0 106|
+F4 |0 62 |0 87 |0 97 |0 107|0 62 |0 87 |0 97 |0 107|
+F5 |0 63 |0 88 |0 98 |0 108|0 63 |0 88 |0 98 |0 108|
+F6 |0 64 |0 89 |0 99 |0 109|0 64 |0 89 |0 99 |0 109|
+F7 |0 65 |0 90 |0 100|0 110|0 65 |0 90 |0 100|0 110|
+F8 |0 66 |0 91 |0 101|0 111|0 66 |0 91 |0 101|0 111|
+F9 |0 67 |0 92 |0 102|0 112|0 67 |0 92 |0 102|0 112|
+F10 |0 68 |0 93 |0 103|0 113|0 68 |0 93 |0 103|0 113|
+F11 |0 133|0 135|0 137|0 139|0 133|0 135|0 137|0 139|
+F12 |0 134|0 136|0 138|0 140|0 134|0 136|0 138|0 140|
+Print Screen/SysRq | | |0 114| | | |0 114| |
+Scroll Lock | | | | | | | | |
+Pause/Break | | |*BRK*| | | |*BRK*| |
+` |96 0 |126 0| |0 41 |96 0 |126 0| |0 41 |
+1 |49 0 |33 0 | |0 120|49 0 |33 0 | |0 120|
+2 |50 0 |64 0 |0 3 |0 121|50 0 |64 0 |0 3 |0 121|
+3 |51 0 |35 0 | |0 122|51 0 |35 0 | |0 122|
+4 |52 0 |36 0 | |0 123|52 0 |36 0 | |0 123|
+5 |53 0 |37 0 | |0 124|53 0 |37 0 | |0 124|
+6 |54 0 |94 0 |30 0 |0 125|54 0 |94 0 |30 0 |0 125|
+7 |55 0 |38 0 | |0 126|55 0 |38 0 | |0 126|
+8 |56 0 |42 0 | |0 127|56 0 |42 0 | |0 127|
+9 |57 0 |40 0 | |0 128|57 0 |40 0 | |0 128|
+0 |48 0 |41 0 | |0 129|48 0 |41 0 | |0 129|
+- |45 0 |95 0 |31 0 |0 130|45 0 |95 0 |31 0 |0 130|
+= |61 0 |43 0 | |0 131|61 0 |43 0 | |0 131|
+<- Backspace |8 0 |8 0 |127 0|0 14 |8 0 |8 0 |127 0|0 14 |
+Tab |9 0 |0 15 |0 148|0 165|9 0 |0 15 |0 148|0 165|
+q |113 0|81 0 |17 0 |0 16 |113 0|81 0 |17 0 |0 16 |
+w |119 0|87 0 |23 0 |0 17 |119 0|87 0 |23 0 |0 17 |
+e |101 0|69 0 |5 0 |0 18 |101 0|69 0 |5 0 |0 18 |
+r |114 0|82 0 |18 0 |0 19 |114 0|82 0 |18 0 |0 19 |
+t |116 0|84 0 |20 0 |0 20 |116 0|84 0 |20 0 |0 20 |
+y |121 0|89 0 |25 0 |0 21 |121 0|89 0 |25 0 |0 21 |
+u |117 0|85 0 |21 0 |0 22 |117 0|85 0 |21 0 |0 22 |
+i |105 0|73 0 |9 0 |0 23 |105 0|73 0 |9 0 |0 23 |
+o |111 0|79 0 |15 0 |0 24 |111 0|79 0 |15 0 |0 24 |
+p |112 0|80 0 |16 0 |0 25 |112 0|80 0 |16 0 |0 25 |
+[ |91 0 |123 0|27 0 |0 26 |91 0 |123 0|27 0 |0 26 |
+] |93 0 |125 0|29 0 |0 27 |93 0 |125 0|29 0 |0 27 |
+\ |92 0 |124 0|28 0 |0 43 |92 0 |124 0|28 0 |0 43 |
+Caps Lock | | | | | | | | |
+a |97 0 |65 0 |1 0 |0 30 |97 0 |65 0 |1 0 |0 30 |
+s |115 0|83 0 |19 0 |0 31 |115 0|83 0 |19 0 |0 31 |
+d |100 0|68 0 |4 0 |0 32 |100 0|68 0 |4 0 |0 32 |
+f |102 0|70 0 |6 0 |0 33 |102 0|70 0 |6 0 |0 33 |
+g |103 0|71 0 |7 0 |0 34 |103 0|71 0 |7 0 |0 34 |
+h |104 0|72 0 |8 0 |0 35 |104 0|72 0 |8 0 |0 35 |
+j |106 0|74 0 |10 0 |0 36 |106 0|74 0 |10 0 |0 36 |
+k |107 0|75 0 |11 0 |0 37 |107 0|75 0 |11 0 |0 37 |
+l |108 0|76 0 |12 0 |0 38 |108 0|76 0 |12 0 |0 38 |
+; |59 0 |58 0 | |0 39 |59 0 |58 0 | |0 39 |
+' |39 0 |34 0 | |0 40 |39 0 |34 0 | |0 40 |
+Enter |13 0 |13 0 |10 0 |0 28 |13 0 |13 0 |10 0 |0 28 |
+Left Shift | | | | | | | | |
+z |122 0|90 0 |26 0 |0 44 |122 0|90 0 |26 0 |0 44 |
+x |120 0|88 0 |24 0 |0 45 |120 0|88 0 |24 0 |0 45 |
+c |99 0 |67 0 |3 0 |0 46 |99 0 |67 0 |3 0 |0 46 |
+v |118 0|86 0 |22 0 |0 47 |118 0|86 0 |22 0 |0 47 |
+b |98 0 |66 0 |2 0 |0 48 |98 0 |66 0 |2 0 |0 48 |
+n |110 0|78 0 |14 0 |0 49 |110 0|78 0 |14 0 |0 49 |
+m |109 0|77 0 |13 0 |0 50 |109 0|77 0 |13 0 |0 50 |
+, |44 0 |60 0 | |0 51 |44 0 |60 0 | |0 51 |
+. |46 0 |62 0 | |0 52 |46 0 |62 0 | |0 52 |
+/ |47 0 |63 0 | |0 53 |47 0 |63 0 | |0 53 |
+Right Shift | | | | | | | | |
+Left Ctrl | | | | | | | | |
+Left Alt | | | | | | | | |
+Space |32 0 |32 0 |32 0 |32 0 |32 0 |32 0 |32 0 |32 0 |
+Right Alt | | | | | | | | |
+Right Ctrl | | | | | | | | |
+Insert |0 82 |0 82 |0 146|0 162|0 82 |0 82 |0 146|0 162|
+Delete |0 83 |0 83 |0 147|0 163|0 83 |0 83 |0 147|0 163|
+Home |0 71 |0 71 |0 119|0 151|0 71 |0 71 |0 119|0 151|
+End |0 79 |0 79 |0 117|0 159|0 79 |0 79 |0 117|0 159|
+Page Up |0 73 |0 73 |0 132|0 153|0 73 |0 73 |0 132|0 153|
+Page Down |0 81 |0 81 |0 118|0 161|0 81 |0 81 |0 118|0 161|
+Up Arrow |0 72 |0 72 |0 141|0 152|0 72 |0 72 |0 141|0 152|
+Left Arrow |0 75 |0 75 |0 115|0 155|0 75 |0 75 |0 115|0 155|
+Right Arrow |0 77 |0 77 |0 116|0 157|0 77 |0 77 |0 116|0 157|
+Down Arrow |0 80 |0 80 |0 145|0 160|0 80 |0 80 |0 145|0 160|
+Num Lock | | | | | | | | |
+Num / |47 0 |47 0 |0 149|0 164|47 0 |47 0 |0 149|0 164|
+Num * |42 0 |42 0 |0 150|0 55 |42 0 |42 0 |0 150|0 55 |
+Num - |45 0 |45 0 |0 142|0 74 |45 0 |45 0 |0 142|0 74 |
+Num + |43 0 |43 0 |0 144|0 78 |43 0 |43 0 |0 144|0 78 |
+Num Enter |13 0 |13 0 |10 0 |0 166|13 0 |13 0 |10 0 |0 166|
+Num 0/Ins |0 82 |48 0 |0 146|NUMSC|48 0 |0 82 |0 146|NUMSC|
+Num ./Del |0 83 |46 0 |0 147| |46 0 |0 83 |0 147| |
+Num 1/End |0 79 |49 0 |0 117|NUMSC|49 0 |0 79 |0 117|NUMSC|
+Num 2/Down Arrow |0 80 |50 0 |0 145|NUMSC|50 0 |0 80 |0 145|NUMSC|
+Num 3/PgDn |0 81 |51 0 |0 118|NUMSC|51 0 |0 81 |0 118|NUMSC|
+Num 4/Left Arrow |0 75 |52 0 |0 115|NUMSC|52 0 |0 75 |0 115|NUMSC|
+Num 5 |0 76 |53 0 |0 143|NUMSC|53 0 |0 76 |0 143|NUMSC|
+Num 6/Right Arrow |0 77 |54 0 |0 116|NUMSC|54 0 |0 77 |0 116|NUMSC|
+Num 7/Home |0 71 |55 0 |0 119|NUMSC|55 0 |0 71 |0 119|NUMSC|
+Num 8/Up Arrow |0 72 |56 0 |0 141|NUMSC|56 0 |0 72 |0 141|NUMSC|
+Num 9/PgUp |0 73 |57 0 |0 132|NUMSC|57 0 |0 73 |0 132|NUMSC|
+
+
+Special:
+ Ctrl+Alt+Caps or Ctrl+Alt+Shift+Caps: 0 64
+ Ctrl+Alt+Del or Ctrl+Alt+Shift+Del: reboot
+
+*BRK* = Ctrl+Break
+NUMSC = Numeric ASCII entry
diff --git a/packages/ptc/tests/crtkeys/crtkeys_tp7.txt b/packages/ptc/tests/crtkeys/crtkeys_tp7.txt
new file mode 100644
index 0000000000..c021f4750f
--- /dev/null
+++ b/packages/ptc/tests/crtkeys/crtkeys_tp7.txt
@@ -0,0 +1,116 @@
+Test results from the Turbo Pascal 7 crt unit, run under DOS, on a PS/2 Model 76, 101-key US keyboard:
+
+Ctrl in the table means: Ctrl or Ctrl+Shift
+Alt in the table means: Alt or Alt+Shift or Alt+Ctrl or Alt+Ctrl+Shift
+
+key | - |Shift|Ctrl |Alt |NumLk|NumLk|NumLk|NumLk|
+ | | | | | |Shift|Ctrl |Alt |
+-------------------+-----+-----+-----+-----+-----+-----+-----+-----+
+Esc |27 0 |27 0 |27 0 | |27 0 |27 0 |27 0 | |
+F1 |0 59 |0 84 |0 94 |0 104|0 59 |0 84 |0 94 |0 104|
+F2 |0 60 |0 85 |0 95 |0 105|0 60 |0 85 |0 95 |0 105|
+F3 |0 61 |0 86 |0 96 |0 106|0 61 |0 86 |0 96 |0 106|
+F4 |0 62 |0 87 |0 97 |0 107|0 62 |0 87 |0 97 |0 107|
+F5 |0 63 |0 88 |0 98 |0 108|0 63 |0 88 |0 98 |0 108|
+F6 |0 64 |0 89 |0 99 |0 109|0 64 |0 89 |0 99 |0 109|
+F7 |0 65 |0 90 |0 100|0 110|0 65 |0 90 |0 100|0 110|
+F8 |0 66 |0 91 |0 101|0 111|0 66 |0 91 |0 101|0 111|
+F9 |0 67 |0 92 |0 102|0 112|0 67 |0 92 |0 102|0 112|
+F10 |0 68 |0 93 |0 103|0 113|0 68 |0 93 |0 103|0 113|
+F11 | | | | | | | | |
+F12 | | | | | | | | |
+Print Screen/SysRq | | |0 114| | | |0 114| |
+Scroll Lock | | | | | | | | |
+Pause/Break | | |*BRK*| | | |*BRK*| |
+` |96 0 |126 0| | |96 0 |126 0| | |
+1 |49 0 |33 0 | |0 120|49 0 |33 0 | |0 120|
+2 |50 0 |64 0 |0 3 |0 121|50 0 |64 0 |0 3 |0 121|
+3 |51 0 |35 0 | |0 122|51 0 |35 0 | |0 122|
+4 |52 0 |36 0 | |0 123|52 0 |36 0 | |0 123|
+5 |53 0 |37 0 | |0 124|53 0 |37 0 | |0 124|
+6 |54 0 |94 0 |30 0 |0 125|54 0 |94 0 |30 0 |0 125|
+7 |55 0 |38 0 | |0 126|55 0 |38 0 | |0 126|
+8 |56 0 |42 0 | |0 127|56 0 |42 0 | |0 127|
+9 |57 0 |40 0 | |0 128|57 0 |40 0 | |0 128|
+0 |48 0 |41 0 | |0 129|48 0 |41 0 | |0 129|
+- |45 0 |95 0 |31 0 |0 130|45 0 |95 0 |31 0 |0 130|
+= |61 0 |43 0 | |0 131|61 0 |43 0 | |0 131|
+<- Backspace |8 0 |8 0 |127 0| |8 0 |8 0 |127 0| |
+Tab |9 0 |0 15 | | |9 0 |0 15 | | |
+q |113 0|81 0 |17 0 |0 16 |113 0|81 0 |17 0 |0 16 |
+w |119 0|87 0 |23 0 |0 17 |119 0|87 0 |23 0 |0 17 |
+e |101 0|69 0 |5 0 |0 18 |101 0|69 0 |5 0 |0 18 |
+r |114 0|82 0 |18 0 |0 19 |114 0|82 0 |18 0 |0 19 |
+t |116 0|84 0 |20 0 |0 20 |116 0|84 0 |20 0 |0 20 |
+y |121 0|89 0 |25 0 |0 21 |121 0|89 0 |25 0 |0 21 |
+u |117 0|85 0 |21 0 |0 22 |117 0|85 0 |21 0 |0 22 |
+i |105 0|73 0 |9 0 |0 23 |105 0|73 0 |9 0 |0 23 |
+o |111 0|79 0 |15 0 |0 24 |111 0|79 0 |15 0 |0 24 |
+p |112 0|80 0 |16 0 |0 25 |112 0|80 0 |16 0 |0 25 |
+[ |91 0 |123 0|27 0 | |91 0 |123 0|27 0 | |
+] |93 0 |125 0|29 0 | |93 0 |125 0|29 0 | |
+\ |92 0 |124 0|28 0 | |92 0 |124 0|28 0 | |
+Caps Lock | | | | | | | | |
+a |97 0 |65 0 |1 0 |0 30 |97 0 |65 0 |1 0 |0 30 |
+s |115 0|83 0 |19 0 |0 31 |115 0|83 0 |19 0 |0 31 |
+d |100 0|68 0 |4 0 |0 32 |100 0|68 0 |4 0 |0 32 |
+f |102 0|70 0 |6 0 |0 33 |102 0|70 0 |6 0 |0 33 |
+g |103 0|71 0 |7 0 |0 34 |103 0|71 0 |7 0 |0 34 |
+h |104 0|72 0 |8 0 |0 35 |104 0|72 0 |8 0 |0 35 |
+j |106 0|74 0 |10 0 |0 36 |106 0|74 0 |10 0 |0 36 |
+k |107 0|75 0 |11 0 |0 37 |107 0|75 0 |11 0 |0 37 |
+l |108 0|76 0 |12 0 |0 38 |108 0|76 0 |12 0 |0 38 |
+; |59 0 |58 0 | | |59 0 |58 0 | | |
+' |39 0 |34 0 | | |39 0 |34 0 | | |
+Enter |13 0 |13 0 |10 0 | |13 0 |13 0 |10 0 | |
+Left Shift | | | | | | | | |
+z |122 0|90 0 |26 0 |0 44 |122 0|90 0 |26 0 |0 44 |
+x |120 0|88 0 |24 0 |0 45 |120 0|88 0 |24 0 |0 45 |
+c |99 0 |67 0 |3 0 |0 46 |99 0 |67 0 |3 0 |0 46 |
+v |118 0|86 0 |22 0 |0 47 |118 0|86 0 |22 0 |0 47 |
+b |98 0 |66 0 |2 0 |0 48 |98 0 |66 0 |2 0 |0 48 |
+n |110 0|78 0 |14 0 |0 49 |110 0|78 0 |14 0 |0 49 |
+m |109 0|77 0 |13 0 |0 50 |109 0|77 0 |13 0 |0 50 |
+, |44 0 |60 0 | | |44 0 |60 0 | | |
+. |46 0 |62 0 | | |46 0 |62 0 | | |
+/ |47 0 |63 0 | | |47 0 |63 0 | | |
+Right Shift | | | | | | | | |
+Left Ctrl | | | | | | | | |
+Left Alt | | | | | | | | |
+Space |32 0 |32 0 |32 0 |32 0 |32 0 |32 0 |32 0 |32 0 |
+Right Alt | | | | | | | | |
+Right Ctrl | | | | | | | | |
+Insert |0 82 |0 82 | | |0 82 |0 82 | | |
+Delete |0 83 |0 83 | | |0 83 |0 83 | | |
+Home |0 71 |0 71 |0 119| |0 71 |0 71 |0 119| |
+End |0 79 |0 79 |0 117| |0 79 |0 79 |0 117| |
+Page Up |0 73 |0 73 |0 132| |0 73 |0 73 |0 132| |
+Page Down |0 81 |0 81 |0 118| |0 81 |0 81 |0 118| |
+Up Arrow |0 72 |0 72 | | |0 72 |0 72 | | |
+Left Arrow |0 75 |0 75 |0 115| |0 75 |0 75 |0 115| |
+Right Arrow |0 77 |0 77 |0 116| |0 77 |0 77 |0 116| |
+Down Arrow |0 80 |0 80 | | |0 80 |0 80 | | |
+Num Lock | | | | | | | | |
+Num / |47 0 |47 0 | | |47 0 |47 0 | | |
+Num * |42 0 |42 0 | | |42 0 |42 0 | | |
+Num - |45 0 |45 0 | | |45 0 |45 0 | | |
+Num + |43 0 |43 0 | | |43 0 |43 0 | | |
+Num Enter |13 0 |13 0 |10 0 | |13 0 |13 0 |10 0 | |
+Num 0/Ins |0 82 |48 0 | |NUMSC|48 0 |0 82 | |NUMSC|
+Num ./Del |0 83 |46 0 | | |46 0 |0 83 | | |
+Num 1/End |0 79 |49 0 |0 117|NUMSC|49 0 |0 79 |0 117|NUMSC|
+Num 2/Down Arrow |0 80 |50 0 | |NUMSC|50 0 |0 80 | |NUMSC|
+Num 3/PgDn |0 81 |51 0 |0 118|NUMSC|51 0 |0 81 |0 118|NUMSC|
+Num 4/Left Arrow |0 75 |52 0 |0 115|NUMSC|52 0 |0 75 |0 115|NUMSC|
+Num 5 | |53 0 | |NUMSC|53 0 | | |NUMSC|
+Num 6/Right Arrow |0 77 |54 0 |0 116|NUMSC|54 0 |0 77 |0 116|NUMSC|
+Num 7/Home |0 71 |55 0 |0 119|NUMSC|55 0 |0 71 |0 119|NUMSC|
+Num 8/Up Arrow |0 72 |56 0 | |NUMSC|56 0 |0 72 | |NUMSC|
+Num 9/PgUp |0 73 |57 0 |0 132|NUMSC|57 0 |0 73 |0 132|NUMSC|
+
+
+Special:
+ Ctrl+Alt+Del or Ctrl+Alt+Shift+Del: reboot
+
+*BRK* = Ctrl+Break
+NUMSC = Numeric ASCII entry
diff --git a/packages/ptc/tests/crtkeys/ptccrtkeys.pas b/packages/ptc/tests/crtkeys/ptccrtkeys.pas
new file mode 100644
index 0000000000..5f962891cf
--- /dev/null
+++ b/packages/ptc/tests/crtkeys/ptccrtkeys.pas
@@ -0,0 +1,33 @@
+program ptccrtkeys;
+uses
+ ptccrt, ptcgraph;
+var
+ Gd, Gm: Integer;
+ Ch, Ex: Char;
+ Done: Boolean;
+begin
+ Gd := VGA;
+ Gm := VGAHi;
+ InitGraph(Gd, Gm, '');
+ Writeln('startup KeyMode (press ''m'' to switch): ', KeyMode);
+ Done := False;
+ repeat
+ Ch := ReadKey;
+ if Ch = #0 then
+ Ex := ReadKey
+ else
+ Ex := #0;
+ Writeln(Ord(Ch), ' ', Ord(Ex));
+ if Ch = 'm' then
+ begin
+ if KeyMode <> High(KeyMode) then
+ KeyMode := Succ(KeyMode)
+ else
+ KeyMode := Low(KeyMode);
+ Writeln('KeyMode: ', KeyMode);
+ end;
+ if Ch = 'q' then
+ Done := True;
+ until Done;
+ CloseGraph;
+end.