Posted By: dzemen () on 'CZprogram'
Title:     Re: Jak se dostat pod 55ms?
Date:      Thu Feb 21 08:12:45 2002

Vim, ze mezitim se to vyresilo jinak, ale jenom pro poradek, jak se da dostat
vicemene presne na milisekundy - postup z crt.pas:

1) Zjisti aktualni hodnotu citace casovace na adrese 0000:046C (4 byty)
2) cekej na zmenu hodnoty citace casovace v cyklu, po zmene pokracuj dale
3) vynuluj hodnotu promenne cycles_for_one_ms
4) cekej na zmenu hodnoty citace casovace, v kazdem cyklu pricti 
   jednicku k cycles_for_one_ms
5) vydel cycles?for?one?ms 55, dostaneme hodnotu pro 1 ms

No, a pak je to jednoduche. Pokud chci cekat treba 12 ms, provadim
cyklus z bodu 4) tak dloho, dokavad je pocitadlo mensi nez 
12*cycles_for_one_ms. Pricemz hodnota citace casovace uz me v tomto pripade 
samozrejme nezajima.

Mimochodem: Tenhle postup v assembleru pouzival 16-bitovy registr (CX) pro
deleni pocitadla (ktere je ale longint) hodnotou 55 , proto se objevil 
znamy Pentium-II bug - hodnota cycles_for_one_ms na konci kroku 4) byla totiz
tak velika, ze po vydeleni 55 se nevesla do vysledkoveho 16-bitoveho registru
a to procesor interpretuje jako deleni nulou (INT 00h).

Pokud je to jen trochu mozne, doporucuji pouzivat instrukci RDTSC (alespon
myslim, ze se tak jmenuje) - ale ta je az od Pentii a nevim jak AMD 
a Cyrix (ten ji nemel, nevim jestli uz ma), nebo 
QueryPerformanceCounter (Win).

Dzemen.

P.S.: Tenhle postup samozrejme nepocita s rezii samotnych instrukci pro
      nastaveni promenne cycles_for_one_ms, ale to je vicemene zanedbatelne
      pokud se bavime o presnosti na milisekundy.

Search the boards