„NO SYSTEM“ programováníRadim Ballner
Již po třetí se setkáváme u seriálu o nesystémovém programování. V tomto
pokračování si povíme o BLITTERu a SPRITECH. Před tím než se vrhneme na blitter, tak bych se rád ještě zmínil o tom, že do
modul bitplanů je možno zapsat i záporná čísla (záporná moduly). To znamená, že
pokud v normálním LORESu dáte modulo -40, tak se bude pořád opakovat jeden
řádek. Tohoto se dá využít pro různé efekty. BLITTER
Blitter je obvod, který dokáže zpracovávat pravoúhlé oblasti paměti, což
není vlastně nic jiného než obrázky. Můžeme ho použít nejen pro kopírování
obrázků (přičemž lze provádět logické operace), ale i pro kreslení čar a
vyplňování oblastí. Blitter má přidělen jeden DMA kanál a jako jediný z DMA
procesů může mít nižší prioritu než hlavní mikroprocesor (samozřejmě v CHIP
paměti). Tuto prioritu lze nastavovat 10. bitem (BLTPRI) v registru DMACON
($DFF096) - jednička znamená, že blitter má vyšší prioritu než mikroprocesor.
Nejdříve se podíváme na to, jak se dají pomocí blitteru kopírovat obrázky.
Abychom mohli blitter používat musíme opět nastavit řadu registrů. Musíme určit,
kde se data nalézají, kam se mají kopírovat a co s nimi má blitter během přenosu
udělat. Jedna z nejdůležitějších věcí, kterou musíte udělat ještě před tím, než
začnete zapisovat do registrů blitteru, je počkat až blitter dokončí svou práci.
Toto zjistíte, pokud se podíváte na BBYSY bit registru DMACON (to je 14. bit na
adrese $DFF002). Pokud byste začali přepisovat registry a blitter by zrovna
pracoval došlo by ke kolizi a blitter by mohl kopírovat data na nesprávná místa.
Blitter má tři zdrojové registry a jeden výstupní registr. Co to pro nás
znamená? Znamená to, že blitter umí zpracovávat data až ze tří zdrojů, s těmito
daty provede námi určené logické operace a data pošle na cílový registr. Pro
určení adres zdrojů (značí se A, B a C) a cíle (označuje se D) se používají tyto
registry:
BLTCPTH a BLTCPTL ($DFF048,$DFF04A) - adresa zdroje C
BLTBPTH a BLTBPTL ($DFF04C,$DFF04E) - adresa zdroje B
BLTAPTH a BLTAPTL ($DFF050,$DFF052) - adresa zdroje A
BLTDPTH a BLTDPTL ($DFF054,$DFF056) - adresa cíle D
Ke každému zdroji (samozřejmě i k cíli) je určen jeden modulo registr. Tyto
modulo registry mají stejnou funkci jako modulo registry pro bitplany. To
znamená, že se jejich obsah, vždy po provedení řádku, přičte k danému zdrojovému
(cílovému) registru. Tato činnost nám umožňuje zpracovávat z každého zdroje
výřez o různé velikosti. Adresy modulo registrů jsou:
BLTCMOD ($DFF060) - modulo pro zdroj
C BLTCMOD ($DFF062) - modulo pro zdroj
B BLTCMOD ($DFF064) - modulo pro zdroj
A BLTCMOD ($DFF066) - modulo pro cíl D
Protože blitter zpracovává postupně vždy word (to znamená dva byty = 16 bitů)
musí adresy zdrojů (i cíle) být dělitelné dvěma (zarovnané na word) a taktéž
moduly musí být sudá čísla (lze použít i záporná moduly). Dalšími registry pro
ovládání blitteru jsou BLTCON0 ($DFF040) a BLTCON1 ($DFF042). Tyto dva registry
jsou řídící a určují, jak se bude blitter chovat. BLTCONO $DFF040 zápis
Bit Název Funkce |
|
|
15 |
ASH3 |
|
14 |
ASH2 |
- Posun zdroje A |
13 |
ASH1 |
- |
12 |
ASH0 |
/ |
11 |
USEA |
|
10 |
LISEB |
- Určení které zdroje blitteru budou použity |
9 |
USEC |
- ( l = použit. 0 = nepoužit) |
8 |
USED |
/ |
7 |
LF7 |
|
6 |
LF6 |
|
5 |
LF5 |
|
4 |
LF4 |
|
3 |
LF3 |
|
2 |
LF2 |
|
1 |
LFI |
|
0 |
LF0 |
|
LF0-LF7 - Logic Function - těchto sedm bitu určuje co se s daty, které do
blitteru přicházejí, má dělat (jakou logickou operaci) - tak zvaný MINTERM. BLTCON 1 $DFF042 zápis
Bit |
Název |
Funkce |
15 |
BSH3 |
|
14 |
BSH2 |
- Posun zdroje B |
13 |
BSH1 |
- |
12 |
BSH0 |
/ |
11 |
0 |
|
10 |
0 |
|
9 |
0 |
|
8 |
0 |
|
7 |
0 |
|
6 |
0 |
|
5 |
0 |
|
4 |
EFE |
Exclusive Fill enable |
3 |
IFE |
Inclusive Fill enable - Používá se v módu vyplňování |
2 |
FCI |
Fill carry Input / |
1 |
DESC |
Pokud je nastaven, tak blitter pracuje pozpátku |
0 |
LINE |
Pokud je nastaven, pak blitter kreslí čáry |
Další registry pro práci s blitterem jsou BLTAFWM ($DFF044 = Blitter Bource A
First Word Mask) a BLTALWM ($DFF046 = Blitter Bource A Las Word Mask). Tyto
registry jsou „přiandovány“ k prvnímu (BLTAFWM) a poslednímu wordu zdroje A.
Posledním registrem je registr BLTSIZE ($DFF058).
Do tohoto registru se zapisuje velikost přenášené oblasti. Zároveň je to strobe
registr, takže zápisem do něj odstartujeme práci blitteru. BLTSIZE $DFF058 zápis
bity |
15 |
14 |
13 |
12 |
11 |
10 |
9 |
8 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
význam |
H9 |
8 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
W5 |
4 |
3 |
2 |
1 |
0 |
H9-H0 = počet řádků (10 bitů => maximálně 1024 řádků)
W5-W0 = počet přenášených wordů (6 bitů = 64*2*8 = maximálně 1024 pixelů) Do tohoto registru tedy zapisujte až jsou všechny ukazovátka a data
nastaveny. Teď si uvedeme na příkladu, jak blitter funguje a jak určíme správně
všechny hodnoty. Mějme malý obrázek autíčka (velikost 80*20) - viz obrázek -
nakreslený ve čtyřech barvách. Tento obrázek chceme nakopírovat na pozadí, které
má velikost 160* 140 a je také ve čtyřech barvách. Všechny grafická data (auto i
pozadí) jsou v RAW formátu. Nejdříve zapíšeme ukazatel na autíčko do zdroje A,
potom zapíšeme adresu kam chceme autíčko nakopírovat do cíle D. Jak již sem řekl
musí být adresy sudé. To znamená, že do zdroje D napíšeme adresu
začátku+48/8+(160/8)*90= začátek+1806. Tuto samou adresu napíšeme do zdroje C.
Do zdroje B napíšeme adresu ukazující na masku. Teď se jistě ptáte, jak
zajistit, aby bylo auto na pozici 53 a ne na 48. To je jednoduché, v registrech
BLTCON0 a BLTCON1 nastavíte rotaci zdroje A a B na (53-48) 5. Toto zajistí, že
se data ze zdroje A a B posunou o pět bitů. Právě z tohoto důvodu je za obrázkem
autíčka vynecháno 16 bitů, protože při rotaci se automaticky to co vylézá vpravo
dává doleva. A protože se může rotovat maximálně o 16 bitů, tak máme za obrázkem
právě šestnáct volných bitů. Do modulo registru zdroje A a B zapíšeme nulu
(protože pracujeme s celým obrázkem). Do modulo registrů C a D zapíšeme 10
((počet bytů na řádek pozadí)-(počet bytů na řádek autíčka = 160/8-80/8 = 20-10
= 10). Nyní zapíšeme do BLTAFWM a BLTALFWM $FFFF (nechceme nic maskovat). Teď
nastavíme registry BLTCON0 a BLTCON1. Do registru BLTCON0 zapíšeme $5FE2 a do
BLTCON1 zapíšeme $5000.
Jistě se ptáte, jak jsem na ta čísla přišel. Číslo $5FE2 znamená - rotace zdroje
A o pět bitů (5=%0101), použity všechny zdroje ($F=%1111), a MINTERM=$E2. Na
určení MINTERMu použijeme pravdivostní tabulku. Víme, že zdroj A ukazuje na
autíčko a B na jeho masku, zdroj C pak na pozadí (stejně tak výstup D). Pokud je
maska rovna 1, pak se kopírují data z autíčka, pokud je maska rovna 0, pak se
kopírují data z pozadí. Tímto způsobem vyplníme tabulku pro výstup D a toto
číslo se zapíše, jak je naznačeno, do LF0-LF7. Na obrázku je i detail výsledku a
z tohoto detailu by mělo být zřejmé proč-je nutné použít masku. Teď povolíme,
pokud jsem to již neudělali někdy předtím, DMA blitteru v DMACON. Nakonec
zapíšeme velikost do registru BLTSIZE (to je (počet wordů)+počet řádků*64=
5+64*20 = 1285), čímž odstartujeme práci blitteru. Celou tuto činnost musíme
provést celkem dvakrát, protože náš obrázek má 2 bitplany (4 barvy). Při druhém
průchodu nezapomeňte posunout ukazovátka na druhé bitplany (ukazovátko na data
autíčka - pro nás to je BLTATP – zvedneme o (80/8)*20=200 a ukazovátka BPLCPT a
BPLDPT zvedneme o (160/8)*140=2800, ukazovátko na masku ukazuje pořád na stejné
místo, protože maska je stejná pro všechny bitplany). Určení MINTERMu - bity LF7-LF0
zdroj |
cíl |
|
A B C |
D |
|
0 0 0 |
0 |
LF0 |
0 0 1 |
1 |
LF1 |
0 1 0 |
0 |
LF2 |
0 1 1 |
0 |
LF3 |
1 0 0 |
0 |
LF4 |
1 0 1 |
1 |
LF5 |
1 1 0 |
1 |
LF6 |
1 1 1 |
1 |
LF7 |
Jak jste jistě všimli, tak ukazovátka zdrojů a cíle ukazují na levý vrchní
roh pracovní oblasti. Ukazatele lze používat i tak, že ukazují na pravý dolní
roh pracovní oblasti, ale pak je nutno nastavit bit DESC (2.bit) v registru
BLTCON1. V tomto případě pracuje vlastně blitter odzadu a moduly se nepřičítají,
ale odčítají. Blitter lze použít i ke zjišťování kolizí objektů. Toto se dělá s
pomocí bitu BZERO (13. bit) v registru DMACON (zde budeme číst, takže adresa je
$DFF002). Nastavíme např. zdroje A a B tak, aby ukazovaly na masky objektů,
které testujeme na kolizi a miniterm uděláme, tak aby se výstup D rovnal jedné
jen tehdy, bude-li A i B rovno jedné (překrývají se => kolize). Pak zpustíme
blitter (výstup D může být vypnut). Pokud by byl výsledek (cíl D) někdy během
práce blitteru roven jedna, pak bude vynulován bit BZERO. BLITTER a vyplňování oblastí
Jak jsem již dříve podotkl, blitter lze používat pro vyplňování oblastí.
Oblast musí být ohraničená zvláštním typem čáry - linka má na každém řádku jen
jeden pixel. Tyto čáry umí blitter kreslit, takže není problém je nakreslit. Jak
blitter vyplňuje? K vyplňování je potřeba jeden zdroj a cíl D. Oba ukazatele
nastavíme na pravý dolní roh a nastavíme bit DESC (toto je velmi důležité neboť
vyplňování pracuje správně pouze v tomto režimu).Zapíšeme správná moduly
(velikost obrázku-velikost vyplňované oblasti) a určíme jakým způsobem se má
vyplňovat pomocí bitu EFE nebo IFE (IFE znamená, že se vyplní vnitřek oblasti a
okraje se nechají, EFE znamená, že vnitřek oblasti se vyplní a úsečky, které
ohraničují oblast zleva se vyjmou). Další důležitý bit je bit FCI - určuje
jestli budeme vyplňovat oblast vně ohraničené oblasti, nebo oblast uvnitř. Teď
se podívejme, jaký algoritmus blitter používá pro vyplňování a jaký vliv na to
má FCI bit. Nejdříve se blitter podívá jestli je bod, na který ukazuje zdroj
roven, jedné, jestliže ano, pak zneguje bit FCI. Je-li zdroj roven nule, pak
kopíruje bit FCI na adresu cíle (ten je v tomto případě roven adrese zdroje). A
takto se pokračuje přes celou oblast. Z tohoto je také zřejmé, jak je nutno
nastavit bit FCI. Poněvadž má blitter tři zdroje, tak lze zbylé dva zdroje při
vyplňování použít ke kopírování. Záleží jen na tom, jak nastavíte minterm. Celou
operaci odstartujeme opět zápisem velikosti pravoúhlé oblasti do registru
BLTSIZE. BLITTER a kreslení čar
Tento režim aktivujeme nastavením bitu LINE (0.bit) v BLTCON1. Nastavením
tohoto bitu dojde k předefinování některých bitů v registrech BLTCON0, BLTCON1 a
některých registrů vůbec. Jak se změní význam registrů ukazuje tabulka. Registry BLITTERU v režimu kreslení čar
Registr bity stav význam |
|
|
|
BLTCON0 |
15,14,13,12 |
|
určuje vzdálenost prvního bitu od adresy dělitelné dvěma (vlastně obdoba
rotace) |
BLTCON0 |
11,10,9,8 |
1011 |
požadováno pro kreslení čar |
BLTCON1 |
15,14.13,12 |
z |
start vzorku linky na bitu z (z=0-15) - udává od kterého bitu vzorku se
má začínat |
BLTCON1 |
5 |
|
rezervován |
BLTCON1 |
4,3,2 |
|
zde zapíšeme kód oktantu |
BLTCON1 |
1 |
1/0 |
typ čáry - 0 normální / 1 na jeden řádek 1 bod (viz vyplňování oblastí) |
BLTCON1 |
0 |
|
aktivuje mód kreslení čar |
BLTADAT |
všechny |
$8000 |
index požadovaný pro kreslení čar |
BLTBDAT |
všechny |
0-$FFFF |
vzorek čáry |
BLTSIZE |
5-0 |
2 |
požadováno pro kreslení čar |
BLTSIZE |
15-6 |
|
délka čáry (dX) |
BLTAMOD |
všechny |
|
2(2dY-2dX) |
BLTBMOD |
všechny |
|
2dY |
BLTCMOD |
všechny |
|
šířka obrazovky v bytech |
BLTDMOD |
všechny |
|
šířka obrazovky v bytech |
BLTCPT |
všechny |
počáteční adresa čáry |
|
BLTDPT |
všechny |
počáteční adresa čáry |
|
BLTADAT = $DFF074 |
BLTBDAT = $DFF072 |
BLTCDAT = $DFF070 |
|
V tabulce se vyskytují výrazy dX a dY. Máme-li bod o souřadnicích X1,Y1 a
chceme-li ho spojit s bodem o souřadnicích X2,Y2, pak dX=X2-X 1 a dY=Y2-Y1. Proč
se zrovna počítají tyto čísla a zapisují do registrů? Je to dáno tím, jaký
používá blitter algoritmus na kreslení čáry - používá Bressenhamův algoritmus.
Tento algoritmus je dostupný v literatuře, takže se jím zde nebudu zabývat. Do
registru BLTCON1 na bity 4, 3 a 2 je nutno zapsat číslo oktantu, toto číslo
vlastně udává jaký sklon linka bude mít. Očíslování oktantů je na obrázku.
Kompletní rutinu na kreslení čar pomocí blitteru naleznete na APD disku. RAW formát vs BLITTER formát
Jak jste si zajisté všimli, tak veškeré obrázky, které jsme doposud
používali byly v RAW formátu. To znamená, že v paměti je uložen celý první
bitplan, pak celý druhý atd. Naproti tomu v BITTER formátu je uložen 1. řádek 1.
bitplanu, pak 1. řádek 2. bitplanu atd (viz obrázek). Jako by byly bitplany ne
za sebou, ale vedle sebe. Tento formát lze díky modul nejen zobrazit, ale také
se s ním velmi dobře pracuje pomocí blitteru (odtud název). Pokud jsme chtěli
kopírovat obrázek, který byl ve více bitplanech, tak jsme museli postupně
kopírovat bitplan za bitplánem. V BLITTER formátu stačí kopírovat jen jednou a
navíc nemusíme nechávat prázdných šestnáct bitů (ale musíme potom maskovat
pomocí BLTAFWM A BLTALWM). Chceme-li pracovat s daty v BLITTER formátu musíme
mít také bitplany, které zobrazujeme v blitter formátu (což lze díky modul
provést velmi jednoduše). Jak naplnit registry pro blitter si ukážeme na
příkladu. Mějme obrázek o velikosti X SIZE*Y SIZE ve dvou bitplanech (viz
obrázek). Tento obrázek chceme podobně jako autíčko přidat před pozadí. Zdroj A
opět nastavíme opět na obrázek, zdroj B na masku (která tam teď musí být 2 krát)
a zdroj C a cíl D nastavíme opět na pozadí. Do modulo registrů pro zdroj C a D
zapíšeme hodnotu MODULO (viz obrázek) a do modulo registrů pro zdroj A a B
zapíšeme opět nulu. Do BLTSIZE zapíšeme SIZEX/16+SIZEY*n*64 (kde n je počet
bitplanů, v našem případě 2). Tímto odstartujeme přenos a blitter přenese
všechny bitplany. Pokud chcete získat data v BLITTER formátu, tak použijte
nějaký IFF konvertor (IFF konvertor na minulém APD disku tento formát
podporuje). SPRITES
SPRITy jsou objekty, které jsou zobrazovány nezávisle na bitplanech. Pro
sprity je vyhrazen DMA kanál, takže chcete-li je používat, nezapomeňte nastavit
příslušný bit v DMACON. Jde zvolit prioritu vůči bitplanům (zobrazovat před nebo
za bitplany). Priorita spritů mezi sebou je dána jejich číslem (sprite 0 má
nejvyšší prioritu). Celkem máme k dispozici osm spritů. Velikost spritu je 16
bodů. Velikost jednoho bodu odpovídá velikosti bodu v módu LORES a tato velikost
není závislá na režimu, ve kterém sprite zobrazujeme). Výška spritu není
omezena. Každý jednoduchý sprite má tři barvy a jednu barvu průhlednou. Pokud se
nám tři barvy zdají málo můžeme sprity slučovat, což nám počet spritů sníží na
čtyři, ale každý sprite má 15 barev plus jednu průhlednou. Přiřazení barvových
registrů jednotlivým spritům - jednoduché sprity:
COLOR16-COLOR18 sprite0 a sprite1
COLOR20-COLOR23 sprite2 a sprite3
COLOR25-COLOR27 sprite4 a sprite5
COLOR29-COLOR31 sprite6 a sprite7
Pro sloučené sprity se barva vybírá z registrů COLOR17-COLOR31. Chceme-li použít
sprite musíme vyplnit strukturu, která popisuje jeho tvar a pozici. Adresu této
struktury poté zapíšeme do registru, který je přidělen danému spritu. Zde je
nutno poznamenat, že jestliže používáme byt jen jeden sprite, tak musíme všechny
nepoužité sprity (resp. jejich registry, které ukazují na popis sprite) nastavit
na falešný sprite, protože jinak se nám budou přes obrazovku míhat podivné věci.
Je to dáno tím, že máme jen jeden bit pro povolení DMA spritu a ten povolí
všechny sprity. Přidělení registrů pro jednotlivé sprity:
SPR0PTH ($DFF020) a SPR0PTL ($DFF022) - adresa spritu 0
SPR1PTH ($DFF024) a SPR1PTL ($DFF026) - adresa spritu 1
SPR2PTH ($DFF028) a SPR2PTL ($DFF02A) - adresa spritu 2
SPR3PTH ($DFF02C) a SPR3PTL ($DFF02E) - adresa spritu 3
SPR4PTH ($DFF030) a SPR4PTL ($DFF032) - adresa spritu 4
SPR5PTH ($DFF034) a SPR5PTL ($DFF036) - adresa spritu 5
SPR6PTH ($DFF038) a SPR6PTL ($DFF03A) - adresa spritu 6
SPR7PTH ($DFF03C) a SPR7PTL ($DFF03E) - adresa spritu 7
Adresa ukazující na sprite musí být opět dělitelné dvěma. Nyní se podíváme na
to, jak je každý sprite popsán. Jak již sem řekl každý sprite má jeden registr
(resp. dvojici registrů), ve kterých je uložena adresa na jistou strukturu. Tato
struktura má následující tvar.
0. word – SPRxPOS
2. word - SPRxCTL
4. word - data obrázku spritu
.
.
n. word - konec spritu (x je číslo spritu)
Do nultého wordu (SPRxPOS) se zapisuje počáteční pozice spritu a to takto - bity
15-8 obsahují nižších 8 bitů vertikální pozice (VSTART), bity 7-0 obsahují
nižších 8 bitů horizontální pozice (HSTART). Ve druhém wordu od začátku je druhé
řídící slovo spritu (SPRxCTL). Význam jednotlivých bitů: Význam bitů 2. řídícího slova spritu
bit |
význam |
15-8 |
nižších osm bitů koncové vertikální pozice (VSTOP) |
7 |
ATTACH bit - povoluje sloučení spritů |
6-3 |
nevyužity (měly by být rovny nule) |
2 |
nejvyšší bit začátku vertikální pozice (VSTART) |
1 |
nejvyšší bit konce vertikální pozice (VSTUP) |
0 |
nejnižší bit začátku horizontální pozice (HSTART) |
Od čtvrtého bitu začínají informace o tvaru spritu (informace o barvách
jednotlivých bodů). Barvy jsou kódovány stejně jako barvy v bitplanech.
Například mějme první řádek spritu ve kterém jsou za sebou tyto barvy:
0011112222333300
pak hodnoty zapsané v paměti budou:
0011110000111100 0000001111111100
V prvním řádku je vyšší (významnější) slovo popisu barev a v druhém řádku je
nižší (méně významné) slovo popisu barev spritu. Barva nula (kombinace 00) je
barva transparentní. Pokud je celý sprite zobrazen, tak následují dva wordy,
které sprite mohou ukončit (jsou to wordy 0,0). Nemusí tomu tak však být,
protože sprite může být zobrazen i několikrát na obrazovce. Pak místo dvou
nulových wordů napíšeme znovu SPRxPOS a SPRxCTL (samozřejmě s novými
souřadnicemi). Samozřejmě není možné dávat do VSTART souřadnici, která by byla
menší než VSTOP z předešlého spritu. Navíc platí omezení, že mezi jednotlivými
sprity musí být volný minimálně jeden horizontální řádek. Toto je dáno
konstrukcí hardwaru (pro každý sprite jsou během zobrazování řádku vyhrazeny jen
dva cykly, takže chceme-li zobrazit sprite ještě jednou, tak je nutno načíst dvě
řídící slova, což zabere právě ony dva cykly). Chceme-li používat šestnácti
barevné sprity, pak musíme v datové struktuře nastavit ATTACH bit. Pokud toto
provedeme, tak se nám sloučí vždy dva sprity do jednoho a to takto: sprite 1 se spritem 0
sprite 3 se spritem 2
sprite 5 se spritem 4
sprite 7 se spritem 6 Aby bylo vše v pořádku, tak musíme nastavit vždy dva sloučené sprity na
stejnou pozici a zajistit, aby měly stejnou velikost. Barva se z datových slov
získá stejným způsobem, jako pro jednoduché sprity až na to, že místo dvou slov
máme slova čtyři (tyto slova se zapisují vždy po dvou do datových struktur dvou
sloučených spritů). Poněvadž ukazatelé na sprity jsou dynamické (podobně jako
ukazatelé na bitplany), je nutné zajistit aby, po každém zobrazení, byly znovu
obnoveny. K tomuto účelu se přímo nabízí použití COPPERu. Toto lze však udělat i
v přerušení. Pokud máte k dispozici nějaký obrázek ve formátu IFF a chcete si z
něj udělat sprite, pak použijte nějaký IFF konvertor, který to umožňuje (na
minulý PD disk jsem jeden takový nahrál). Chcete-li se spritem pohybovat, tak
jen přepisujte hodnoty v řídících slovech spritu (nezapomeňte, že při
vertikálním pohybu musíte přepsat dvě hodnoty VSTART a VSTUP). Tyto změny do
struktury spritu byste měli dělat je v okamžiku, když jste si jisti, že DMA na
tyto data zrovna nepřistupuje. 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
|