{
 BD> I have a loop that goes something like this:

 BD>         uses crt;
 BD>         var c: char;
 BD>             i: integer;
 <skipped>

 BD>   The problem is, if they press anything, the program needs to simulate
 BD> F10 being pressed.  Obviously, if the user hits F10, the loop ends just
 BD> like anything else.  And, if I don't put the c := readkey at the end, I
 BD> get an extra keystroke.

 BD> So...

 BD> can anyone tell me how to put F10 in the keyboard buffer?

Sure, no problem. Here is the routine:
}

Procedure StuffKey(Key : word); assembler;
{$IFNDEF BP70} const Seg0040 = $0040; {$ENDIF}
Asm
  cli
  mov es,Seg0040
  mov di,001Ch
  mov ax,Key
  xchg ah,al
  mov bx,[es:di]
  mov [es:bx],ax
  add byte ptr [es:di],2
  cmp byte ptr [es:di],60
  jle @@1
  mov byte ptr [es:di],30
@@1:
  sti
End; { StuffKey }

{ and here are the values to pass to StuffKey: }

const

  { standard (non-extended) key codes }

  keyNull          = $0000;
  keyBell          = $0700;
  keyEscape        = $1B00;
  keyTab           = $0900;
  keyBackspace     = $0800;
  keySpace         = $2000;
  keyEnter         = $0D00;
  keyCtrlEnter     = $0A00;
  keyCtrlY         = $1900;
  keyA             = $4100;
  keyZ             = $5A00;

  { extended key codes }

  keyUp            = $0048;
  keyDown          = $0050;
  keyLeft          = $004B;
  keyRight         = $004D;
  keyCtrlLeft      = $0073;
  keyCtrlRight     = $0074;
  keyPageUp        = $0049;
  keyPageDown      = $0051;
  keyHome          = $0047;
  keyEnd           = $004F;
  keyDelete        = $0053;
  keyInsert        = $0052;
  keyF1            = $003B;
  keyF2            = $003C;
  keyF3            = $003D;
  keyF4            = $003E;
  keyF5            = $003F;
  keyF6            = $0040;
  keyF7            = $0041;
  keyF8            = $0042;
  keyF9            = $0043;
  keyF10           = $0044;
  keyShiftF1       = $0054;
  keyShiftF2       = $0055;
  keyShiftF3       = $0056;
  keyShiftF4       = $0057;
  keyShiftF5       = $0058;
  keyShiftF6       = $0059;
  keyShiftF7       = $005A;
  keyShiftF8       = $005B;
  keyShiftF9       = $005C;
  keyShiftF10      = $005D;
  keyCtrlF1        = $005E;
  keyCtrlF2        = $005F;
  keyCtrlF3        = $0060;
  keyCtrlF4        = $0061;
  keyCtrlF5        = $0062;
  keyCtrlF6        = $0063;
  keyCtrlF7        = $0064;
  keyCtrlF8        = $0065;
  keyCtrlF9        = $0066;
  keyCtrlF10       = $0067;
  keyAltF1         = $0068;
  keyAltF2         = $0069;
  keyAltF3         = $006A;
  keyAltF4         = $006B;
  keyAltF5         = $006C;
  keyAltF6         = $006D;
  keyAltF7         = $006E;
  keyAltF8         = $006F;
  keyAltF9         = $0070;
  keyAltF10        = $0071;
  keyAltA          = $001E;
  keyAltB          = $0030;
  keyAltC          = $002E;
  keyAltD          = $0020;
  keyAltE          = $0012;
  keyAltF          = $0021;
  keyAltG          = $0022;
  keyAltH          = $0023;
  keyAltI          = $0017;
  keyAltJ          = $0024;
  keyAltK          = $0025;
  keyAltL          = $0026;
  keyAltM          = $0032;
  keyAltN          = $0031;
  keyAltO          = $0018;
  keyAltP          = $0019;
  keyAltQ          = $0010;
  keyAltR          = $0013;
  keyAltS          = $001F;
  keyAltT          = $0014;
  keyAltU          = $0016;
  keyAltV          = $002F;
  keyAltW          = $0011;
  keyAltX          = $002D;
  keyAltY          = $0015;
  keyAltZ          = $002C;


Example:

StuffKey(keyF10);  { will fortunately do the job for ya }

{
 BP> Could someone please give me some source code to stuff a key into the
 BP> keyboard buffer? :)

Here is for you and for SWAG:

{ The following are ASCII and extended key codes that consist of:

  ASCII code:
   hi byte: ASCII key code
   lo byte: zero

  Extended code:
   hi byte: zero
   lo byte: Extended key code
}

const
  { ASCII key codes }

  { standard (non-extended) key codes }

  keyNull          = $0000;
  keyBell          = $0700;
  keyEscape        = $1B00;
  keyTab           = $0900;
  keyBackspace     = $0800;
  keySpace         = $2000;
  keyEnter         = $0D00;
  keyCtrlEnter     = $0A00;
  keyCtrlY         = $1900;
  keyA             = $4100;
  keyZ             = $5A00;

  { extended key codes }

  keyUp            = $0048;
  keyDown          = $0050;
  keyLeft          = $004B;
  keyRight         = $004D;
  keyCtrlLeft      = $0073;
  keyCtrlRight     = $0074;
  keyPageUp        = $0049;
  keyPageDown      = $0051;
  keyHome          = $0047;
  keyEnd           = $004F;
  keyDelete        = $0053;
  keyInsert        = $0052;
  keyF1            = $003B;
  keyF2            = $003C;
  keyF3            = $003D;
  keyF4            = $003E;
  keyF5            = $003F;
  keyF6            = $0040;
  keyF7            = $0041;
  keyF8            = $0042;
  keyF9            = $0043;
  keyF10           = $0044;
  keyShiftF1       = $0054;
  keyShiftF2       = $0055;
  keyShiftF3       = $0056;
  keyShiftF4       = $0057;
  keyShiftF5       = $0058;
  keyShiftF6       = $0059;
  keyShiftF7       = $005A;
  keyShiftF8       = $005B;
  keyShiftF9       = $005C;
  keyShiftF10      = $005D;
  keyCtrlF1        = $005E;
  keyCtrlF2        = $005F;
  keyCtrlF3        = $0060;
  keyCtrlF4        = $0061;
  keyCtrlF5        = $0062;
  keyCtrlF6        = $0063;
  keyCtrlF7        = $0064;
  keyCtrlF8        = $0065;
  keyCtrlF9        = $0066;
  keyCtrlF10       = $0067;
  keyAltF1         = $0068;
  keyAltF2         = $0069;
  keyAltF3         = $006A;
  keyAltF4         = $006B;
  keyAltF5         = $006C;
  keyAltF6         = $006D;
  keyAltF7         = $006E;
  keyAltF8         = $006F;
  keyAltF9         = $0070;
  keyAltF10        = $0071;
  keyAltA          = $001E;
  keyAltB          = $0030;
  keyAltC          = $002E;
  keyAltD          = $0020;
  keyAltE          = $0012;
  keyAltF          = $0021;
  keyAltG          = $0022;
  keyAltH          = $0023;
  keyAltI          = $0017;
  keyAltJ          = $0024;
  keyAltK          = $0025;
  keyAltL          = $0026;
  keyAltM          = $0032;
  keyAltN          = $0031;
  keyAltO          = $0018;
  keyAltP          = $0019;
  keyAltQ          = $0010;
  keyAltR          = $0013;
  keyAltS          = $001F;
  keyAltT          = $0014;
  keyAltU          = $0016;
  keyAltV          = $002F;
  keyAltW          = $0011;
  keyAltX          = $002D;
  keyAltY          = $0015;
  keyAltZ          = $002C;

Procedure StuffKey(Key : word); assembler;
Asm
  cli
  mov es,Seg0040
  mov di,001Ch
  mov ax,Key
  xchg ah,al
  mov bx,es:[di]
  mov es:[bx],ax
  add byte ptr es:[di],2
  cmp byte ptr es:[di],60
  jle @@1
  mov byte ptr [es:di],30
@@1:
  sti
End; { StuffKey }

The above function is BIOS-independant and thus should work on most of the
PC compatibles.

Example:

var S : string;

Function MakeWord(Hi, Lo : byte) : word; assembler;
Asm
  mov ah,Hi
  mov al,Lo
End; { MakeWord }

Begin
  Write('Enter a string: ');
  StuffKey(MakeWord(Ord('H'), 0));
  StuffKey(MakeWord(Ord('e'), 0));
  StuffKey(MakeWord(Ord('l'), 0));
  StuffKey(MakeWord(Ord('l'), 0));
  StuffKey(MakeWord(Ord('o'), 0));
  StuffKey(MakeWord(Ord('!'), 0));
  StuffKey(keyEnter);
  ReadLn(S);
  WriteLn('Oh, you have already typed your string? :O Hmm, smart guy...')
End.

