TestCPU
Detekce
procesoru a benchmark
Freeware,
Naprogramoval Robert Šmíd
Nová verze 0.96 (11.1.2000)
přidáno menu pro zvolení jednotlivých
procesorů do grafů,
podpora INI souborů větších než 64kB
DOWNLOAD TestCPUc.zip
0.96 česky (619885 B)
DOWNLOAD Results.zip 17.2.2000
(19098 B)
INI soubor s výsledky, obsahuje 115 procesorů (i486DX, i486DX2,
i486DX4, Cx486DX2, Am486DX4, Am5x86, Pentium, Pentium MMX, 6x86, 6x86MX, M-II, K5, K6, K6-2,
K6-III, Athlon, WinChip, Pentium Pro, Celeron, Celeron A, Pentium II, Pentium
III, Pentium III E)
Posílejte své výsledky na můj E-mail: xsmid4@fi.muni.cz
Minimální systémové
požadavky
operační systém Windows 95/98/NT/2000
32-bitový procesor i386 (s FPU)
volná paměť 4 MB
pracovní plocha s 256 barvami
nespuštěné žádné procesy náročné na výkon počítače
doporučená je myš
Splashscreen
Když spustíte exe soubor zobrazí se malé úvodní okno -
splashscreen, během kterého se zjistí typ procesoru,
frekvence, testy přenosové rychlosti paměti a sada klasických
testů CPU a FPU (Dhrystones, Whetstones, MIPS, MFLOPS).
Pokud testování trvá příliš dlouho, tak buď systém čeká
až bude moci přidělit maximální prioritu, kterou testy
požadují nebo je velký rozdíl mezi rychlostí paměti a
procesoru. Testování paměti potom trvá o něco déle.
Stránka 1 - Procesor
První stránka obsahuje základní informace o procesoru.
Ke zjištění typu procesoru
používám tři metody.
První metoda
využívá
rozdílů mezi procesory a dokáže tak rozlišit následující procesory. V závorce uvádím jak byl
typ zjištěn:
Intel i386SX Intel i386DX Intel i486SX Intel i486DX Intel Pentium Cyrix Cx486S Cyrix Cx486DX NexGen Nx586 NexGen Nx586FP |
(má POPAD chybu) (nemá FPU) (má AC bit v registru příznaků) (má ID bit v registru příznaků značící podporu CPUID instrukce, viz dále) (nemá FPU) (procesory Cyrix nemění při dělení nedefinované bity v registru příznaků) (nemá FPU) (procesory NexGen nemění při dělení ZeroFlag v registru příznaků) |
Druhá metoda
vezme
výsledky první a určí následující typy procesoru podle
jeho frekvence:
AMD Am386SX AMD Am386DX Intel i486DX2 AMD Am486DX4 Cyrix Cx486DX2 Cyrix Cx486DX4 Cyrix 6x86 Cyrix 6x86MX |
(40MHz) (40MHz) (50 a 66MHz) (100 a 120MHz) (66 a 80 MHz) (100MHz) (všechny verze, 80 až 150MHz) (všechny verze od 166MHz) |
Třetí metoda
se
provádí pouze u procesorů podporujících CPUID instrukci. To
jsou v podstatě všechny procesory vyrobené po procesoru Intel
Pentium, který byl uveden v roce 1993. Tedy i některé nové
486ky z roku 1994. U procesorů Cyrix 5x86, Cyrix 6x86 a NexGen
je ale tato instrukce BIOSem vypnuta a pro správnou detekci je
potřeba ji softwarově zapnout. Po provedení CPUID instrukce
vrátí procesor o sobě řadu informací, pomocí kterých lze
všechny současné procesory přesně detekovat. Zde je seznam
procesorů, které lze touto metodou rozpoznat:
Intel i486DX Intel i486SX Intel i486DX2 Intel i486SL Intel i486SX2 Intel i486DX4 Intel i486DX4 OverDrive Intel Pentium Intel Pentium OverDrive Intel Pentium MMX Intel Pentium MMX OverDrive Intel Pentium Pro Intel Pentium II OverDrive Intel Pentium II Intel Pentium II Xeon Intel Pentium II PE (mobilní) Intel Celeron Intel Celeron A (Slot1) Intel Celeron A (Socket370) Intel Pentium III Intel Pentium III Xeon Intel Pentium III E Intel Pentium III E Xeon UMC U5S |
AMD Am486DX2 AMD Am486DX4 AMD Am5x86 AMD K5 AMD K6 AMD K6-2 AMD K6-III AMD Athlon Cyrix MediaGX Centaur/IDT WinChip Rise mP6 NexGen Nx586 |
CPUID instrukci lze provádět v
několika úrovních.
Na první úrovni CPUID instrukce
vrací specifický řetězec prodejce čipu:
"GenuineIntel" "AuthenticAMD" "CyrixInstead" "NexGenDriven" "CentaurHauls" "RiseRiseRise" "UMC UMC UMC" |
řetězec "PravýIntel" vrací
procesory Intel řetězec "AutentickéAMD" vrací procesory AMD řetězec "CyrixMístoToho" vrací procesory Cyrix řetězec "PoháněnoNexGenem" vrací procesory NexGen řetězec "KentaurTáhne" vrací procesory Centaur/IDT vrací procesory Rise vracely 486ky od firmy UMC |
Na druhé úrovni CPUID instrukce
vrací informace o typu, rodině, modelu, revizi a vlastnostech
procesoru.
Program obsahuje malou databázi, která k těmto detekovaným
informacím doplní krátké popisky. Malé vysvětlení hodnot,
které CPUID instrukce vrací:
TYP může nabývat hodnot:
0 - což znamená, že se jedná o primární (první) procesor
1 - znamená OverDrive procesor, což je upgrade do zastaralých základních
desek
2 - značí, se jedná o sekundární (druhý, pomocný) procesor
ve víceprocesorovém systému
RODINA je téměř ekvivalentní s generací a značí
"výkonovou" třídu procesoru:
4 - všechny 486ky, AMD 5x86, Cyrix 5x86
5 - Intel Pentium a Pentium MMX, AMD K5 a K6, Cyrix 6x86, všechny Centaur/IDT
WinChip, Rise mP6
6 - Intel Pentium Pro, Celeron, Pentium II a Pentium III, AMD
Athlon, Cyrix 6x86MX a M-II
MODEL je opět číslo, které definuje o jaký model z rodiny
se jedná:
například u rodiny 4:
0 - i486DX
3 - i486DX2
8 - i486DX4
například u rodiny 5:
2 - Pentium
4 - Pentium MMX
například u rodiny 6:
1 - Pentium Pro
5 - Pentium II
6 - Celeron
7 - Pentium III
tyto všechny procesory pocházejí od Intelu, pro jiného
výrobce samozřejmě tytéž hodnoty znamenají jiný procesor.
REVIZE číslo výrobce zvyšuje podle toho, kolik drobnějších úprav na procesoru provede
BRAND je Intelem nově přidaná položka, její význam
je rozlišit některé jejich procesory. Uvedu hodnoty, které jsou doposud známé:
0 - funkce není podporována
2 - Intel Pentium III
3 - Intel Pentium III Xeon
Na třetí úrovni CPUID instrukce
podporují pouze procesory Intel šesté generace (Pentium Pro a
novější) a vrací informace o velikosti cache pamětí reprezentované následujícími
(hexadecimálními) hodnotami:
$06 - procesor má 8kB L1 cache pro instrukce
$08 - procesor má 16kB L1 cache pro instrukce
$0A - procesor má 8kB L1 cache pro data
$0C - procesor má 16kB L1 cache pro data
$40 - procesor nemá L2 cache (princip detekce Celeronu)
$41 - procesor má 128kB L2 cache (CeleronA)
$42 - procesor má 256kB L2 cache (mobilní Pentium II)
$43 - procesor má 512kB L2 cache (Pentium II a III)
$44 - procesor má 1MB L2 cache (verze Xeon)
$45 - procesor má 2MB L2 cache (verze Xeon)
$82 - procesor má 256kB L2 cache (Pentium III E)
$4x - znamená 4-cestná cache (všechny)
$8x - znamená 8-cestná cache (Pentium III E)
Na čtvrté úrovni CPUID instrukce
vrací procesory Intel Pentium III (a novější) sériové
číslo procesoru.
Procesory AMD, Cyrix a Centaur navíc podporují některé další úrovně CPUID instrukce, kterými lze u těchto procesorů zjistit další vlastnosti (jako 3Dnow! technologii), velikosti cache pamětí nebo řetězec se jménem procesoru, který je v čipu zakódován. Zde jsou řetězce, které procesory vrací:
AMD-K5(tm) Processor AMD-K6tm w/ multimedia extensions AMD-K6(tm) 3D processor AMD-K6(tm)-2 Processor AMD-K6(tm) 3D+ Processor AMD-K6(tm)-III Processor AMD-K7(tm) Processor IDT WinChip 2 IDT WinChip 2-3D |
AMD K5 AMD K6 AMD K6-2 AMD K6-2 AMD K6-III AMD K6-III AMD K7 Centaur/IDT C2 Centaur/IDT C2 |
Frekvenci procesoru měřím pomocí
dvou metod.
První metoda
změří čas provedení několika
operací procesoru, pak podle typu procesoru vybere z tabulky
hodnotu, která udává za kolik taktů tyto operace procesor
provede. Potom stačí vydělit počet taktů časem a vyjde
frekvence.
Nevýhodou této metody je, že frekvence nebude zjištěna
správně, pokud není detekovaný správný typ procesoru nebo
pokud hodnota pro nový procesor ještě není do tabulky
přidána.
Zjištění frekvence první metodou:
z tabulky načti kolik taktů je potřeba / čas
provedení = frekvence
120000 taktů procesoru / 0.0012 sekundy = 100 MHz
Druhá metoda
se provádí
jen u procesorů majících Time Stamp Counter - TSC (čítač
taktů procesoru). Ten se s každým taktem procesoru zvyšuje o
jedničku a poskytuje tak nejpřesnější způsob časování na
PC. Čítač se nuluje při resetu procesoru. Je to 64 bitový
registr, takže se může zvyšovat 5850 let než přeteče zpět
na nulu, pokud má procesor 100MHz. Přítomnost TSC se
zjišťuje přes CPUID instrukci. Všechny moderní procesory TSC
mají. Intel ho podporuje od procesoru Pentium, AMD od procesoru
K5, Cyrix až od procesoru 6x86MX. Pomocí TSC lze teoreticky
určit správnou frekvenci procesoru s přesností na jeden takt.
V praxi se mohou hodnoty mírně lišit podle zatížení
systému, ale přesto program zjistí frekvenci s přesností
tisíciny MHz.
Zjištění frekvence druhou metodou:
1) přečti hodnotu TSC a zapiš ji do proměnné TAKT1
2) čekej přesně jednu sekundu (TSC se samo zvyšuje)
3) přečti hodnotu TSC a zapiš ji do proměnné TAKT2
4) výslednou frekvenci procesoru v Hertzích získáme
odečtením TAKT2-TAKT1
PR-hodnocení
U některých procesorů se navíc vedle frekvence udává
PR-hodnocení, což znamená anglicky Performance Rating (tedy zkráceně PR).
Na tomto označení svých procesorů se domluvily firmy AMD, Cyrix a IBM, které
tak chtěly zdůraznit, že jejich procesory dokáží efektivněji zpracovávat
instrukce, takže na nižších frekvencích dosahují srovnatelného výkonu
jako procesory Intel Pentium nebo Pentium II. Jako měřítko použily test
Winstone. Takže například procesor s výkonem Pentia 75 obdrží PR75. Následuje
tabulka procesorů a jejich PR-hodnocení:
procesor: NexGen Nx586-PR75 NexGen Nx586-PR80 NexGen Nx586-PR90 NexGen Nx586-PR100 NexGen Nx586-PR110 NexGen Nx586-PR120 AMD Am5x86-PR75 Cyrix 5x86-PR75 Rise mP6-PR166 IDT WinChip2A-PR200 |
interní / externí frekvence v MHz: 70 / 35 75 / 37,5 84 / 42 93 / 46,5 102 / 51 111 / 55,5 133 / 33 100 / 33 166 / 83 200 / 66 |
Stránka 2 - Vlastnosti
Vlastnosti procesoru, které vrací CPUID
instrukce
jsou zobrazeny na druhé stránce. Některé zajímavé pro uživatele dále popíši:
Koprocesor je integrován na čipu | Tato položka značí přítomnost matematického koprocesoru přímo v procesoru, všechny moderní procesory jsou již takto vyráběny (od 486DX), slouží pro výpočty s pohyblivou desetinnou čárkou, anglický název zní Floating-Point Unit (FPU). |
Čítač taktů procesoru | Anglicky Time Stamp Counter (TSC) umožňuje nejpřesnější způsob časování na PC a lze pomocí něj velmi přesně zjistit frekvenci procesoru, viz výše |
Podpora více procesorů (čip má APIC) | Tato položka značí přítomnost APIC, který umožňuje spolupráci více procesorů. Pokud je položka škrtnutá, je APIC buď vypnutý nebo není přítomen. |
Sériové číslo procesoru | Značí zapnuté sériové číslo. Intel ho umožňuje vypnout, potom je položka škrtnutá. |
Technologie MMX | Značí rozšíření instrukční sady procesoru o dalších 57 instrukcí zrychlující zpracování grafiky a multimédií. Poprvé se objevila u procesoru Intel Pentium MMX. V současnosti ji podporují všichni výrobci procesorů. |
Rychlé uložení a obnovení FP/MMX/SSE |
Značí schopnost procesoru rychle se přepínat mezi módy FPU, MMX a SSE. |
Intel Streaming SIMD Extensions (SSE) | Značí přítomnost druhé rozšiřující sady se 70 instrukcemi, které umožňují rychlejší zpracování 3D grafiky, zvuku a internetu. Je podporována od procesoru Intel Pentium III. |
Další vlastnosti podporují pouze konkurenční procesory Intelu:
Částečná podpora SSE | Značí rozšíření instrukční sady procesoru Athlon a novějších o SSE-MMX a SSE-MEM instrukce. |
Cyrix rozšířené MMX | Značí rozšíření instrukční sady procesorů 6x86MX, M-II a novějších o další MMX instrukce. |
AMD 3Dnow! | Značí přítomnost 21 instrukcí od AMD pro zrychlení 3D grafiky, které se poprvé objevily v procesoru K6-2. Tato sada je obsažena i v procesorech IDT WinChip. |
AMD rozšířené 3Dnow! | Od procesoru Athlon zavádí AMD další rozšiřující 3D instrukce. |
Stránka 3 - Paměť 1
MOV test
je první z dvojice testů paměti, který měří přenosovou
rychlost pamětí a vyrovnávacích pamětí (tzv. cache).
Test zjišťuje rychlost těchto pamětí tak, že dvakrát přesouvá stejně
velký blok dat. Při prvním přesunu se blok dat nahraje zároveň do cache,
takže se podruhé vyzvednou data z ní. Velikost bloku se postupně zvětšuje
od 2kB až po 2MB. Pokud při zvětšení bloku prudce klesne přenosová
rychlost, znamená to, že zatímco se minulý blok do cache vešel, stávající
blok byl vzhledem k velikosti cache příliš velký. Tímto způsobem lze určit
velikosti cache pamětí. V tomto prvním testu používám k přesunu dvojici
instrukcí MOV, což je zároveň jedna z nejvíce používaných instrukcí vůbec.
Přesun pomocí MOV instrukce je však pomalejší než přesun pomocí MOVSD
instrukce, která je použita v druhém testu paměti, viz dále. Zde je část
kódu, který pro přesun používám:
@opakuj: | mov eax,[esi] mov [edi],eax add esi,4 add edi,4 dec ecx jnz @opakuj |
Nejprve se do ESI uloží zdrojová adresa, do EDI cílová adresa a do ECX počet opakování. Chceme-li například přenášet 4 kB dat je to 1024 opakování, protože přenášíme 32 bitů (4 byte) najednou. Instrukce MOV EAX,[ESI] čte data ze zdrojové adresy [ESI] v paměti do EAX registru v procesoru. Druhá instrukce MOV [EDI],EAX zapíše data z EAX zpátky na cílovou adresu v paměti určenou [EDI]. Následující dvě instrukce ADD ESI,4 a ADD EDI,4 zvyšují ukazatele na zdrojovou a cílovou adresu o 4 byte, aby ukazovaly na další 4 byte, které budeme přenášet. Další instrukce DEC ECX sníží obsah registru ECX o jedničku, aby se smyčka opakovala už jen 1023krát. Poslední instrukce JNZ @OPAKUJ se vrátí na začátek pokud není ECX rovno nule.
Cache
jsou rychlé paměti malé kapacity, které do sebe nahrají často používaná
data z RAM a tak je přístup k těmto datům mnohem rychlejší.
Cache paměť se poprvé objevila na základních deskách pro 386. Od
procesoru 486 se používají dvě cache. Cache první úrovně, která je přímo
v procesoru (tzv. Level 1 cache) a cache druhé úrovně na desce (Level 2
cache), která je větší, ale pomalejší. Od Pentia se cache v procesoru rozdělila
na cache pro instrukce a pro data.
Některé velikosti cache v procesoru:
procesor: Intel i486SX/DX/DX2 Intel i486DX4 Intel Pentium Intel Pentium MMX Intel Pentium Pro Intel Pentium II/III Intel Celeron Intel Celeron A Intel Pentium III E AMD Am486DX/DX2/DX4 Cyrix Cx486SLC/DLC IDT WinChip/WinChip2 Rise mP6 NexGen Nx586 UMC 486 IBM 486SLC |
L1 cache (pro instrukce + pro data) 8 kB 16 kB 16 kB (8 kB + 8 kB) 32 kB (16 kB + 16 kB) 32 kB (16 kB + 16 kB) 32 kB (16 kB + 16 kB) 32 kB (16 kB + 16 kB) 32 kB (16 kB + 16 kB) 32 kB (16 kB + 16 kB) 8 kB 1 kB 64 kB (32 kB + 32 kB) 16 kB (8 kB + 8 kB) 32 kB (16 kB + 16 kB) 8 kB 16 kB |
L2 cache v procesoru: 256 kB až 1 MB 512 kB (Xeon až 2 MB) 128 kB 256 kB
|
Stránka 4 - Paměť 2
MOVSD test
je podobný prvnímu. Také měří přenosovou
rychlost paměti, případně cache, ale používá k tomu MOVSD
instrukci. Ta je rychlejší než dvojice MOV instrukcí, protože procesor přednačte
data v burst cyklech (použije prefetch) a také zápis dat bude kombinovat do
burst cyklů.
Postup pro přenesení bloku dat je podobný. Nejprve se do ESI uloží zdrojová adresa, do EDI cílová adresa a do ECX počet opakování. Potom stačí použít jedinou instrukci REP MOVSD. Prefix REP znamená, že instrukce bude prováděna opakovaně. Počet opakování určuje obsah registru ECX, jehož hodnota se po každém provedení MOVSD snižuje o jedničku. Až je ECX rovno nule provádění instrukce skončí. Instrukce MOVSD při každém provedení přesune data ze zdrojové adresy [ESI] na cílovou adresu [EDI] a oba ukazatele ESI a EDI zvýší, aby ukazovaly na další data.
Stránka 5 - Výpočty
Tato stránka obsahuje pětici matematických testů:
První test počítá faktoriál čísla 10001.
Jedná se o celočíselný výpočet, takže využívá pouze procesor. Faktoriál
čísla 10001 spočítáme vynásobením všech čísel od 1 do 10001:
10001! = 1 * 2 * 3 * 4 * ....... * 9998 * 9999 * 10000 * 10001
Výsledek je velmi vysoké číslo, které je zapsáno v 14812 bytech (přes 14 kB) paměti. Při vyjádření v bitech by se jednalo o 118496-bitové číslo! Přesto se výsledek vejde u většiny procesorů do L1 cache, která je přímo v procesoru.
Druhý test počítá prvních 30000 prvočísel. Opět se počítá s celými čísly, takže test zatěžuje jen procesor. Test používá asi 120 kB paměti, které jsou ale přistupované pouze jednou, takže data nemusí být ani v cache. Ke zjištění prvočísla existuje spousta inteligentních algoritmů, použil jsem následující verzi:
Číslo n je prvočíslo pokud není dělitelné čísly většími než 1 a menšími než n. Stačí však zjišťovat jen dělitelnost čísly od 2 po odmocninu z čísla n. Navíc všechna sudá čísla n po dvojce nemohou být prvočísla, protože jsou dělitelná právě dvojkou.
Třetí test počítá determinant matice 9x9 Laplaceovým rozvojem. Pracuje s (regulární) maticí reálných čísel, takže mimo procesor využívá i koprocesor. Počítání Laplaceovým rozvojem je založeno na rozkladu původní matice na menší matice, které se dále rozkládají, dokud nezískáme jednotlivá čísla. V programu to zajišťuji rekurzivním voláním procedury. Zde je začátek výpočtu determinantu matice 3x3, který ukazuje, jak procedura pracuje:
| 9 8 7 | | 4 5 6 | | 0 1 2 | |
= (-1)1+1 * 9 * | | 5 6 | | 1 2 | |
+ (-1)1+2 * 8 * | | 4 6 | | 0 2 | |
+ (-1)1+3 * 7 * | | 4 5 | | 0 1 | |
= ..... atd. |
Čtvrtý test počítá inverzní matici 200x200 Gaussovou eliminací. Test pracuje s dvojicí matic 200x200 s reálnými čísly, takže test používá nejen procesor, ale i koprocesor. Navíc dvojice matic zabírá přibližně 320 kB, takže má i paměťové požadavky. Do L2 cache se vejde pouze pokud má cache alespoň 512 kB. První matice obsahuje náhodná čísla (tak, aby byly jednotlivé vektory lineárně nezávislé) a druhá matice je jednotková. Na těchto dvou maticích provádí program Gaussovu a zpětnou Gaussovu eliminaci tak, že se první matice převede na jednotkovou a z druhé vznikne inverzní matice.
Pátý test násobí dvě matice 250x250. Výsledek se ukládá do třetí. Všechny matice obsahují reálná čísla, takže test opět zatěžuje mimo procesoru i koprocesor. Tento test je ale nejnáročnější na paměť, protože všechny tři matice vyžadují asi 750 kB paměti, takže se obvykle nevejdou ani do L2 cache.
Stránka 6 - Testy
Tato stránka obsahuje čtveřici testů, které zatěžují procesor a koprocesor:
Dhrystone
je 32-bitová verze testu, který reprezentuje výkon procesoru převážně v
aplikacích s celočíselnými výpočty. Zde jsem použil původní verzi
(2.1) od autora testu Reinholda Weickera. Celý test se vejde do poměrně malé
cache (asi 8 kB), takže u procesorů s interní cache testuje pouze výkon
procesoru a ne pamětí.
Whetstone
je 32-bitová verze syntetického testu, který zatěžuje převážně
koprocesor při operacích s reálnými čísly. Navíc obsahuje transcendentní
funkce jako SIN a EXP. Použita je verze jednoho z původních autorů Briana Wichmanna.
Test je opět malý, takže odráží pouze výkon koprocesoru a interní L1
cache.
MIPS
není, jak by se mohlo podle názvu zdát, test výkonu v celočíselných
operacích. Jedná se o malý test, který velmi zatěžuje koprocesor počítáním
transcendentní funkce. Autor tohoto testu je Hiroshi Fukuda, který ho zveřejnil
v C a ve Fortranu, zde je původní část C kódu:
int i,n;double x,y;
for(i=1;i<=n;i++){
x=i;
y=sin(x)/x+x;
}
MFLOPS
Výsledek tohoto 32-bitového testu říká, kolik miliónů základních operací s desetinnou
čárkou (sčítání, odčítání, násobení) je schopný počítač provést za sekundu.
Toto číslo je určeno prováděním starší verze Lawrence Livermoore Loops, což je sada 14 jader programů pracujících s reálnými čísly, a vypočítáním
průměrných MFLOPS (Millions of FLoating-point OPerations per Second).
Existuje i novější verze LLL, která používá 24 jader a dává detailnější diagnózu
výkonu, ta ale nebyla používána kvůli své velikosti. Test LLL používá kolem 60
kB paměti, takže výsledky mohou být ovlivněny velikostí cache.
Stránka 7 - Muzeum
Tato stránka popisuje vlastnosti většiny 32-bitových procesorů, které byly doposud představeny. Většinu z nich také program rozpozná (až na Cx486SLC/DLC, který lze detekovat pouze přes DIR registry Cyrixu). První dva řádky Rodina a Model popisují jaké hodnoty vrací procesor po provedení CPUID instrukce. V případě, že ji nepodporuje, tak jaké hodnoty vrací po RESETU. Další řádek popisuje Kódové jméno, za kterým je v závorce uvedená výrobní technologie. Následují položky: Počet tranzistorů, První představení procesoru, Rozsah frekvencí, na kterých procesor pracuje, Další vlastnosti a Velikosti cache.
Stránka 8 - O Programu
Naprogramoval Robert Šmíd pod Delphi 4
Program volně ke stažení na URL: www.fi.muni.cz/~xsmid4
Připomínky a výsledky testů posílejte na E-mail: xsmid4@fi.muni.cz