Hallo,
ich experimentier gerade ein wenig mit einfachen TSR-Programmen in Turbo Pascal und nun will ich ein kleines Programm schreiben welches Tastatureingaben ändern kann, daß z.B. ein y erscheint wenn man ein z eingibt bzw. umgekehrt.
Wie kann ich das realisieren? Mein erster Ansatz war der den int 09h umzuleiten, den port $60 auszulesen, auf den Scancode für y oder z zu testen und dann den entsprechend geänderten Wert an den Port $60 zurück zu senden damit der alte Handler den geänderten Wert ausliest.
Aber ich hab mittlerweile gelesen daß das nicht geht weil man den Port $60 nicht beschreiben kann.
Wie könnte ich das also alternativ umsetzen? Eventuell durch Umleitung des int16h?
lg, Markus
Tastendruck ändern durch Interrupt-Umleitung?
Re: Tastendruck ändern durch Interrupt-Umleitung?
Der Vorschlag von Dosenware war auch meine erste Idee. Wenn der nicht in Frage kommt (zum Beispiel, weil es auf einem PC/XT-BIOS klappen muss, das die Keyboard-Intercept-Funktion noch nicht hat), könnte man auch INT 09 hooken, und statt Port 60 umzuschreiben (was nicht ohne ganze fiese Tricks geht, möglicherweise könnte man da aber was dengeln, weil man den KBC dazu überreden kann, auch anderen Kram als Tastendrücke über Port 60 zur Verfügung zu stellen), kann man auch nach der Ausführung des Original-INT09 (den man dann per PUSHF/CALL aufrufen muss, nicht per JMP) in den BIOS-Tastaturpuffer schauen, und dort die Daten umschreiben, auf die INT 16 zugreifen wird. Dabei sollte man prüfen, ob das Ende der Queue "echt" ist, nicht dass man beim Drücken von "Z" das Ergebnis "Z" durch "Y" ersetzt, und beim Loslassen von "Z" (erneut ein INT 09) das "Y" im Tastaturpuffer für ein Ergebnis des aktuellen INT 09 hält, und es durch "Z" zurückersetzt...
Re: Tastendruck ändern durch Interrupt-Umleitung?
Ich verweise hier mal auf meinen Thread "Programm durch TSR oder "übergeordnetes" Programm mit Interrupt-Routinen beenden" - da stellt sich auch ein ähnliches Problem.
mov ax, 13h
int 10h
while vorne_frei do vor;
int 10h
while vorne_frei do vor;