Exerciser (přesněji instruction exerciser) je assemblerový program, který provede důkladný test funkcí procesoru, včetně nastavení příznaků za všemožných situací. Ve světě osmibitů se nejvíce používá exerciser, který napsal v r. 1994 pro procesor Z80 Frank D. Cringle a který o 15 let později upravil pro 8080/8085 Ian Bartholomew.
Test je rozdělen do dvou částí. V první se jednoduchými operacemi rychle otestuje, zda je emulovaný procesor vůbec schopen podstoupit test (tu jsem pro PMD 85 neimplementoval, je pro naše účely zbytečná), ve druhé se provádějí jednotlivé instrukce pro danou množinu počátečních podmínek, daných hodnotami registrů, a z výsledku provedení instrukce, který má podobu záznamu o hodnotách registrů, se vypočítá CRC přes všechny počáteční podmínky. Počáteční podmínky se nevytvářejí ručně, ale pomocí určitého skriptu, který umožňuje např. zvolit všechny možné hodnoty registru B. Zní to složitě, ale je to poměrně jednoduché a ve výsledku velmi efektivní, protože se procesor otestuje skutečně zevrubně a důkladně.
Tento test jsem používal už vloni, když jsem začínal vyvíjet versi emulátoru PMI-80, a upravit ho pro PMD 85 tudíž byla víceméně formální záležitost. Abych nemusel využívat služeb monitoru, který např. neumí u PMD 85-1 zobrazovat malá písmena, přepsal jsem si příslušné rutiny dovnitř exerciseru.
Z praktických důvodů je exerciser vytvořen jako ROM modul, který se po startu počítače zavede od adresy 0x2000 a spustí, případně, ve versi PMD 85-1, je nutné zavést ho ručně příkazem BASIC G.
Provedení testu při normální rychlosti trvá několik hodin, ale my si můžeme vypomoci zrychlením (přepínač -S/--speed-up). To je mimochodem vlastnost, kterou v emulátoru příliš nepodporuji, protože jde proti duchu věrné emulace: kdo chce něco rychlejšího, může používat své PC, pomalost je přece podstatnou součástí retro-zážitku! Podobně neumožňuji a nebudu umožňovat ani zrychlené nahrávání z kasety, každému by měla stačit možnost pracovat se snapshoty.
Pro porovnání jsem test spustil i na vynikajícím emulátoru RM Teamu, a výsledek je podle očekávání; poněkud překvapilo, že můj pracoval cca 8,5 minuty, kdežto konkurenci to trvalo, při maximálním zrychlení, více než dvojnásobek. Nicméně to není důležité, čas není kritický faktor, jen by člověk od programu v C++ nečekal, že může být pomalejší než Java.
Aktualisováno.
Arci ne všechny emulátory testem projdou. Takto dopadlo příkladmo dílo Martina Schotka z r. 2002. Jak by skončily další testy, nevím, jeho emulátor umožňuje pouze dvojnásobené zrychlení procesoru a nechtělo se mi na výsledek několik hodin čekat; škoda, že autor nezveřejnil zdrojové texty, třeba bychom našli chybu.
Aktualisováno.
Nikoli s vlajícími prapory absolvoval test též universální emulátor Petra Hyťhy. Prvním testem prošel, druhým ne, a při třetím se zhroutil. Ten zdrojové kody obsahuje, a tak se pro zábavu budeme moci podívat, kde udělali soudruzi z NDR chybu.
Netrvalo ani deset minut a vidíme první: instrukce ANA r v emulátoru (soubor ds_EmuCPU_8080_instructions_process.inc, ř. 141) vždy nastaví Auxilliary Carry (AC) Flag na jedničku, ale skutečný procesor ho nastavuje na hodnotu logického součtu bitů 4 registrů A a r (viz můj soubor Intel8080A.java, ř. 3232 et seq.). Je to idiosynkratické a vlastně jde o důsledek chyby při návrhu procesoru (původně měl Intel jiné plány), nicméně emulátor musí emulovat procesor přesně, i s chybami.
Aktualisováno.
Petr Hyťha svůj emulátor opravil, takže již, zdá se, dává správné výsledky.
Číst dále...