lnxspectrum:hgfx
Rozdíly
Zde můžete vidět rozdíly mezi vybranou verzí a aktuální verzí dané stránky.
Obě strany předchozí revizePředchozí verzeNásledující verze | Předchozí verze | ||
lnxspectrum:hgfx [2020/07/28 12:55] – lanex | lnxspectrum: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 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šší, | Na rozdíl od **LnxBlitteru** je celkově jednodušší, | ||
- | 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/ | + | 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/ |
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á | + | 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á |
===Obsluha celé Videoram=== | ===Obsluha celé Videoram=== | ||
- | Jak obsluhovat celou Videoram, když je jen 6144 B velká? Systém funguje na principu " | + | Jak obsluhovat celou Videoram, když je jen 6144 B velká? Systém funguje na principu " |
- | -Nejprve inicializace HGFX, Videoram na adresu | + | -Nejprve inicializace HGFX/Q, Videoram na adresu |
-Nastavíme pozici razítka na 100,100 (v pixelech) | -Nastavíme pozici razítka na 100,100 (v pixelech) | ||
- | -do videoram na adresu | + | -do videoram na adresu |
-nastavíme znovu pozici razítka, nyní 100,101 | -nastavíme znovu pozici razítka, nyní 100,101 | ||
- | -do videoram na adresu | + | -do videoram na adresu |
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/ | ||
lnxspectrum/hgfx.1595933704.txt.gz · Poslední úprava: 2020/07/28 12:55 autor: lanex