Uživatelské nástroje

Nástroje pro tento web


lnxspectrum:hgfx

Rozdíly

Zde můžete vidět rozdíly mezi vybranou verzí a aktuální verzí dané stránky.

Odkaz na výstup diff

Obě strany předchozí revizePředchozí verze
Následující verze
Předchozí verze
lnxspectrum:hgfx [2020/07/28 12:55] lanexlnxspectrum:hgfx [2022/07/18 18:36] (aktuální) lanex
Řádek 1: Řádek 1:
-=====HGFX Graphics=====+=====HGFX/Q 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.+Poznámka: **HGFX/Q** je vývojová verze **HGFX**. Je zde spousta odlišností od verze **HGFX** v **eLeMeNt** a **MB03+**. 
 + 
 +**HGFX/Q** 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 640x240 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.  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 640x240 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 jen **Write Only**. Rozlišení 640x240 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.+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í 640x240 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í 256x192. Dá se ale zápisem do registru povolit kreslení i v prostoru Borderu. V takovém případě bude rozlišení 320x240. Nebo i HiRes, pak máme možnost rozlišení 640x240. Defaultně je systém nastavený na rozlišení 256x192. Dá se ale zápisem do registru povolit kreslení i v prostoru Borderu. V takovém případě bude rozlišení 320x240. Nebo i HiRes, pak máme možnost rozlišení 640x240.
  
-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ě!+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/Q nemá žádné paměťové nároky v ZX navíc. Ideální postup kreslení s HGFX/Q 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ěží. 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ěží.
Řádek 23: Řádek 25:
 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í. 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á stejně jako režim **Ink**, dokuď nedojde k dalšímu čtení z Videoram.+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/Q 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/Q pracuje s 16 pixely. Při opětovném zápisu do Videoram se do Bufferu v HGFX/Q 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=== ===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í dvou spritů:+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 32768, linearní režim.+-Nejprve inicializace HGFX/Q, Videoram na adresu 16384, linearní režim.
 -Nastavíme pozici razítka na 100,100 (v pixelech) -Nastavíme pozici razítka na 100,100 (v pixelech)
--do videoram na adresu 32768 32769 vykreslíme první linku spritu.+-do videoram na adresu 16384 16385 vykreslíme první linku spritu.
 -nastavíme znovu pozici razítka, nyní 100,101 -nastavíme znovu pozici razítka, nyní 100,101
--do videoram na adresu 32768 32769 vykreslíme druhou linku spritu.+-do videoram na adresu 16384 16385 vykreslíme druhou linku spritu.
  
 Nastavování pozice razítka opakujeme pro všechny linky 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/Q 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.1595933704.txt.gz · Poslední úprava: 2020/07/28 12:55 autor: lanex

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki