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.