home *** CD-ROM | disk | FTP | other *** search
- (* ------------------------------------------------------ *)
- (* 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 *)