mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-11-12 08:49:31 +01:00
169 lines
4.3 KiB
PHP
169 lines
4.3 KiB
PHP
{
|
|
System independent keyboard interface for tp7
|
|
|
|
$Id$
|
|
}
|
|
|
|
procedure InitKeyboard;
|
|
begin
|
|
end;
|
|
|
|
procedure DoneKeyboard;
|
|
begin
|
|
end;
|
|
|
|
function GetKeyEvent: TKeyEvent; assembler;
|
|
asm
|
|
mov ax,[word ptr PendingKeyEvent+0]
|
|
or ax,[word ptr PendingKeyEvent+2]
|
|
je @@1
|
|
mov ax,[word ptr PendingKeyEvent+0]
|
|
mov dx,[word ptr PendingKeyEvent+2]
|
|
mov [word ptr PendingKeyEvent+0],0
|
|
mov [word ptr PendingKeyEvent+2],0
|
|
jmp @@99
|
|
@@1:
|
|
mov ax,40h
|
|
mov es,ax
|
|
mov ah, 10h { get extended key }
|
|
int 16h
|
|
mov dh,3
|
|
mov dl,[byte ptr es:17h] { shift state }
|
|
and dl,0fh
|
|
cmp al,0e0h
|
|
jne @@2
|
|
or ah,ah
|
|
jz @@2
|
|
mov al,0
|
|
@@2:
|
|
@@99:
|
|
end;
|
|
|
|
|
|
function PollKeyEvent: TKeyEvent; assembler;
|
|
asm
|
|
mov ax,[word ptr PendingKeyEvent+0]
|
|
or ax,[word ptr PendingKeyEvent+2]
|
|
je @@1
|
|
mov ax,[word ptr PendingKeyEvent+0]
|
|
mov dx,[word ptr PendingKeyEvent+2]
|
|
jmp @@2
|
|
@@1:
|
|
mov ax,40h
|
|
mov es,ax
|
|
mov ah,11h
|
|
int 16h
|
|
jnz @@2
|
|
xor ax,ax
|
|
xor dx,dx
|
|
jmp @@99
|
|
@@2: mov dh,3
|
|
mov dl,[byte ptr es:17h] { shift state }
|
|
and dl,0fh
|
|
cmp al,0e0h
|
|
jne @@3
|
|
or ah,ah
|
|
jz @@3
|
|
mov al,0
|
|
@@3:
|
|
@@99:
|
|
end;
|
|
|
|
|
|
function PollShiftStateEvent: TKeyEvent;assembler;
|
|
asm
|
|
mov ax,40h
|
|
mov es,ax
|
|
xor dx,dx
|
|
xor ax,ax
|
|
mov dl,byte ptr es:[17h] { shift state}
|
|
and dl,0fh
|
|
end;
|
|
|
|
|
|
{ Function key translation }
|
|
type
|
|
TTranslationEntry = record
|
|
Min, Max: Byte;
|
|
Offset: Word;
|
|
end;
|
|
|
|
const
|
|
TranslationTableEntries = 12;
|
|
TranslationTable: array [1..TranslationTableEntries] of TTranslationEntry =
|
|
((Min: $3B; Max: $44; Offset: kbdF1), { function keys F1-F10 }
|
|
(Min: $54; Max: $5D; Offset: kbdF1), { Shift fn keys F1-F10 }
|
|
(Min: $5E; Max: $67; Offset: kbdF1), { Ctrl fn keys F1-F10 }
|
|
(Min: $68; Max: $71; Offset: kbdF1), { Alt fn keys F1-F10 }
|
|
(Min: $85; Max: $86; Offset: kbdF11), { function keys F11-F12 }
|
|
(Min: $87; Max: $88; Offset: kbdF11), { Shift+function keys F11-F12 }
|
|
(Min: $89; Max: $8A; Offset: kbdF11), { Ctrl+function keys F11-F12 }
|
|
(Min: $8B; Max: $8C; Offset: kbdF11), { Alt+function keys F11-F12 }
|
|
(Min: 71; Max: 73; Offset: kbdHome), { Keypad keys kbdHome-kbdPgUp }
|
|
(Min: 75; Max: 77; Offset: kbdLeft), { Keypad keys kbdLeft-kbdRight }
|
|
(Min: 79; Max: 81; Offset: kbdEnd), { Keypad keys kbdEnd-kbdPgDn }
|
|
(Min: $52; Max: $53; Offset: kbdInsert));
|
|
|
|
|
|
function TranslateKeyEvent(KeyEvent: TKeyEvent): TKeyEvent;
|
|
var
|
|
I: Integer;
|
|
ScanCode: Byte;
|
|
begin
|
|
if KeyEvent and $03000000 = $03000000 then
|
|
begin
|
|
if KeyEvent and $000000FF <> 0 then
|
|
begin
|
|
TranslateKeyEvent := KeyEvent and $00FFFFFF;
|
|
exit;
|
|
end
|
|
else
|
|
begin
|
|
{ This is a function key }
|
|
ScanCode := (KeyEvent and $0000FF00) shr 8;
|
|
for I := 1 to TranslationTableEntries do
|
|
begin
|
|
if (TranslationTable[I].Min <= ScanCode) and (ScanCode <= TranslationTable[I].Max) then
|
|
begin
|
|
TranslateKeyEvent := $02000000 + (KeyEvent and $00FF0000) +
|
|
(ScanCode - TranslationTable[I].Min) + TranslationTable[I].Offset;
|
|
exit;
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
TranslateKeyEvent := KeyEvent;
|
|
end;
|
|
|
|
function TranslateKeyEventUniCode(KeyEvent: TKeyEvent): TKeyEvent;
|
|
begin
|
|
TranslateKeyEventUniCode := KeyEvent;
|
|
ErrorHandler(errKbdNotImplemented, nil);
|
|
end;
|
|
|
|
{
|
|
$Log$
|
|
Revision 1.1 2000-01-06 01:20:31 peter
|
|
* moved out of packages/ back to topdir
|
|
|
|
Revision 1.1 1999/11/24 23:36:38 peter
|
|
* moved to packages dir
|
|
|
|
Revision 1.2 1998/12/12 19:13:13 peter
|
|
* keyboard updates
|
|
* make test target, make all only makes units
|
|
|
|
Revision 1.1 1998/12/04 12:48:57 peter
|
|
* moved some dirs
|
|
|
|
Revision 1.3 1998/11/01 20:28:25 peter
|
|
* fixed strange al=$e0 after int $16 call
|
|
|
|
Revision 1.2 1998/10/28 21:18:27 peter
|
|
* more fixes
|
|
|
|
Revision 1.1 1998/10/26 11:31:49 peter
|
|
+ inital include files
|
|
|
|
}
|