Uživatelské nástroje

Nástroje pro tento web


lnxspectrum:hgfx

HGFX Graphics

HGFX je alternativní grafický systém, navržený pro ZX Spectrum. Je možné ho zrealizovat pomocí FPGA, a připojit k reálnému ZX Spectrum jako interface. Systém zvyšuje výkonnost celého grafického rozhraní, ale také grafické možnosti celého ZX Spectra.

Na rozdíl od LnxBlitteru je celkově jednodušší, a přitom výkonnější. Skládá se ze 3 částí. První část jsou dva Buffery / Videoram, které jsou nad původní ZX videoram. Která se zobrazuje a do které se zapisuje se dá řídit pomocí registrů. Jejich rozlišení je 640×240 pixelů, každý pixel může mít 1 barvu z 256 indexových barev. Defaultně je nultý index průhlednost, tam se zobrazuje původní obsah videoram ZX.

Velikost jednoho Bufferu je tedy 153600 Bajtů. To je pro ZX Spectrum hodně dat, Buffery jsou proto ze strany Z80 jen Write Only. Rozlišení 640×240 je pro případ použití HiRes režimu. Do Bufferů se dá kreslit jak v HiRes režimu, tak v LowRes současně. Systém nemá žádné problémy s Attributy, jako klasická ZX videoram. Co pixel, to barva, ať je kdekoliv.

Defaultně je systém nastavený na rozlišení 256×192. Dá se ale zápisem do registru povolit kreslení i v prostoru Borderu. V takovém případě bude rozlišení 320×240. Nebo i HiRes, pak máme možnost rozlišení 640×240.

Druhá část systému je zápis do Bufferu. Odchytává nastavený prostor pro Videoram v paměti, a její velikost je jen 6144 Bajtů. Může být dokonce nastavena na stejnou adresu jako je videoram v ZX, díky tomu využívají nové možnosti i třeba Printové rutiny z ROM. Systém HGFX nemá žádné paměťové nároky v ZX navíc. Ideální postup kreslení s HGFX je (po nastavení indexových barev) nastavit režim (Clear/Ink/Copy), Masku na 255, vybrat požadovanou indexovou barvu, a zapsat do Videoram data stejně, jako se to děla s videoram v ZX. A nová barva je na světě!

Třetí část je jen pomocná, má jen 3 základní funkce. Jsou to: rychle vymazat vybraný Buffer, rychle překopírovat obsah z Bufferu A do Bufferu B, a třetí je totéž, ale opačně. Jediné čeho se drží je nastavení Masky při jejich aktivaci. Teoretická rychlost by měla být při nulování paměti 2400 taktů, kopírování 4800 taktů. Tyto funkce běží na pozadí, během nich Z80 běží.

Díky Masce se dá s Bufferem pracovat jako s Planes známé z jiných systémů. V takovém případě jich máme 8. Dají se tedy rozdělit například na samostatné 16 barevné pozadí, a samostatné 16 barevné popředí. Možné jsou jakékoliv kombinace.

Režimy zápisu do Bufferu

Režimy jsou 3, všechny se řídí nastavením Masky:

První je Clear. Jakýkoliv zápis do videoram má za následek nastavení všech pixelů na indexovou barvu 0, bez ohledu co se zapisuje.

Druhý je Ink. Tam kde je v zapisovaném bajtů logická jednička se do Bufferu zapíše právě vybraná indexová barva. Kde jsou logické nuly, se nic nemění.

Třetí je Copy. Je to speciální funkce, díky které je možný například Vertikální Scroll v Basicu, nebo dokonce Horizontální Scroll o libovolný počet pixelů. Funguje to tak, že při čtení z Videoram se sice načte obsah paměti do registru, ale interně se v HGFX vyzvedne do odkládacího prostoru obsah 16 pixlů. ZX při zápisu jednoho bajtu zapíše 8 pixlů naráz. To odpovídá šířce 16 pixlů v HiRes, proto interně HGFX pracuje s 16 pixely. Při opětovném zápisu do Videoram se do Bufferu v HGFX zapíše na nové místo právě těchto 16 pixelů. Tím dojde k překopírování obsahu v Bufferu. Můžu tedy například nastavit ofset na 1, načíst obsah z adresy 16384 a znovu zapsat na adresu 16384. Tím se mi obsah Videoram posune o jeden pixel doleva. Takový zápis proběhne pouze 1x, při dalším zápisu do Videoram se chová podobně jako režim Ink, dokuď nedojde k dalšímu čtení z Videoram. Jediný rozdíl oproti Ink režimu je že zapisované logické nuly se resetují na indexovou barvu 0. Vynuluje tedy okolní obsah v bajtu. Díky tomu funguje perfektně například běžný Basicovský scroll textu nahoru.

Obsluha celé Videoram

Jak obsluhovat celou Videoram, když je jen 6144 B velká? Systém funguje na principu „razítek“. Díky tomu se dá vykreslovat všude po celé HiRes ploše, ale i rychle vykreslovat větší počet spritů. Jako příklad postupu si popíšeme vykreslení spritu:

-Nejprve inicializace HGFX, Videoram na adresu 16384, linearní režim. -Nastavíme pozici razítka na 100,100 (v pixelech) -do videoram na adresu 16384 a 16385 vykreslíme první linku spritu. -nastavíme znovu pozici razítka, nyní 100,101 -do videoram na adresu 16384 a 16385 vykreslíme druhou linku spritu.

Nastavování pozice razítka opakujeme pro všechny linky spritu.

Pro kreslení není ze strany Z80 potřeba žádná rotace, to šetří spousta strojového času. Vykreslování funguje na principu nastavení absolutní X,Y pozice na obrazovce, a následné vykreslení do videoram na první pozici, například 16384. Bajt se vykreslí na pozici nastavených X,Y, nikoliv na ZX pozici 0,0. X je 10 bitová hodnota, aby pokryla celý možný rozsah v HiRes, 0-639. Y si vystačí s 8 bity, 0-239.

Pro případ že chceme vykreslovat druhou linku spritu nemusíme nutně měnit Y a vykreslovat na stejnou adresu jako předtím (16384). Videoram má 6144 bajtů. Druhou linku můžeme vykreslovat bez změny Y, na adrese 16416, nebo v případě nelineárního módu na adresu 16640. Stejná adresa jako adresa druhé linky v originální Videoram ZX. Díky tomu bude možné upravit stávající software na používání HGFX enginu, nebo barevné možnosti používat s běžným Basicem.

Maskování

Maska v systému říká, kterých bitů v indexové videoram se změna týká. Když například bude na prvním pixelu nastavena indexová barva 128, nastavíme masku na hodnotu 3, a zapíšeme novou barvu s indexovou hodnotou 255, nová barva bude indexová barva 131. Změní se jen první 2 bity, ostatní zůstanou původní.

Maska má vliv na všechny režimy, Clear/Ink/Copy. Dokonce i na nulování a kopírování bufferu. Tam se odchytí hodnota při spuštění, a tato hodnota je stejná pro celý proces. Na pozadí tedy probíhá čištění bufferu, ale s druhým bufferem již můžeme pracovat s jinou maskou.

lnxspectrum/hgfx.txt · Poslední úprava: 2020/08/14 20:20 autor: lanex