ich habe ein merkwürdiges Problem mit dem Interrupt 16, welchen ich befrage ob eine Taste gedrückt worden ist oder nicht.
Code: Alles auswählen
FUNCTION KeyPressed0: BOOLEAN;
VAR
ch:CHAR;
regs:REGISTERS;
BEGIN
ch:=CHR(0);
regs.AH:=$01; INTR($16,regs); (* Prüfen auf Taste *)
IF (regs.AX<>$00) THEN BEGIN
regs.AH:=$00; INTR($16,regs);
ch:=CHR(regs.AL); (* Leeren *)
END;
KeyPressed0:=(ch<>CHR(0));
END (* KeyPressed0 *);
(nämlich nur reagieren, wenn Taste gedrückt wurde) und einmal unter VirtualBox MS-DOS muckt es, nämlich wartet es auf Tastendruck und das will ich ja nun gerade nicht.
Hier mein Hauptprogramm
Code: Alles auswählen
uses stdio;
var i:card;
c:char;
begin
repeat
writeln(i,', ');
inc(i);
if keypressed0 then begin i:=0; c:=taste0; end;
until (i>1000000) or (c=' ');
end.
In der Stdio.pas steht natürlich auch, daß ich für modernere Betriebsysteme sprich 32/64 bit die Keyboard Unit von FreePascal benutze und das geht auch.
Nur habe ich damals (im Juli) als ich das für 16bit entwickelt habe, den Fehler gemacht, nicht zu testen, ob es denn auch unter MS-DOS geht und nicht nur unter Windows XP.
Mir ist das unklar, aber was mache ich falsch und welchen Int sollte ich ggf. nehmen?
Hintergrund ist, ich habe versucht, die Unit CRT abzulösen, weil es nach meiner Erinnerung irgendein Umlaute-Problem gab. Natürlich kann ich für den immer selteneren
Fall 16bit die schwer ausgebaute CRT und keypressed auch wieder reinnehmen, aber vielleicht weiß ja von euch jemand Rat. Warum verhält sich das (originale) MS-DOS so komisch,
was habe ich nicht bedacht bei der Umsetzung der Idee mit dem Int 16 (aus dem Internet).
Danke!