Tastendruck ändern durch Interrupt-Umleitung?

Diskussion zum Thema Programmierung unter DOS (Intel x86)
Antworten
markusk
Norton Commander
Beiträge: 132
Registriert: Fr 19. Apr 2013, 11:12

Tastendruck ändern durch Interrupt-Umleitung?

Beitrag von markusk »

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
Benutzeravatar
Dosenware
DOS-Gott
Beiträge: 3745
Registriert: Mi 24. Mai 2006, 20:29

Re: Tastendruck ändern durch Interrupt-Umleitung?

Beitrag von Dosenware »

mkarcher
LAN Manager
Beiträge: 204
Registriert: Fr 5. Jun 2020, 19:38

Re: Tastendruck ändern durch Interrupt-Umleitung?

Beitrag von mkarcher »

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...
Benutzeravatar
zatzen
DOS-Guru
Beiträge: 518
Registriert: Di 17. Apr 2012, 05:10
Wohnort: bei Köln
Kontaktdaten:

Re: Tastendruck ändern durch Interrupt-Umleitung?

Beitrag von zatzen »

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;
Antworten