home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / 1990 / 06 / tricks / keysim2.pas < prev    next >
Pascal/Delphi Source File  |  1990-03-08  |  4KB  |  123 lines

  1. (* ------------------------------------------------------ *)
  2. (*                      KEYSIM2.PAS                       *)
  3. (*           (c) 1990 Ulf Kepper & TOOLBOX                *)
  4. (* ------------------------------------------------------ *)
  5. PROGRAM KeySim2;
  6. {$M 1024,0,0}
  7.  
  8. USES Dos;
  9.  
  10. CONST LW  = 'C:\DOS\';
  11.       Max = 300;
  12.  
  13. VAR
  14.   OldTmr   : POINTER;
  15.   BuffInd  : INTEGER;
  16.   BuffPtr  : INTEGER;
  17.   Buff     : ARRAY [1..Max] OF RECORD
  18.                                  s1, s2 : BYTE;
  19.                                END;
  20.   i, b     : BYTE;
  21.   Str      : STRING;
  22.   FileName : STRING;
  23.   BSeg     : INTEGER;
  24.         (* Adresse von 'BuffInd','BuffPtr' und 'Buff' für *)
  25.   BOfs     : INTEGER;
  26.         (* spätere Aufrufe von 'KeySim' speichern         *)
  27.   F                 : FILE OF BYTE;
  28.   AllreadyInstalled : BOOLEAN;
  29.  
  30.  
  31.   PROCEDURE TmrInt (Flags, CS, IP, AX, BX, CX, DX,
  32.                     SI, DI, DS, ES, BP : WORD); INTERRUPT;
  33.   BEGIN
  34.                  (* Liegen Zeichen vor, ist das vorherige *)
  35.                  (* bereits ausgeführt                    *)
  36.     IF (Mem[BSeg:BOfs] >= Mem[BSeg: BOfs+2]) AND
  37.        (Mem[$40:$1A] = Mem[$40:$1C]) THEN BEGIN
  38.  
  39.        (* Tastendruck simulieren *)
  40.       Mem[$40:$1C] := Mem[$40:$1C] + 2;
  41.       IF Mem[$40:$1C] >= $3E THEN Mem[$40:$1C] := $1E;
  42.  
  43.        (* Zeichensequenz aus 'Buff' in den Tastaturpuffer *)
  44.        (* einspielen                                      *)
  45.       Mem[$40:Mem[$40:$1C]]   := Mem[BSeg:BOfs+2 *
  46.                                  Mem[BSeg:BOfs+2] + 2];
  47.       Mem[$40:Mem[$40:$1C]+1] := Mem[BSeg:BOfs+2 *
  48.                                  Mem[BSeg:BOfs+2] + 3];
  49.       Inc(Mem[BSeg:BOfs+2]);
  50.     END;
  51.     INLINE($9C/$3E/$FF/$1E/OldTmr);
  52.   END;
  53.  
  54. BEGIN
  55.   FileName := ParamStr(1) + '.Key';
  56.   Assign(F, LW+FileName);
  57. {$I-}
  58.   Reset(F);
  59. {$I+}
  60.   IF IOResult <> 0 THEN BEGIN
  61.     WriteLn (LW+FileName,' nicht gefunden');
  62.     Halt;
  63.   END;
  64.  
  65.   FOR i := 1 TO FileSize(F) DO BEGIN
  66.     Read(F, b);
  67.     Str[i] := Chr(b);
  68.   END;
  69.   Str[0] := Chr(i);
  70.  
  71.   AllreadyInstalled := (MemW[$0:$3F1] = $b000);
  72.  
  73.   IF AllreadyInstalled THEN BEGIN
  74.     BSeg := MemW[$0:$3F3];
  75.     BOfs := MemW[$0:$3F5];
  76.   END ELSE BEGIN
  77.     BSeg := Seg(BuffInd);
  78.     BOfs := Ofs(BuffInd);
  79.     MemW[$0:$3F1] := $b000;
  80.     MemW[$0:$3F3] := BSeg;
  81.     MemW[$0:$3F5] := BOfs;
  82.   END;
  83.  
  84.         (* Überspielen der Zeichensequenz 'Str' in 'Buff' *)
  85.   i := 0;
  86.   REPEAT
  87.     Inc(i);
  88.     IF Str[1] = #0 THEN BEGIN
  89.       FillChar(Mem[BSeg:BOfs+2+2 * i], 1, 0);
  90.       Delete(Str, 1, 1);
  91.       FillChar(Mem[BSeg:BOfs+3+2 * i], 1, Str[1]);
  92.       Delete(Str, 1, 1);
  93.     END ELSE BEGIN
  94.       FillChar(Mem[BSeg: BOfs+2+2 * i], 1, Str[1]);
  95.       FillChar(Mem[BSeg: BOfs+3+2 * i], 1, 0);
  96.       Delete(Str, 1, 1);
  97.     END;
  98.   UNTIL (Str = '') OR (i >= Max);
  99.  
  100.                                 (* Tastaturpuffer löschen *)
  101.   MemW[$40:$1A] := $001E;
  102.   MemW[$40:$1C] := $001E;
  103.  
  104.             (* Erstes Zeichen in Tastaturpuffer schreiben *)
  105.   FillChar(Mem [$40:mem[$40:$1C]], 1, Mem[BSeg:BOfs+4]);
  106.   FillChar(Mem [$40:mem[$40:$1D]], 1, Mem[BSeg:BOfs+5]);
  107.  
  108.       (* Falls nicht schon aktiv, Timerinterrupt umleiten *)
  109.   IF NOT AllreadyInstalled THEN BEGIN
  110.     GetIntVec($1C, OldTmr);
  111.     SetIntVec($1C, @TmrInt);
  112.   END;
  113.  
  114.    (* Start der Ausführung, da nun 'BuffInd' >= 'BuffPtr' *)
  115.   FillChar(Mem[BSeg:BOfs+2], 2, 2);
  116.   FillChar(Mem[BSeg:BOfs  ], 2, i+1);
  117.  
  118.   (* Falls nicht schon aktiv, terminate and stay resident *)
  119.   IF NOT AllreadyInstalled THEN Keep(0);
  120. END.
  121. (* ------------------------------------------------------ *)
  122. (*               Ende von KEYSIM2.PAS                     *)
  123.