Dneska začnu s novou sérií článků o CPU Motorola 68000, v níž už si nebudeme povídat o tom, kde a jak který bajtík posunout a co se potom stane s registry a příznaky. Ode dneška přejdeme na strojové programování vašeho oblíbeného ST, část věcí bude pochopitelně kompatibilní i s vyššími procesory jako jsou 68020, 68030, 68040, ale některé věci budou natolik specifické, že je jinde než na ST prostě neužijete.
Každý zdrojový kód je dle mého názoru dostatečně okomentovaný, takže se k němu, až na nějaké složitejší algoritmy, nebudu vyjadřovat. Zdrojové kódy naleznete v archívu 68000_1.TOS.
První ukázka vám představí, jak vypsat text, zdroják pro ni nese název DEMO.S, takže si to klidně můžete zkusit.
Druhá ukázka, k níž však bude následovat i menší pokec, se jmenuje SCROLL.S. Pokud si myslíte, že všemu rozumíte, můžete si ten prográmek vyzkoušet, v opačném případě si o tomto prográmku ještě něco přečtěte.
Takže ten druhý zdroják scroluje po obrazovce text, k čemuž využívá font, který je ve formátu 16x16 bodů, 1 barvě. Samotná znaková sada začíná až znakem mezera.
Tento způsob kódování dovoluje opravdu minimální rozsah celého fontu, protože jedno písmenko v jednobarevném formátu zabere pouhých 16 bajtů, protože 16 bodů se dá zakódovat do jednoho wordu.
Program na začátku zapne supervizor mód, což je mód, v němž můžete přistupovat na všechny adresy paměti a přerušovací vektory procesoru. Potom vymažeme obrazovku, aby scroll nebyl žádným způsobem zmršený. Dalším krokem je zjištění volné adresy VBL rutiny. Abyste pochopili, proč a jak pracuje VBL, budu se tomuto přerušení trochu podrobněji věnovat.
Procesor 68000 má v sobě celou řadu vyjímkových vektorů, které se v určitých situacích vyvolají. Kromě klasických chybových vyjímek, jako chyby sběrnice, adresy apod., existují i vyjímky závislé na určité periodicky se opakující situaci. Například to jsou jsou Timery A, B, C, D, HBL a právě VBL.
Adresa hlavní VBL rutiny je ve skutečnosti určena přes adresu $70, ta ukazuje například u TOSu 1.4 na adresu $FC06CA v ROM paměti. Pochopitelně i tuto adresu můžete změnit, ale pokud dojde k chybě, procesor se v 99% případů sesype. Navíc taková rutina musí, pokud chce fungovat ve spolupráci s normálními programy, všechny používané registry někam uschovat a před ukončením rutiny příkazem RTE (ne RTS) je opět obnovit. Proto dali softwaroví návrháři do operačního systému ST jakousi základní rutinu, která přes adresu $456 ukazuje na tabulku 8 VBL rutin, pokud je nějaká z těchto rutin použita, musí mít adresu různou od 0. A to je celá její podmínka. Obvykle adresa $456 ukazuje na adresu $4CE, ale pokud ji budete chtít změnit, máte možnost, poté si na novou adresu můžete strčit osm svých vlastních VBL rutin. Osobně si myslím, že je to zbytečné, protože např. ATARI ST používá pouze 1 z těchto rutin pro vykreslování kurzoru myši a ostatních 7 je volných. Ještě jedna důležitá adresa v oblasti VBL má číslo $452, když je slovo na této adrese rovno 0, tak se žádné rutiny VBL (ukazatel na ně je právě $456) nevyvolávají, tehdy pracuje pouze základní přerušení $70. Pokud je zde ale slovo různé od nuly (obvykle 1), tak se tyto VBL rutiny volají.
Proč vůbec používat VBL?
V podstatě je to prosté, VBL přerušení se používá především proto, aby překreslování obrazovky působilo plynulým dojmem, tedy ne jako ty trhance na PC (viz Lion King a Alladin na ISA sběrnicích apod ;-). Abych to ale ještě víc přiblížil, musíš si uvědomit, jakým způsobem pracuje TV přenos. Ten vlastně (zjednodušeně) vykresluje obrazovku řádek po řádku, až se dostane úplně dolů. Poté vyjede mimo obrazovku a chystá se opět přejet nahoru, tehdy se zavolá VBL přerušení. V té chvíli můžeš na obrazovku napsat co chceš, a když to v patřičné rychlosti opět smažeš, nikdo nic nepozná. Toto přerušení je vyvoláno 50x, 60x či vícekrát za sekundu (záleží na typu monitoru). Pochopitelně, ne vše se dá zvládnout tak plynule, jako náš scroll, proto autoři používají techniky více obrazovek (2-4), které sice vykreslují déle než jedno VBL, ale právě ve VBL přepnou vždy na další následující snímek, čímž dosáhnou dostatečné plynulosti. Kdyby se o toto přepnutí pokoušeli mimo VBL, docházelo by k různým rušivým vlivům, kdy např. horní polovina adresy obrazovky už je nastavena, zatímco dolní ještě není apod.
V této VBL rutině náš program právě provadí samotný skrol písmen. Jelikož každé písmeno má šířku 16 bodů, tak zde máme počítadlo (proměnná COUNTER), které počítá vždy od 16 do 0 a teprve potom se čte do bufferu (SCROLL_BUFFER) další písmeno. Odtamtud je opět pomocí instrukce ROXL vyčteno, tj. když provedeš tuto instrukci je poslední levý bit (v našem případě i bod) vysunut do tzv.X registru a jelikož tato instrukce zároveň poslední pravý bit vyčítá právě z X registru, je možné tímto způsobem jednoduše pohybovat i písmeny po obrazovce.
Jediný problém tady tvoří právě organizace obrazové paměti u ST, proto musíme vlastně přesunout pomocí ROXL z bufferu bod, ten pak pomocí ROXL přesunout na poslední sloupec obrazovky, ten má adresu začátek řádku+152, odtamtud opět pomocí této instrukce na začátek řádku+144 . . . . až se dostanem k nule.
Proč?
U ST je totiž obrazová pamět organizovaná tak, že: první 2 bajty (word) je 16 bodů prvního plane
druhé 2 bajty je 16 bodů druhého plane
třetí 2 bajty je 16 bodů třetího plane
čtvrté 2 bajty je 16 bodů čtvrtého plane
Kombinací těchto planeů se dostaneme ke všem 16 barvám, tzn. že další dva byte jsou body 17-32 prvního plane, další druhého atd. Takže pokud chceme pracovat pouze s jednou barvou, musíme u rozlišení 320x200 skákat po osmi. Jak je to u jiných rozlišení nebudu zbytečně vysvětlovat, jen pro přemýšlivce připomínám, že je to velmi podobné (pouze u ST, Falcon to má i úplně jinak).
Poslední věc, kterou musíme vyřešit, je označení samotného konce skrolu. Pro to jsem vybral číslo 0. Na podrobnosti se podívej do zdrojáku.
A po stisku klávesy (GEMDOS 7) se celý program opět ukončí, tj. vymaže se VBL rutina, navrátíme se do USER MÓDU procesoru a ukončíme program (GEMDOS 0).
A to bylo pro dnešek bylo vše, co se týče kódování. Pokud máte nějaké dotazy, připomínky, tak se ozvětě, jinak se těším na vaše krásné vlastní skroly, které určitě uvidím už na Narsil Party.
HEAD