„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
|