OldComp.cz

Komunitní diskuzní fórum pro fanoušky historických počítačů


Právě je 29.03.2024, 16:01

Všechny časy jsou v UTC + 1 hodina [ Letní čas ]




Odeslat nové téma Odpovědět na téma  [ Příspěvků: 52 ]  Přejít na stránku 1, 2, 3, 4  Další
Autor Zpráva
PříspěvekNapsal: 13.07.2022, 22:01 
Offline
Pan Generální
Uživatelský avatar

Registrován: 11.06.2013, 15:27
Příspěvky: 3025
Has thanked: 2192 times
Been thanked: 894 times
Kód:
Úvod do HGFX - ZX-Planar                                 1. díl
===============================================================

HGFX je nové hardvérové rozšíření, které grafické obrazovce ZX
Spectra přidává tzv. "planarovou" grafiku.  Používá normální
bitmapu zx-screenu o velikosti 6144 bajtů (od adresy 16384)
takovým způsobem,  abyste mohli každý jednotlivý bod (pixel)
obarvit libovolnou barvou nebo naopak ponechat původní
zx-pixely a k nim připojit další barevnou grafiku.

Planarový systém znáte z některých herních systémů a domácích
počítačů. V případě ZX Spectra nám dovoluje, aby nová grafika
zbytečně nezabírala už tak malou a většinou plně využívanou
základní paměť 48 až 128 KB. V planaru HGFX není nutno
programově zapisovat ani přesouvat velké úseky paměti. V
následujcícím seriálu si HGFX krátce představíme a popíšeme
zejména tu odlišnost, proč tam, kde klasická bitmapová grafika
zabírá pro 256barevný pixel jeden bajt, postačí u HGFX
manipulace s jedním bitem.

HGFX byl pečlivě definován taky s ohledem na slučitelnost s
grafikou a organizací paměti ZX Spectra, např.

- adresa videoram může být na místě ZX-screenu
- videoram může být provozována současně se ZX-screenem, který
  je zobrazen na místě transparentní HGFX barvy
- konverze programů a her pro HGFX nevyžaduje změnu paměťového
  uspořádání, videoram má stále jen 6144 bajtů paměti
- všechny nové vlastnosti HGFX lze použít i při standardní
  (nelineárně řazené) organizaci ZX-screenu

Stručně o organizaci HGFX
-------------------------

HGFX obhospodařuje osm úseků vnitřní paměti, tzv. "bitplany" o
velikosti 6144 bajtů. Jsou uložené za sebou, ale pro lepší
názornost si je představme uložené nad sebou (viz obrázek).
Čím více bitplanů zapojíte do systému, tím větší "hloubky" barev
dosáhnete. Jeden bitplane umožňuje dvě barvy, tak lze pixely jen
rozsvíti nebo zhasnout (černá nebo bílá). Dva bitplany poskytují
4 barvy. 4 bitplany 16 barev atd.

To, že celý pixel není uložen na jednom místě, paradoxně
poskytuje při práci s rozšířenou grafikou i na malém ZX Spectru
řadu výhod.


HGFX Planar
Graphics
               --------------------------------------
              /                                    /
             /                                    /--   
 Bitplane   /                                    / /    Colours
           /                                    / /--
          /                                    / / /       2
 no.0    -------------------------------------- / /--       
          /                                    / / /       4
 no.1    -------------------------------------- / /--
          /                                    / / /       8
 no.2    -------------------------------------- / /--
          /                                    / / /      16
 no.3    -------------------------------------- / /--
          /                                    / / /      32
 no.4    -------------------------------------- / /--
          /                                    / / /      64
 no.5    -------------------------------------- / /     
          /                                    / /       128
 no.6    -------------------------------------- /
          /                                    /         256
 no.7    --------------------------------------

HGFX - ZX-Planar
Každý pixel má v jednotlivých bitplanech vyhrazen vždy 1 bit.
Je to podobné jako když na ZX Spectru zadáte POKE 16384,1, což
nakreslí na obrazovku jeden bod. Rozdíl je v tom, že HGFX
nepracuje pouze s "monochromatickou" grafikou jednoho bitplane,
ale zajistí, aby se požadavek na barevný pixel - nebo jiný
efekt, ale to předbíháme výklad možností HGFX - přepsal do
všech bitplanů. Dělá to velmi rychle a tisk barevného znaku je
stejně rychlý jako tisk na původním zx-screenu. Technicky
vzato, jedním zápisem na dané pozici pixelu HGFX nastaví všech
8 bitplanů.

Teď se jistě ptáte, jak se barevná hodnota pixelu přepíše
do bitplanů? K tomu si názorně zobrazme konkrétní barvovou
hodnotu pixelu v bajtu, v binárním tvaru, a pro účely bitplanu
ji dejme nastojato, tak lépe pochopíme, jak je zapsána systémem
HGFX, tedy "propsána" napříč bitplany.


HGFX Pixel
Colour Value
                decimal: 25
                binary: 00011001

  bits order:  0 0 0 1 1 0 0 1   <-- The lowest bit goes
    bitplane:  7 6 5 4 3 2 1 0   <-- to the 1st (top) bitplane.

            /                                    / /
           /                                    / /--
          /     1                              / / / 
 no.0    -------------------------------------- / /--       
          /     0                              / / /
 no.1    -------------------------------------- / /--
          /     0                              / / /
 no.2    -------------------------------------- / /--
          /     1                              / / /
 no.3    -------------------------------------- / /--
          /     1                              / / /
 no.4    -------------------------------------- / /--
          /     0                              / / /
 no.5    -------------------------------------- / /     
          /     0                              / / 
 no.6    -------------------------------------- /
          /     0                              /
 no.7    --------------------------------------

                The most upper bit of the colour value
                goes to the lowest (last) bitplane. 

_________________
// na co myslím, když sedím u oldkompů: Blood Products from Genetic Vaccine Recipients


Nahoru
 Profil  
 
PříspěvekNapsal: 13.07.2022, 22:01 
Offline
Pan Generální
Uživatelský avatar

Registrován: 11.06.2013, 15:27
Příspěvky: 3025
Has thanked: 2192 times
Been thanked: 894 times
Kód:
Úvod do HGFX - ZX-Planar                                 2. díl
===============================================================


Nakreslení barevného pixelu
---------------------------

Už víme, že k záchazení s planarovou paměti a ke kreslení
pixelů nemusíme obsluhovat jednotlivě každý bitplane. To za
nás udělá HGFX, s jednoduchým nastavením:


1. Nastavíme si barvu, kterou se budou pixely kreslit.

HGFX umí najednou zobrazit 256 barev. Určíme číslo barvy v
indexu barev, od 0 do 255. Index barev je tabulka v paměti ZX
Spectra, délka tabulky je 768 bajtů a obsahuje 256 pozic. Barva
je vždy dána třemi bajty, protože je nastavována z rozsahu
palety TrueColour, tj. 16777216 barev (stejně jako v grafickém
režimu HRXC, HiResindeXedColour).


2. Dále nastavíme hodnotu PlanarMask, číslo, které udává,
jakých bitplanů se bude operace vykreslení pixelů týkat.
Aktivní (nastavené) bity čísla PlanarMask udávají, se kterými
bitplany se bude pracovat a které bitplany jsou pro aktuální
tisk pixelu "vypnuté". Jde tedy o masku, přes kterou se budou
do jednotlivých bitplánů "nalévat" příslušné bity barvy.

PlanarMask vlastně určuje hloubku použití barvy. 8 bitů z 8
bitplanů se promítne do jediného pixelu na obrazovce. Je to
třetí rozměr grafiky, jakási osa Z.

Příklady: Pixel s barvou (IndexColour) číslo 233 nakreslíme
tak, že v PlanarMask nastavíme hodnotu 255 (binárně 11111111).
Číslo 233 vlastně v HGFX binárně ANDujeme s číslem 255.
Všechny aktivní bity masky způsobí, že se hodnota barvy
promítne do všech bitplánů.

Složitější příklad, v němž změnou hodnoty masky nafiltrujeme
hodnotu barvy jen do vybraných bitplanů: v níže uvedeném
příkladu chceme zapsat hodnotu jen do prvních čtyř (bitplane
4 to 7) a posledního (bitplane no. 0).

      Stará barva:
   (bitplany před změnou)   145 dec, 10010001 bin         
      Nová barva:           233 dec, 11101001 bin         
      Maska:                143 dec, 10001111 bin         


      New           Planar     Bitplanes     Bitplanes
      Colour        Mask       before        after

  b0    1   ----->   1  ------change------>    1
  b1    0   ----->   1  ------change------>    0
  b2    0   ----->   1  ------change------>    0
  b3    1   ----->   1  ------change------>    1
  b4    0   ---X--   0            1  ----->    1
  b5    1   ---X--   0            0  ----->    0
  b6    1   ---X--   0            0  ----->    0
  b7    1   ----->   1   -----change------>    1     

    (zkratky b0..b7 znamenají jak bit, tak bitplane)


Binárně vyjádřeno:

     Nová barva:      11101001
     Maska:           10001111
     -------------------------
     Stará barva:     10010001
     =========================
     Výsledek         10011001


3. A teď nakreslíme pixel. Velmi prostě, barvu (IndexColour) a
propis do bitplanů (PlanarMask) už máme nastaveny, takže nám
zbývá HGFX říci, aby se pixel "aktivoval".

K tomu nám poslouží videoram HGFX o rozsahu 6144 bajtů. Její
obsah se neliší od toho, co již známe, pokud na ZX Spectru
programujeme. Představme si ji jako klasický zx-screen, matrici
256*192 pixelů, tedy 32*192 bajtů, kde každý jednotlivý bit
znamená jeden pixel. Zapisováním do videoram, změnou
jednotlivých bitů, sdělujeme HGFX, se kterými pixely má
operovat.

U ZX-screenu příkaz POKE 16384,15 způsobí, že se v levém
horním rohu obrazovky rozsvítí řada 4 bodů (v barvách
zx-atributů). Pokud zapneme HGFX, způsobí takový příkaz
vykreslení 4 bodů v plných 256 barvách.

Shoda se ZX-screenem je důležitá. Veškeré zápisy do klasických
videoram zx48 i zx128, každé vykreslení pixelu v zx-basicu i ve
strojovém kódu jde totiž s pomocí HGFX snadno obarvit jednou
z 256 unikátních barev nebo doplnit jiným efektem. A to pouhou
změnou bitu ve videoram.

HGFX však umí také zajistit, aby se nová grafika s původním
ZX-screenem jen prolínala. Adresu umístění HGFX videoram lze
kdykoliv změnit a posunout na jiné místo v paměti, třeba
na adresu 0, pokud máte na místě ROM zapnut all-ram režim.
(stejně tak můžeme posunovat tabulku barev.)


V tomto díle jsme si pro zjednodušení nakreslili jen barevný
pixel, jistě vás napadá, že planarová maska je vhodná i pro
jiné, složitější operace. O tom někdy příště.

_________________
// na co myslím, když sedím u oldkompů: Blood Products from Genetic Vaccine Recipients


Nahoru
 Profil  
 
PříspěvekNapsal: 13.07.2022, 22:01 
Offline
Pan Generální
Uživatelský avatar

Registrován: 11.06.2013, 15:27
Příspěvky: 3025
Has thanked: 2192 times
Been thanked: 894 times
Kód:
Úvod do HGFX - ZX-Planar                                 3. díl
===============================================================

Ve třetí a čtvrté části úvodu do HGFX opustíme teorii planaru a
povíme si o několika šikovných drobnostech tohoto grafického
rozšíření.


1. Nelineární vs. lineární uspořádání paměti.

Zvláštní způsob řazení obrazových dat u ZX Spectra je jasně
patrný při pomalém nahrávání ZX-screenu z pásky. Linky jsou
vykreslovány po třetinách obrazovky v pořadí linek 0, 8, 16,
... až 56, a po nich následují linky 1, 9, ... až 57 atd.

    ZX Spectrum bitmap structure

        1st line  ...  byte 0 to 31 
        2nd line  ...  byte 256 to 287
        ...
        8th line  ...  byte 32 to 63
        9th line  ...  byte 288 to 319
        ...

Aby HGFX bylo snadno použitelné s téměř každým dosavadním
programem pro ZX Spectrum, má defaultně nastavené toto původní
nelineární uspořádání videoram.

Pokud nepotřebujeme kompatibilitu se ZX-screenem, zkusme
lineární uložení paměti. Umožní to úsporné a rychlé operace
typu kopírování částí screenu a DMA přenosy, třeba posuny
screenu o jeden pixel.

    HGFX Linear video memory

        1st line  ...  byte 0 to 31 
        2nd line  ...  byte 32 to 63
        3rd line  ...  byte 64 to 95
        ...
     

2. Transparentnost

Původní ZX-screen s atributy může být zachován i při zapnutém
HGFX. Pokud povolíme transparenci, ZX-screen bude zobrazován
jakoby pod vrstvou HGFX a bude vidět jen tam, kde má HGFX
grafika nastavenu indexovou barvu č. 0.

S HGFX videoram nastavenou defaultně, od 16384, kreslíme
současně do ZX videoram i do videopaměti HGFX. Buffer HGFX má
však v zobrazení přednost a není-li zapnuta transparence, vždy
zastíní atributovu ZX grafiku svou barvou.

Zachování ZX-screenu souběžně s HGFX ukáže své kouzlo při
úpravě programů a her pro HGFX. Ne všechny grafické prvky je
ale nutno převádět do HGFX, např. herní pozadí, to by mohlo
být navíc velmi pracné.


3. Offsety

Na offsety si určitě vzpomenou ti, kdo programovali v Beta
Basicu a používali systémové proměnné XOS a YOS. My ostatní si
zapamatujme prostou definici, že offset nastavuje pozici
kreslení na obrazovce. Souřadnice X a Y v pixlech jsou v
systému HGFX dány takto:

---------------------------------------------------------------
| X,Y: 0,0                                        X,Y: 255,0  | 
| adr. 16384                                      adr. 16415  | 
|                                                             |
|                256 pixels, 32 bytes per line                |
|                                                             |
|                                                             |
|                                                             |
|       192 lines                                             |
|          192*32 = 6144 bytes                                |
|                                                             |
|                                                             |
|                                                             |
|                                                             |
|                                                             |
|                                                             |
| X,Y: 0,191                                      X,Y: 255,191|
| adr. 22496                                      adr. 22527  | 
---------------------------------------------------------------

Příklad 1:

Nastavíme OffsetX=0, OffsetY=16 a vykreslíme znak do videoram.
Uložíme první bajt na adresu 16384, další bajt na 16416 atd.
Znak se na obrazovce zobrazí tak, jako bychom tiskli pomocí
basicového PRINT AT 2,0;

Příklad 2: Tisk písmen o šířce 6 pixelů.

Nastavíme offsety na 0,0. Tiskneme už klasicky, jako v prvním
příkladu na adresu 16384. Souřadnice pro druhé písmeno
nastavíme také offsetem, dáme OffsetX na 6, a tiskneme...
zase na adresu 16384 (?! jo, skutečně odpadá nutnost přepočítat
souřadnice na bajty a bity přesného umístění v paměti ani není
třeba rolovat bitové předlohy znaků). Pro třetí znak nastavíme
OffsetX na 12 a opět tiskneme na 16384. Takto pokračujeme se
všemi znaky.

Další příklady si už jistě představíte sami. Úspora strojového
času je při použití offsetů ohromná. Ať už se jedná o práci
s fonty proporcionálními (či s nestandarní šířkou 4 - 7 pixelů)
nebo o pohyblivou grafiku. Do příští kapitoly o HGFX si zkusme
spočítat, kolik nám offsety ušetří námahy při vykreslení
sprajtů na jiné pozice než jsou násobky osmi.

A zvídavým čtenářům lze do některé z příštích příštích kapitol
napovědět, že offsety umí překvapit, např. mohou být záporné
a třeba nám pomůžou s HiRes grafikou. :-O

_________________
// na co myslím, když sedím u oldkompů: Blood Products from Genetic Vaccine Recipients


Nahoru
 Profil  
 
PříspěvekNapsal: 13.07.2022, 22:02 
Offline
Pan Generální
Uživatelský avatar

Registrován: 11.06.2013, 15:27
Příspěvky: 3025
Has thanked: 2192 times
Been thanked: 894 times
Kód:
Úvod do HGFX - ZX-Planar                                 4. díl
===============================================================

4. Umístění videopaměti HGFX

Videopaměť v systému HGFX se skládá ze 3 oblastí:
   1. Vlastní videopaměť HGFX o velikosti 6144 bajtů.
   2. Konfigurační paměťové registry.
   3. Barvové registry (index 256 barev) o velikosti 768 bajtů.

HGFX VideoRAM, ConfigRAM i ColourRAM můžou být umístěny
v paměťovém prostoru ZX Spectra od adresy 0 kdekoliv, po
násobcích 256 bajtů. Nastavuje se pomocí tří HGFX portů.

  g_zxi_021  high byte of Videoram area
  g_zxi_022  high byte of Registers area             
  g_zxi_023  high byte of Indexed colour table area 

Počátek obrazové paměti je při zapnutí HGFX nastaven do
původní zx-bitmapy, na 16384 (40h * 100h = 4000h = 16384 dec).
Nastránkovat lze také do oblasti ROM (i tady zápisy do HGFX
pamětí fungují).

Poznámky:
Hardware EleMeNt ZX/MB umisťuje nová rozšíření na již předem
plánované ZXi porty. Žádný z HGFX portů tak nikdy nebude
kolidovat s dosavadními, korektně naprojektovanými
ZX-periferiemi. Porty a registry HGFX najdete sepsané
v Programátorské referenční přiručce na stránce 128land.com
v sekci Dokumenty.

Stávající verze HGFX má celkem 7 řídících portů a 7 paměťových
registrů, z toho čtyři registry jsou 16bitové.

Outy na HGFX porty se obvykle použijí jen jednou, k zapnutí a
nastavení systému (kde je videoram, kde barvy, a kde registry).
Pak se na ně už nemusí sahat. Další ovládání probíhá zápisem
do HGFX registrů, které jsou uloženy normálně v paměti a dají
se obsluhovat, např. inkrementovat, rychleji než porty.

V příručce ProgRef si povšimnete, jak paměťové registry HGFX
pracují se dvěma videobuffery. Při práci s planarem žádné
buffery ve videoram nenajdete, neboť se jedná o interní
záležitost HGFX systému, o dvě vnitřní pracovní obrazovky
zahrnující vždy data všech bitplanů. Skrze registry HGFX je
však lze ovládat dokonale, mnohem lépe, než jsme zvyklí z
přepínání dvou klasických zx-videoramek.


5. HiRes - "jemné" rozlišení 512*192 bodů

Jsem Vám ještě neprozradil, že HGFX umí jemnou grafiku? Dokonce
s barvami a na rozdíl od grafických módů HRC (HiResColour) bez
jakýchkoliv atributových kompromisů. I v HiResu, stejně jako
v rozlišení 256*192 platí, že co pixel, to jiná barva. HGFX je
prvním systémem, co na ZX Spectru zobrazí (s malým trikem)
v 6144 bajtech 256 barev v jemné grafice, s 512 pixely na
řádek.

Jedna linka (bod 0 až 511) zabírá v HiRes 64 bajtů
(v původním rozlišení ZX Spectra 256*192 bodů, které nyní
můžeme nazvat LowRes, ať už bylo nelineární nebo lineární, to
je vždy 32 bajtů).

    HGFX HiRes linear video memory

        1st line  ...  byte 0 to 63
        2nd line  ...  byte 64 to 127
        3rd line  ...  byte 128 to 191
        ...

Dvojnásobné rozlišení znamená, že paměťový prostor 6144 bajtů
vystačí pouze pro polovinu obrazovky HiRes. K tomu, abychom
ovládali celý prostor najednou, a sice vždy stejným
jednoduchým způsobem, si vypomůžeme offsetem.

---------------------------------------------------------------
| X,Y: 0,0                                         X,Y: 511,0 | 
| adr. 16384          512 pixels, 64 bytes         adr. 16447 | 
| Offset Y=0                    per line                      |
|                                                             |
...                                                         ...
|                 96 lines                                    |
| X,Y: 0,95         96*64 = 6144 bytes             X,Y: 511,95| 
| adr. 22464                                       adr. 22527 | 
| Offset Y=0                                                  |
---------------------------------------------------------------
| X,Y: 0,96                                        X,Y: 511,96| 
| adr. 16384          512 pixels, 64 bytes         adr. 16447 | 
| Offset Y=96                   per line                      |
|                                                             |
...                                                         ...
|                 96 lines                                    |
| X,Y: 0,191        96*64 = 6144 bytes             X,Y:511,191|
| adr. 22464                                       adr. 22527 | 
| Offset Y=96                                                 |
---------------------------------------------------------------

Také HiRes lze kombinovat se ZX screenem a tak kupř.
atributovou grafiku obohatit jemným písmem...


6. Formát indexových barev, border

Barva je vyjádřena 24bitovou (3 bytes) RGB hodnotu uloženou do
paměti tak, že jako první je ukládán nejnižší byte, barevná
složka (B)lue. Podobně, jako to dělá Z80 CPU, když ukládá
16bitová čísla, např. číslo #4000 uloží v pořadí #00, #40.

Příklad:
        adr   - hodnota blue
        adr+1 - hodnota green
        adr+2 - hodnota red

Můžeme také mluvit o ukládání v pořadí BGR(0-255,0-255,0-255).

Originální paletu ZX Spectra nadefinujeme v HGFX takto:

     Colour    Binary    B-G-R       Colour
     number    value     storage     name
    ----------------------------------------------------
       0        0000     #000000     black
       1        0001     #B60000     blue   (BRIGHT 0)
       2        0010     #0000B6     red
       3        0011     #B600B6     magenta
       4        0100     #00B600     green
       5        0101     #B6B600     cyan
       6        0110     #00B6B6     yellow
       7        0111     #B6B6B6     white
       8        1000     #000000     black
       9        1001     #FF0000     blue   (BRIGHT 1)
      10        1010     #0000FF     red
      11        1011     #FF00FF     magenta
      12        1100     #00FF00     green
      13        1101     #FFFF00     cyan
      14        1110     #00FFFF     yellow
      15        1111     #FFFFFF     white

Uložení v paměti:
    DATA 0,0,0     ; black
    DATA 182,0,0   ; blue (no bright)
    DATA 0,0,182   ; red (no bright)
    DATA 182...    ; magenta (no bright)

Port 254 standardně slouží k výběru barvy okraje obrazovky ze
základních 8 barev (bez brightu). Pokud se v HGFX zapne
"indexová barva v borderu", port 254 určuje, která barva
uložená v některém z prvních osmi barevných indexů bude barvou
borderu.


Příště - a asi už naposledy pro úplné HGFX začátečníky -
začneme o tom nejlepším... o kouzlením s HGFX pomocí funkcí
(žádný složitý blitter ani dma to ale nebude).

_________________
// na co myslím, když sedím u oldkompů: Blood Products from Genetic Vaccine Recipients


Nahoru
 Profil  
 
PříspěvekNapsal: 13.07.2022, 22:02 
Offline
Pan Generální
Uživatelský avatar

Registrován: 11.06.2013, 15:27
Příspěvky: 3025
Has thanked: 2192 times
Been thanked: 894 times
Kód:
Úvod do HGFX - ZX-Planar                                 5. díl   
===============================================================

V páté části úvodu do HGFX si povíme o 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ý
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.

_________________
// na co myslím, když sedím u oldkompů: Blood Products from Genetic Vaccine Recipients


Nahoru
 Profil  
 
PříspěvekNapsal: 13.07.2022, 22:02 
Offline
Pan Generální
Uživatelský avatar

Registrován: 11.06.2013, 15:27
Příspěvky: 3025
Has thanked: 2192 times
Been thanked: 894 times
Kód:
Úvod do HGFX - ZX-Planar                                 6. díl   
===============================================================

Dnes ukončíme začátečnické lekce o HGFX. Pro ostřílenou část ZX
komunity to bylo netradiční a zdlouhavé, jak se šlo klikatou
metodou od obecného k náročnému. Proto nyní končíme u dvou věcí
z hlediska HGFX velmi podstatných, které obvykle najdete
v technické dokumentaci na předních místech.

Metody zápisů a čtení mohou být v ZX-planaru velmi kreativní.
Už chápeme, jak vyčistit celý bajt nebo změnit jen pixely
nastavené na 1. K tomu si teď ukážeme něco složitějšího, jak
uchovat načtený obsah v interním bufferu, aby šel později
vrátit na jiné místo. Máme pro to v HGFX různé módy a režimy
práce.


Operační mód HGFX - Ink Mode
----------------------------

Dosavadní popisy uvažovaly především tenhle mód. Mód Ink
znamená, že tam, kde je v zapisované hodnotě logická jednička,
se zapíše do aktivního (nastaveného) videobufferu bit z právě
vybrané indexové barvy. Kde jsou logické nuly, tam se nic
nemění.


Operační mód HGFX - Copy Mode
-----------------------------

Copy Mode je složitější než Ink. Mód Copy umí dva režimy:

První režim je čistě zápisový. Tam, kde se do videopaměti
zapisuje (nastavuje) bit 1, se pixel obarví stejně jako v módu
Ink. A kde je 0, tam se vše vynuluje. Jinak řečeno, při zápisu
dat dává do míst, kde se (v kombinaci s PlanarMask) do videoram
barva nezapisuje, barvu s index. číslem 0.

Druhý režim nastává automaticky vždy, když se nejprve čte
z videoram. V takovém případě příští zápis zapíše obsah, který
byl načten při posledním čtení. Ale pozor! Hodnota načtená musí
být stejná s hodnotou následně zapisovanou. Pokud se neshodují,
provede se jen zápis v prvním režimu módu Copy.

Platí tedy:

1. Pokud v módu Copy zápisu do videoram předchází čtení
z videoram a čtená hodnota je stejná jako zapisovaná, dojde ke
kopírování barev u celé řady 8 pixelů.

2. Pokud se v módu Copy nejprve čte z prostoru videoram,
předmětem příštího zápisu bude obsah videoram z pozice, kde se
četlo.

Je jedno, zda jsou zapisovány 0 nebo 1, zkopíruje se 8 pixelů.

Ukázkovým příkladem jednoduchosti zdánlivě složitého módu Copy
je scrollování výpisu na obrazovce, jak to známe ze spectráckého
basicu. Když ROM scrolluje nahoru, načte z videoram bajt
 - teď, pozor, tady se přepíná mód Copy do druhého režimu! -
a zapisuje jej o 8 pixelů výše. A pořád dokola, pokud dodržíme
pořadí čtení/zápis.

Také v Copy mode se uplatňuje offset, čtení i zápis mají své
vlastní offsety. Každá zápisová nebo čtecí operace může být
z jiného místa. Dokonce i z jiného bufferu, u Copy módu lze
nastavit, ze kterého a do kterého bufferu chceme kopírovat
(pozn.: v případě rozlišení 512*192 máme jen jeden buffer).


Chunky grafika
--------------

Chunky můžememe považovat za formát (upořádání) dat nebo za
mód zobrazení. Je to megablok paměti, uspořádaný tak, že každý
pixel je obarvitelný jednou z 256 barev a zabírá v paměti celý
jeden bajt. Chunky sebou nese problém obrovské videoram, která
má v případě rozlišení 256*192 bodů velikost 48 KB. Starší
procesor typu Z80, bez specializovaných DMA a dalších obvodů má
co dělat, aby v ní něco plynule provedl, kupř. při scrollingu
musí obětovat všechen svůj strojový čas na přenos bajtů.

 256 coloured pixel chunky graphics

        256*192 = 49152 pixels (48 KBytes)

    1st      2nd      3rd                   49152.
    pixel    pixel    pixel                 pixel
 |--------|--------|--------|...  ...  ...|-------|
                                                 
   byte 0   byte 1   byte 2              byte 49151


HGFX umí kromě planarové grafiky vystavit svá grafická data
také v chunky. Upřímně: interní buffery jsou v HGFX vedeny
v chunky formátu a můžeme do nich přistupovat přes planar
anebo přes chunky režim.

Planar je nepochybně vhodný pro skromnější počítače (zejména
v osmibitových poměrech), chunky režim pro silnější hardvér.
Vzhledem k rozdílnému přístupu do videopaměti poskytuje
chunky efekty, které jdou v planaru jen obtížně realizovat
(a naopak).

V HGFX chunky řeší jednu základní věc, a to čtení z bufferů,
což v planaru není možné. V paměťovém módu Ultimate (hardvéru
eLeMeNt ZX/MB) si jej může zobrazit v okně 8 KB anebo 16 KB.
Chunky paměť se však nestránkuje! Rychlé osmibitové stránkovací
registry našich elementů či mbéček nemají pro HGFX význam.
Musíme na to jít jinak: Počátek oblasti, kterou chceme
zpřístupnit, nastavujeme offsetem Y. Tak je možné, abychom od
adresy 0 měli data pixelů třeba z linky 120.

Příklad tisku v Chunky módu - nakreslení pixelu na souřadnice
128,96 barvou 158

   chunky RAM nastavit do osmiKB prostoru od 8192 do 16383
   OffsetY = 96
   POKE 8192+128,158

Aby byl chunky režim přece jen více použitelný, respektuje
některá systémová nastavení HGFX z planaru. V chunky režimu
kromě offsetů využijeme PlanarMask a nastavovací bity HGFX
registru č. 0 (video parameters).

PlanarMask se chová, překvapivě, stejně jako v planaru :-)
Prostě když zapisujete bajt, zpracuje se skrze PlanarMask.
Tedy i v případě chunky platí, že se přepíšou jen aktivní bity,
ostatní data (na místě nul v PlanarMask) se nemění, se
uchovají v předchozí hodnotě.

Zjednodušeně: v planaru jsou bity nastojato nad sebou, v chunky
jsou naležato, ale maska na ně vždy sedne stejně, když se do
pamětí zapisuje. Rozdíl tu ale každopádně je, ve prospěch
planaru: Zápisem jednoho bajtu obsloužíme v planaru 8 (chunky)
různých pixelů současně, v chunky režimu ale jen jeden jediný
chunky pixel.

Další pořádná věc, co nám práci v chunky režimu usnadní, je
možnost přepínat buffery a nastavit různé buffery pro různé
operace. Můžeme tak bez přepínání číst z jiného bufferu, než
do kterého zapisujeme.


Na závěr
--------

Seriál o HGFX tímto dílem končí. Ještě přibude dodatek s tématy
z nezodpovězených diskusních otázek a s příklady programování,
nastaveními, zejména v basicu. Tím plynule přejdeme do
praktického kursu "HGFX pro pokročilé" :-)

Přeji Vám s HGFX hodně spokojenosti a radosti při dalším
objevování, ať už si zapnete emulátor LnxSpectrum nebo grafárnu
HGFX budete prohánět na reálných strojích typu eLeMeNt ZX a
MB03+ Ultimate.

Poděkovat chci:    Lanexovi, LMN128 a Hoodovi,
                   za velkou pomoc s tímto seriálem.

A taky za bratrství, díky němuž jsme mohli ZX Spectrum naladit
pro 21. století. Přitom se podařilo sloučit různé přístupy
(klony, periferie), západní i východní spectristické styly.
Osvědčené staré věci nevylučovat a nové a dobré více spojovat.
Přehled vývoje několika minulých let najdete na www.128land.com

Dále děkuji za podporu všem, kteří přispěli rukou a hlavou,
radou nebo jinou podporou, prostě dali šanci novému hardvéru
z rodiny eLeMeNt ZX/MB:

                   pvym, Zoom, Busy, lordcoxis,
                   nihirash, NEO SPECTRUMAN, Tchunass,
                   Velesoft, Martin8bity, dakidski a další

+ aplaus patří komunitě vývojářů pro esxDOS, bez nich by naše
snaha nebyla úspěšná!

_________________
// na co myslím, když sedím u oldkompů: Blood Products from Genetic Vaccine Recipients


Nahoru
 Profil  
 
PříspěvekNapsal: 13.07.2022, 22:02 
Offline
Pan Generální
Uživatelský avatar

Registrován: 11.06.2013, 15:27
Příspěvky: 3025
Has thanked: 2192 times
Been thanked: 894 times
dodatky a přílohy

_________________
// na co myslím, když sedím u oldkompů: Blood Products from Genetic Vaccine Recipients


Nahoru
 Profil  
 
PříspěvekNapsal: 14.07.2022, 08:46 
Offline
Pan Štábní
Uživatelský avatar

Registrován: 12.05.2013, 21:39
Příspěvky: 1970
Bydliště: Praha
Has thanked: 85 times
Been thanked: 255 times
Martin1 píše:
SCjoe píše:
V případě ZX Spectra nám dovoluje, aby nová grafika
zbytečně nezabírala už tak malou a většinou plně využívanou
základní paměť 48 až 128 KB.
HGFX obhospodařuje osm úseků vnitřní paměti, tzv. "bitplany" o
velikosti 6144 bajtů. Jsou uložené za sebou,

Si to trochu protirečí, 8x6kB je 48kB, takže ťažko hovoriť, že to nezaberá základnú pamäť.


Ja to chapu tak ze HGFX ma vlastni velkou pamet kam jsou data kopirovany pres oblast ZXS videoram jako buffer a tak to v pameti ZXS skutecne nic nezabira.

https://wiki.ilnx.cz/doku.php/lnxspectrum:hgfx


Nahoru
 Profil  
 
PříspěvekNapsal: 14.07.2022, 08:59 
Offline
Pan Generální
Uživatelský avatar

Registrován: 11.06.2013, 15:27
Příspěvky: 3025
Has thanked: 2192 times
Been thanked: 894 times
všichni máte pravdu... ale jen částečně :ugeek:
ani ve výše uvedeném odkazu to úplně přesně není, tam je popis staršího a trošku robustnějšího HGFX/Q

_________________
// na co myslím, když sedím u oldkompů: Blood Products from Genetic Vaccine Recipients


Nahoru
 Profil  
 
PříspěvekNapsal: 14.07.2022, 12:44 
Offline
Óm Nejvyšší
Uživatelský avatar

Registrován: 07.07.2019, 22:14
Příspěvky: 3767
Has thanked: 269 times
Been thanked: 452 times
Aniž bych chtěl snižovat význam tohoto udělátka tak mi přijde ten nadpis poněkud technicky nesprávný. Byť přímo možných 256 barev je na 8bit nevídaně hodně, Truecolor má 24bitovou hloubku čili potřeboval bys reálně ne jeden ale 3 bajty na pixel neboli 24 planárů. A stejně tak 6144 bajtů ani náhodou nemůže stačit pro uchování obrazové informace rozlišení ZX Spectra v truecolor. Samozřejmě udělátko musí mít svoji RAM ale tam rozhodně nevystačíš s tak malou pamětí. Spectrum barvu definuje na oblast 8x8 bodů tak jsem zvědavý jak je tenhle nesoulad tady řešený a ano viděl jsem ta krásná barevná videa tohoto rozšíření, které pracuje s pixely takže řešení existuje ovšem nemůže to tak nikdy běžet na neupraveném Spectru v 6 KB RAM.

Tento přístup má i PP-01, které má 3 RGB mapy pixelů a registr co dokáže zapisovat buď do zvolené mapy nebo hardwarově vybranou barvu rozdělit do všech tří. Díky tomu dostali 8 barev na 1 pixel v rozlišení 256x256 do 24 KB paměti což je úplné technické minimum pro toto rozlišení a barevnost bez komprese apod. S Truecolor by to vyžadovalo 3x víc RAM, alespoň 72 KB což by PP-01 sice stále v pohodě zvládalo ale tvorba video signálu už by nevystačila s jednoduchým RGB mícháním 3 sloźek.


Ač mi to přijde trošku jako škrábat se levou nohou za pravým uchem, ty výsledky zobrazení jsou moc hezké, stejně tak rozlišení. Jen tedy ve své době by to asi nemělo šanci vzniknout, když to je technicky vzato o pár generací novější samostatná grafická karta s na 8bit obří RAM a Spectrum jí slouží jen jako vstup pro samostatné kreslení. Jakými obvody to je realizováno, pokud to není emulace od A do Z?

Busy: Buffery jsou dle popisku pro Spectrum jen write only, takže asi nijak. To samé je i u PP-01, nedá se přímo přečíst jaká barva je ve videoRAM (byť by to asi bylo možné udělat zpětným dekodérem ale patrně nebyl důvod). Na PP se nicméně dá barva alespoň zpětně odvodit z pomalého přečtení 3 bajtů videoram když to je zásadně nutné vědět.


https://wiki.ilnx.cz/doku.php/lnxspectrum:hgfx


Nahoru
 Profil  
 
PříspěvekNapsal: 14.07.2022, 13:30 
Offline
Pan Generální
Uživatelský avatar

Registrován: 11.06.2013, 15:27
Příspěvky: 3025
Has thanked: 2192 times
Been thanked: 894 times
Busy píše:
Ma to ... kolko ... ako ... Akym sposobom

Vsechny dotazy nas HGFX team rad zodpovi vsem tazatelum osobne, teda pokud to za nas zpetnym vzdalenym dishardweringem uz neudelal Czech Human :-)
Skrze PM idealne ... protoze jinak by nam Busy z toho uz udelal expertni rubriku pro programatory :-)

Za dotazy a vsechny napady kazdopadne dekuju, prosim piste.
Ackoliv je HGFX skromny a usporny (zadne blittery ani amigy), vedle planaru dojdeme i na chunky :-)
Dalsi dil uz dnes vecer, zase po 10. hodine.

Pro netrpelive tu udelam vyjimku a dam cersty odkaz na nepratelskou platformu: https://www.facebook.com/groups/743960316425769
Kdo na FB nechodite: o nic neprichazite, vse mate jiz tu na foru (a vzdy jeste neco navic),
nize vizte prilozeny (po rozkliknuti jiste animovany) obrazek neceho, co je zatim nehotove "in development... in progress".


Přílohy:
highwenc-hgfx.gif
highwenc-hgfx.gif [ 4.67 MiB | Zobrazeno 5560 krát ]

_________________
// na co myslím, když sedím u oldkompů: Blood Products from Genetic Vaccine Recipients
Nahoru
 Profil  
 
PříspěvekNapsal: 14.07.2022, 13:53 
Offline
Pan Generální
Uživatelský avatar

Registrován: 11.06.2013, 15:27
Příspěvky: 3025
Has thanked: 2192 times
Been thanked: 894 times
dex píše:
do eLeMeNtu se HGFX...

samozřejmě vejde, běží i v nerozšířeném eLeMeNtu ZX bez extra RAM, o eLeMeNtu ZX+ (a AU+) nemluvě

HGFX se spíše nevejde například do... SpecNextu, a to ani do poslední verze, kde autoři údajně zase chtějí něco pošetřit a hodlají "upgradovat" na (opět) mrňavé FPGA (?)

_________________
// na co myslím, když sedím u oldkompů: Blood Products from Genetic Vaccine Recipients


Nahoru
 Profil  
 
PříspěvekNapsal: 14.07.2022, 16:09 
Offline
Óm Nejvyšší
Uživatelský avatar

Registrován: 07.07.2019, 22:14
Příspěvky: 3767
Has thanked: 269 times
Been thanked: 452 times
Já nechci nic srážet nebo ze sebe dělat přechytrálka, jen jsem si přečetl popisku co to umí na co se Busy ptal a dal jsem odkaz. Předpokládám že víc mutací tohoto rozšíření neexistuje. Očekával jsem jen něco víc fyzického než pár rovnic do FPGA byť ten funkční princip se mi moc líbí když bezbolestně umožní přidat takové zásadní vylepšení :-). Rozlišení a barvy jsou největší bolest všech 8bitů a tohle ze Spectra dělá takové malé PC.


Nahoru
 Profil  
 
PříspěvekNapsal: 14.07.2022, 19:09 
Offline
Óm Nejvyšší

Registrován: 22.05.2013, 21:14
Příspěvky: 3642
Bydliště: Bratislava
Has thanked: 372 times
Been thanked: 788 times
Czech Human píše:
To samé je i u PP-01, nedá se přímo přečíst jaká barva je ve videoRAM (byť by to asi bylo možné udělat zpětným dekodérem ale patrně nebyl důvod). Na PP se nicméně dá barva alespoň zpětně odvodit z pomalého přečtení 3 bajtů videoram když to je zásadně nutné vědět.
Ano, platformu PP-01 poznam velmi dobre, takze viem ako to tam funguje. Tam je cela videoramka, vsetky bitplany okrem hw-akcelerovaneho zapisu normalne pristupna procesoru pre normalne citanie aj zapis, preto ma zaujimalo, ci aj na tomto HGFX je take nieco mozne.


Nahoru
 Profil  
 
PříspěvekNapsal: 14.07.2022, 21:34 
Offline
Radil

Registrován: 18.10.2014, 23:10
Příspěvky: 377
Has thanked: 28 times
Been thanked: 120 times
V tom "Copy" móde by bolo dobré mať na výber kopírovanie alebo priehladnosť farby 0.
Ak nepoužijem maximalne rozlíšenie napadlo ma využiť pamäť mimo obrazovky pre sprajty v 255 farbách s maskovaním farbou 0. S kopírovaním by sa dala táto pamäť použiť ako dlaždice pre pozadie.


Nahoru
 Profil  
 
Zobrazit příspěvky za předchozí:  Seřadit podle  
Odeslat nové téma Odpovědět na téma  [ Příspěvků: 52 ]  Přejít na stránku 1, 2, 3, 4  Další

Všechny časy jsou v UTC + 1 hodina [ Letní čas ]


Kdo je online

Uživatelé procházející toto fórum: Žádní registrovaní uživatelé a 0 návštevníků


Nemůžete zakládat nová témata v tomto fóru
Nemůžete odpovídat v tomto fóru
Nemůžete upravovat své příspěvky v tomto fóru
Nemůžete mazat své příspěvky v tomto fóru
Nemůžete přikládat soubory v tomto fóru

Hledat:
Přejít na:  
Založeno na phpBB® Forum Software © phpBB Group
Český překlad – phpBB.cz