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.