AMIGA REVIEW obsah časopisu online!
  Domov     Software     Hry     Obaly     Download  

„NO SYSTÉM“ programování

Radim Ballner

Vítám vás u druhého pokračování seriálu o nesystémovém programování. Dnes si povíme o COPPERu a zkusíme se podívat na to, jak zobrazit nějaký raw obrázek.

COPPER
Copper je vlastně koprocesor, který můžeme programovat obdobně jako každý jiný procesor. Jistě si ještě vzpomínáte z minulého čísla na to, jak jsem hovořil o DMA. A právě jeden DMA kanál je přiřazen COPPERu. Z toho vyplývá, že hlavní mikroprocesor a COPPER můžou pracovat současně. Copper má jen úzkou instrukční sadu, má pouze tři instrukce u to – MOVE, SKIP, WAIT. Někomu by se mohlo zdát, že je to málo, ale ve skutečnosti je to přesně tolik, kolik potřebujete pro práci se zobrazováním.
Nejdříve se podívejme na řídící registry (jsou to samozřejmě registry s adresami v CUSTOM oblasti). Aby vše mohlo fungovat, tak musíme samozřejmě nastavit adresu počátku programu pro COPPER (program pro copper= COPPER LIST). Tato adresa se musí zapsat do registrů s adresou COP1LCH (=$dff080) a COP1LCL (=$dff082) nebo COP2LCH (=$dff084) a COP2LCL (=$dff086) (zápis lze provést jediným příkazem a to move.l #copper,$dff080 nebo move.l #copper,$dff084).
Pozorný čtenář si jistě všiml, že adresy počátku programu pro COPPER jsou dvě. Toto lze s výhodou využít např. pro střídání dvou COPPER LISTŮ ...
Po inicializaci startu programu musíme COPPER odstartovat. Na to slouží strobe registry na adresách COPJMP1 (=$dff088) a COPJMP2 (=$dff08a). Vlastní odstartování se provede tak, že na daný strobe registr (podle toho kam jste zapsali start COPPER LISTU, pro COP1LCH a COP1LCL je to COPJMP1) zapíšete nějakou hodnotu (např. clr.w $dff080).
Dále je nutno povolit DMA pro COPPER. To se provede nastavením příslušného bitu v hlavním řídícím registru pro DMA. U tohoto registru bych se na chvíli pozastavil. Tento registr se jmenuje DMACON a nachází se na adrese $dff096 pro zápis a na $dff002 pro čtení. Takže pokud chcete na něj něco zapsat použijete adresu $dff096, pokud chcete zjistit jeho stav, tak se podíváte na adresu $dff002. Tento postup (že se někam zapisuje a z jiné adresy se to samé čte) je poměrně častý a ještě se s ním setkáme (jsou i registry do kterých lze jen zapisovat a nelze je nijak přečíst a naopak existují registry, ze kterých lze jen číst a nelze do nich zapisovat).
Podívejme se teď na jednotlivé bity registru DMACON. 15. bitem určujeme jestli chceme bity s hodnotou jedna nulovat, nebo nastavovat. Bity s hodnotou nula jsou nezměněny. Např. chceme-li nastavit DMAEN a BPLEN, pak uděláme
move.w #%1000001100000000,$dff096; chceme-li je vynulovat, pak provedeme
move.w #%0000001100000000,$dff096.
Tento postup je výhodný, protože můžeme nastavovat a nulovat bity nezávisle na stavu registru. 14.bit určuje stav Blitteru (pracuje/dokončil práci). 13. bit určuje byla-li výsledkem operace Blitteru nula (používá se např. pro zjištění kolize a my se tímto problémem budeme zabývat v některým z příštích čísel). 12. a 11. bit jsou nepoužity. Pokud je nastaven 10. bit, pak má Blitter vyšší prioritu než mikroprocesor. 9. bit povoluje použití všech DMA kanálů (tento bit musíte nastavit, pokud chcete použít jakékoliv DMA. Bity 8 až 0 povolují jednotlivé DMA.

Instrukce COPPERU
Jak jsem již řekl jsou tři (MOVE, WAIT, SKIP).
MOVE - zapíše data do určeného registru v CUSTOM oblasti
WAIT - čeká dokud pozice elektronového paprsku není rovna nebo větší než zadaná hodnota
SKIP - přeskočí následující instrukci MOVE, jestliže bylo dosaženo dané pozice elektronového paprsku Každá instrukce pro COPPER zabírá dva wordy (=4 byty). Význam jednotlivých bitů pro každou instrukci je uveden v tabulce.
Příklad použití COPPERu naleznete na APD disku.

Registr DMACON
($DFF096 zápis, $DFF002 čtení)

Bit Název Funkce
15 SET/CLR 1= bity s hodnotou 1 nastavit 0= bity s hodnotou 1 vynulovat
14 BBYSY Blitteru pracuje/nepracuje (čtení)
13 BZERO Logický stav Blitteru (jen čtení)
12 x  
11 x  
10 BLTPRI Nastavení priority Blitteru vůči CPU
9 DMAEN Hlavní povolení DMA
8 BPLEN Povolení DMA Bitplanů
7 COPEN Povolení DMA Copperu
6 BITEN Povolení DMA Blitteru
5 SPREN Povolení DMA Spritů
4 DSKEN Povolení DMA floppy disků
3 AUD3EN Povolení DMA audio kanálu 3
2 AUD2EN Povolení DMA audio kanálu 2
1 AUD1EN Povolení DMA audio kanálu 1
0 AUD0EN Povolení DMA audio kanálu 0

Význam bitů v instrukcích COPPERu
MOVE

BIT WORD 1 WORD2
15 – 9 x DATA 15 – 9
8 ADR8 DATA8
7 ADR7 DATA7
6 ADR6 DATA6
5 ADR5 DATA5
4 ADR4 DATA4
3 ADR3 DATA3
2 ADR2 DATA2
1 ADR1 DATA1
0 0 DATA0

ADR8-ADR1 = adresa registru v CUSTOM oblasti (např. adresa $DFF180 = $180 pro instrukci MOVE). Nultý bit WORDu 1 je pro MOVE VŽDY roven 0 (z toho vyplývá, že lze zapisovat jen na sudé adresy).
DATA15-DATA0 = data která chcete zapsat na daný registr
Příklad: dc.w $180,$fff ;na registr barvy pozadí zapíše $fff

WAIT

BIT WORD1 WORD2
15 VP7 BFD
14 VP6 VE6
13 VP5 VE5
12 VP4 VE4
11 VP3 VE3
10 VP2 VE2
9 VP1 VE1
8 VP0 VE0
7 HP7 HE7
6 HP6 HE6
5 HP5 HE5
4 HP4 HE4
3 HP3 HE3
2 HP2 HE2
1 HP1 HE1
0 1 0

VP7-VP0 = vertikální pozice paprsku do které se má čekat
HP7-HP1 = horizontální pozice paprsku do které se má čekat
VE6-VE0 = komparační maska pro vertikální pozici (toto se vlastně „anduje“ s VP6-VP0 a na tuto pozici se čeká). Toto využijete chcete-li např. čekat jen na daný řádek a nezajímá vás horizontální pozice HE7-HE1 = komparační maska pro horizontální pozici (toto se vlastně „anduje“ s HP7-HP1 a na tuto pozici se čeká). Toto využijete chcete-li např. čekat jen na daný sloupec a nezajímá vás vertikální pozice 0. bit WORDu 1 je vždy 1 pro WAIT 0, bit WORDu 2 je vždy 0 pro WAIT BFD (BLITTER FINISHED DISABLED) = pokud je roven jedné, pak 14. bit (=BBYSY) DMACON nemá na WAIT žádný vliv. Pokud je roven 0, pak COPPER čeká dokud není paprsek na dané pozici a navíc dokud blitter nedokončí práci
Příklad: dc.w $4001,$fffe ;počká na pozici x=0,y=$40

SKIP

BIT WORD1 WORD2
15 VP7 BFD
14 VP6 VE6
13 VP5 VE5
12 VP4 VE4
11 VP3 VE3
10 VP2 VE2
9 VP1 VE1
8 VP0 VE0
7 HP7 HE7
b HP6 HE6
5 HP5 HE5
4 HP4 HE4
3 HP3 HE3
2 HP2 HE2
1 HP1 HE1
0 1 1

VP7-VP0 = vertikální pozice paprsku do které se má čekat
HP7-HP1 = horizontální pozice paprsku do které se má čekat
VE6-VE0 = viz WAIT HE7-HE 1 = viz WAIT 0. bit WORDu 1 je vždy 1 pro SKIP 0. bit WORDu 2 je vždy 1 pro SKIP BFD (BLITTER FINISHED DISABLED) = viz WAIT

BITPLANY
V prvním dílu jsme si řekli, jak jsou bitplany uloženy v paměti. Teď se podíváme na to, jak je zobrazit. Nejdříve se musíme rozhodnout, kolik bitplánů chceme použít (1 bitplan = 2 barvy, 2 bitplany = 4 barvy, 3 bitplany = 8 barev atd). Pro Amigy s OCS (staré dobré pětistovky) je maximální počet bitplanů 6 (to znamená 64 barev) u AGA čipů je to až osm bitplanů (což je 256 barev). Navíc má Amiga speciální grafické režimy, ve kterých je možno zobrazit ještě více barev (HAM režim) u režimy pro dvojité „hrací pole“ - oběma režimům se budeme věnovat později. Dále je třeba určit jaké rozlišení použijeme. K tomu slouží registr BPLCON0, který se nalézá na adrese $DFF100 (význam jednotlivých bitů je uveden v tabulce.

BPLCONO $DFF 100 zápis

BPLCONO $DFF 100 zápis
Bit Název Funkce
15 HIRES High Resolution
14 BPU2
13 BPU1 - Počet bitplanů 1-6
12 BPU0 /
11 HAM režim HAM („Hold And Modify“)
10 DPF dvojité hrací pole („Double PlayField“)
9 COLOR aktivace barvového signálu (jen pro A1000)
8 GAUD povolení zvuku z genlocku („Genlock Audio enable“)
7 x  
6 x  
5 x  
4 x  
3 LPEN povolení světel. pera („Light Pen“)
2 LACE interlace režim
1 ERSY externí synchronizace
0 x  

Příklad: move.w #%1010000000000000,$dff100 ;rozlišení hires se 2 bitplany (= 4 barvy)

Dále je nutné zapsat začátky bitplanů do příslušných registrů. Tuto činnost je nutno provádět při každém VBLANKu (VBLANK = Vertical BLANK - doba kdy se elektronový paprsek přesouvá z pravého dolního rohu obrazovky do levého horního rohu obrazovky), protože registry ukazující na začátek se postupně při zobrazování zvětšují. Adresy registrů pro bitplany jsou:
BPLPTH1,BPLPTL1 ($DFF0E0,$DFF0E2) - adresy 1 . bitplanu
BPLPTH2.BPLPTL2 ($DFF0E0,$DFF0E2) - adresa 2. bitplanu
BPLPTH3,BPLPTL3 ($DFF0E0,$DFF0E2) - adresa 3. bitplanu
BPLPTH4,BPLPTL4 ($DFF0E0.$DFF0E2) - adresa 4. bitplunu
BPLPTH5.BPLPTL5 ($DFF0E0.$DFF0E2) - adresa 5. bitplanu
BPLPTH6,BPLPTL6 ($DFF0E0,$DFF0E2) - adresa 6. bitplanu

Jak jsem již říkal, je nutno tyto registry obnovovat. Tuto činnost lze dělat, buď pomocí mikroprocesoru (registry obnovíme ve VBLANK přerušení), nebo pomocí COPPERu. Adresy, které zapíšete na tyto registry, musí být sudé (u některých AGA režimů dělitelné osmi). Další důležité registry pro bitplany jsou BPL1MOD ($DFF108) a BPL2MOD ($DFF10A).
Tyto dva registry představují modula bitplanů. Co to je? Je to počet bytů, který se má přičíst k ukazovátkům bitplanů po každém řádku. Toto je nutné, když chcete zobrazit obrázek, který je větší než obrazovka. Např. máme obrázek, který je velký 512*256 bodů, my zobrazujeme jen výsek 320*256 bodů, z toho vyplývá, že do modulo registrů zapíšeme 512/8-329/8=64-40=24. Jistě se teď ptáte, proč jsou tyto registry dva. Je tomu tak proto, že registr BPL1MOD se přičítá k lichým bitplanům (to znamená k 1..3..5.) a BPL2MOD k sudým bitplanům (to znamená k 2.,4..6.). Možná se vsím to zdá pořád nesmyslné, ale dá se toho velmi dobře využít (např. při dvojitém hracím poli u různých efektech v demech či hrách). Další důležité registry jsou BPLCON1 ($DFF102) a BPLCON2 ($DFF104). Význam jednotlivých bitů je opět v tabulce.
Registr BPLCON1 je řídící registr pro horizontální scroling. Pomocí něho u registrů pro adresy bitplanů lze velmi lehce plynule pohybovat velkým obrázkem. Registr BPLCON2 řídí priority zobrazování.
Další registry důležité pro zobrazení jsou registry pro řízení velikostí zobrazovacího okna a jeho umístnění u pro řízení přenosu dat z bitplanů na obrazovku. DIWSTRT ($DFF08E - zápis) a DIWSTOP ($DFF090 - zápis). DIWSTRT určuje začátek zobrazovacího okna, je omezen ve vertikálním směru na horní dvě třetiny u horizontálně na levé tři čtvrtiny obrazovky.
Registr DIWSTOP určuje konce zobrazovacího okna, je omezen vertikálně na spodní polovinu a horizontálně na pravou čtvrtinu. Bity 15-8 určují vertikální pozici (V7-V0) u bity 7-0 určují horizontální pozici (H9-H2). Registry pro řízení přenosu dat DDFSTRT ($DFF092 - zápis) = start přenosu obrazových dat (horizontální pozice) a DDFSTOP ($DFF094 - zápis) = Konec přenosu obrazových dat (horizontální pozice). Tyto registry ovládají horizontální časování začátku a konce přenosu obrazových dat ponosí DMA Bitplanů. Vertikální časování DMA Bitplanů je shodné se zobrazením oken, popsaném výše. Modulo Bitplanů závisí na horizontální velikostí Bitplanů a na velikosti přenosu dat do okna. Hodnota v DDFSTOP se zdá spočítat podle vztahu DDFSTR+(počet přenášených wordů-1 )*8 (v LORES) a DDFSTR+(počet přenášených wordů-1)*4 (v HIRES). Přiřazení bitů v registru:

Bit 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
Funkce x x x x x x x x H8 H7 H6 H5 H4 H3 x x

Bity označené x by měly mít hodnotu 0, aby byla zajištěna kompatibilita směrem nahoru.

BPLCON 1 $DFF102 zápis

Bit Název Funkce
15-8 x  
7 PF2H3
6 PF2H2  
5 PF2H1 - kód horizontálního scrolingu (liché bitplany)
4 PF2H0 /
3 PF1H3
2 PF1H2  
1 PF1H1 - kód horizontálního scrolingu (sudé bitplany)
0 PF1H0 /

BPLCON2 $DFF104 zápis

Bit Název Funkce
15-7 x  
6 PF2PRI Priorita hracího pole 2
5 PF2P2
4 PF2P1 - Priorita hracího pole 1 (liché bitplany) vůči spritům
3 PF2P0 /
2 PF1P2
1 PF1P1 - Priorita hracího pole 2  (sudé bitplany) vůči spritům
0 PF1P0 /

PF2PRI = hrací pole 2 (sudé bitplany) má vyšší prioritu než hrací pole 1 (liché bitplany). Používá se při dvojitém hracím poli.

Barvy
Celkem máme k dispozici 32 barvových registrů (u OCS u AGA čipů to je 256). Registry začínají na adrese $DFF180 (COLOR0), což je barva pozadí (kód barvy 0). Barvové registry jsou wordové (dva byty), ale využívá se z nich jen dvanácti bitů (u AGA je to trošku jinak, ale tím se budeme zabývat až na závěr seriálu). Každá barevná složku - červená, zelená, modrá (RGB Red Green Blue)- má čtyři hity. Z toho vyplývá 4069 barev celkem (16 odstínů každé barevné složky – 16*16*16 = 4096). Význam jednotlivých bitov:

COLORx (x=0-31) $DFF180-$DFF1BE

Bit 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
Funkce x x x x R3 R2 R1 R0 G3 G2 G1 G0 B4 B3 B1 B0

Příklad: move.w #$fff,$dff180 ;bílé pozadí

Speciální režimy
HAM - Speciální režim ve kterém lze s jistými omezeními zobrazit celou paletu 4096 barev (u AGA je i HAM8) pomocí šesti bitplanů. V normálním režimu by bylo možno pomocí šesti bitplanů zobrazit jen 64 barev, zde se však používá zvláštní fintu. Základem tohoto režimu je 16 barev (od COLOR0). Pokud je v bitplanu 6 a 5 nula pak se použije barva přímo z registru, který je určen v bitplanech 4 až 1. Pokud je v bitplanech 5 a 6 jiná kombinace než (X), tak se použije barva z předchozího pixelu u modifikuje se jedna barvová složka (červená, nebo zelená, nebo červená) podle bitplanů 1 už 4 (do dané barevné složky se přímo okopírují bity s bitplanů 1 až 4). Z tohoto vynikl i název HOLD AND MODIFY - podrž a změň. Jak přesně se barvové složky mění ukazuje tabulka.

HAM

BP6 BP5 RED GREEN BLUE
0 0 přímo barva z rozmezí Color0-Color15    
0 1 hold hold modify
1 0 modify hold hold
1 1 hold modify hold

HALFBRITE - Tento režim aktivujete, když nastavíte zobrazení s šesti bitplany a HIRES=HAM=DPF=0. V tomto režimu máte k dispozici 64 barev, ale barvových registrů je jen 32, tudíž vrchní polovina barev se odvozuje od spodních třicetidvou a to tak, že mají poloviční jas.
DOUBLE PLAYFIELD - umožňuje zobrazit dvě nezávislé hrací plochy v osmi barvách, přičemž jedna barva (barva pozadí COLOR0 - závisí na nastavení priority v BPLCON2)je transparentní (průhledná).
INTERLACE - Tento režim zdvojí výšku obrazovky pomocí prokládaného řádkování, což se na televizi (či monitoru, ale zde závisí na jeho typu) projeví nepříjemným blikáním. Je to způsobeno tím, že frekvence vykreslení celého snímku se dělí dvěma.
Na závěr bych se chtěl ještě zmínit o tom, že u OCS čipů nejsou dovoleny maximální počty bitplanů ve všech režimech. Je to dáno tím, že hardware nedokázal zpracovat tolik dat při velkých rozlišeních. Na PD disku naleznete demonstrační prográmky a AGA.guide, což je souhrnný popis registrů (včetně AGA grafiky) a IFFMASTER pro převod IFF obrázků do RAW formátu.

Vytlačiť článok



Pozn.: články boli naskenované ako text a preto obsahujú aj zopár chýb. Taktiež neručíme za zdrojové kódy (Asm, C, Arexx, AmigaGuide, Html) a odkazy na web. Dúfame, že napriek tomu vám táto databáza dobre poslúži.

Žiadna časť nesmie byť reprodukovaná alebo inak šírená bez písomného povolenia vydavatela © ATLANTIDA Publishing



none

AMIGA REVIEW

57 ( 11-12 / 2000 )
56 ( 9-10 / 2000 )
55 ( 7-8 / 2000 )
54 ( 5-6 / 2000 )
53 ( 3-4 / 2000 )
52 ( 1-2 / 2000 )
 
51 ( 12 / 1999 )
50 ( 11 / 1999 )
49 ( 10 / 1999 )
48 ( 9 / 1999 )
46-47 ( 7-8 / 1999 )
45 ( 6 / 1999 )
44 ( 5 / 1999 )
43 ( 4 / 1999 )
42 ( 3 / 1999 )
41 ( 2 / 1999 )
40 ( 1 / 1999 )
 
39 ( 12 / 1998 )
38 ( 11 / 1998 )
37 ( 10 / 1998 )
36 ( 9 / 1998 )
35 ( x / 1998 )
34 ( x / 1998 )
33 ( 1-2 / 1998 )
 
32 ( 11-12 / 1997 )
31 ( 9-10 / 1997 )
30 ( 7-8 / 1997 )
29 ( 6 / 1997 )
28 ( 5 / 1997 )
27 ( 4 / 1997 )
26 ( 3 / 1997 )
25 ( 2 / 1997 )
24 ( 1 / 1997 )
 
23 ( 12 / 1996 )
22 ( 11 / 1996 )
21 ( 10 / 1996 )
20 ( 9 / 1996 )
18-19 ( 7-8 / 1996 )
17 ( 6 / 1996 )
16 ( 5 / 1996 )
15 ( 4 / 1996 )
14 ( 3 / 1996 )
13 ( 2 / 1996 )
12 ( 1 / 1996 )
 
11 ( 12 / 1995 )
10 ( 11 / 1995 )
9 ( 10 / 1995 )
8 ( 9 / 1995 )
7 ( 7 / 1995 )
6 ( 5 / 1995 )

ATLANTIDA NEWS

5 ( 3 / 1995 )
4 ( 1 / 1995 )
 
3 ( 11 / 1994 )
2 ( 9 / 1994 )
1 ( 7 / 1994 )
0 ( 5 / 1994 )