Nachfolgendes Pascal - Programm ruft in einer Schleife ständig den Int 15h, Fkt. 83h auf und lässt das Flag alle 50 Millisekunden setzen. Sobald die 50 Millisekunden vorbei sind, sollte das Flag gesetzt sein und Int 15h, 83h wird erneut aufgerufen, solange bis eine Taste zum Programmabbruch betätigt wird.
Code: Alles auswählen
uses dos, crt;
var r : registers;
timeflag : byte;
ticks : longint;
begin
ClrScr;
ticks := 0;
timeflag := 1;
Repeat
inc( ticks );
WriteLn( 'ticks: ', ticks);
GotoXY( 1, whereY-1);
Repeat Until timeflag<>0;
timeflag := 0;
r.ax := $8300;
r.es := Seg(timeflag);
r.bx := Ofs(timeflag);
r.cx := 0;
r.dx := 50000;
intr( $15, r );
Until KeyPressed;
While KeyPressed Do ReadKey;
end.
Kombiniere ich nun den Aufruf von Int15h, Fkt. 83h mit dem Abfragen des Vertical Retraces der VGA hängt sich der PC unter den beiden oben genannten BIOSen auf.
Hier das Problemprogramm:
Code: Alles auswählen
uses dos, crt;
var r : registers;
timeflag : byte;
ticks : longint;
begin
ClrScr;
ticks := 0;
timeflag := 1;
Repeat
inc( ticks );
WriteLn( 'ticks: ', ticks);
GotoXY( 1, whereY-1);
Repeat Until timeflag<>0; { <-- PC bleibt hier hängen! }
Repeat Until (Port[$3da] and 8) = 8; { <-- neu: Vertical Retrace }
timeflag := 0;
r.ax := $8300;
r.es := Seg(timeflag);
r.bx := Ofs(timeflag);
r.cx := 0;
r.dx := 50000;
intr( $15, r );
Until KeyPressed;
While KeyPressed Do ReadKey;
end.
Auf einem 486dx4-100 (egal, welche VGA) mit AWARD BIOS 4.50G und auf einem p75 mit PhoenixBIOS Pentium 1.03 dagegen bleibt der PC früher oder später in der Schleife hängen, die das Flag abfragt. Meist erreicht die Zählervariable ticks
einen Wert zwischen 200-2000 bis der PC in der Repeat Until timeflag<>0 -Schleife festhängt.
Das Flag wird ab diesem Zeitpunkt vom Int15h nicht mehr gesetzt. Dies gilt auch, wenn man das Programm neu startet. Auch dann funktioniert Int15h, Fkt. 83h nicht mehr: das Flag wird einfach nicht mehr gesetzt. Dies gilt solange, bis ich ein Reset ausführe (Warmstart mittels Ctrl-Alt-Del reicht aus).
Ich kann mir den Fehler einfach nicht erklären. Einen Programmierfehler schließe ich eigentlich aus (oder?).
Ich habe das Ganze übrigens in allen mir möglichen Varianten programmiert, d.h. das Flag auf den Heap gelegt oder das Ganze in BASM ohne CRT und ohne DOS - Unit programmiert. Das Resultat war immer dasselbe: Sobald der Vertical-Retrace
abgefragt wird, hängt der PC -früher oder später - auf den beiden BIOSen (und nur bei diesen PCs) in der Flag-Abfrage-Schleife.
Wie gesagt: ich kann mir den Fehler auch im Ansatz nicht erklären. Was hat denn der Vertical Retrace mit der RTC zu tun?
Stutzig hat es mich allerdings schon gemacht, dass zwei verschiedene PCs mit verschiedenen BIOSen und verschiedenen Bus-System (vlb/pci) denselben Fehler aufweisen.