[Back to KEYBOARD SWAG index]  [Back to Main SWAG index]  [Original]

{
   I found the following code in my Utils unit and repackaged into a new
   unit. It compiles and works on my PC, but as Im sure everyone will
   agree, this programming style is rather dirty! It assumes the keyboard
   buffer is in the same location in memory on every pc. I really should
   be using an interrupt but never got around to it.
   Remember that you have a limit of only 16 characters in the buffer.

   Anywayz hope it helps...

   {-----------------------------------CUT HERE------------------------}

UNIT KeyStuff;

Interface

Var
  keyrec : array [1..16] of
             record
               ch ,
               scan : char;
             end absolute $0000:1054;
  KeyPtr1: byte absolute 0000:1050;
  KeyPtr2: byte absolute 0000:1052;

  Procedure AdvanceKeyTail;
  Procedure AdvanceKeyHead;
  procedure FlushBuffer;
  procedure StuffBufferKey(ch,Scan : char);
  procedure StuffBuffer(W:word);
  procedure StuffBufferStr(Str:string);
  function  tail:byte;
  Function  head:byte;

Implementation
uses dos;

Procedure AdvanceKeyTail;
{Moves the keyboard tail ptr forward}
begin
  inc(KeyPtr1,2);
  if keyptr1 > 60 then keyptr1 := 30;
end;

Procedure AdvanceKeyHead;
{Moves the keyboard Head ptr forward.
Turbo's KeyPressed function will now return True}
begin
  inc(KeyPtr2,2);
  if keyptr2 > 60 then keyptr2 := 30;
end;

procedure FlushBuffer;
{Clear Keyboard Buffer}
var Regs: registers;
begin
   with Regs do
   begin
      Ax := ($0c shl 8) or 6;
      Dx := $00ff;
   end;
   Intr($21,Regs);
end;

procedure StuffBufferKey(ch,Scan : char);
{Puts keyboard scan code directly into the buffer
Examples. #65,#0 = Simulate an 'A' being pressed
          #0,#59 = Simulate the F1 key being pressed
}
begin
   keyrec[head].ch := ch;
   keyrec[head].scan := scan;
   AdvanceKeyhead;
end;

procedure StuffBuffer(W:word);
{Put Word directly into the buffer}
begin
   keyrec[head].ch := chr(lo(w));
   keyrec[head].scan := chr(hi(w));
   AdvanceKeyhead;
end;

procedure StuffBufferStr(Str:string);
{Stuffs a string into the buffer. Remember the max of 16 chars.}
var I,L : byte;
begin
   if Str <> '' then
   begin
      I := 1;
      L := length(Str);
      while I <= L do
      begin
         StuffBuffer(ord(Str[I]));
         inc(I);
      end;
   end;
end;

function Tail:byte;
{Returns number between 1 and 16 showing where tail is}
begin
  tail := KeyPtr1 div 2 - 14;
end;

Function Head:byte;
{Returns number between 1 and 16 showing where head is}
begin
  head := KeyPtr2 div 2 - 14;
end;

end.

   {-----------------------------------CUT HERE------------------------}

*********************
Example of use...
*********************

Uses Keystuff;

begin
  StuffBufferStr('Hello There!'#13);
  Write('>');
  Readln;
  halt;
end.

[Back to KEYBOARD SWAG index]  [Back to Main SWAG index]  [Original]