Úvod do HGFX - ZX-Planar 5. díl =============================================================== V páté části úvodu do HGFX si povíme o dvou základních a často používaných funkcích systému, kombinovaných s hodnotou PlanarMask. Nejdříve však dejme rekapitulaci s ukázkou, abychom se ujistili, že rozumíme práci s bitplány, tj. orientaci ve vrstvách grafiky. Ovládání HGFX je jednoduché, pokud se vyznáme v bitplanech (hlavně kvůli barvám), ostatní pak už je hračka. Příklad: Potřebujeme tříbarevný sprajt, šipku. Protože zapisujeme do bitplanů, máme grafická data připravena ve vrstvách. Na ZX Spectru se většinou vyskytují jednobarevné nebo dvoubarevné sprajty, tzn. 1 bitmapu (vrstva, event. s maskou), v níž aktivní bity určují obrázek a nuly místa, kde není nic nebo kde se třeba vykreslí pozadí. U našich tří barev potřebujeme 2 vrstvy (umožňují až 4 barvy). Skládání vrstev nám dá požadovaný výsledek. U šipky máme záměr, že: barva č. 1 obarví lesklou (horní) polovinu šipky barva č. 2 matnou (dolní) polovinu šipky barva č. 3 okraje a hřbet šipky Ve vrstách jsou barvy aranžovány takto: Colour 1 Colour 2 Colour 3 b0 1 0 1 b1 0 1 1 Tím, že v planaru je vše poskládáno "na sebe", se spojují bity ležící nad sebou v jednotlivých vrstvách a poskytují kýženou barvu. V našem případě např. barva č. 3 musí mít nastaven bit v každé vrstvě. Obě vrstvy a zobrazený celek vypadají takto: 1. layer 2. layer Result + + + + + + + + + + + + + + + + # # # # # # # # + + + + + + + . + + . . . . + . # # @ @ @ @ # . + . + + + + . . + + + . . + . . # % # @ @ # . . + . . + + + + . + + + + . . + . # % % # @ @ # . + . . . + + + + + + + + + . . + # % % % # @ @ # + . + . . + + . + + + + + + + . # % # % % # # . + + . + . + . . + + . + + + . . # # . # % # . . + . . . + . . . + . . . + . . . # . . . # . . . Šipku budeme umisťovat v bitplanech 3 a 4. To znamená, že první vrstva grafiky šipky půjde do bitplanu 3 a druhá vrstva do bitplanu 4. Ještě si předem nastavíme požadovanou barvu. A jdeme kreslit: 1. Hodnotu PlanarMask na 8 (000001000 bin, tedy bitplane no.3) 2. Vykreslíme první vrstvu sprajtu. 3. Hodnotu PlanarMask na 16 (000010000 bin, tedy bitplane no.4) 4. Vykreslíme druhou vrstvu sprajtu. I když by se zdálo, že opakovaný tisk vrstev grafiky sprajtu do bitplánů, jakési razítkování napříč bitplány, musí program zpomalovat, není tomu tak. V HGFX ušetříme čas nejen tím, že výběrově pracujeme s bitplany a vrstvami grafiky, ale taky tím, že používáme offsety a nemusíme grafiku bitově rolovat. Tohle ještě doplňují jednoduché, ale velmi rychlé speciální funkce pro kopírování a mazání. Ve výsledku je HGFX i při 16 barvách sprajtů rychlejší než původní monochromatická nebo atributová grafika ZX Spectra. Jak múže být kombinována různá grafika, v několika vrstvách a s různým počtem barev, si ukážeme na příkladu letící sovy (známé animace z Agony). V HGFX provedení ji najdete na adrese https://vimeo.com/429052052 Statické, animované a rolované oblasti grafiky tohoto dema jsou rozděleny mezi bitplany, a to v poměru 1 : 3 : 2 : 2 Bitplany: / tráva / no. 0 (nejbližší popředí) ------------------ / no. 1 =================== ------------------ / no. 2 stromy (popředí) ------------------ / no. 3 =================== ------------------ / no. 4 logo ------------------ a / no. 5 letící sova ------------------ / no. 6 =================== ------------------ tmavý les / no. 7 (pozadí) ------------------ Nejvíce barev přirozeně vyžaduje hlavní objekt na obrazovce, sova. Její grafická data jsou prokopírovávána do 3 bitplanů. Zajímavostí, mimo vrstvy planaru, je to, že nejzazší pozadí s měsícem a hvězdami není v žádném bitplánu, ale v zx-screenu. ZX-screen prosvítá tam, kde je v HGFX barva č. 0. K dispozici je tak vedle 8 bitplánů ještě jedna vrstva, klasická ZX, obarvená atributy. COPY_ALL a ERASE_ALL -------------------- jsou v HGFX součástí samostatné jednotky, jsou to funkce, které umí dvě užitečné činnosti: na povel provedou buď kopírování nebo mazání, a to v rámci celého bufferu. Spouští se příkazem: zápisem do paměťového HGFX registru. COPY_ALL vždy překopíruje celý obsah videoram z jednoho bufferu (source) do druhého (destination). Přitom se řídí podle hodnoty PlanarMask, což umožňuje kopírovat jen některé bity v rámci každého bodu, tedy zkopírovat jen některé bitplany. ERASE_ALL vyplní celý buffer nulami. Kterých bitplanů se to týká, říká PlanarMask. Přes tuhle masku tedy maže vybrané vrstvy - bitplany (když máme v PlanarMask hodnotu 0, žádný bit masky není nastaven, nesmaže se nic). Obě funkce zpracovávají celou videoram, a to něco trvá. Po tuto dobu není vhodné s videoram pracovat, ale Z80 může dělat jakoukoliv jinou činnost. Na to, abychom zjistili, že funkce skončila a může se zase sahat do bufferů, slouží STATUSový (paměťový) registr. Pro letmou představu: operace COPY trvá necelé dvě milisekundy, ERASE trochu více více než 1 milisekundu. Pro programátory: doba COPY_ALL se dobře pamatuje, na 3,5 MHz stroji provedení této funkce trvá 6144 Téček :-) Tím jsme dnes délku výuky vyčerpali, na pracovní módy HGFX se nedostalo, tak zase příště, jeden díl ještě bude.