home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Turbo Toolbox
/
Turbo_Toolbox.iso
/
1990
/
06
/
tricks
/
keysim2.pas
< prev
next >
Wrap
Pascal/Delphi Source File
|
1990-03-08
|
4KB
|
123 lines
(* ------------------------------------------------------ *)
(* KEYSIM2.PAS *)
(* (c) 1990 Ulf Kepper & TOOLBOX *)
(* ------------------------------------------------------ *)
PROGRAM KeySim2;
{$M 1024,0,0}
USES Dos;
CONST LW = 'C:\DOS\';
Max = 300;
VAR
OldTmr : POINTER;
BuffInd : INTEGER;
BuffPtr : INTEGER;
Buff : ARRAY [1..Max] OF RECORD
s1, s2 : BYTE;
END;
i, b : BYTE;
Str : STRING;
FileName : STRING;
BSeg : INTEGER;
(* Adresse von 'BuffInd','BuffPtr' und 'Buff' für *)
BOfs : INTEGER;
(* spätere Aufrufe von 'KeySim' speichern *)
F : FILE OF BYTE;
AllreadyInstalled : BOOLEAN;
PROCEDURE TmrInt (Flags, CS, IP, AX, BX, CX, DX,
SI, DI, DS, ES, BP : WORD); INTERRUPT;
BEGIN
(* Liegen Zeichen vor, ist das vorherige *)
(* bereits ausgeführt *)
IF (Mem[BSeg:BOfs] >= Mem[BSeg: BOfs+2]) AND
(Mem[$40:$1A] = Mem[$40:$1C]) THEN BEGIN
(* Tastendruck simulieren *)
Mem[$40:$1C] := Mem[$40:$1C] + 2;
IF Mem[$40:$1C] >= $3E THEN Mem[$40:$1C] := $1E;
(* Zeichensequenz aus 'Buff' in den Tastaturpuffer *)
(* einspielen *)
Mem[$40:Mem[$40:$1C]] := Mem[BSeg:BOfs+2 *
Mem[BSeg:BOfs+2] + 2];
Mem[$40:Mem[$40:$1C]+1] := Mem[BSeg:BOfs+2 *
Mem[BSeg:BOfs+2] + 3];
Inc(Mem[BSeg:BOfs+2]);
END;
INLINE($9C/$3E/$FF/$1E/OldTmr);
END;
BEGIN
FileName := ParamStr(1) + '.Key';
Assign(F, LW+FileName);
{$I-}
Reset(F);
{$I+}
IF IOResult <> 0 THEN BEGIN
WriteLn (LW+FileName,' nicht gefunden');
Halt;
END;
FOR i := 1 TO FileSize(F) DO BEGIN
Read(F, b);
Str[i] := Chr(b);
END;
Str[0] := Chr(i);
AllreadyInstalled := (MemW[$0:$3F1] = $b000);
IF AllreadyInstalled THEN BEGIN
BSeg := MemW[$0:$3F3];
BOfs := MemW[$0:$3F5];
END ELSE BEGIN
BSeg := Seg(BuffInd);
BOfs := Ofs(BuffInd);
MemW[$0:$3F1] := $b000;
MemW[$0:$3F3] := BSeg;
MemW[$0:$3F5] := BOfs;
END;
(* Überspielen der Zeichensequenz 'Str' in 'Buff' *)
i := 0;
REPEAT
Inc(i);
IF Str[1] = #0 THEN BEGIN
FillChar(Mem[BSeg:BOfs+2+2 * i], 1, 0);
Delete(Str, 1, 1);
FillChar(Mem[BSeg:BOfs+3+2 * i], 1, Str[1]);
Delete(Str, 1, 1);
END ELSE BEGIN
FillChar(Mem[BSeg: BOfs+2+2 * i], 1, Str[1]);
FillChar(Mem[BSeg: BOfs+3+2 * i], 1, 0);
Delete(Str, 1, 1);
END;
UNTIL (Str = '') OR (i >= Max);
(* Tastaturpuffer löschen *)
MemW[$40:$1A] := $001E;
MemW[$40:$1C] := $001E;
(* Erstes Zeichen in Tastaturpuffer schreiben *)
FillChar(Mem [$40:mem[$40:$1C]], 1, Mem[BSeg:BOfs+4]);
FillChar(Mem [$40:mem[$40:$1D]], 1, Mem[BSeg:BOfs+5]);
(* Falls nicht schon aktiv, Timerinterrupt umleiten *)
IF NOT AllreadyInstalled THEN BEGIN
GetIntVec($1C, OldTmr);
SetIntVec($1C, @TmrInt);
END;
(* Start der Ausführung, da nun 'BuffInd' >= 'BuffPtr' *)
FillChar(Mem[BSeg:BOfs+2], 2, 2);
FillChar(Mem[BSeg:BOfs ], 2, i+1);
(* Falls nicht schon aktiv, terminate and stay resident *)
IF NOT AllreadyInstalled THEN Keep(0);
END.
(* ------------------------------------------------------ *)
(* Ende von KEYSIM2.PAS *)