Součástí výuky předmětu 36UPS (Úvod do počítačových systémů) na fakultě elektrotechnické ČVUT je požadavek na vytvoření programu, který ovládá přípravek „Semafor“, což je maketa křižovatky, připojená na paralelní port. Jelikož se velká část studentů v tomto předmětu setkává s programováním v assembleru poprvé (a mnoho z nich i naposledy…), není pro ně lehké zvládnout tvorbu tohoto programu pouze v průběhu vyučování. Pokud ovšem potřebují na úloze pracovat i mimo své pravidelné vyučovací hodiny, musí mít přístup k přípravku, což je možné pouze v příslušných laboratořích. Proto nemohou studenti pracovat doma, na koleji, apod. Lépe řečeno, nemohli by, pokud by neexistoval tento program.
Tento program slouží k emulaci přípravku semafor, tzn. umožňuje testovat programy k ovládání přípravku i na počítači, kde přípravek připojen není. Emulátoru se jako parametr předá jméno programu, který se má testovat. Tento testovaný program je pak spuštěn samotným emulátorem, který odchytává pokusy programu přistoupit na LPT port a zpracovává je stejným způsobem, jakým by reagoval skutečný přípravek, připojený na paralelní port.
Před tím, než budete emulátor používat, si opravdu tento dokument přečtěte!
Poté, co si stáhnete zip archív s programem (viz sekce download), si jej rozbalte do libovolného adresáře. Poté, když budete chtít testovat svůj program, provedete následující:
Emulátor odchytává a reaguje na následující klávesy:
Emulátor je poměrně nízkoúrovňový program (pro zvědavce: jak to vlastně funguje). Jako takový se nesnáší s mnoha jinými nízkoúrovňovými programy. Původně byl program navržen pro MS-DOS (tzn. čistý DOS, ne příkazovou řádku Windows!). To je také prostředí, ve kterém ho nejpravděpodobněji spustíte bez problémů. Autorovi bez problému chodí i ve Windows 98, ovšem zkoušet cokoliv na bázi Windows NT je naivní. Stejně tak emulátor nebude chodit ani ve Windows XP.
Co se týká požadavku na testovaný program, je to složitejší. Stručně se dá říct, že pokud je váš program pouhým rozšířením toho, který je vám dodán jako ukázkový, nejspíše bude všechno v pořádku. Problémy by mohlo způsobit jen několik věcí, které nejspíš dělat nebudete:
Některá omezení je však třeba mít na paměti:
IN, OUT
. Pokud budete na port přistupovat buď pomocí
služeb BIOSu, nebo instrukcemi 16-bitového V/V, budou takové přístupy ignorovány
a projdou přímo na port.Řekněme, že máte svůj program, který jste rozpracovali ve školní laboratoři, čtvrthodinovou piplavou prací jste doladili konstanty pro čekání tak, aby červená na semaforu svítila přesně jednu sekundu. Pak budete chtít doplňovat do programu další funkce, ovšem tentokrát doma, s tím, že testování bude probíhat v emulátoru. Najednou šok – program vůbec nefunguje!
To je ovšem omyl. Program funguje, emulátor také, jenom vaše čekací smyčka tentokrát nečeká přesně jednu sekundu, ale mnohem déle. Třeba 100 sekund. Proč? To je jednoduché: doba, kterou smyčka čeká, je ve vašem programu natvrdo zadána na základě toho, jak dlouho čeká na jednom konkrétním počítači, s konkrétní konfigurací. Pokud byste váš program vyzkoušeli na jiném počítači, např. s rychlejším procesorem, čekací smyčka by opět nefungovala správně. Problém není v emulátoru, ale ve špatném návrhu podprogramu pro čekání. Když totiž program běží pod emulátorem, kromě toho, že procesor zpracovává testovaný program, musí také zpracovávat instrukce emulátoru. Výsledkem je, že testovaný program beží mnohem pomaleji, než by běžel mimo emulátor. V normálních částech kódu si toho nevšimnete, ale v čekací smyčce se to projeví.
Jak tento problém řešit? Máte dvě možnosti:
delay
,
kterou dostanete v ukázkovém programu, je šmejd!
Místo toho můžete využít o něco lepší funkci pro čekání.mov ax, 0ffffh
zkuste třeba mov ax, 100h
. Teprve tehdy, když se vám
povede program „rozběhat“, můžete hodnotu doladit. Tato možnost
má tu nevýhodu, že musíte hodnoty měnit pokaždé, když program přenášíte
z emulátoru na skutečný prípravek ci naopak.emulator.zip (18,183B ZIP)
Pokud najdete nějakou chybu v programu, dejte mi vědět.
Součástí archívu, který jste si stáhli, je i zdrojový kód. Celý program je totiž pod GNU licencí. Což mimo jiné znamená, že ho opravdu můžete zdarma okopírovat svým spolužákům. (Ne, že bych se snad domníval, že by vám v tom zabránilo, kdybych to zde zakázal…)