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

    {
     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.

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