Ich habe eine 20 Jahre alte Unit von mir gefunden zwecks Tastaturabfrage, vielleicht kann davon noch irgend jemand was verwenden.
Hier hab ich auch die Konstanten der Tastencodes festgelegt.
Code: Alles auswählen
 
              {*********************************************}
              { Compiler      : Boorland Pascal 7.0         }
              {               : Turbo Pascal    6.0         }
              { Zielplattform : Protected Mode              }
              {                 und Real Mode               }
              { Update        : 09.02.1998 Siro             }
              { Funktion      : PC-Tastatur-Routinen        }
              {*********************************************}
 
      {-------------------------------------------------------------}
      { fuer Turbo-Pascal muss folgende Zeile hinter IMPLEMENTATION }
      { eingefuegt werden:                                          }
      {                                                             }
      {             CONST Seg0040 = $0040;                          }
      {                                                             }
      { bei Boorland Pascal MUSS diese Zeile entfernt werden        }
      {-------------------------------------------------------------}
 
UNIT KB;
 
INTERFACE
 
CONST Seg0040 = $0040;   { Zeile ausklammern bei Borland Pascal }
 
CONST { Definition der einzelnen Tastencodes }
 
      KB_None       =   0;   { 0 = kein Tastencode }
 
      KB_ESC        =  27;   { Esc  Taste                }
      KB_Space      =  32;   { Leer Taste                }
      KB_Return     =  13;   { Return Taste              }
      KB_Enter      =  13;   { Entertaste = Return Taste }
      KB_BackSlash  =  92;   { Schraegstrich \           }
      KB_BackSpace  =   8;   { Rckschritt               }
      KB_TabRight   =   9;   { Tabulator rechts          }
      KB_TabLeft    = 271;   { Tabulator links, in Verbindung mit Shift }
 
      KB_Left  = 331;        { Cursor Links    }
      KB_Right = 333;        { Cursor Rechts   }
      KB_Home  = 327;        { Cursor Home     }
      KB_End   = 335;        { Cursor End      }
      KB_PgUp  = 329;        { Seite aufw„rts  }
      KB_PgDn  = 337;        { Seite abw„rts   }
      KB_Up    = 328;        { Cursor aufw„rts }
      KB_Down  = 336;        { Cursor abw„rts  }
      KB_Ins   = 338;        { Insert Taste    }
      KB_Del   = 339;        { Delete Taste    }
 
      KB_F1  = 315;          { Funktionstaste F1  }
      KB_F2  = 316;          { Funktionstaste F2  }
      KB_F3  = 317;          { Funktionstaste F3  }
      KB_F4  = 318;          { Funktionstaste F4  }
      KB_F5  = 319;          { Funktionstaste F5  }
      KB_F6  = 320;          { Funktionstaste F6  }
      KB_F7  = 321;          { Funktionstaste F7  }
      KB_F8  = 322;          { Funktionstaste F8  }
      KB_F9  = 323;          { Funktionstaste F9  }
      KB_F10 = 324;          { Funktionstaste F10 }
      KB_F11 = 389;          { Funktionstaste F11 }
      KB_F12 = 390;          { Funktionstaste F12 }
 
      KB_Shift_F1  = 340;    { Funktionstaste F1  mit Shifttaste }
      KB_Shift_F2  = 341;    { Funktionstaste F2  mit Shifttaste }
      KB_Shift_F3  = 342;    { Funktionstaste F3  mit Shifttaste }
      KB_Shift_F4  = 343;    { Funktionstaste F4  mit Shifttaste }
      KB_Shift_F5  = 344;    { Funktionstaste F5  mit Shifttaste }
      KB_Shift_F6  = 345;    { Funktionstaste F6  mit Shifttaste }
      KB_Shift_F7  = 346;    { Funktionstaste F7  mit Shifttaste }
      KB_Shift_F8  = 347;    { Funktionstaste F8  mit Shifttaste }
      KB_Shift_F9  = 348;    { Funktionstaste F9  mit Shifttaste }
      KB_Shift_F10 = 349;    { Funktionstaste F10 mit Shifttaste }
      KB_Shift_F11 = 391;    { Funktionstaste F11 mit Shifttaste }
      KB_Shift_F12 = 392;    { Funktionstaste F12 mit Shifttaste }
 
      KB_CTRL_A =  1;        { "A" Taste mit CTRL-Taste }
      KB_CTRL_B =  2;        { "B" Taste mit CTRL-Taste }
      KB_CTRL_C =  3;        { "C" Taste mit CTRL-Taste }
      KB_CTRL_D =  4;        { "D" Taste mit CTRL-Taste }
      KB_CTRL_E =  5;        { "E" Taste mit CTRL-Taste }
      KB_CTRL_F =  6;        { "F" Taste mit CTRL-Taste }
      KB_CTRL_G =  7;        { "G" Taste mit CTRL-Taste }
      KB_CTRL_H =  8;        { "H" Taste mit CTRL-Taste }
      KB_CTRL_I =  9;        { "I" Taste mit CTRL-Taste }
      KB_CTRL_J = 10;        { "J" Taste mit CTRL-Taste }
      KB_CTRL_K = 11;        { "K" Taste mit CTRL-Taste }
      KB_CTRL_L = 12;        { "L" Taste mit CTRL-Taste }
      KB_CTRL_M = 13;        { "M" Taste mit CTRL-Taste }
      KB_CTRL_N = 14;        { "N" Taste mit CTRL-Taste }
      KB_CTRL_O = 15;        { "O" Taste mit CTRL-Taste }
      KB_CTRL_P = 16;        { "P" Taste mit CTRL-Taste }
      KB_CTRL_Q = 17;        { "Q" Taste mit CTRL-Taste }
      KB_CTRL_R = 18;        { "R" Taste mit CTRL-Taste }
      KB_CTRL_S = 19;        { "S" Taste mit CTRL-Taste }
      KB_CTRL_T = 20;        { "T" Taste mit CTRL-Taste }
      KB_CTRL_U = 21;        { "U" Taste mit CTRL-Taste }
      KB_CTRL_V = 22;        { "V" Taste mit CTRL-Taste }
      KB_CTRL_W = 23;        { "W" Taste mit CTRL-Taste }
      KB_CTRL_X = 24;        { "X" Taste mit CTRL-Taste }
      KB_CTRL_Y = 25;        { "Y" Taste mit CTRL-Taste }
      KB_CTRL_Z = 26;        { "Z" Taste mit CTRL-Taste }
 
      KB_CTRL_F1  = 350;     { Funktionstaste F1  mit CTRL-Taste }
      KB_CTRL_F2  = 351;     { Funktionstaste F2  mit CTRL-Taste }
      KB_CTRL_F3  = 352;     { Funktionstaste F3  mit CTRL-Taste }
      KB_CTRL_F4  = 353;     { Funktionstaste F4  mit CTRL-Taste }
      KB_CTRL_F5  = 354;     { Funktionstaste F5  mit CTRL-Taste }
      KB_CTRL_F6  = 355;     { Funktionstaste F6  mit CTRL-Taste }
      KB_CTRL_F7  = 356;     { Funktionstaste F7  mit CTRL-Taste }
      KB_CTRL_F8  = 357;     { Funktionstaste F8  mit CTRL-Taste }
      KB_CTRL_F9  = 358;     { Funktionstaste F9  mit CTRL-Taste }
      KB_CTRL_F10 = 359;     { Funktionstaste F10 mit CTRL-Taste }
      KB_CTRL_F11 = 393;     { Funktionstaste F11 mit CTRL-Taste }
      KB_CTRL_F12 = 394;     { Funktionstaste F12 mit CTRL-Taste }
 
      KB_CTRL_Left  = 371;   { Cursor Links  mit CTRL-Taste }
      KB_CTRL_Right = 322;   { Cursor Rechts mit CTRL-Taste }
      KB_CTRL_Home  = 375;   { Cursor Home   mit CTRL-Taste }
      KB_CTRL_End   = 373;   { Cursor End    mit CTRL-Taste }
      KB_CTRL_PgUp  = 388;   { PgUp-Taste    mit CTRL-Taste }
      KB_CTRL_PgDn  = 374;   { PgDn-Taste    mit CTRL-Taste }
 
      KB_ALT_1 = 376;        { "1" Taste mit ALT-Taste }
      KB_ALT_2 = 377;        { "2" Taste mit ALT-Taste }
      KB_ALT_3 = 378;        { "3" Taste mit ALT-Taste }
      KB_ALT_4 = 379;        { "4" Taste mit ALT-Taste }
      KB_ALT_5 = 380;        { "5" Taste mit ALT-Taste }
      KB_ALT_6 = 381;        { "6" Taste mit ALT-Taste }
      KB_ALT_7 = 382;        { "7" Taste mit ALT-Taste }
      KB_ALT_8 = 383;        { "8" Taste mit ALT-Taste }
      KB_ALT_9 = 384;        { "9" Taste mit ALT-Taste }
      KB_ALT_0 = 385;        { "0" Taste mit ALT-Taste }
 
      KB_ALT_A = 286;        { "A" Taste mit ALT-Taste }
      KB_ALT_B = 304;        { "B" Taste mit ALT-Taste }
      KB_ALT_C = 302;        { "C" Taste mit ALT-Taste }
      KB_ALT_D = 288;        { "D" Taste mit ALT-Taste }
      KB_ALT_E = 274;        { "E" Taste mit ALT-Taste }
      KB_ALT_F = 289;        { "F" Taste mit ALT-Taste }
      KB_ALT_G = 290;        { "G" Taste mit ALT-Taste }
      KB_ALT_H = 291;        { "H" Taste mit ALT-Taste }
      KB_ALT_I = 279;        { "I" Taste mit ALT-Taste }
      KB_ALT_J = 292;        { "J" Taste mit ALT-Taste }
      KB_ALT_K = 293;        { "K" Taste mit ALT-Taste }
      KB_ALT_L = 294;        { "L" Taste mit ALT-Taste }
      KB_ALT_M = 306;        { "M" Taste mit ALT-Taste }
      KB_ALT_N = 305;        { "N" Taste mit ALT-Taste }
      KB_ALT_O = 280;        { "O" Taste mit ALT-Taste }
      KB_ALT_P = 281;        { "P" Taste mit ALT-Taste }
      KB_ALT_Q = 272;        { "Q" Taste mit ALT-Taste }
      KB_ALT_R = 275;        { "R" Taste mit ALT-Taste }
      KB_ALT_S = 287;        { "S" Taste mit ALT-Taste }
      KB_ALT_T = 276;        { "T" Taste mit ALT-Taste }
      KB_ALT_U = 278;        { "U" Taste mit ALT-Taste }
      KB_ALT_V = 303;        { "V" Taste mit ALT-Taste }
      KB_ALT_W = 273;        { "W" Taste mit ALT-Taste }
      KB_ALT_X = 301;        { "X" Taste mit ALT-Taste }
      KB_ALT_Y = 277;        { "Y" Taste mit ALT-Taste }
      KB_ALT_Z = 44;         { "Z" Taste mit ALT-Taste }
 
      KB_ALT_F1  = 360;      { Funktionstaste F1  mit ALT-Taste }
      KB_ALT_F2  = 361;      { Funktionstaste F2  mit ALT-Taste }
      KB_ALT_F3  = 362;      { Funktionstaste F3  mit ALT-Taste }
      KB_ALT_F4  = 363;      { Funktionstaste F4  mit ALT-Taste }
      KB_ALT_F5  = 364;      { Funktionstaste F5  mit ALT-Taste }
      KB_ALT_F6  = 365;      { Funktionstaste F6  mit ALT-Taste }
      KB_ALT_F7  = 366;      { Funktionstaste F7  mit ALT-Taste }
      KB_ALT_F8  = 367;      { Funktionstaste F8  mit ALT-Taste }
      KB_ALT_F9  = 368;      { Funktionstaste F9  mit ALT-Taste }
      KB_ALT_F10 = 369;      { Funktionstaste F10 mit ALT-Taste }
      KB_ALT_F11 = 395;      { Funktionstaste F11 mit ALT-Taste }
      KB_ALT_F12 = 396;      { Funktionstaste F12 mit ALT-Taste }
 
      KB_ALT_SPACE = 258;    { SPACE Taste mit ALT-TASTE }
      KB_Cursor_5  = 332;    { mittlere Cursor 5 }
 
Type YesNoRangeType   = #13..#127;   { gueltige Character fuer YES NO }
Type KeyCodeRangeType = 1..396;      { gueltige Tastencodes }
 
Procedure KB_Clear;
Procedure KB_Read (Var KeyCode : Word);
Function  KB_Pressed           : Boolean;
Function  KB_CtrlPressed       : Boolean;
Function  KB_AltPressed        : Boolean;
Function  KB_ScrollPressed     : Boolean;
Function  KB_NumPressed        : Boolean;
Function  KB_CapsPressed       : Boolean;
Function  KB_InsPressed        : Boolean;
Function  KB_ShiftPressed      : Boolean;
Function  KB_ShiftRightPressed : Boolean;
Function  KB_ShiftLeftPressed  : Boolean;
 
Function  KB_ScrollActive      : Boolean;
Function  KB_NumActive         : Boolean;
Function  KB_CapsActive        : Boolean;
Function  KB_InsActive         : Boolean;
 
Function  KB_Last:Word;
Procedure KB_Wait      (KeyCode        : KeyCodeRangeType);
Function  KB_YesNo     (YesChar,NoChar : YesNoRangeType):Boolean;
Procedure KB_Put       (KeyCode        : KeyCodeRangeType);
Procedure KB_PutString (S:String);
{****************************************************************************}
 
IMPLEMENTATION 
 
CONST
 
BIOS_READ_PTR  = $001A;  { BIOS-Variable Tastatur-Lesezeiger      0040:001A }
BIOS_LAST_PTR  = $001C;  { BIOS-Variable Zeiger auf letzte Taste  0040:001C }
BIOS_START_PTR = $0080;  { Zeiger auf Start des Tastaturpuffers   0040:0080 }
BIOS_END_PTR   = $0082;  { Zeiger auf Ende  des Tastaturpuffers   0040:0082 }
 
BIOS_STATUS_1  = $0017;  { BIOS-Variable Tastatur-Status-Byte 1   0040:0017 }
BIOS_STATUS_2  = $0018;  { BIOS-Variable Tastatur-Status-Byte 2   0040:0018 }
 
NEW_BUF_OFFSET = $0200;  { neuer Tastaturpuffer Startoffset }
 
Bit_ShiftRight = $01;    { Bits im BIOS Statusbyte }
Bit_ShiftLeft  = $02;
Bit_Shift      = $03;
Bit_Ctrl       = $04;
Bit_Alt        = $08;
Bit_Scroll     = $10;
Bit_Num        = $20;
Bit_Caps       = $40;
Bit_Ins        = $80;
 
VAR
 
OldExitProc     : Pointer;       { Orginal Exit Procedure }
 
org_start_ptr : Word;  { Orginal Start des Tastatur-Puffers }
org_end_ptr   : Word;  { Orginal Ende  des Tastatur-Puffers }
 
LastKey       : Word;  { enth„lt stets die zuletzt gelesene Taste }
                       { die mit Readkey gelesen wurde }
 
Function KB_Last:Word; Assembler;
ASM MOV AX,LastKey
    RET
end;
{============================================================================}
Procedure KB_Clear; Assembler;
 
           { loescht den kompletten Tastaturpuffer }
 
ASM  MOV AX,Seg0040             { Bios Datensegment }
     MOV ES,AX                  { ueber AX }
     PUSHF                      { IRQ-Flag merken }
     CLI                        { Interrupts sperren }
     MOV AX,ES:[BIOS_START_PTR] { AX = Start des Puffers BIOS }
     MOV ES:[BIOS_READ_PTR],AX  { naechstes Zeichen = Pufferstart BIOS }
     MOV ES:[BIOS_LAST_PTR],AX  { letztes   Zeichen = Pufferstart BIOS }
     POPF                       { IRQ-Flag restaurieren }
     RET
end;
{============================================================================}
Function KB_ShiftRightPressed:Boolean; Assembler;
 
 { liefert True, wenn rechte Shifttaste momentan gedrueckt, sonst False. }
 
ASM  XOR  AX,AX                  { False }
     MOV  BX,Seg0040             { Bios Datensegment }
     MOV  ES,BX
     TEST Byte Ptr ES:[BIOS_STATUS_1],Bit_ShiftRight
     JZ   @@1
     INC  AX                     { True }
@@1: RET
end;
{============================================================================}
Function KB_ShiftLeftPressed:Boolean; Assembler;
 
 { liefert True, wenn linke Shifttaste momentan gedrueckt, sonst False. }
 
ASM  XOR  AX,AX                  { False }
     MOV  BX,Seg0040             { Bios Datensegment }
     MOV  ES,BX
     TEST Byte Ptr ES:[BIOS_STATUS_1],Bit_ShiftLeft
     JZ   @@1
     INC  AX                     { True }
@@1: RET
end;
{============================================================================}
Function KB_ShiftPressed:Boolean; Assembler;
 
 { liefert True, wenn eine Shifttaste momentan gedrueckt, sonst False. }
 
ASM  XOR  AX,AX
     MOV  BX,Seg0040             { Bios Datensegment }
     MOV  ES,BX
     TEST Byte Ptr ES:[BIOS_STATUS_1],Bit_Shift
     JZ   @@1
     INC  AX
@@1: RET
end;
{============================================================================}
Function KB_CtrlPressed:Boolean; Assembler;
 
  { liefert True, wenn die CTRL-Taste momentan gedrueckt, sonst False. }
 
ASM  XOR  AX,AX
     MOV  BX,Seg0040             { Bios Datensegment }
     MOV  ES,BX
     TEST Byte Ptr ES:[BIOS_STATUS_1],Bit_Ctrl
     JZ   @@1
     INC  AX
@@1: RET
end;
{============================================================================}
Function KB_AltPressed:Boolean; Assembler;
   { liefert True, wenn die ALT-Taste momentan gedrueckt, sonst False. }
 
ASM  XOR  AX,AX
     MOV  BX,Seg0040             { Bios Datensegment }
     MOV  ES,BX
     TEST Byte Ptr ES:[BIOS_STATUS_1],Bit_Alt
     JZ   @@1
     INC  AX
@@1: RET
end;
{============================================================================}
Function KB_ScrollActive:Boolean; Assembler;
 
   { liefert True, wenn die SCROLL-Taste aktiviert ist, sonst False. }
 
ASM   XOR  AX,AX
      MOV  BX,Seg0040             { Bios Datensegment }
      MOV  ES,BX
      TEST Byte Ptr ES:[BIOS_STATUS_1],Bit_Scroll
      JZ   @@1
      INC  AX
@@1:  RET
end;
{============================================================================}
Function KB_NumActive:Boolean; Assembler;
 
  { liefert True, wenn die NUMLOCK-Taste aktiviert ist, sonst False. }
 
ASM   XOR  AX,AX
      MOV  BX,Seg0040             { Bios Datensegment }
      MOV  ES,BX
      TEST Byte Ptr ES:[BIOS_STATUS_1],Bit_Num
      JZ   @@1
      INC  AX
@@1:  RET
end;
{============================================================================}
Function KB_CapsActive:Boolean; Assembler;
 
   { liefert True, wenn die CAPSLOCK-Taste aktiviert ist, sonst False. }
 
ASM   XOR  AX,AX
      MOV  BX,Seg0040             { Bios Datensegment }
      MOV  ES,BX
      TEST Byte Ptr ES:[BIOS_STATUS_1],Bit_Caps
      JZ   @@1
      INC  AX
@@1:  RET
end;
{============================================================================}
Function KB_InsActive:Boolean; Assembler;
 
  { liefert True, wenn die INSERT-Taste aktiviert ist, sonst False. }
 
ASM   XOR  AX,AX
      MOV  BX,Seg0040             { Bios Datensegment }
      MOV  ES,BX
      TEST Byte Ptr ES:[BIOS_STATUS_1],Bit_Ins
      JZ   @@1
      INC  AX
@@1:  RET
end;
{============================================================================}
Function KB_ScrollPressed:Boolean; Assembler;
 
 { liefert True, wenn die SCROLL-Taste momentan gedrueckt ist, sonst False. }
 
ASM   XOR  AX,AX
      MOV  BX,Seg0040             { Bios Datensegment }
      MOV  ES,BX
      TEST Byte Ptr ES:[BIOS_STATUS_2],Bit_Scroll
      JZ   @@1
      INC  AX
@@1:  RET
end;
{============================================================================}
Function KB_NumPressed:Boolean; Assembler;
 
 { liefert True, wenn die NUMLOCK-Taste momentan gedrueckt ist, sonst False.}
 
ASM   XOR  AX,AX
      MOV  BX,Seg0040             { Bios Datensegment }
      MOV  ES,BX
      TEST Byte Ptr ES:[BIOS_STATUS_2],Bit_Num
      JZ   @@1
      INC  AX
@@1:  RET
end;
{============================================================================}
Function KB_CapsPressed:Boolean; Assembler;
 
 { liefert True, wenn die CAPSLOCK-Taste momentan gedrueckt ist, sonst False. }
 
ASM   XOR  AX,AX
      MOV  BX,Seg0040             { Bios Datensegment }
      MOV  ES,BX
      TEST Byte Ptr ES:[BIOS_STATUS_2],Bit_Caps
      JZ   @@1
      INC  AX
@@1:  RET
end;
{============================================================================}
Function KB_InsPressed:Boolean; Assembler;
 
{ liefert True, wenn die INSERT-Taste momentan gedrueckt ist, sonst False.}
 
ASM   XOR  AX,AX
      MOV  BX,Seg0040             { Bios Datensegment }
      MOV  ES,BX
      TEST Byte Ptr ES:[BIOS_STATUS_2],Bit_Ins
      JZ   @@1
      INC  AX
@@1:  RET
end;
{============================================================================}
Function KB_pressed:Boolean; Assembler;
 
      { liefert TRUE, wenn sich mindestens ein Zeichen im }
      { Tastaturpuffer befindet, ansonsten FALSE.         }
 
ASM    PUSHF                       { IRQ-FLAG merken }
       CLI                         { Interrupts sperren }
       XOR  AX,AX
       MOV  BX,Seg0040             { Bios Datensegment }
       MOV  ES,BX
       MOV  BX,ES:[BIOS_READ_PTR]  { BIOS-Lesezeiger }
       CMP  BX,ES:[BIOS_LAST_PTR]  { = BIOS Letztezeiger ? }
       JE   @@1                    { dann kein Zeichen im Puffer }
       INC  AX                     { sonst TRUE, Zeichen im Puffer }
@@1:   POPF                        { IRQ-Flag restaurieren }
       RET
end;
{============================================================================}
Procedure KB_read(Var KeyCode:Word); ASSEMBLER;
 
   { Liest wenn vorhanden ein Zeichen aus dem Tastaturpuffer }
   { in die uebergebene Variable KeyCode ein.                }
   { Befindet sich kein Zeichen im Tastaturpuffer, so wird   }
   { solange gewartet bis ein Zeichen vorhanden ist.         }
 
ASM         XOR  AX,AX
            MOV  DI,Seg0040             { Bios Datensegment }
            MOV  ES,DI
            MOV  BX,ES:[BIOS_READ_PTR]  { BIOS-Lesezeiger }
@@wait:     CMP  BX,ES:[BIOS_LAST_PTR]  { = BIOS Letztezeiger ? }
            JE   @@wait                 { dann kein Zeichen im Puffer }
            MOV  AX,ES:[BX]             { sonst Code aus Puffer holen }
            CMP  AL,224                 { extended Code ? }
            JE   @@extended             { ja }
            CMP  AL,240                 { extended Code ? }
            JE   @@extended             { ja }
            CMP  AL,0                   { extended Code ? }
            JZ   @@extended             { ja }
            XOR  AH,AH                  { sonst normale Ascii Taste }
            JMP  @@normal
@@extended: MOV  AL,1                   { AL Code + 256 }
            XCHG AL,AH
@@normal:   ADD  BX,2                   { BIOS Lesezeiger + 2 }
            CMP  BX,ES:[BIOS_END_PTR]   { am Ende des BIOS Puffer ? }
            JNE  @@1                    { nein }
            MOV  BX,ES:[BIOS_START_PTR] { sonst an Start des BIOS Puffers }
@@1:        MOV  ES:[BIOS_READ_PTR],BX  { BIOS Lesezeiger speichern }
            LES  BX,KeyCode             { Adresse der Variablen KeyCode }
            MOV  ES:[BX],AX             { KeyCode uebergeben }
            MOV  LastKey,AX             { zuletzt gelesen Taste merken }
end;
{============================================================================}
Procedure KB_put(KeyCode:KeyCodeRangeType); Assembler;
 
  { alle Register retten wird speater von Mouse Unit aufgerufen }
 
   ASM PUSH AX
       PUSH BX
       PUSH CX
       PUSH ES
       MOV  AX,KeyCode                 { Tastencode nach AX }
       OR   AH,AH                      { erweiterter CODE ? }
       JZ   @@1                        { nein, dann ok }
       SUB  AX,256                     { sonst Tastencode - 256 }
       XCHG AL,AH                      { AL=0 AH=Code }
@@1:   MOV  DI,Seg0040                 { Bios Datensegment }
       MOV  ES,DI                      { nach ES }
       PUSHF                           { IRQ-Flag merken }
       CLI                             { Interrupts sperren }
       MOV  BX,ES:[BIOS_Last_Ptr]      { Einlesezeiger }
       MOV  CX,BX                      { nach CX }
       ADD  CX,2                       { +2 }
       CMP  CX,ES:[BIOS_End_Ptr]       { am Ende des Puffers  ? }
       JNE  @@2                        { nein, dann ok }
       MOV  CX,ES:[BIOS_Start_Ptr]     { sonst Puffer von vorn }
@@2:   CMP  CX,ES:[BIOS_Read_Ptr]      { Einlesezeiger = Auslesezeiger }
       JE   @@3                        { ja, Puffer voll Exit }
       MOV  ES:[BX],AX                 { nein dann Zeichen eintragen }
       MOV  ES:[BIOS_Last_Ptr],CX      { Einlesezeiger speichern }
@@3:   POPF                            { IRQ-FLAG restaurieren }
       POP  ES
       POP  CX
       POP  BX
       POP  AX
end;
{============================================================================}
Procedure KB_PutString(S:String);
Var i:Integer;
Begin
  For i:=1 to Length(S) do KB_Put( Ord(S[i]) );
end;
{============================================================================}
Procedure KB_Wait(KeyCode:KeyCodeRangeType);
Var Key:Word;
Begin
  repeat
    KB_Read(Key);
  Until Key=KeyCode;
end;
{============================================================================}
{$F+}
Procedure KB_ExitProc;
Begin
  ASM MOV AX,Seg0040                 { Bios Datensegment }
      MOV ES,AX
      MOV AX,org_start_ptr
      PUSHF
      CLI
      MOV ES:[BIOS_START_PTR],AX
      MOV ES:[BIOS_READ_PTR],AX
      MOV ES:[BIOS_LAST_PTR],AX
      MOV AX,org_end_ptr
      MOV ES:[BIOS_END_PTR],AX
      POPF
  end;
  ExitProc:=OldExitProc;
end;
{$F-}
{============================================================================}
Function KB_YesNo(YesChar,NoChar:YesNoRangeType):Boolean;
Var Key:Word;  ch:Char;
Begin
  KB_YesNo := False;
  YesChar  := UpCase(YesChar);
  NoChar   := UpCase(NoChar);
  Repeat
    KB_read(Key);
    ch := Upcase(Chr(Key));
    if ch = YesChar then KB_YesNo := TRUE;
  Until (ch=YesChar) or (ch=NoChar);
end;
{============================================================================}
Begin                 { Initialisierung }
  ASM MOV DI,Seg0040               { Bios Datensegment }
      MOV ES,DI
      MOV AX,ES:[BIOS_START_PTR]   { Orginal Start }
      MOV org_start_ptr,AX         { merken }
      MOV AX,ES:[BIOS_END_PTR]     { Orginal Ende }
      MOV org_end_ptr,AX           { merken }
      MOV AX,NEW_BUF_OFFSET        { Offset 400h+200h=600h neuer Puffer }
      PUSHF                        { IRQ-Flag merken }
      CLI                          { Interrupts sperren }
      MOV ES:[BIOS_START_PTR],AX   { Startadresse setzen }
      MOV ES:[BIOS_READ_PTR],AX    { Lesezeiger auf Start }
      MOV ES:[BIOS_LAST_PTR],AX    { Schreibzeiger auf Start }
      ADD AX,200                   { 200 Bytes = Platz fuer 100 Tastencodes }
      MOV ES:[BIOS_END_PTR],AX
      POPF                         { IRQ-Flag restaurieren }
  end;
  OldExitProc := ExitProc;
  ExitProc    := @KB_ExitProc;
end.