Xpacket/XPKEY.PAS

278 lines
8.7 KiB
Plaintext
Executable File
Raw Permalink Blame History

{ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
³ ³
³ X - P a c k e t ³
³ ³
³ ³
³ X P K E Y . P A S ³
³ ³
³ Routinen f<>r die Tastaturabfrage ³
ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ}
Procedure _ReadKey (* var SK : Sondertaste; var VC : char *);
var Code,
Scan : Byte;
Shift : Boolean;
Procedure FunktionsTaste(cch: char);
begin
case cch of
#59 : SK := _F1; #84 : SK := _ShF1; #94 : SK := _CtrlF1;
#60 : SK := _F2; #85 : SK := _ShF2; #95 : SK := _CtrlF2;
#61 : SK := _F3; #86 : SK := _ShF3; #96 : SK := _CtrlF3;
#62 : SK := _F4; #87 : SK := _ShF4; #97 : SK := _CtrlF4;
#63 : SK := _F5; #88 : SK := _ShF5; #98 : SK := _CtrlF5;
#64 : SK := _F6; #89 : SK := _ShF6; #99 : SK := _CtrlF6;
#65 : SK := _F7; #90 : SK := _ShF7; #100 : SK := _CtrlF7;
#66 : SK := _F8; #91 : SK := _ShF8; #101 : SK := _CtrlF8;
#67 : SK := _F9; #92 : SK := _ShF9; #102 : SK := _CtrlF9;
#68 : SK := _F10; #93 : SK := _ShF10; #103 : SK := _CtrlF10;
#133 : SK := _F11; #135 : SK := _ShF11; #137 : SK := _CtrlF11;
#134 : SK := _F12; #136 : SK := _ShF12; #138 : SK := _CtrlF12;
#104 : SK := _AltF1; #120 : SK := _Alt1;
#105 : SK := _AltF2; #121 : SK := _Alt2;
#106 : SK := _AltF3; #122 : SK := _Alt3;
#107 : SK := _AltF4; #123 : SK := _Alt4;
#108 : SK := _AltF5; #124 : SK := _Alt5;
#109 : SK := _AltF6; #125 : SK := _Alt6;
#110 : SK := _AltF7; #126 : SK := _Alt7;
#111 : SK := _AltF8; #127 : SK := _Alt8;
#112 : SK := _AltF9; #128 : SK := _Alt9;
#113 : SK := _AltF10; #129 : SK := _Alt0;
#139 : SK := _AltF11;
#140 : SK := _AltF12;
#16 : SK := _AltQ; #30 : SK := _AltA; #44 : SK := _AltZ;
#17 : SK := _AltW; #31 : SK := _AltS; #45 : SK := _AltX;
#18 : SK := _AltE; #32 : SK := _AltD; #46 : SK := _AltC;
#19 : SK := _AltR; #33 : SK := _AltF; #47 : SK := _AltV;
#20 : SK := _AltT; #34 : SK := _AltG; #48 : SK := _AltB;
#21 : SK := _AltY; #35 : SK := _AltH; #49 : SK := _AltN;
#22 : SK := _AltU; #36 : SK := _AltJ; #50 : SK := _AltM;
#23 : SK := _AltI; #37 : SK := _AltK;
#24 : SK := _AltO; #38 : SK := _AltL;
#25 : SK := _AltP;
#71 : SK := _Home; #114 : SK := _CtrlPrtSc;
#73 : SK := _PgUp; #115 : SK := _CtrlLeft;
#79 : SK := _End; #116 : SK := _CtrlRight;
#81 : SK := _PgDn; #117 : SK := _CtrlEnd;
#82 : SK := _Ins; #118 : SK := _CtrlPgDn;
#83 : SK := _Del; #119 : SK := _CtrlHome;
#72 : SK := _Up; #132 : SK := _CtrlPgUp;
#80 : SK := _Dn;
#77 : SK := _Right;
#75 : SK := _Left;
#15 : SK := _ShTab;
#76 : SK := _Fuenf;
else SK := _Nix;
end; { case }
VC := cch;
if Shift then
begin
case SK of
_Left : SK := _ShLeft;
_Right : SK := _ShRight;
_Up : SK := _ShUp;
_Dn : SK := _ShDn;
_Ins : SK := _ShIns;
_Del : SK := _ShDel;
_Home : SK := _ShHome;
_End : SK := _ShEnd;
_PgUp : SK := _ShPgUp;
_PgDn : SK := _ShPgDn;
end;
end;
end;
Begin
if G^.Makro then MakroKey(SK,VC) else
begin
{-------------------------------------------------------------|
| Status liefert den Status der Sondertasten |
+-------------------------------------------------------------|
| Bit 0 = 1 : Rechte Shift-Taste gedr<64>ckt |
| Bit 1 = 1 : Linke Shift-Taste gedr<64>ckt |
| Bit 2 = 1 : Crtl-Taste gedr<64>ckt |
| Bit 3 = 1 : Alt-Taste gedr<64>ckt |
| Bit 4 = 1 : [Scroll Lock] gedr<64>ckt |
| Bit 5 = 1 : [Num Lock] gedr<64>ckt |
| Bit 6 = 1 : [Caps Lock] gedr<64>ckt |
| Bit 7 = 1 : [Ins] gedr<64>ckt |
+-------------------------------------------------------------}
Case Kbd of
0 : begin
Repeat
{ if OnlHelp then TNCs_pollen; }
Until Key1A <> Key1C;
code := TastPuffer[Key1A];
scan := TastPuffer[Key1A+1];
if Key1A + 2 > $3D then Key1A := $1E
else Key1A := Key1A + 2;
end;
1 : begin
asm
mov ah, $10
int $16
mov code,al
mov scan,ah
end;
end;
2 : begin
asm
mov ah, $00
int $16
mov code,al
mov scan,ah
end;
end;
3 : begin
asm
mov ah,$07
int $21
mov code,al
cmp code,0
jnz @1
mov ah,$07
int $21
mov scan,al
@1:
end;
end;
End;
if (code = $E0) and (scan > 0) then code := $00;
if (code = $F0) and (scan > 0) then code := $00;
VC := Chr(Code);
Shift := (KeyStatus and 3) in [1..3];
if VC = #0 then FunktionsTaste(Chr(scan)) else
begin
case VC of
M1 : SK := _Ret;
^I : SK := _Tab;
^H : SK := _Back;
#27 : SK := _Esc;
else SK := _Andere;
end;
if Shift and (KeyOpt in [1,3]) then
case VC of
'1' : SK := _ShEnd;
'2' : SK := _ShDn;
'3' : SK := _ShPgDn;
'4' : SK := _ShLeft;
'6' : SK := _ShRight;
'7' : SK := _ShHome;
'8' : SK := _ShUp;
'9' : SK := _ShPgUp;
end;
if KeyOpt in [2,3] then
case VC of
'+': if scan = 78 then SK := _Plus;
'-': if scan = 74 then SK := _Minus;
'*': if scan = 55 then SK := _Star;
'/': if scan = 53 then SK := _Slash;
end;
end;
if G^.MakroLearn then Makro_Erlernen(SK,VC);
end;
End;
Function _KeyPressed (* : Boolean *);
Var w : Word;
Begin
Case Kbd of
0 : _KeyPressed := Key1A <> Key1C;
1 : begin
asm
mov ah, $11
int $16
pushf
pop w
and w, $40
end;
_KeyPressed := w = 0;
end;
2 : begin
asm
mov ah, $01
int $16
pushf
pop w
and w, $40
end;
_KeyPressed := w = 0;
end;
3 : _KeyPressed := KeyPressed;
End;
if G^.Makro then _KeyPressed := true;
End;
Procedure MakroKey (* var SK : Sondertaste; var VC : char *);
var Taste : Sondertaste;
Flag : Boolean;
Procedure Init;
Begin
G^.Makro := false;
G^.MakroZeile := '';
SK := _Nix;
VC := #255;
End;
Begin
if G^.MakroZeile = '' then MakroZeile_holen;
if pos(S_ch+B1,G^.MakroZeile) = 1 then
begin
G^.MakroZeile := UpCaseStr(RestStr(G^.MakroZeile));
Taste := _CtrlF1;
Flag := false;
While not Flag and (Taste <> _Key2) do
begin
if Key[Taste].Ta = G^.MakroZeile then
begin
SK := Taste;
VC := Key[Taste].Ze;
Flag := true;
end;
inc(Taste);
end;
if not Flag then
begin
if (pos(CTRL,G^.MakroZeile) = 1) and (length(G^.MakroZeile) = 5) then
begin
VC := G^.MakroZeile[5];
if VC in ['A'..'Z'] then
begin
VC := chr(ord(VC)-64);
SK := _Andere;
Flag := true;
end;
end;
if not Flag then
begin
SK := _Nix;
VC := #255;
end;
end;
G^.MakroZeile := '';
end else
begin
SK := _Andere;
VC := G^.MakroZeile[1];
delete(G^.MakroZeile,1,1);
end;
if G^.MakroFileEnd and (G^.MakroZeile = '') then MakroInit;
End;