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.