🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: pl.comp.lang.asm
Article #2209

Re: Nie zagadka, tylko pytanie

#2209
From: Andrzej Grażyński
Date: Fri, 16 Apr 2010 11:41
73 lines
3015 bytes
Bernard pisze:
> On 2010-04-16 00:23, Andrzej Grażyński wrote:
>>
>> Jaki proponujecie sposób sprawdzenia, czy progam chodzi na Pentium czy
>> na starszym badziewiu?
>>

[CIACH]

> 
> Najpierw sprawdzamy, czy procesor ma CPUID (bit w EFLAGS). Jeśli ma - 
> dalej jest prosto. Jeśli nie ma - może to być najwyżej 486 i TSC nie ma 
> na pewno.

Dziękuję, ten test już znam.



> Istnieje cała masa testów umożliwających stwierdzenie typu <= 486 na 
> podstawie zachowań procesora przy wykonaniu instrukcji.

To też jest powszechnie znane, choć teraz nie jest mi potrzebne.


> Niezależnie od TSC istnieje jeszcze timer systemowy i zmienna timera 
> (zlicza interwały ok. 55 ms) w pamięci, dostępna dla apikacji DOSowych.

Oczywiście, i gdy nie było RDTSC to był jednyn ysposob odmierzania 
czasu, choć mało dokładny. W Turbo Pascalu zaimplementowano programowo 
dokładniejszy zegarek: kręci się pewną wzorcową pętlę, zlicza jej obroty 
mięzy kolejnymi tylknięciami zegara pod adresem BIOS:$6C, a potem 
przelicza jedną milisekundę na liczbę obrotó tej pętli. To było dobre 
jeszcze dla 386, ale teraz jest dość zawodne, bo:

1. W systemie wieloprogramowym pętla kręci się tylko wtedy, gdy zadanie 
ma przydzielony czas procesora

2. W nowszych procesorach czas jednego obrotu pętli może być 
zróżnicowany, ze względu na mechanizmy optymalizacyjne (cacheowanie, 
potok rozkazów).

W efekcie Delay(1000) nie zawsze daje jedną sekundę oczekiwania. Te 
mankamenty znikną, jeśli zamiast programowej pętli użyjemy RDTSC:


1. czekamy, aż zmieni się wartość zegara BIOS:$6C

2. Odczytujemy RDTSC i zapisujemy do TSCSTART

3. czekamy, aż zmieni się wartość zegara BIOS:$6C

4. Odczytujemy RDTSC i zapisujemy do TSCSEND

5. Obliczamy liczbę tyknięć TSC na milisekundę:

   TSCPERMSEC = (TSCEND-TSCSTART)*(1193180/65536/1000)

i odtąd możemy odmierzać interwały w czasie rzeczywistym.



Delay(MSec:Word):



TSCCOUNT := MSec * TSCPERMSEC;

TSC <- RDTSC
TSCEND <- TSC + TSCCOUNT-1

repeat
   TSC <- RDTSC
until TSC >= TSCEND;
Technical Details
Message-ID: <hq9iem$gp7$1@news.onet.pl>
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.rmf.pl!agh.edu.pl!news.agh.edu.pl!news.onet.pl!not-for-mail
References: <hq83lv$5in$1@news.onet.pl> <hq8uv7$vas$1@newsread1.aster.pl>

Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.rmf.pl!agh.edu.pl!news.agh.edu.pl!news.onet.pl!not-for-mail
From: Andrzej Grażyński <grazynsk@petex.com.pl>
Newsgroups: pl.comp.lang.asm
Subject: Re: Nie zagadka, tylko pytanie
Date: Fri, 16 Apr 2010 13:41:54 +0200
Organization: http://onet.pl
Lines: 96
Message-ID: <hq9iem$gp7$1@news.onet.pl>
References: <hq83lv$5in$1@news.onet.pl> <hq8uv7$vas$1@newsread1.aster.pl>
NNTP-Posting-Host: public-gprs74644.centertel.pl
Mime-Version: 1.0
X-Trace: news.onet.pl 1271418144 17191 91.94.164.222 (16 Apr 2010 11:42:24 GMT)
X-Complaints-To: niusy@onet.pl
NNTP-Posting-Date: Fri, 16 Apr 2010 11:42:24 +0000 (UTC)
User-Agent: Thunderbird 2.0.0.24 (Windows/20100228)
In-Reply-To: <hq8uv7$vas$1@newsread1.aster.pl>
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit