Programmieren - alles kontrollieren 4.941 Themen, 20.715 Beiträge

Interrupthandler

JamesBomb / 13 Antworten / Baumansicht Nickles

Hi!
Wo im Speicher liegt die Interrupt-Vektor-Tabelle? Wie kann ich eine Interruptbehandlungsroutine reinschreiben?
Geht dies auch mit einer Hochsprache?
(Darunter fällt auch noch C :-))

bei Antwort benachrichtigen
T-Rex JamesBomb „Interrupthandler“
Optionen

Hi,

soweit ich weiß (meine DOSe-Zeiten und TP6 sind schon eine Weile her), liegt die Interrupt-Vektor-Tabelle direkt bei $0:$0 und ist ziemlich genau 256 * 4 Byte = 1024 Byte groß.

Und die Tabelle konnte man auch modifizieren.
Unter TP6 ging es so:

Var IVT: Array [0..255] of pointer absolute $0:$0;

Schon hast Du Deine Vektortabelle. Willst Du den IntVec von der Mouse (meist $33) ändern, schreibst Du jetzt einfach:
IVT[$33] := @MyMouseHandler;

Vorher solltest Du MyMouseHander noch schreiben:
procedure MyMouseHandler; interrupt;
begin
 (* Was auch immer *)
end;

Fertig (und keine Garantie auf Funktionalität)!

 GrüßeT-Rex 
bei Antwort benachrichtigen
JamesBomb T-Rex „Hi, soweit ich weiß meine DOSe-Zeiten und TP6 sind schon eine Weile her , liegt...“
Optionen

Was ist $0 in asm?

bei Antwort benachrichtigen
T-Rex JamesBomb „Was ist 0 in asm?“
Optionen

Wie?

$0 (Pascal) = 0 (Dezimal) = 0x00 (C/C++) = frag mich nicht.
Aber mit 0dez kann man das eigentlich schreiben.

Aber wenn Du die entsprechenden Register schneller löschen willst, dann schreibe doch einfach
XOR ax, ax

Spart (meines Wissens nach) 2 Prozessortakte.

 GrüßeT-Rex 
bei Antwort benachrichtigen
JamesBomb Nachtrag zu: „Interrupthandler“
Optionen

Wie sieht es im PM aus? Wo im Speicher steht die Tabelle?

bei Antwort benachrichtigen
T-Rex JamesBomb „Wie sieht es im PM aus? Wo im Speicher steht die Tabelle?“
Optionen

Hallo,

das weiß ich nicht ganz genau, weil der PM die Interrupts anders verarbeitet. Die meisten werden sowieso deaktiviert, weil der Code dafür 16Bit ist und PM ja 32Bit. Der Prozessor soll schließlich nicht "in die Steinzeit" zurückfallen.
Aber ich denke, daß die Tabelle dann ebenfalls an dieser Adresse liegt. Könnte mich aber auch irren, unterm 286er habe ich den PM nie benutzt (bevor jemand schreit: der kann das auch, lest euch nur die Specs durch).

 GrüßeT-Rex 
bei Antwort benachrichtigen
JamesBomb T-Rex „Hallo, das weiß ich nicht ganz genau, weil der PM die Interrupts anders...“
Optionen

Wo gibts die Specs?
und 2. habe ich gerade den int 09h überschrieben und versucht ne kleine einlesen, ausgeben routine für den tastatur irq zu installieren. wie kann ich nach der installation des interrupthandlers(ohne betriebssystem :-)) das programm beenden? reicht eventuell schon ein

x: jmp x? aus? wird dann der interrupt bei tastatureingabe auch ausgeführt? (ich vermute ja)

3. ich habe in die interrupt 09h routine geschrieben:
in al, 60h ->tastaturport 60h einlesen
und dann mit dem bios-ausgabe befehl (Teletype) das zeichen in al ausgeben:
mov ah, oEh
usw...
ist das in ordnung?
das alles noch im real mode
wo kann ich was zu 32bit pm interrupts finden? möglichts mit beispielen, wie man routinen installiert und mit übersciht über den ganzen descriptor scheiss.

Tschüss

bei Antwort benachrichtigen
T-Rex JamesBomb „Wo gibts die Specs? und 2. habe ich gerade den int 09h überschrieben und...“
Optionen

Hallo,

Frage1:
wo ich die Specs her hatte, weiß ich nicht mehr. Ich hatte so eine Liste mit allen Beschreibungen zu den verschiedenen Interrupts, was für Eingaben die benötigen und was die dann ausgeben (alles in/mit Assembler realisiert). Dummerweise ist die Platte, wo die Specs drauf waren, im Daten-Nirvana (Nicht mal mit Linux zu retten).

Frage2:
Wie man ein (reines) Assembler-Programm beendet, weiß ich nicht, ich hatte den ganzen Kram in TP6 - Programme drin.
Und sobald Du nach dem "Verbiegen" des Interrupts irgend eine Taste drückst, wird Dein Handler aufgerufen. Wenn Du hier einen bestimmten Tastencode zum Exit bestimmst (z.B.: STRG+C), dann muß dieser Code die gewünschten Aktionen durchführen, etwa: alten Handler restaurieren, Programm beenden.

Frage3:
Bin aus ASM schon eine Weile raus. Ich weiß nicht, ob mit dieser Anweisung auch die Tasten SHIFT, STRG, ALT, ALT GR, WinDoof abgefangen werden (Konstante für die WinDoof-Taste habe ich gar nicht).
Habe aber ein Buch@Home, in dem für TurboPascal/TurboVision ein Aufsatz programmiert wird, der die erweiterten Befehle der Tastatur benutzt (Tasten sperren, umleiten, etc).
Werde mal gucken, ob ich da was brauchbares finde und es dann morgen posten (vielleicht gibts das ja mittlerweile als eBook).

Aber:
Bei M$ (eher unwahrscheinlich) oder Borland oder wie die ganzen Schmieden heißen, die was mit IDE machen, kann man bestimmt so eine Liste bekommen. M$ wird die garantiert nicht rausrücken, weil man ja sonst die Start-Routinen von WinDoof nachmachen könnte.

Ich glaube, ich komme noch mal zu Euch auf die (OS-)Seite, wenn wir die Leute hier so mit ASM zutexten, kommen die irgendwann nicht mehr her.

 GrüßeT-Rex 
bei Antwort benachrichtigen
JamesBomb T-Rex „Hallo, Frage1: wo ich die Specs her hatte, weiß ich nicht mehr. Ich hatte so...“
Optionen

Ich habe das jetzt hingekriegt, dass beim irq 9 die gedrückte taste ins al register reingemoved wird. nun ist das aber so, dass diese tastencodes nicht dem ascii code entsprechen. Ich dachte mir eine Tabelle zu schreiben, in der alle Asciizeichen in Tastencodereihenfolge stehen zB so:
DB 0, "1234567890", ...
0 stellt jeweils ein nichtdruckbares Zeichen dar (01h = ESC), 02h = "1" usw.
wie kann ich dann aus dem tastencodewert im al register den ascii code rauskriegen?
ich dachte so irgendwie:
im al steht der tastencode -> mov al(zur ausgabe dann), offset tabelle + tastencode - 1
so müsste die formel aussehen. wie kann ich das ganze nun in asm verpacken?

Was genau machen die []?
ich gehe davon aus, dass ein label in [] die adresse des labels und ein label ohne [] den inhalt des labels darstellen. Ist das so korrekt?

CU L8ER Aligater

bei Antwort benachrichtigen
T-Rex JamesBomb „Ich habe das jetzt hingekriegt, dass beim irq 9 die gedrückte taste ins al...“
Optionen

Wie gesagt, ich bringe morgen mal ein bisschen Code mit.
Ich glaube, die in dem Buch sind nicht nur über den IRQ9 gegangen, um den Kram auszulesen.

Das mit den eckigen Klammern ist richtig, denke ich.

Sag doch mal, Du machst doch sicher bei diesem ObjectsOS mit.
Wie schreibt ihr denn Objects nur mit ASM? Bisher dachte ich, daß ASM gar nicht in der Lage ist, so was komplexes darzustellen!

 GrüßeT-Rex 
bei Antwort benachrichtigen
JamesBomb T-Rex „Wie gesagt, ich bringe morgen mal ein bisschen Code mit. Ich glaube, die in dem...“
Optionen

Das sit richtig. Das habe ich sogar ins Leben gerufen.
Ich weiss auch nicht, ob asm dazu fähig ist. (Warum eigentlich nicht?)
Aber darüber machen wir uns später n Kopp. :-) Jetzt steht erstmal im Vordergrund einen Kernel auf die Beine zu stellen und den ganzen elementaren Krimskrams zu erlernen, denn keiner von uns hatte noch vor 2 Monaten keinen Plan wie sowas überhaupt funktioniert. Das bedeutet: Learning by Doing.
Woher hast du von OOS erfahren?

bei Antwort benachrichtigen
T-Rex JamesBomb „Das sit richtig. Das habe ich sogar ins Leben gerufen. Ich weiss auch nicht, ob...“
Optionen

Du hattest hier mal die Adr gepostet.

unter TP6 war ASM nicht dazu in der Lage. Ob sich da mitllerweile was getan hat, weiß ich nicht.

 GrüßeT-Rex 
bei Antwort benachrichtigen
T-Rex JamesBomb „Interrupthandler“
Optionen

Moin,

folgendes Buch:
TuneUp für TurboPascal/TurboVision, Dr. Trutz Eyke Podschun
Sybex-Verlag, ISBN 3-8155-0027-3, (damals ) 89DM

Wegen Tastatur-Puffer:
Für das Auslesen des Tastaturpuffers gibt es den BIOS-Int 16hex. Dieser bietet bei allen Computern mindestens drei Funktionen:

  • Funktion 00hex liest ein Zeichen aus dem Tastaturpuffer, der im BIOS-Datensegment liegt und von einem weiteren BIOS-Int (Nummer 09hex) gefüllt wird, wenn eine Taste oder Tastenkombination gedrückt wird.

  • Funktion 01hex stellt fest, ob ein Zeichen im besagten Tastaturpuffer liegt

  • Funktion 02hex gibt über den Zustand der sogenannten Statustasten wie STR, ALT, SHIFT Auskunft.

  • Dies reichte für die alten Tastaturen (zehn Funktionstasten, kein NumPad etc) völlig aus. Irgendwann kamen andere Tastaturen und zwecks Abwärtskompatibilität wurde Int 16hex erweitert:
  • Zu jeder Funktion einfach 10hex addieren, dann kann man auch die anderen Tasten auf heutigen Tastaturen lesen (Funktionen 10hex bis 12hex des Int 16hex).


  • Jetzt kann man schon recht viel damit machen. Noch ein paar Deklarationen:
  • kbS1 : byte absolute $0040:0017;

  • kbS2 : byte absolute $0040:0018;

  • kbS3 : byte absolute $0040:0096;

  • kbBufHead : word absolute $0040:$001A

  • kbBufTail : word absolute $0040:$001C

  • kbBuffer : array [$0F..$1E] of word absolute $0040:$001E;

  • kbBuffer ist der Tastaturpuffer, kbBufHead gibt die Position des nächsten auszulesenden Zeichens an, kbBufTail gib an, wo Int 09hex das nächste Zeichen reinschreiben muß.
    Sind beide Werte gleich, ist der Puffer leer.
    Liegt kbBufTail ein Zeichen "vor" kbBufHead, ist der Puffer voll.
    kbBuffer ist ein Ringpuffer, d.h. wenn ein Zeichen an die (physikalisch) letzte Adresse 3Chex geschrieben worden ist, erfolgt der nächste Eintrag wieder an der (physikalisch) ersten Adresse 1Ehex.

    Jetzt noch was zu kbS1, kbS2, kbS3: Das sind die Statustasten.
    kbS1 - Zustände der Schalter Insert, Caps, Scroll, Num, Alt, Strg, links und rechts Shift:

Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
Ins Caps Num Scroll Alt Strg Shift li Shift re


kbS2 - Informationen zu Insert, Caps, Scroll, Num, SysReq, links Alt, links Strg, sowie Schalter Pause:

Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
Ins Caps Num Scroll Pause SysReq Alt li Strg li


kbS3 - rechts Alt und rechts Strg, sowie Flags, die das BIOS benötigt:

Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
n/a n/a n/a n/a Alt re Strg re n/a n/a


So, das sollte als erstes an Infos reichen.
 GrüßeT-Rex 
bei Antwort benachrichtigen
olliman JamesBomb „Interrupthandler“
Optionen

Moin, ich weiß wer James Bomb ist, ich bin mit ihm zusammen in der Objects OS Gruppe. Ich werde jetzt für ihn neuen Code anfordern...

Mich würde interessieren, wie man die Bildschirmauflösung ändert.

tha,
olliman

bei Antwort benachrichtigen