ZX Spectrum a loadery – 2

Pokračování článku o loaderech na ZX Spectru. Držte si klobouky a vytáhněte kalkulačky, pojedeme z kopce!

Minule jsem skončil s tím, že příště bude potřeba počítat a vážit každý takt. Naším spojencem nejbližším bude tentokrát čekací smyčka v rutině LD_EDGE_1. Připomeňme si ji:

Vidíte ji tam u LD_DELAY? Ano? Tak to je ona! Zabere 7T + 21*(4T+12T) + (4T+7T) = 354T, což je docela dost taktů na to, aby se v nich dalo něco rozumně dělat. Co třeba? No, nejčastěji nějaké počítadlo toho, kolik ještě zbývá nahrát.

Grafický ukazatel

U textovky Poradce jsem použil, kromě děsivého blikání, taky jakýsi „teploměr“, který ukazoval, kolik ještě zbývá nahrát. Je to takové to vlevo…

Tenhle efekt je jednodušší, než byste možná čekali. Délka sloupečku je téměř přesně „délka souboru / 512“ (píšu „téměř přesně“, protože jsem ho tehdy namaloval o kousek kratší…) Takže si vezmu vyšší bajt zbývajícího počtu bajtů (ten je ve dvojici registrů DE), vydělím dvěma, přičtu offset odspodu obrazovky, převedu si souřadnici na adresu v obrazovce a daný bajt maskuju s hodnotou %11100111 – tedy vše zůstává, jen dva body uprostřed, které jsou shodou okolností zrovna ten „teploměr“, se umáznou. K přepočtu použiju dokonce rutinu PIXEL-ADD ($22AA) z ROMky Spectra, která vezme souřadnice v B a C (stejný souřadný systém jako má PLOT) a z nich spočítá adresu na obrazovce (HL) a masku bodu (A).

Jak vidíte, zasáhnul jsem do časovací smyčky tak, že na začátek jsem si odskočil do vlastní rutiny pro obsluhu onoho efektu (i s odskokem to je 305T), a po návratu mám ještě stále dost času, takže si počkám dalších 50T, což dává výsledných 355T, a to je skoro přesně to naše Magické Číslo!

Číselný ukazatel

Pokud chcete ukazovat místo nějakého ubývajícího sloupečku raději číslo, bude to náročnější. Každá číslice se totiž musí vykreslit na obrazovku, což je osm zápisů na každou číslici, při trojmístném počítadle to je už docela hodně, to se do 354T nevejde. Musíte proto rozsekat algoritmus na části, které se do tohoto časového limitu vejdou, a postupně je volat. Neocenitelným pomocníkem vám bude druhá sada registrů a indexregistr IY.

Velmi pěkná počítadla měly hry od Hewson a české programy od Universum (tuším), používaly vlastní font a měly i efekt přetáčení číslic. Já jsem u další textovky měl jen prosté počítání „počtu bajtů / 64“, což se mi pro 48kB blok vejde stále do tří číslic. Na začátku jsem si požadované číslice připravil (desítkově!) do registrů D a E (resp. do těch zrcadlových):

Efekt neprobíhal přímo v LD_EDGE, ale v LD_8_BITS. I když LD_EDGE bylo upravené tak, aby používalo při načítání bajtů výrazně jiné časovací hodnoty:

Samotný efekt se pak odehrával takto:

 

K tomu samozřejmě pár vysvětlivek:

V registrech DE je vlastní počítadlo, uložené v BCD kódování. V registru C je počítadlo bitů, v registru B počítadlo bajtů. Jakmile dopočítají do nuly, proběhne snížení počítadla o 1, úprava výsledku instrukcí DAA a příprava na samotný tisk znaků. Do HL je uložena hodnota $3D00, což je shodou okolností adresa ROM, kde jsou uloženy číslice, a do IY je uložena adresa rutiny LD_CHARS, která číslice vykresluje.

Když rozsekáte rutinu na kousky, máte dvě možnosti. Buď upravujete kód a přepisujete adresu, kam se má příště skočit, nebo si adresu uchováváte nějak jinak. Tady to je v registru IY. Jednoduchým trikem CALL LD_RETHERE (Jako že RET HERE, vrať se sem) skočíte zpátky do LD_8_BITS, a zároveň se návratová adresa dostane do IY, takže při příštím volání bude JP (IY) směřovat na další kousek. Všimněte si, že tisk znaků je právě voláním LD_RETHERE rozsekán na malé kousky.

Ukazatel času a další

Když počítáte čas, je to složitější než počítat bajty. Musíte totiž buď počítat každý bit jinak (jedničkový je dvakrát tak delší než nulový), anebo využít přerušení (ano, přerušení v loaderu!)

Hledal jsem ukázku toho prvního přístupu, ale než jsem ji stihnul okomentovat, ozval se mi Busy, že našel zdroják svého loaderu k Overscanu, a jestli bych ho nechtěl publikovat. Takže s Busyho laskavým svolením: Overscan loader!

(Počítání času i grafické efekty jsou v ceně!)

A tady je zdroják i s Busyho komentáři (Díky!) Protože to je dlouhé, tak se s vámi rozloučím už zde a popřeju hodně zdaru při vlastním experimentování.

 

Příspěvek byl publikován v rubrice Software, Stroják se štítky , , , . Můžete si uložit jeho odkaz mezi své oblíbené záložky.