Pieni ongelma Turbo Pascalin kanssa. TP:ssä on bugi Delay-proseduurissa mikä ei toimi nopeilla koneilla (esim. Pentium 2 ja ylöspäin). Nykykoneista puhumattakaan.
Kun korvaa alkuperäisen Delay-proseduurin tällä alla olevalla, niin 1000 millisekunnin viive viiyttääkin oikeasti vain 500 millisekuntia.
Tuossa yhdessä kommentissa lukee "The system timer normally runs in mode 3, which counts down by twos, so Delay(1193180) may be only a half a second."
Mikä on mode 3 ja mistä tietää mikä tila on normaalisti käytössä jos haluan saada tehdä ohjelman joka toimii oikein vanhoilla ja uudemmilla koneila?
Tässä on vielä se juttu että virtuaalikoneilla esimerkiksi 10 sekunnin delay toimii oikein, oikeilla koneilla delay onkin sitten vaan 5 sekuntia.
procedure ShortDelay(Interval: Word); assembler;
{ Interval = number of ticks
Note: About 1193180 ticks/s }
asm
push ax
push bx
cmp Interval,0FFFFh { otherwise 0FFFFh will end in an infinite loop }
jne @start
dec Interval
@start:
in al,040h { save initial time in bx }
mov bl,al
in al,040h
mov bh,al
@delayloop:
in al,040h { get current time }
xchg al,ah
in al,040h
xchg al,ah
sub ax,bx { calculate the difference }
neg ax
cmp ax,Interval { are we done? }
jb @delayloop
pop bx
pop ax
end;
procedure delay(ms: Word);
{ identical to the faulty Borland delay procedure }
var
A : Word;
begin
for A := 1 to ms do
ShortDelay(1193); { pause for 1 ms }
end;CONST Windows31Second = 1193180;
OneSecondDelay = 2386360;
PROCEDURE Delay(Tics: Longint);
{ =========================================================== }
{ Wait specified number of 1.193180 MHz clock tics to elapse. }
{ The system timer normally runs in mode 3, which counts down }
{ by twos, so Delay(1193180) may be only a half a second. }
{ =========================================================== }Aihe on jo aika vanha, joten et voi enää vastata siihen.