Archiv verlassen und diese Seite im Standarddesign anzeigen : DOS Interrupts
Poison Nuke
03.09.2002, 15:58
Ich lasse grade ein Programm mit einer Interruptprozedur über den Interrupt 28 laufen.
Mein erstes Problem:
gibt es noch andere Interrupts, die ich "missbrauchen" kann, denn die bisher anderen getesteten liefen nicht.
zweitens:
gibt es eine Möglichkeit, die aufruffrequenz des Interrupt 28 von 18,2 Hz zu erhöhen, OHNE den PIT0 zu ändern (meine Systemzeit sollte nich rasen ;) ).
Denn der Interrupt ist zu langsam für meine Zwecke und eine andere Möglichkeit um einen Programmteil unabhängig UND Zeitgesteuert laufen zu lassen fällt mir nicht ein.
und 40-60 Hz wären mir schon ganz lieb.
Also wenn es eine Möglichkeit gibt, eine Procedure in so einem Zeitintervall ausführen zu lassen, ich bin immer offen für Ratschläge. =)
Felix Kaiser
03.09.2002, 16:01
Interrupt 28, oder 1Chex wird von IRQ0 aufgerufen. IRQ0 wird über PIT0 gesteuert, insofern hast du dort keine Chance. Du kannst aber IRQ8 benutzen, der ist in der Regel nicht unter Verwendung. Das Ding läuft mit exakt 1024Hz, wird aktiviert/deaktiviert über Interrupt 15hex, AH=83hex. Schau mal nach, dann weißte wies geht :)
Poison Nuke
03.09.2002, 18:35
Ok, ich habe ihn mit "reg.ah=$83" (VAR reg:registers) und intr($15,reg) aktiviert und meine Procedur läuft dann über INterrupt 22 schön flott *g*.
Aber nun ist keine Tasteneingabe mehr möglich. Ich kann das Prog nur noch mit Strg+pause beenden.
Woran liegt das?
Lord_Otter
03.09.2002, 19:01
ich bin mir nicht sicher, aber wahrscheinlich hast du einen Tastaturinterrupt überschrieben...
Felix Kaiser
03.09.2002, 20:46
22 ist 16hex und das ist der Tastaturabfrageservice des BIOS. Gib doch Interrupts bitte immer in HEX an. IRQ8 wäre Interrupt 70hex.
Poison Nuke
03.09.2002, 21:22
Vielen Dank erstmal für eure riesen Mühe, mir dauernd zu helfen. Ich finde das echt Klasse von euch! Ohne euch wäre ich nie so weit.
Aber irgendwie klappt das hier immer noch nicht :(
Ich habe jetzt die Interrupts wie beschrieben aktiviert, aber es passiert GAR nix. :mauer::mauer::mauer:
Hier mal mein Code:
CONST it=$70;
VAR i,j : integer;
reg : registers;
alda : pointer;
PROCEDURE pong;
INTERRUPT;
BEGIN
....
END;
BEGIN
reg.ah:=$83;
intr($15,reg);
getintvec(it,alda);
setintvec(it,@pong);
....
setintvec(it,alda);
END.
Könnt ihr mir den Fehler zeigen, und wie ich ihn korrigieren kann?
Felix Kaiser
04.09.2002, 15:07
Du hast dir NICHT die Beschreibung zu dieser Interruptfunktion durchgelesen.
AX=8300h
CX=-1
DX=-1
INT 15h
Aktiviert den IRQ8, ggf. passe die Werte in CX:DX an. AX=8301h müsste den IRQ8 wieder deaktivieren.
Poison Nuke
04.09.2002, 15:50
@ felix Kaiser:
+
thx, ich werde es gleich probieren.
Außerdem, wie soll ich es nachlesen, wenn ich NICHTS habe, wo ich nachlesen könnte!
nachtrag:
jetzt geht noch weniger als vorher.
das "h" nach den Zahlen nimmt er nicht an, genauso wie die -1.
Könntest du es bitte mal als TP Code für mich verfassen. Denn so wie du es schreibst, kann ich echt absolut nix mit anfangen. Ich kenne die Interruptzuweisung nicht mit Hexwerten usw.
Felix Kaiser
04.09.2002, 18:06
Langsam aber sicher reißt mir der Geduldsfaden ... h ist der nummerische Suffix für Zahlen. Den unterstützt Pascal nicht, man muss einen $ Präfix verwenden. In der Regel wirst du IMMER Dokumentationen sehen, in denen nur der h'ex' Suffix verwendet wird.
Und du begibst dich bitte sofort in Google auf die Suche nach 'Ralf Brown's Interrupt List'. Dort sind sämtliche DOS Interruptvektoren und mehr ausführlich dokumentiert.
Lord_Otter
04.09.2002, 20:41
Mit "h" geht das, wie FK schon gesagt hat, in Pascal nicht, aber in Assembler. Und -1 nimmt er nicht an, weil CX und DX vom Typ Word sind (0-65535). Da passt -1 natürlich nicht rein.
Versuch das mal so:
reg.ax :=$8300;
Integer(reg.cx) :=-1;
Integer(reg.dx) :=-1;
Intr($15,reg);
Das wäre Felix' Code in TP. Und in Assembler, so wie Felix es dagestellt hat, sollte das so aussehen:
ASM
MOV AX,8300h
MOV CX,-1
MOV DX,-1
INT 15H
END;
Das müsste eigentlich gehen...
vBulletin® v3.8.6, Copyright ©2000-2012, Jelsoft Enterprises Ltd.