Elôszó
------

Ez  a  kézikönyv  információkat nyújt az Amiga grafikájáról, hangjáról és a
külsô  világgal  való  kapcsolatáról.   A  kézikönyv egy része bepillantást
nyújt  az  assembly nyelvű programozásba, hogy így mutassa be közvetlenül a
grafikát és az egyéb részleteket.

Ezt a kézikönyvet a következôk használhatják eredményesen:

-  Assembly  programozók,  akiknek  nagyobb  szükségük  van  a  közvetlen
programozásra, mint a rendszer-rutinok hívására, aminek a leírása az 'Amiga
ROM  Kernel  Manual'-ban  részletesen  benne  van.   Sok  olyan  információ
található  itt,  amelyekkel gyorsabbá lehet tenni a programok futását, vagy
olyan dolgokat lehet megtenni, amiket a ROM rutinokkal nem lehet.

 -  Bárki,  aki új perifériákat csatol az Amigához, és csak tudni szeretné,
hogy hogyan is működik az.


Ajánlatos,  hogy  a  könyvet  mindenki  a  saját, Amiga  rendszerben   való
jártasságának megfelelô szinten használja.  Ehhez néhány jó tanács:

-  Aki  most teszi az elsô lépéseket, az olvassa el az elsô fejezetet, mely
áttekintést  nyújt  az  összes  hardver tulajdonságról és röviden átfutja a
grafika és hangeffektusok hardveres elôálítását.

- Aki  már  ismeri  a rendszert,  az böngéssze át a 2-8-as fejezeteket, itt
megtalálhatja  a  vezérlôregiszterek  bitjeinek  leírását, ez a rész megis-
merteti a rendszerfunkciókat, és példákat is tartalmaz.

-  Haladó  felhasználóknak  a  függelékek adnak egy tömör összefoglalást a
teljes  regiszterkészletrôl,  és  a speciális bitek használatáról.  Aki már
egyszer megtanulta a bitek átírásának hatásait, az jobban tudja használni a
függelékeket, mert  itt könnyebb a részleteket megtalálni, mint a magyarázó
szövegben.


A fejezetek tartalmának rövid áttekintése
-----------------------------------------

1. Fejezet: Bevezetés
Áttekinti  a  hardvert,  és  röviden  átfutja  az  Amiga  grafika  és  hang
tulajdonságait.

2. Fejezet: Segédprocesszor hardver
A  Copper  a  teljes  grafika  és  audio  rendszer vezérlésére használható.
Ezenkívül  itt  található  a  képernyô  változásainak  vezérlése,  az egyes
képmegjelenítések között.

3. Fejezet: Képmezô hardver
Az  Amiga  képernyôjének  definiálási,  ábrázolási  és  mozgatási  alapjait
mutatja  be.   Ezenkívül  bemutatja,  hogyan  kell létrehozni a multi-color
üzemmódot és a multi grafikus bittérképet.

4. Fejezet: Sprite hardver
Bemutatja, hogy  hogyan  lehet a nyolc DMA csatorna segítségével mozgatható
tárgyakat,  adatstruktúrákat  készíteni,  megjeleníteni  és mozgatni, újra-
használni a DMA csatornát.

5. Fejezet: Audio hardver
Áttekintés a digitalizált hangok, minôségileg jobb hangok, az egyszerűbb és
összetettebb hangok és modulált hangok elöállításáról.

6. Fejezet: Blitter hardver
Hogyan  kell  használni  a  blitter  DMA  csatornáit  animációs  effektusok
létrehozására, és hogyan lehet vonalat húzni a képernyôn.

7. Fejezet: Rendszervezérlés hardver
Ez  a  fejezet bemutatja, hogyan kell a vezérlôregiszterekkel grafikus tár-
gyak  adatait  átrendezni,  ütközésüket  vizsgálni,  a DMA-t és a megszakí-
tásokat kezelni.

8. Fejezet: Interface hardver
Ez  a  fejezet  bemutatja, hogyan tart kapcsolatot az Amiga a külvilággal a
vezérlô  portok, a billentyűzet, az audio hardver, a video port, a soros és
párhuzamos  portokon keresztül.  Információkat nyújt a lemezvezérlôrôl és a
RAM bôvítésekrôl.

Függelékek:
A  hang és a grafika regisztereinek leírása ABC és cím szerinti sorrendben,
a  regiszterek bitjeinek leírása. Tartalmaz memóriatérképet, a külsô, belsô
csatlakozók, az interface csatlakozók, és a billentyűzet leírását.


További információk a következô könyvekben találhatók:

Az  Amiga  ROM  Kernel  Manual információkat tartalmaz az Exec multitasking
rendszerű  rutinokról, az  Amiga grafika, animáció és hang rutinok C nyelvű
leírását foglalja magába.

A következô kézikönyvek az AmigaDOS operációs rendszer leírásai:

                AmigaDOS User's Manual
                AmigaDOS Developer's Manual
                AmigaDOS Technical Reference Manual

Az  Amiga egy olcsó, nagy teljesítményű számítógép fejlett grafikai és hang
sajátosságokkal.   Ez a fejezet leírja az Amiga hardver alkatrészeit és egy
rövid áttekintést nyújt a grafika és a hang jellemvonásokról.


Az Amiga alkotórészei
---------------------

Az Amiga fôbb hardver alkatrészei a következôk:

- Motorola MC68000 16/32 bites mikroprocesszor.
- 512 KByte belsô RAM.
- 256  KByte  ROM,   ami  tartalmazza  a valós idejű multitasking operációs
  rendszert, a hang, a grafika és az animáció rutinjaival.
- Beépített 3 1/2 inches kétoldalas lemezmeghajtó.
- Lemezcsatlakozó,   maximum  3  további  5  1/4  vagy  3  1/2 inches lemez
  csatlakoztatásához.
- Teljesen programozható soros port.
- Teljesen programozható párhuzamos port.
- Két nyomógombos opto-mechanikus egér.
- Két vezérlô port (egér, joystick, pad, felhasználói vezérlô).
- Billentyűzet (különálló kurzor, numerikus és funkcióbillentyűkkel).
- Port az RGB analóg és digitális videójelek részére.
- Sztereo audio kimenet, 4 speciális csatornával.
- Bôvítôport, mely lehetôséget ad RAM, további lemezegységek (FD vagy HD),
  perifériák és koprocesszorok csatlakoztatására.


A 68000 és az Amiga hardvere
----------------------------

A  Motorola  68000-es  egy  16/32 bites mikroprocesszor, amely 7.16 MHz-cel
működik.  Az Amigában a 68000-es 8 MByte folytonos RAM-ot képes megcímezni.

A  68000-es  teljesítményét növeli a rendszer kiépítése, mely biztosít neki
egy  mindig  változó  busz  vonalat,  engedélyezve  ezzel, hogy az idô nagy
részében  teljes  sebességgel  működhessen.   A  speciális  célhardver idôt
rabolhat  el  a  68000-estôl,  ha  az  az  adott munkát így eredményesebben
végezheti  (erre  késôbb  visszatérünk).  Amikor ROM-ot vagy külsô memóriát
használ a 68000-es, mindig teljes sebességgel dolgozik.

Más funkcióknál a speciális célhardver gondoskodik a következôkrôl:

- A  bittérkép  által  elôállított  grafikák  jellegzetes  formái:  320*200
(320*400  interlace)  32  színnel,  640*200 (640*400 interlace) 16 színnel.
Egy  speciális  üzemmódban  4096  színt  is  képes megjeleníteni az Amiga a
képernyôn egyidôben.

-  A video koprocesszor speciális regiszterei általában az elektronsugárral
szinkronban íródnak át.  Ez lehetôvé tesz olyan effektusokat, mint a képer-
nyô színpalettájának kicserélése, a képernyô felbontásának különbözô szele-
tekre  bontása,így  különbözô  felbontás és színmélység lehet egyszerre egy
képernyôn.  Így lehet megszakítást kiváltani a 68000-esen.  A videochip ké-
pes egy frissítés alatt több ilyen jelet kiváltani, és ezt akár egy sor kö-
zepén is megteheti, ugyanúgy, ahogy az elektronsugár visszafutásakor is.  A
koprocesszor  regiszterei  közvetlenül  is  kihatással lehetnek a speciális
célhardverre,  felszabadítva a 68000-est, hogy általános számításait végez-
ze.

-  A  32  színregiszter  mindegyike  12 bites, amelyekbôl 4-4 külön-külön a
piros,  a  zöld és a kék intenzitást határozza meg.  Ez lehetôséget ad 4096
szín közül kiválasztani a megfelelôket.

- Nyolc újrahasználható 16 pixel széles sprite, mely 15 színű lehet (amikor
a  sprite-ok  párban  vannak).   A  sprite  egy könnyen mozgatható grafikus
tárgy,  mely  teljesen  függetlenül  jeleníthetô meg a képernyôn.  A sprite
lehet a háttérmezô elôtt vagy mögött.  A sprite 16 kisfelbontású képpontnyi
széles,  és  bármilyen  magas  lehet.   Miután  a  sprite  utolsó  sorát is
ábrázolta  a  képernyôn  a  gép,  a  sprite  DMA csatornát egy újabb sprite
elôállítására  lehet  használni  (legalább  egy  vízszintes  raszter  után
mindegyik  sprite  újrahasználható).   Így sok kis sprite használható a DMA
megfelelô újrafelhasználásával.

-  Dinamikusan  vezérelhetô a tárgyak prioritása, és az ütközés vizsgálata.
Ez  azt jelenti, hogy a rendszer képes dinamikusan a képtárgyak prioritásá-
nak megfelelôen a sprite-ot vagy a hátteret megjeleníteni.  Így lehet vezé-
relni,  hogy  melyik  tárgy vagy tárgyak legyenek láthatók az adott takarás
mellett.   Emiatt  a rendszer hardvert a tárgyak közötti ütközésvizsgálatra
lehet használni, így egy ilyen ütközés kihatással lehet a programra.

-  A  bit-blitter  egy  nagy  sebességű  adatmozgató,  a memória másolására
használható.   A blitter úgy van tervezve, hogy az adatokat három forrásból
vegye  ki,  majd  ezeket  256  lehetséges  úton összekombinálja, és tárolja
azokat  a  célterületen.   Ez  csak egy példa arra, hogy a blitter bizonyos
esetekben  sokkal  hatásosabb,  mint  a  68000.   A  blitter  egy speciális
üzemmódban  egy  derékszögű  koordináta rendszerben ábrázolt vonalat másod-
percenként  1000000 képpont sebességgel rajzol ki, és hatásosan tölti fel a
grafikus területeket.

- Az audio chip négy digitális hangcsatornából áll, amelyek hangerôssége és
a mintavételezés-foka független.  Az audio csatornák vezérlése és az adatok
küldése  a  DMA-n keresztül történik.  A hangcsatorna automatikusan játssza
az elôírt hullámformát, a processzor hatása nélkül.  Ha több csatorna szól,
akkor  ezek  a két sztereo kimeneten továbbítódnak.  A hangcsatornák össze-
kapcsolhatók  egymással,  az amplitúdó, frekvencia vagy egyidejűleg mindkét
moduláció kiválasztásával.

-  A  DMA  vezérelt  floppy  írni és olvasni teljes track-re képes.  Ez azt
jelenti,  hogy  a  beépített  floppy  5.6 KByte információt képes olvasni a
lemez egy fordulata alatt (11 szektor, egyenként 512 byte).


Az összes leírt speciális funkciót 3 VLSI állítja elô, melyek a 68000-essel
együtt dolgoznak.  A VLSI-k és a 68000-es megosztva használják a memóriát a
műveletekhez.  Így,  míg  a 68000-es csak címez, addig a memóriabusz az idô
nagy részében szabad más aktív egységek számára.

A  speciális célhardverek a memóriabuszt ezekben a szabad ciklusokban hasz-
nálják,  így hatékonyan használják ki a buszt, hogy a 68000 az idô nagy ré-
szében  teljes sebességgel tudjon dolgozni.  Azért mondjuk, hogy az id nagy
részében,  mert elôfordulhat, hogy a speciális célhardverek ciklusokat lop-
nak a 68000-estôl, amit persze nem tesznek ok nélkül.  Amikor ilyen ciklus-
lopásra  sor  kerül,  akkor  a  koprocesszor, ami a lopásért felelôs, olyan
feladatot  végez,  amit  jobban  tud megcsinálni, mint a 68000, így a lopás
jogos.   A DMA csatorna maximális hatásfokúvá van kifejlesztve, hogy azokat
a  feladatokat,  amelyeket  végre  kell  hajtania,  csak  a  legmegfelelôbb
hardverelem  legyen képes elvégezni.  Így tehát a sprite-ok, az audio, és a
lemez DMA is képes cikluslopásra.

Egy  másik fontos jellemvonása az Amiga hardverének, hogy dinamikusan képes
ellenôrízni,  hogy  a memória mely részeit tartja fenn a kép hátterének, az
audionak,  és  a  sprite-ok  kezelésére.   Az Amiga nem korlátozza ezeket a
funkciókat  egy kis RAM területre.  Ehelyett a rendszer engedélyezi, hogy a
bittérképek,  a  sprite  vezérlô szavak, a koprocesszor utasításlistája, az
audio lista bárhol lehet az alsó 512 KByte-os memóriában.

A  memóriának ezt a részét képes a blitter címezni.  Ez azt jelenti, hogy a
felhasználó  képes  grafikus  tárgyakat venni a memóriából, és ezeket gyors
másolással  és  a háttérre való helyezéssel mozgatni a képernyôn.  Az Amiga
beépített  szoftvere  segítséget  nyújt  a  kép  definiálásához,  animációk
vezérléséhez, a képtárgyak háttérbe való beágyazásához.


VCR és közvetlen kamera interface
---------------------------------

Az  Amigához  analóg vagy digitális RGB monitorok, vagy NTSC monitorok kap-
csolhatók.   A rendszer bôvíthetô VCR vagy kamera interfésszel.  A rendszer
képes a külsô forrás szinkronizálására, és külsô kép megjelenítésére.  Ez a
fejlesztés  tökéletessé  teszi a grafikát.  A lézerlemez csatlakoztatása és
használata hasonló módon elérhetô.


Elsôdleges és másodlagos memória
--------------------------------

Az  elsôdleges  memória az Amigán a 256 KByte ROM és az 512 KByte RAM.  RAM
bôvítôkártya szabadon csatlakoztatható.  A másodlagos memória a beépített 3
1/2 inches floppy.  A lemezegység 80 track-es, kétoldalas és 11 szektort ír
track-enként  (egy lemez több mint 9000000 byte kapacitású). A lemezvezérlô
speciális programok segítségével más formátumú lemezeket is képes elolvasni
(pl.  IBM  PC,  Apple II, MAC).  A rendszer bôvíthetô 3 1/2 és 5 1/4 méretű
lemezegységekkel a bôvítôporton keresztül.


Perifériák
----------

A  perifériák áramkörei általában tartalmaznak egy custom chip-et.  A többi
chip nem fontos, ezek is valamelyik custom chip-hez csatlakoznak (például a
modem  vezérlôk, lemezállapot jelzôk, lemez motor és léptetômotor vezérlôk,
ROM  engedélyezô,  párhuzamos  input/output  interface, billentyűzet inter-
fész).
Az Amiga egy standard RS-232-C porttal is rendelkezik.
A  professzionális  billentyűzetet  az  alaprendszer  magában  foglalja.  A
maximális  rugalmasság  érdekében  a billentyűk lenyomása és felengedése is
jelzést  küld.   A billentyűzeten a kurzor vezérlésére elkülönítve van négy
billentyű.   A  gép  hátulján  van  két kontroll port, amiken keresztül más
vezérlôket  is  lehet  csatlakoztatni,  így  például  egeret,  joystick-ot,
mellékklaviatúrát,  pozícionáló  gömböt,  és  kormányt mindkét; fényceruzát
csak a 0-ás portba.


A rendszer bôvítése és adaptálása
---------------------------------

Az  Amiga  összeköthetô a bôvítô portokon keresztül perifériákkal.  További
lemezegységeket  daisy  kábellel  kötve  kapcsolhatók  az Amigához (maximum
három).
Az  Amiga  grafikáját  támogató  rutinokat  a  felhasználó  is könnyedén és
gyorsan  tudja  használni.  Az operációs rendszer felismeri és használja az
új perifériákat, definiálásukat belsôleg végzi el.










Bevezetés
---------

A  Copper egy általános célú segédprocesszor az Amiga chipjei között.  Uta-
sításait  a  DMA-n  keresztül küldi el.  A Copper vezérelni tudja szinte az
egész grafikus rendszert, felszabadítva a 68000-est.  Képes közvetlenül be-
folyásolni  a legtöbb chip vezérlôregisztereit.  Ez a leghatásosabb eszköz,
mellyel  vezérelni  lehet a képernyô változásait, illetve a függôleges üres
intervallumban  a  regiszterek átírását.  Ezeken kívül a vezérlôregiszterek
idôzítését, a sprite-ok újrafelhasználását, a szín- paletta kicserélését, a
hangcsatornák idôzítését, és a blitter vezérlését lehet elvégezni vele.

Egyik  jellemvonása  a Coppernek a videosugárra való várakozási képesség és
az  adatok mozgatása a rendszerregiszterekbe. Mialatt a Copper várakozik, a
vidosugár pozícióját tároló számlálót figyeli.  Ez azt jelenti, hogy amíg a
Copper  arra  vár,  hogy a videosugár a megadott pozícióra érjen, addig nem
képes  az egész memóriabuszt használni.  Ezalatt a busz más DMA, valamint a
68000-es számára szabad.

Amikor  a WAIT feltétel teljesül, a Copper ciklusokat lop a blittertôl és a
68000-estôl,  hogy  a  megadott adatmozgatásokat elvégezze a speciális cél-
regiszterekbe.

A Copper a memóriabuszt csak páratlan ciklusoknál igényli.  Ez megakadáloz-
za az összeütközést a hang DMA-val, a lemez DMA-val, a memóriafrissítéssel,
a  sprite-rajzolással  és  a  kisfelbontású kép legtöbb ciklusával, amelyek
csak  a  páros ciklusokat használják.  A Coppernek így magasabb prioritásra
van szüksége, mint a blitternek és a 68000-esnek.

Mint  minden  más  DMA  csatorna,  a  Copper  is  csak az alsó 512 KByte-os
memóriaterületet képes kezelni.


Néhány szó a fejezetrôl
-----------------------

Ebbôl  a fejezetbôl megtanulható, hogyan használhatók a Copper utasítások a
regiszterek  átírására,  a  kép  megváltoztatására, illetve a mutatók beál-
lítására  a  függôleges üres intervallumban.  A fejezet leírja, hogy kell a
Copper utasításait copperlistává szervezni, hogyan kell a Coppert használni
interlace  üzemmódban,  és  hogyan  kell  használni  a Coppert a blitterrel
együtt.


Mi is az a Copper utasítás?
---------------------------

Mint a segédprocesszorok, a Copper is kiegészíti az utasításkészletet, amit
a 68000 már nyújt a felhasználónak.  Ugyan csak három utasítássa van, ezek-
kel azonban nagyon sok dolgot lehet elvégezni:

WAIT: várakozás egy (X;Y) koordinátákkal megadott képernyôpontra.

MOVE: egy adat közvetlen írása egy speciális célregiszterbe.

SKIP: a következô utasítás átlépése,  ha a videosugár elérte vagy már túl-
      haladt a megadott pozíción.

Az  összes  Copper  utasítás  16 bites szóból áll.  Mindig, amikor a Copper
vesz  egy  utasítást,  veszi mindkét szót.  A MOVE és a SKIP utasítások két
ciklust  igényelnek,  de  mivel a Copper csak a páratlan ciklusokat éri el,
ezért  négy ciklusnyi ideig tart a végrehajtásuk.  A WAIT utasításnak három
ciklusra van szüksége, ezért hat ciklusnyi ideig tart a végrahajtása.

Habár  a  Copper  közvetlenül  hozzáfér a gép regisztereihez, a fô memóriát
csak  a  blitteren  keresztül  képes  elérni.   A késôbbi fejezetekben meg-
találjuk, hogy ezt hogyan lehet megtenni.


A MOVE utasítás
---------------

A MOVE utasítás a RAM-ból adatot visz át a célregiszterbe.  a MOVE utasítás
elsô  szava  a  célregiszter  címét  tartalmazza,  a  második  szó  pedig a
mozgatandó  16  bites  adatot.   A bitek pontos jelentése a következô ábrán
látható:

                          Elsô utasításszó (IR1)

                        0. bit  : értéke mindig 0
                        8-1 bit : a célregiszter címe
                        15-9 bit: értéke mindig 0


                         Második utasításszó (IR2)

     15-0 bitek: a 16 bites adat, amit mozgatni kell a célregiszterbe.


A Copper a következô regiszterekbe képes írni:

- Bármely regiszterbe, amelynek címe nagyobb, mint $20.
- Bármely  regiszterbe  $10  és  $20  között,  ha a danger bit értéke 1.  A
danger  bit a Copper vezérlô regiszterében, a COPCON-ban van, ennek leírása
egy késôbbi fejezetben lesz.

A Copper nem képes olyan regiszterbe írni, amelynek a címe kisebb mint $10.
A függelék tartalmazza az összes regiszter címét.

A  következô példa bemutatja a MOVE utasítást.  Az 1-es bittérkép mutatóját
$21000-re, a 2-es bittérkép mutatóját $25000-ra állítja.

           dc.w $00E0,$0002; írj $0002-t a $0e0 címre (BPL1PTH)
           dc.w $00E2,$1000; írj $1000-t a $0e2 címre (BPL1PTL)
           dc.w $00E4,$0002; írj $0002-t a $0e4 címre (BPL2PTH)
           dc.w $00E6,$5000; írj $5000-t a $0e6 címre (BPL2PTL)


A WAIT utasítás
---------------

A  WAIT  a  Coppert  várakozásra utasítja, amíg a videosugár számlálója nem
egyenlô  (vagy  nagyobb)  a parancsban meghatározott koordinátával.  Amíg a
Copper várakozik, nem használ memóriaciklusokat.

Az  elsô  utasításszó tartalmazza a függôleges és vízszintes koordinátákat.
A  második  szó  egy maszkot tartalmaz, amely meghatározza, hogy mely bitek
vegyenek részt az összehasonlításban.

                          Elsô utasításszó (IR1)

                       0. bit  : mindig 1
                       15-8 bit: függôleges pozíció
                       7-1 bit : vízszintes pozíció


                         Második utasításszó (IR2)

                0. bit  : mindig 0
                15. bit : blitter-vége-letiltás bit, értéke
                          általában 1 (leírása késôbbi feje-
                          zetben található)
                14-8 bit: függôleges pozíció összehasonlítását
                          engedélyezô bitek
                7-1 bit : vízszintes pozíció összehasonlítását
                          engedélyezô bitek

A következô példa a WAIT utasítás segítségével a 150-es ($96) raszterre vár
(a vízszintes pozíciót nem veszi figyelembe):

                             dc.w $9601,$FF00

A  következô  példa  a 255-ös sorra, és a 254-es oszlopra vár.  Ez soha nem
fog teljesülni, így a Copper megáll addig, amíg a következô függôleges üres
intervallum el nem kezdôdik:

                             dc.w $FFFF,$FFFE


Vízszintes sugárpozíció
-----------------------

A vízszintes sugárpozíció értéke $00-tól $E2-ig terjed.  A legkisebb helyi-
értékű  bit használaton kívül van, ezért 113 különbözô pozíció van a Copper
számára.   Az  egyes pozíciók négy kisfelbontású vagy nyolc nagy- felbontás
pixelre  vannak  egymástól.   A  vízszintes üres intervallum $0F-tôl $35-ig
terjed.   A  standard  (320  pixel  széles) kép használaton kívüli területe
$04-tôl $47-ig terjed (ekkor csak a háttérszín jelenik meg).


Függôleges sugárpozíció
-----------------------

A  függôleges  sugárpozíció  egy  raszter.   A  képernyôn  262  lehetséges
különbözô  pozíció  van.   Ha  az utolsó hat, hét raszteren akarunk valamit
tenni,  akkor  egy  kicsit bonyolultabb.  Mivel a függôleges pozíciót nyolc
biten  adjuk  meg, ez csak 256 pozíciót különböztet meg.  A következô példa
egy egyszerű módszert mutat be a legalsó pozíciók kezelésére:

                Utasítás                        Jelentés

        [más utasítások]
        WAIT (0,255)                    Ezen a ponton a függôleges számláló
                                        0-ra fog átfordulni,  mivel a nyolc
                                        bit túlcsordul

        WAIT (várakozás egy pozícióra,  Ilyenformán a végsô függôleges
        0 és 6 között. Az üres inter-   pozíció a 256+6=262, melyet a
        vallum kezdete elôtt még ezek   Copper végrehajthat.
        a sorok kerülnek kijelzésre.


Az összehasonlítást engedélyezô bitek
-------------------------------------

A  14-1  bitek  értéke általában 1.  Ezeknek a biteknek a részletes leírása
egy késôbbi fejezetben található.


A Copper regisztereinek használata
----------------------------------

Számos regiszter tartozik a Copperhez: - pozícióregiszterek
                                       - ugrási címregiszterek
                                       - vezérlôregiszterek


Pozícióregiszterek
------------------

A Copper pozícióregiszterei:

        COP1LCH: az elsô copperlista címének felsô 3 bitje
        COP1LCL: az elsô copperlista címének alsó 16 bitje
        COP2LCH: a második copperlista címének felsô 3 bitje
        COP2LCL: a második copperlista címének alsó 16 bitje

A  hardver  közvetlen  elérésekor  gyakran  van  szükség  arra,  hogy  egy
regiszter-párt  írjunk  át.  Az  adat  alsó  részét egy 'L'-re végzôdô nevű
regiszterbe,  a magas részét pedig 'H' végű regiszterbe.  A felsô regiszter
megelôzi  az  alsó regisztert.  Ez az oka annak, hogy a 68000-es hosszúszós
címzésnél a felsô szót teszi a kisebb címre.

Emiatt  a  Copper  pozícióregisztereit  mindig  úgy fogjuk átírni, hogy egy
hosszúszót  írunk  a  COP1LCH-ba.  Az egyszerűség kedvéért ezt a regisztert
COP1LC-nek fogjuk hívni.

A  Copper egy programmutatót használ a copperlista kiértékelésekor.  Minden
egyes  utasítás kiemelése után a programmutató értéke növekszik, hogy az új
utasításra  mutasson.  Amikor egy ugrási regiszterbe írunk, a programmutató
értéke  újratöltôdik  az  ugrási  értékre,  így a következô utasítást nem a
következô,  hanem  az  általunk  meghatározott  címrôl veszi majd, és onnan
folytatódik addig, amíg egy újabb ugrás nem történik.

Megjegyzés:   minden  üres  intervallum  kezdetekor  a COP1LC automatikusan
újraíródik.   Teljesen mindegy, hogy éppen mit csinál a Copper, ha egy üres
intervallum kezdôdik, a programmutató a COP1LC-ben lévô értékre állítódik.


Az ugrási regiszterek
---------------------

Amikor  az ugrási regiszterbe írunk, a Copper programmutatója újtatöltôdik.
A  Copper  képes a saját pozíció és az ugrási regisztereibe írni, ezzel egy
vezérlésátadást hozhatunk létre.

Két ugrási cím van: COPJMP1 és COPJMP2.


Vezérlôregiszterek
------------------

A  Copper számos regisztert mindig el tud érni, néhányat csak akkor, ha egy
speciális  bit  értéke 1, és néhányat soha sem.  A regiszterek, amelyeket a
Copper  mindig képes elérni, a $20-tól $FF-ig terjedôk.  Amelyeket soha sem
képes elérni, a $00-tól $0F-ig terjedôk.  A függelékben az összes regiszter
címe megtalálható.  A Copper vezérlôregiszterei a harmadik, védett csoport-
ban  vannak.  Emiatt  a  Copper  csak  a  68000-es különös figyelemmel való
programozása esetén éri el ezeket a vezérlôregisztereket.

A  Copper  vezérlôregisztere  (COPCON)  egyetlen  bitet  tartalmaz, az 1-es
bitet,  neve  CDANG  (Copper Danger Bit).  Ez a bit védi a $10-tôl a $1F-ig
terjedô  regisztereket.  Ez  az  intervallum  tartalmazza a blitter vezérlô
regisztereit  is.   Ha a CDANG bit 0, akkor a Copper ezeket a regisztereket
nem  tudja átírni.  Az, hogy letiltjuk a blitter kezelését, megakadályozza,
hogy egy rosszul megírt copperlista kifusson a rendszer memóriából.

Megjegyzés: a CDANG bit törlôdik a reset után.


Egy copperlista összeállítása
-----------------------------

A  copperlista  tartalmazza az összes szükséges regiszter beállítását, amit
az üres intervallumban meg kell tenni.  Amikor azt tervezzük, hogy mit kell
a Coppernek minden képfrissítéskor tennie, könnyebben boldogulunk, ha fela-
datok  szerint  szétbontjuk  a teljes feldatot, sprite-ok, audio, megszakí-
tások és így tovább.

Miután az egyes részfeladatokat megoldottuk, ezeket egymás után kell fűzni,
hogy  egy  futtatható  listát  kapjunk.   Ezt  minden közbensô lépés nélkül
megtehetjük.

Például  a bittérkép mutatókat és a sprite mutatókat az üres intervallumban
kell átírni, ezért ezt a következô copperlistával lehet például megtenni:

                WAIT amíg az elsô raszterbe nem ér
                MOVE adat az 1-es bittérkép mutatójába
                MOVE adat a 2-es bittérkép mutatójába
                MOVE adat az 1-es sprite mutatójába
                stb.

Egy  másik  példa:   a  sprite  DMA  által  készített  mozgatható tárgyakat
többször  fel  lehet  használni  egy képfrissítés alatt.  A sprite alakját,
méretét  így  megváltoztathatjuk, azonban ilyenkor ugyanazt a színkészletet
fogja  továbbra  is használni az egész képfrissítés alatt.  Egy copperlista
segítségével megváltoztathatjuk a sprite színkészletét a képernyô közepén a
két  felhasználás  között, így a két sprite más színkészlettel jelenik majd
meg:

                WAIT az elsô raszterig
                MOVE szín11 -> COLOR17
                MOVE szín12 -> COLOR18
                MOVE szín13 -> COLOR19
                WAIT az utolsó sprite utolsó soráig
                MOVE szín21 -> COLOR17
                MOVE szín22 -> COLOR18
                MOVE szín23 -> COLOR19
                stb.

Amikor  több  listát  rakunk  egymás után, ne felejtsük el, hogy ugyanolyan
sorrendben kell a feladatokat elvégeztetni, amilyen sorrendben a videosugár
a  képet felépíti.  A videosugár a bal felsô sarokból (0,0) indul és a jobb
alsó  sarokba  érkezik  (226,263).   Például,  ha  egy  műveletet a (0,100)
pozíción kell megtenni, akkor ennek kásôbb kell a listában szerepelni, mint
annak a feladatnak, amit a (0,60) pozíción értelmeztünk.

Megjegyezzük,  hogy  a  WAIT utasítás végrehajtásából adódóan néha kicsúsz-
hatunk  a  pontos koordinátára való pozícionálásból.  A WAIT utasítás addig
várakozásra  kényszeríti  a  Coppert, amíg a videosugár értéke egyenlô vagy
nagyobb  az  utasításban  megadottnál.  Ez azt jelenti például, hogy ha van
pár utasításunk, amelyek hasonlóak ezekhez:

                WAIT (64,64)
                MOVE adat,regiszter
                WAIT (60,60)
                MOVE adat,regiszter

akkor  a  Copper mindkét adatmozgatást végrahajtja, pedig nincsenek sorban.
A  nagyobb  mint  elôírás  megakadályozza,  hogy  a  Copper  azután  is  az
elektronsugarat  figyelje,  mikor  az  már rég túlhaladt a megadott koordi-
nátákon.  A következô példában a második MOVE ugyanígy végrehajtódik:

                WAIT (60,60)
                MOVE adat,regiszter
                WAIT (60,60)
                MOVE adat,regiszter

Amikor  a  második WAIT értékelôdik ki, a videosugár már túl van a megadott
pozíción.   Emiatt  a  második  MOVE  azonnal végrehajtódik.  Ilyen esetben
egyszerűbb így összeállítani a listát:

                WAIT (60,60)
                MOVE adat,regiszter
                MOVE adat,regiszter
                MOVE adat,regiszter


Egy teljes copperlista
----------------------

A  következô példa egy teljes copperlistát mutat be.  Ez a program két bit-
térképet  állít  be $21000 és $25000-hez.  A képernyô tetején a színregisz-
terek értékét a következôkre állítja be:

                           Regiszter       Szín

                            COLOR00        fehér
                            COLOR01        piros
                            COLOR02        zöld
                            COLOR03        kék

A 150-es raszterben a színregiszterek újraíródnak:

                           Regiszter       Szín

                            COLOR00        fekete
                            COLOR01        sárga
                            COLOR02        cián
                            COLOR03        lila

A copperlista a következô:

Copperlist:
        dc.w $00E0,$0002        ; $0002 -> $0E0 (BPL1PTH)
        dc.w $00E2,$1000        ; $1000 -> $0E2 (BPL1PTL)
        dc.w $00E4,$0002        ; $0002 -> $0E4 (BPL2PTH)
        dc.w $00E6,$5000        ; $5000 -> $0E6 (BPL2PTL)
;
; a színregiszterek betöltése
;
        dc.w $0180,$0FFF        ; a 0-ás szín fehér
        dc.w $0182,$0F00        ; az 1-es szín piros
        dc.w $0184,$00F0        ; a 2-es szín zöld
        dc.w $0186,$000F        ; a 3-as szín kék
;
; várakozás a 150-es raszterre
;
        dc.w $9601,$FF00        ; vízszintes pozíciót nem figyel
;
; a színregiszterek újraírása
;
        dc.w $0180,$0000        ; a 0-ás szín fekete
        dc.w $0182,$0FF0        ; az 1-es szín sárga
        dc.w $0184,$00FF        ; a 2-es szín cián
        dc.w $0186,$0F0F        ; a 3-as szín lila
;
; vége a listának
;
        dc.w $FFFF,$FFFE


A  képmezô  hardver  című  fejezetben  további  információkat  találunk  a
színregiszterekkel kapcsolatban.


A Copper elindítása reset után
------------------------------

Bekapcsoláskor  és  reset  esetén  inicializálni  kell a Copper egyik pozí-
cióregiszterét  (COP1LC  vagy  COP2LC),  és írni kell az ugrás regiszterbe,
mielôtt  a  Copper DMA bekapcsolódna.  Ez biztosít egy kezdeti ismert címet
és  állapotot.  Általában erre a COP1LC-t használják, mert ezt a regisztert
minden üres intervallumban újrahasználja a rendszer.  A következô példa azt
mutatja be, hogy hogyan kell a pozícióregisztereket inicializálni.  A példa
feltételezi,  hogy  a  felhasználó  már készített egy teljes copperlistát a
MYCOPLIST címre.

        MOVE.L  MYCOPLIST,A0
        MOVE.L  A0,COP1LCH      ; ez átírja a COP1LCL-t is
        MOVE.W  COPJMP1,D0
        MOVE.W  #SETBIT+CopperDMA,D0
        MOVE.W  D0,DMACONW      ; a Copper DMA engedélyezése

Most  a COP1LC értéke nem változik, és a Copper minden képernyôfrissítéskor
újraindul.   Ez  egy  ismétlôdô ciklust alakít ki, ami ha helyes a program,
akkor a képernyô állandó lesz.


A Copper leállítása
-------------------

A Coppernek nincs külön leállító utasítása.  Aonban ha biztosítani akarjuk,
hogy  a  Copper  ne  csináljon semmit amíg a képernyô kirajzolódik, akkor a
Copper  utolsó  utasítása  egy  WAIT  kell,  hogy  legyen,  amit  nem  tud
végrehajtani.  Az  általános megoldást már láttuk.  A Copper egy nem létezô
pozícióra  vár,  így  nem  csinál semmit, amíg az elinduló üres intervallum
újra nem indítja a Coppert a lista elejétôl.

A  Coppert  úgy is leállíthatjuk, hogy a DMA csatornáját tiltjuk le.  Ezt a
DMACON  regiszterben  lévô  COPEN  nevű 7-es bit törlésével érhetjük el.  A
Copper  DMA-ja  csak  akkor  dolgozik, ha ez a bit 1-re van állítva.  A DMA
vezérlésrôl a 7.  fejezetben találhatunk bôvebb leírást.


A SKIP utasítás
---------------

A  SKIP  utasítás  hatására  a  Copper  átlépi  a következô utasítást, ha a
megadott pozíciót elérte, vagy már túlhaladt rajta a videosugár.

A  SKIP  utasítás szavainak tartalmát a következô táblázat tartalmazza.  Az
utasítás  formája  azonos  a  WAIT-tel, kivétel egy bit az utasítás második
szavában, mely a WAIT-nél 0, a SKIP-nél mindig 1.

                          Elsô utasításszó (IR1)

                       0. bit  : mindig 1
                       15-8 bit: függôleges pozíció
                       7-1 bit : vízszintes pozíció


                         Második utasításszó (IR2)

        0. bit  : mindig 1
        15. bit : blitter-vége-letiltás bit, értéke általában 1
                  leírása készôbbi fejezetben található
        14-8 bit: függôleges pozíció összehasonlítását engedélyezô bitek
        7-1 bit : vízszintes pozíció összehasonlítását engedélyezô bitel

Megjegyezzük,  hogy  az  elektronsugár  figyelésével  kapcsolatban  a  WAIT
utasításnál tett kitételek érvényesek a SKIP utasításra is.

A  következô  példa a SKIP utasítást szemlélteti. A SKIP átlépi a következô
utasítást,  ha  a  videosugár függôleges koordinátája nagyobb vagy egyenlô,
mint 100 ($64):
                             dc.w $6401,$FF01


Ciklus, elágazás, összehasonlítás
---------------------------------

Képesek  vagyunk  átírni  a  Copper pozíció regiszterét, így ciklust tudunk
létrehozni.   A  következô üres intervallum elôtt azonban a COP1LC-t vissza
kell írni a copperlista elejére.  A COP1LC értéke ugyanis beíródik a Copper
programszámlálójába minden üres intervallum kezdetekor.

A  WAIT  és  a SKIP utasítások második szavának 14-1 bitjei határozzák meg,
hogy  a  koordináták  összehasonlításakor  mely bitek vegyenek részt.  Csak
azok  a  bitek  vesznek  részt  az  összehasonlításban, amelyekhez  tartozó
engedélyezô  bit  értéke  1.   Amely bitekhez tartozó engedélyezô bit 0, az
olyan, mintha az a bit megegyezne a sugárszámlálóval.  Például ha csak arra
vagyunk  kiváncsiak,  hogy  a megadott és az aktuális függôleges pozíció az
utolsó  négy  biten  egyezik-e, akkor csak az utolsó négy engedélyezô bitet
állítsuk 1-re (11-8).

Egy másik példa:  tegyük fel, hogy minden 16.  sorban egy megszakítást kell
kiváltanunk.   Ezenkívül  a  megszakításokat  a 80-as és a 160-as raszterek
között  akarjuk.   A  következô lista ezt csinálja, kihasználva a maszkolás
lehetôségeit.

Mielôtt  a  Coppert  elindítanánk  ezen a listán, a 68000-es segítségével a
LOOP címét a COP2LC-be kell írni.


; copperlista, ami minden 16. raszterben megszakítást generál
; a 80-160 intervallumban

        dc.w $5001,$FFFE        ; várakozás:(0,$50)
        dc.w $0F01,$0F00        ; várakozás:(0,xxxx1111)

; A következô utasítás a $09C című regiszterbe ír. Ez a megszakítás
; kérelem regisztere, a $8010 írása a regiszterbe egy Copper megszakítást
; vált ki a 68000-es felé

        dc.w $009C,$8010        ; $8010->$09C (megszakítás)
        dc.w $a001,$FF01        ; feltételesen átlépi a következô utasítást

; A következô MOVE utasítás nem mozgat ténylegesen. Ez ugrásra kényszeríti
; a Coppert a COP2LC-ben tárolt címre. Ezt már elôzôleg be kell állítani a
; 68000-essel vagy a Copperrel. Ha a függôleges pozíció >= 160, akkor a
; következô utasítást átlépi

        dc.w $008A,$0000


A Copper használata interlace üzemmódban
----------------------------------------

Interace  üzemmódban  kétszer  annyi  bitsor  van  a képernyôn, mint normál
esetben.   Minthogy  normál  esetben  200  sor  van, ezért lace módban 400.
Ebben  az  üzemmódban a videosugár kétszer szalad végig a képernyôn, minden
esetben  200 sort rajzolva.  Az elsô menetben a páratlan sorokat, a második
menetben  a  páros  sorokat ábrázolja.  A képfrissítô áramkör úgy kezeli az
interlace  üzemmódot,  mint  két  képmezôt.   Egyik tartalmazza a páratlan,
másik a páros sorokat.  A következô táblázat azt mutatja, hogy a memóriában
hogyan helyezkedik el az interlace üzemmódú kép.

                Adat a képen               Adat a memóriában

                páratlan mezô 1.sor             1. sor
                páros mezô 1. sor               2. sor
                páratlan mezô 2. sor            3. sor
                páros mezô 2. sor               4. sor
                        .
                        .
                        .
                páratlan mezô utolsó sor        399. sor
                páros mezô utolsó sor           400. sor

A  rendszer  a  képernyôfrissítéskor  az  adatokat  a bittérkép kezdôcímére
mutató  regiszter  segítségével  ábrázolja.   Amint  látható, a páros sorok
kezdôcíme  egy  sorral  nagyobb,  mint  a  páratlanoké.   Ezért a bittérkép
mutatóknak  tartalmazniuk  kell  a váltakozó mezôk címeit.  Ez azt jelenti,
hogy két különbözô Copper program szükséges ilyen esetben.

Ahhoz,  hogy  a  Copper  jól hajtsa végre a két programot, egy megszakítást
kell  elôállítanunk  a  68000-esnek  az elsô sor ábrázolása után.  Miután a
megszakítás  lefutott,  ki  kell  cserélnünk  a  COP1LC regiszter értékét a
második program kezdôcímére.  Ezután a COP1LC automatikusan visszaíródik az
üres intervallum alatt.

A interlace üzemmódról további információk vannak a 3-as fejezetben.


A Copper használata a blitterrel
--------------------------------

Ha  a  Copper  elindított  egy  blitter  műveletet, a következôt csak akkor
indíthatja  el,  ha  az  elôzôt  már  befejezte.  Ha a blitter regisztereit
átírjuk,  miközben  dolgozik,  ez megjósolhatatlan eredményt okozna.  Ez az
oka  annak,  hogy  a  WAIT  utasítás  tartalmaz egy plusz bitet (neve BFD).
Általában  ennek a bitnek az értéke 1, és csak a sugárszámláló befolyásolja
a WAIT utasítást.

Ha  a  BFD  bit  értéke  0, a WAIT utasítás logikája megváltozik.  A Copper
addig  fog  várni, amíg a sugárszámláló összehasonlítása igaz, és a blitter
befejezte a munkáját.  A blitter akkor fejezte be a munkáját, amikor az ezt
jelzô  bit  beállítódik.   A blitterrel kapcsolatban információkat találunk
még a 6-os fejezetben.


A Copper és a 68000-es
----------------------

Abban  az  esetben, ha a Copper utasítások nem elegendôk, megszakíthatjuk a
68000-es  működését,  és  használhatjuk azt a Copper utasítások helyett.  A
68000-es  állíthatja  az  INTREQ  regiszter bitjeit különbözô megszakítások
elôállítására.   Használjunk  egy  Copper MOVE utasítást, hogy megszakítást
váltsunk ki a 68000-es felé:

                Bitszám         Név     Funkció
                  15          SET/CLR   azt határozza meg, hogy az 1-es
                                        bitek töröljék vagy beállítsák
                                        a megszakítást
                   4           COPEN    Copper megszakítás a 68000 felé

A 7-es fejezet részletes leírást tartalmaz a megszakításokról.


A Copper utasítások összefoglalása
----------------------------------

A  következô  táblázat a Copper utasítások bitjeinek funkcióját mutatja be.
A függelékben megtalálható az összes regiszter címe.


             Bit     ---MOVE---      ---WAIT---     ---SKIP---
                     IR1    IR2      IR1    IR2     IR1    IR2
             15       x     RD15     VP7    BFD     VP7    BFD
             14       x     RD14     VP6    VE6     VP6    VE6
             13       x     RD13     VP5    VE5     VP5    VE5
             12       x     RD12     VP4    VE4     VP4    VE4
             11       x     RD11     VP3    VE3     VP3    VE3
             10       x     RD10     VP2    VE2     VP2    VE2
              9       x     RD9      VP1    VE1     VP1    VE1
              8      DA8    RD8      VP0    VE0     VP0    VE0
              7      DA7    RD7      HP8    HE8     HP8    HE8
              6      DA6    RD6      HP7    HE7     HP7    HE7
              5      DA5    RD5      HP6    HE6     HP6    HE6
              4      DA4    RD4      HP5    HE5     HP5    HE5
              3      DA3    RD3      HP4    HE4     HP4    HE4
              2      DA2    RD2      HP3    HE3     HP3    HE3
              1      DA1    RD1      HP2    HE2     HP2    HE2
              0      0      RD0      1      0       1      1


x  : nem figyeli, de 0-nak kell lennie a kompatibilitás miatt
IR1: elsô utasításszó
IR2: második utasításszó
DA : célregiszter tárcíme
RD : RAM adat, ami a célregiszterbe másolandó
VP : függôleges pozíció
HP : vízszintes pozíció
VE : összehasonlítás engedélyezése (maszk)
HE : összehasonlítás engedélyezése (maszk)
BFD: blitter-vége letiltás














Bevezetés
---------

Kétféleképpen rajzolhatunk Amigán a képernyôre:  egyik a közvetlen memória-
megjelenítés,  másik  a  sprite  ábrázolás  (egy könnyen mozgathat grafikus
tárgy).   Ez a fejezet a képmezô elôállítását írja le, a hardverregiszterek
közvetlen programozásával.


A fejezetrôl
------------

Ez  a  fejezet a grafika jellegzetességeinek rövid áttekintésével kezdôdik,
majd  az  alapvetô  ábrázolási  módok  definiálását  írja  le,  valamint  a
következô témakörökkel foglalkozik:

- Egy  egyszerű  alap képernyô elôállítása,  melynek mérete a megjelenített
mezôével  megegyezik.   Ez a fejezet olyan alapvetô gondolatokat tartalmaz,
amelyek mindenféle kép elôállításához szükségesek.
- A  kétképernyôs  üzemmód leírása,  ahol az egyik kép rajta van a másikon.
Az itt leírt eljárás természetesen néhány részletben eltér az alap képernyô
elôállításától.
- Méretben különbözô képmezôk elôállítása.
- Egyéb témák a képmezô speciális helyzetekben való használatához.

A  mozgatható sprite-okról a 4.  fejezetben találhatók információk.  Ezek a
mozgatható tárgyak a képernyônél kisebbek.  A képernyô kisebb részének moz-
gatására  egy technikai megoldás a blitter használata, melyet a 6.  fejezet
ír le.


Az ábrázolás sajátosságai
-------------------------

Az Amiga a videoképét raszter technika segítségével állítja elô.  Képet úgy
kell  elôállítani,  hogy  definiálni  kell  egy  vagy  több  bittérképet  a
memóriában,  feltöltve  ôket  1  és 0-val, amelyek meghatározzák majd a kép
színeit  és  mintáit.   A  képet,  ami a TV képernyôjén látható, vízszintes
elektronsugár  készíti  el  úgy, hogy minden egyes vízszintes sort kirajzol
gyorsan egymás után.

        ---->---->---->----  Mindegyik vonal  az elektronsugár útját jelké-
        ---->---->---->----  pezi, amely futás közben a képet kirajzolja. A
        ---->---->---->----  videosugár minden egyes  vonalon balról jobbra
                 .           halad. A teljes  képernyôt  pedig úgy  állítja
             video kép       elô, hogy a  tetejétôl  az aljáig  rajzolja  a
                 .           vonalakat.
        ---->---->---->----
        ---->---->---->----
        ---->---->---->----


A  videosugár  kb.  262 sort készít a képernyô tetejétôl az aljáig, amelyek
közül  normál  esetben  200  látható.   A  teljes  262  videovonalat hívják
képernyô mezônek.  A teljes képmezôt megközelítôleg 1/60-ad másodperc alatt
állítja  elô az elektronsugár; köztudottan ez a képernyôfrissítés ideje.  A
látható  mezô alatt  az  elektronsugár húz még egy vonalat, majd a képernyô
tetejére ugrik, hogy újabb képet rajzoljon ki.

A  képernyôt  a  pontrács határozza meg.  A képpont (pixel) a kép legkisebb
címezhetô  része.   Az  1-es  ábra  azt  mutatja, hogy mi is az a pixel, és
hogyan lesz a pixelekbôl látható kép.

Az  Amigának  négy  alap  rajzolási  üzemmódja  van:   interlace  (lace),
non-interlace (no-lace), kisfelbontás, nagyfelbontás.  A no-lace üzemmódban
a  képernyô  magassága  200 vonal.  A lace üzemmód finom felbontást ad, ami
400  sort  jelent  függôlegesen  a  képernyôn.   A  kisfelbontás  mellett a
képernyô szélessége 320 pixel, míg a nagyfelbontású kép sokkal finomabb, ez
640  képpont  vízszintesen.   Ezeket  az  üzemmódokat  összekombinálhatjuk,
például a lace-t és a nagyfelbontást egyszerre.

Megjegyezzük,  hogy az elôzô bekezdésben a méretek normál esetben értendôk,
vagyis  akkor,  amikor  még  bekapcsolási  állapot  van.  Valójában nagyobb
képernyôt  is  lehet  használni,  a maximális méret megadásáról késôbb lesz
szó.   Elôfordulhat,  hogy  a  memóriában  a  kép  mérete nagyobb, mint ami
valóban  kijelezhetô.  Ekkor meg kell adni az ablak méretét, amit kijelezni
kivánunk a teljes képbôl.

Amikor a képmezô magasabb a képernyônél, akkor simán lehet scrolloztatni és
mozgatni  fel vagy le a képet.  Amikor a képmezô szélesebb mint a képernyô,
akkor  vízszintesen  is  lehet  a  képet mozgatni.  Ezeket a mozgásokat egy
késôbbi fejezetben tárgyaljuk.

Az   Amiga   grafikai   rendszere  32  színregisztert  tartalmaz,  melynek
segítségével  normál  üzemmódban  32  színt lehet használni egy képen.  Egy
képpont színét úgy lehet vezérelni, hogy a hozzá tartozó bitet vagy biteket
kell  beállítani.   A rajzolás ezen módját bittérképes ábrázolásnak hívjuk.
Például  kétszínű  képernyônél  a  képpont  színét az határozza meg, hogy a
hozzá  tartozó  bit  be van-e kapcsolva, vagy nincs.  Ha a bit 0, akkor egy
felhasználó  által definiált színt vesz fel a pixel, ha 1, akkor a másikat.
Ha  a  kép négyszinű, akkor két bittérképet kell használni.  Ilyenkor a két
bittérkép  egymás  mögött  van,  így  egy  pixel  két  bit  mélységű.  Meg-
határozható  két,  három,  négy,  öt  vagy  hat bittérkép, így négy, nyolc,
tizenhat,  harminckét,  hatvannégy (Extra Halfbright) vagy 4096 (HAM) színt
lehet használni

A  pixel  színét tehát az egymás fölötti bitek kombinációja adja meg.  Ez a
bináris kód egy 0-31 közötti szám, ami egy színregisztert határoz meg.  Ezt
a  képpontszínezést  indirekt  eljárásnak  is  nevezik.   Az Amiga 32 szín-
regisztere  a  felhasználó által kiválasztott színt tárolja (az összes 4096
lehetséges szín közül).

A  2-es ábra azt mutatja, hogy az 5 bittérképes üzemmódban hogyan határozza
meg a rendszer egy képpont színét.

A magasabb számú bittérkép adja a magasabb helyiértékű számjegyet a bináris
számban.  Ezt  mutatja  a következô ábra is, a képpont értékének bal szélsô
számjegyét a legnagyobb számú bittérkép határozza meg.

              1       1       0       0       5-ös bittérkép
              1       0       1       0       4-es bittérkép
              1       0       0       1       3-as bittérkép
              0       1       1       1       2-es bittérkép
              0       0       1       0       1-es bittérkép

     érték:  28      18      11       6

     szín: COLOR28 COLOR18 COLOR11  COLOR06

Lehetôség  van  2  különálló  képernyôt  létrehozni,  melyek  mindegyike  3
bittérképes.   Így  mindegyik nyolc színű lehet.  Ezt hívják Dual-Playfield
(kétképernyôs) üzemmódnak.


Az alapkép formálása
--------------------

Az  elinduláshoz  ad segítséget ez a rész; hogyan kell a hardverregiszterek
címzésével  meghatározni  a  képernyô  ablakát,  méretét.   A  méret itt az
aktuális megjelenítô ablakra vontakozik.

A képernyô definiálásánál szükség van az alábbi jellemvonásokra:

- A  képemzô  magassága  és szélessége;  a megjelenítô ablak mérete (ez azt
  jelenti, mennyi látszódjon a képmezôbôl a képernyôn).
- A képpontok színe.
- Vízszintes felbontás (kis vagy nagy felbontás).
- Függôleges felbontás (interlace vagy non-interlace).
- Fetch és modulo értékek, melyek közlik a rendszerrel, mennyi adat van egy
  vízszintes sorban (modulo),  és  honnan  kezdve vegye a képmezô adatait a
  memóriából (fetch).

Összegezve,  le  kell  foglalni egy memóriarészt, hogy ide lehessen tenni a
képmezô adatait, be kell állítani a mutatókat, hogy a rendszer megtalálja a
képmezôt,  és  (szükség esetén) írni kell egy copperlistát,  amely kezeli a
képmezôt.


A képmezô magassága és szélessége
---------------------------------

Egy  olyan  képmezô elôállításához, amelynek azonos a mérete a képernyôvel,
320  vagy  640  pixel  szélességűnek  kell  lennie, a felbontástól függôen.
Ekkor a magasságnak 200-nak vagy 400-nak kell lennie attól függôen, hogy az
üzemmód interlace vagy nem.


Bittérképek és a szín
---------------------

A képmezô színét a következôk határozzák meg:

1. A színek számának eldöntése.
2. A színregiszterek feltöltése.
3. Memóriafoglalás a bittérképeknek, és a mutatók rájuk állítása.
4. Minden bit beállítása, amely megadja a pixelek színét.

A következô táblázat azt mutatja, hogy x színhez hány bittérkép kell.

                       Színek száma    Bittérképek száma

                            1- 2              1
                            3- 4              2
                            5- 8              3
                            9-16              4
                           17-32              5

A színtáblázat
--------------

A  színtáblázat  32  regiszterbôl  áll, amelyek mindegyikébe különbözô szín
tölthetô.  Itt egy sűrített lista található a színtáblázatról.

                Regiszter        Méret          Jelentés

                 COLOR00         12 bit     Keret és háttérszín
                 COLOR01         12 bit          1-es szín
                 COLOR02         12 bit          2-es szín
                    .
                    .
                 COLOR31         12 bit         31-es szín

A  COLOR00 mindig a háttérnek fenntartott szín.  Ahol nincs semmilyen tárgy
a képen, ott ez a szín fog látszódni.  Ha ablak is meg van határozva, akkor
a keret szintén ez lesz.

Ha  Genlock  áramkör tölt be képet kameráról, VCR-rôl vagy lézerlemezrôl, a
háttérszínt a bejövô kép fogja meghatározni.

A  32  színregiszter  mindegyike 4096 színt képes definiálni 12 biten.  Ezt
mutatja a következô ábra.

                          Bitek            Funkció

                          15-12            semmi
                          11- 8            vörös
                           7- 4            zöld
                           3- 0            kék

A  következô táblázat a gyakoribb színek bit értékét mutatja be.  A fejezet
végén egy bôvebb lista található.

                       Színregiszter    Eredményezett
                         tartalma           szín

                           $FFF          fehér
                           $6FE          égszínkék
                           $DB9          sárgásbarna
                           $000          fekete

Néhány konkrét példa a színregiszterek feltöltésére:

        LEA     COLOR00, A0     ; a 0-ás színregiszter címe A0-ba
        MOVE.W  #$FFF,(A0)      ; fehér szín a 0-ás színregiszterbe
        MOVE.W  #$6FE,2(A0)     ; égszínkék az 1-es színregiszterbe

Megjegyezzük,  hogy  a  színregiszterek  csak  írhatók.  Tartalmukat csak a
képernyôt  nézve  lehet  kitalálni.   Egy bevett szokás ezekkel és más csak
írható  regiszterekkel  kapcsolatban,  hogy  érdemes  beírásukkor készíteni
róluk  egy másolatot a RAM-ba.  Amikor ezeket a regisztereket írjuk, mindig
a  RAM-ban  levô megfelelôjüket is újra kell írni.  Aki így tesz, az mindig
ellenôrízni tudja a regiszterek értékét.


A bittérképek számának kijelölése
---------------------------------

Miután  megvan, hogy hány színre van szükség, és ehhez hány bittérkép szük-
séges, akkor közölni kell a rendszerrel, hogy hány bittérképet használjon a
kép megjelenítéséhez.

A  bittérképek  számát a  BPLCON0  (bittérkép  vezérlô 0-ás regiszter) nevű
regiszterbe kell írni.  Az itt fontos bitek a következôk:  14-edik, 13-adik
és  12-edik.   Ezek neve:  BPU2, BPU1, BPU0.  A következô ábra azt mutatja,
hogyan határozza meg a rendszer a bittérképek számát.

                            Bittérképek     Bittérképek
                    Érték      száma            neve

                     000      nulla (*)
                     001         1           PLANES1
                     010         2           PLANES1-2
                     011         3           PLANES1-3
                     100         4           PLANES1-4
                     101         5           PLANES1-5
                     110         6 (**)      PLANES1-6
                     111      nem használható

(*)   Csak a háttér színe látszik

(**)  Hat  bittérkép  Dual-Playfield,  HAM vagy Extra-Halfbright üzemmódban
      használható, ezek leírása késôbb lesz.

Megjegyzés:   a  BPLCON0 regiszter bitjei nem függetlenek egymástól.  Ha át
kell írni egy bitet, akkor a többit is át kell írni.


A  következô  példa azt mutatja,  hogyan kell kisfelbontású két bittérképes
képet beállítani.

BPLCON0 EQU     $DFF100                 ; a BPLCON0 címe
        MOVE.W  #$2200,BPLCON0          ; $2200 a BPLCON0-ba

Mivel a BPLCON0 az ábrázolás más paramétereit is beállítja, és a bitjei nem
függetlenek  egymástól,  ezért a példában más paramétereket is átírtunk (az
összes paramétert a fejezetben még tárgyaljuk):

- HAM kikapcsolva
- Egy képmezôs mód bekapcsolva
- Összetett színre is képes
- Genlock kikapcsolva
- Fényceruza nincs
- No-lace üzemmód
- Külsô szinkronizáció nincs


Vízszintes és függôleges felbontás
----------------------------------

Az  otthoni  TV képernyô a kisfelbontású képekre a legalkalmasabb.  Kisfel-
bontás  mellett  a  képernyô 320 pixel széles.  Nagyfelbontású monochrom és
RGB  monitorok  alkalmasak  nagyfelbontású  képek  megjelenítésére, melyben
vízszintesen  640  képpont  van.   Egy  kisfelbontású képtárgyat fele olyan
szélesen látjuk, ha nagyfelbontásban ábrázoljuk.

A vízszintes felbontást a BPLCON0 regiszter 15. bitje határozza meg.

                         nagyfelbontás: 15. bit 1
                         kisfelbontás : 15. bit 0

Megjegyezzük,  hogy nagyfelbontással maximum négy bittérképet, így 16 színt
használhatunk.

Interlace  üzemmódban  kétszer  annyi vízszintes sor van, mint no-lace-ban.
Általában  a normál (no-lace) üzemmódban 200 a függôleges felbontás, mely a
teljes  kép függôleges mérete.  Lace üzemmódban 400 vízszintes sorból áll a
képernyô.   Ebben az üzemmódban kétszer akkora az adatterület, mint no-lace
módban.

Lace  módban  a  letapogató  áramkör mindig a másik területrôl olvassa le a
videovonalakat.  Ez látható a 3-as ábrán.

Az interlace üzemmód egy precíz munkát kíván a regiszterek állításánál (ezt
még  késôbb is meglátjuk), és finom beállításokat követel a grafikus effek-
tusok  elôállításánál.   A  4-es ábra a no-lace és a lace közti különbséget
mutatja.  A lace üzemmód bekapcsolásával a legtöbb szaggatottság és lépcsô-
zetesség megszüntethetô.

Amikor  a  blitter  DMA-t  használjuk  vonalhúzásra  és  sokszögrajzolásra
interlace üzemmódban, akkor a képmezônek csak az egyik felét fogja kezelni,
de így is elérhetô a sima vonalak rajzolása.

Az interlace üzemmódot bekapcsolni a BPLCON0 regiszter 2. bitjével lehet.

                          Lace üzemmód: 2. bit 1
                          No-lace mód : 2. bit 0

A  következô pálda azt mutatja, hogyan lehet nagyfelbontású interlace képet
meghatározni.

BPLCON0 EQU     $DFF100                 ; a cím beállítása
        MOVE.W  #$A204,BPLCON0          ; $A204 beírása

A példa még a következô paramétereket állítja be:

- Nagyfelbontás bekapcsolva
- Egyképernyôs üzem
- Összetett video szín lehet
- Genlock kikapcsolva
- Fényceruza nincs
- Inerace mód bekapcsolva
- Külsô szinkronizálás nincs

A  memória egy részét bittérképek részére le kell foglalni.  Attól függôen,
hogy  milyen  felbontást  és  lace/no-lace  üzemmódot kapcsolunk be, kell a
megfelelô méretű memóriát lefoglalni.


Memóriafoglalás a bittérképek számára
-------------------------------------

A  memória  lefoglalását akkor lehet elkezdeni, amikor már ki van jelölve a
bittérképek  száma,  és  ki van kötve a használható felbontás.  A bittérkép
egymást  követô szavakat (16 bites egység) tartalmaz, amelyek a képet hatá-
rozzák meg.  A memória lefoglalásához a mutatókat a bittérképek kezdôcímére
kell  állítani. A bittérkép kezdôcíme a képmezô bal fels sarkának megfelelô
szó címe.

A  következô  táblázat  azt  mutatja,  hogy  az  egyes alapképekhez mekkora
memória  szükséges.   Mindig  mérlegelni  kell, hogy melyiket használjuk, a
szabad memóriától függôen.

                 Képméret          Mód          Méret byte-ban

                 320*200       kisfelbontás           8000
                                 no-lace

                 320*400       kisfelbontás          16000
                                  lace

                 640*200       nagyfelbontás         16000
                                 no-lace

                 640*400       nagyfelbontás         32000
                                  lace

Kisfelbontásban,  normál  üzemmódban  a  képernyô  mérete  320*200 képpont.
Egy-egy vízszintes vonal 40 byte-ot foglal el (320 osztva 8-cal az 40).

Ebben  az üzemmódban két bittérkép (4 szín) már 16000 byte-ot foglal el.  A
memóriában a bittérképnek folytonosnak kell lennie, ezért kell, hogy legyen
a  memóriában  két 8000 byte-os szabad blokk.  A következô ábra azt mutatja
be,  hogy  a 8000 byte-os memóriaterület hogyan szervezôdik a képernyôn 200
darab 40 byte-os vonallá, és egy bit hol helyezkedik el a képernyôn.

                     ******** ---->---->----> ********
                     cím=N                    cím=N+38
                     ******** ---->---->----> ********
                     cím=N+40                 cím=N+78
                                     .
                                     .
                     ******** ---->---->----> ********
                     cím=N+7960               cím=N+7998

Egy  bittérkép  kezdôcímét  két regiszter segítségével kell megadni.  Ezek:
BPLxPTH  és a BPLxPTL (összesen 12 ilyen regiszter van).  Az 'x' jelentése,
hogy melyik bittérképhez tartozik (értéke 1-6).  Így a BPL1PTH és a BPL1PTL
az  1-es bittérkép kezdôcímét tartalmazza.  Rendszerint a regiszterpárok 19
biten  tárolják  a  mutatókat.   Ezt  a  regiszterpárt  a  68000  32  bites
regiszterként  kezeli, és így együtt átírhatók egy hosszúszós címzéssel.  A
hosszúszót a PTH-ba kell egy utasítással írni.

A  következô  példa bemutatja egy bittérkép mutatóinak beállítását.  Felté-
telezzük,  hogy két bittérkép van, $21000 és $25000 címeken, és a BPL1PT és
BPL2PT  regisztereket  írjuk  át.  Megjegyezzük, hogy ez általában a Copper
feladata.

BPL1PTH EQU     $DFF0E0                 ; 1. mutató felsô 3 bitje
BPL1PTL EQU     $DFF0E2                 ; alsó 15 bit
BPL2PTH EQU     $DFF0E4                 ; 2. mutató felsô 3 bitje
BPL2PTL EQU     $DFF0E6                 ; alsó 15 bit

        MOVE.L  $21000,BPL1PTH          ; 1. mutató beírása
        MOVE.L  $25000,BPL2PTH          ; 2. mutató beírása

Megjegyzés:   a memória használható másra is, nemcsak a kép tárolására.  Ha
szükség  van  rá,  másik  képet  is lehet tárolni, vagy sprite-okat, zenét,
animációt és programokat.  Több kép tárolására még visszatérünk.


Bittérképek színezése
---------------------

A  színregiszterek  és  színkódok  beállítása akkor aktuális, ha már be van
állítva a bittérképek száma, és a mutatók a térképre mutatnak.


Egy- és kétszínű kép
--------------------

Egy  egyszerű  képmezô  elôállításához  az  összes, amit tenni kell, hogy a
bittérképet  0-val  fel  kell  tölteni.  A következô példa egy kisfelbontás
képet tölt fel a háttér (00) színével.  A bittérkép $21000-nél kezdôdik, és
8000 byte hosszú.

        LEA     $21000,A0               ; a bittérképre mutat
        MOVE.W  #2000,D0                ; 2000 hosszúszó = 8000 byte
LOOP:   MOVE.L  #0,(A0)+                ; egy nulla kiírása
        SUBQ.W  #1,D0                   ; számláló csökkentése
        BNE     LOOP                    ; vissza, amíg nincs kész

Kétszínű képnél definiálni kell a háttérszínt a 0-ás és a használandó színt
az  1-es  színregiszterben.  A következô példa ugyanaz, mint az elôzô, csak
abban  különbözik,  hogy  a bittérképet 0-ák helyett FF00FF00-al tölti fel.
Így kétszínű képet kapunk.

        LEA     #$2100,A0               ; A0 a bittérképre mutat
        MOVE.W  #2000,D0                ; 2000 hosszúszó = 8000 byte
LOOP:   MOVE.L  #$FF00FF00,(A0)+        ; $FF00FF00 kiírása
        SUBQ.W  #1,D0                   ; visszaszámlálás
        BNE     LOOP                    ; vissza, amíg nincs vége


Kép három, vagy annál több színnel
----------------------------------

Ha  három vagy annál több színre van szükség, akkor egynél több bittérképet
kell  kezelni.   Az  eljárás,  amit  itt  leírunk, olyan, hogy minden pixel
színét  meg  kell  határozni  az adott helyen.  Ez egy kicsit bonyolultabb,
mint  egy bittérképnél (2 szín).  A következô példa egy 4 színű képet mutat
be, de az alapgondolat és az eljárás 32 színű képnél is ugyanez.

Mindkét  bittérképet  0-ákkal  és 1-ekkel kell feltölteni, úgy, hogy minden
pozíción a megfelelô szín legyen.

Az  alap  ábrázolásoknál ilyen módon öt bittérképet lehet használni, és így
32  szín  közül  választhatunk  minden  egyes  képpont esetén.  A kép szín-
választási  lehetôségeit  a fejezet végén levô összefoglalás térképezi fel,
illetve azt, hogy a bitkombinációk milyen színt eredményeznek.


Az ablak definiálása
--------------------

Miután  teljesen  definiáltuk  a bitmezôt, meg kell adnunk a képernyô ablak
méreteit, ami az aktuális látható kép mérete a képernyôn.  A képernyô ablak
beállítása  kihatással  van az egész képernyôre, magába foglalva a keretet,
és  a  sprite-okat  is.   A  definiált  ablakon  kívül  nem lehet tárgyakat
megjeleníteni.  Az ablak méretétôl függ a keret mérete is a képmezô körül.

Az  alap  képmezô,  amit  itt  részletezünk,  azonos  a  képernyôvel, és az
ablakkal.   Ez azonban nem mindig van így.  Gyakran az ablak kisebb, mint a
nagy  kép,  vagyis a képmezô, ami a memóriában definiálva van.  Ha az ablak
kisebb,  mint  a képmezô, akkor a rendszer a teljes kép egy részét jeleníti
csak meg, így lehet scrolloztatni is.  Ezenkívül az ablak lehet nagyobb is,
mint  a  képmezô.   Ezeket a méretbeli különbségeket egy késôbbi fejezetben
részletezzük.

Az ablak méretének definiálásakor az ablak kezdôpontjának és végpontjának a
vízszintes és függôleges pozícióját kell a megfelelô regiszterekbe írni.  A
függôleges  pozíciókat  raszterekben  kell megadni, a vízszintes pozíciókat
pedig  kis  felbontású  pixel  méretében.   A képernyôn minden pozíció meg-
határoz  egy  pixelt,  és  minden pixelnek van egy X és egy Y koordinátája.
Ebben  a  leírásban  ezeket  a  koordinátákat  így  jelöljük:   (X,Y).   A
koordináta-rendszer a  (0,0)  ponttal  kezdôdik,  ami  a képernyô bal felsô
sarka.  Általában az elsô vízszintes pozíció, amit használni szoktak a $81,
az  elsô  függôleges  pozíció  pedig a $2C.  A hardver lehetôséget ad, hogy
ennél  hamarabb  kezdôdjön  a  kép,  de  ilyenkor  egyes  részek nem mindig
láthatók  a  TV-n.   Az  itt  megadott ($81,$2C) kezdôpozíció egy általában
használható érték.  A pásztázó sugár azért pásztáz végig nagyobb területet,
mint  amit  látunk,  hogy  a  képernyô  szélén  fellépô torzulást lehetôleg
elkerüljük.   A  ($81,$2C) kezdôpozíció egy normál méretű képernyôt határoz
meg  középen és egy nyolc pixeles keretet hagy maga körül.  A 6-os ábra azt
mutatja,  hogy  milyen  a  kapcsolat  az  ablak,  a  látható  terület, és a
pásztázási terület között.


Az ablak kezdôpontjának beállítása
----------------------------------

A  legtöbb  TV  képernyô  középsô, torzításmentes része kezdôpontjának víz-
szintes  pozíciója  $81, függôleges pozíciója $2C.  A kezdôpont koordinátái
nagyfelbontás  és interlace  üzemmód  esetén sem változnak.  A kezdôpozíció
mindig  független  a  felbontástól.   Más  szóval:   a kezdôpozíciót mindig
kisfelbontású és no-lace pixelben kell megadni.

A  DIWSTRT  regiszter  vezérli  az  ablak kezdôpontját.  A regiszter magába
foglalja  a  kezdôpozíció  vízszintes  és függôleges koordinátáit is.  Ezek
elnevezése:  HSTART (vízszintes) és VSTART (függôleges).  A következô példa
a  DIWSTRT-ot beállítja egy alap képernyônek megfelelôen.  Az VSTART értéke
$2C és a HSTART értéke $81 lesz.

DIWSTRT EQU     $DFF08E                 ; a cím beállítása
        MOVE.W  #$2C81,DIWSTRT          ; az érték beírása


Az ablak végpontjának beállítása
--------------------------------

Az eddigieken  kívül  még be kell állítani az ablak végpontjának (jobb alsó
sarok) pozícióját.  A végpont koordinátáit a nagyfelbontás, és az interlace
üzemmód  sem  változtatja  meg.   Ugyanúgy  mint  a kezdôpontnál, a végpont
koordinátái is függetlenek a felbontástól.

A  DIWSTOP regiszter az ablak végpontjának pozícióját vezérli.  A regiszter
a vízszintes és a függôleges pozíciót is tartalmazza.  Az egyes komponensek
neve:   VSTOP  (függôleges)  és  HSTOP (vízszintes).  A következô példa azt
mutatja,  hogy  a  HSTOP és VSTOP értékét hogyan kell a DIWSTOP regiszterbe
írni, elfogadva, hogy a kezdôpozíció ($81,$2C).  Megjegyezzük, hogy a HSTOP
értékbôl beírás elôtt 256 ($100)-ot le kell vonni.  A HSTOP értéke $1C1, de
a DIWSTOP regiszterbe $C1-et kell írni.

Az  VSTOP  értékét úgy  kell beírni, hogy a stop pozíció MSB-je a következô
MSB  komplemense  (MSB = a legmagasabb helyiértékű bit).  Így lehet 256-nál
nagyobb számot tárolni 8 biten.  Általában az VSTOP értéke $F4.

A normál DIWSTRT: ($2C81), a normál DIWSTOP: ($F4C1).

A következô példa beállítja a DIWSTOP-ot normál értékre.

DIWSTOP EQU     $DFFf090
        MOVE.W  #$F4C1,DIWSTOP


A rendszer adatkezelése
-----------------------

Miután megadtuk az ablak pozícióját és méretét, meg kell adni a rendszernek
egy  kezdôpozíciót, amitôl kezdve fogja az adatokat megjeleníteni.  Ehhez a
DDFSTRT  regiszterbe  kell  írni  azt  a  vízszintes  koordinátát, amelytôl
kezdôdik  mindegyik  képvonal.   A  DDFSTRT regiszterbe írandó pozíciókat 4
pixeles  egységekben  kell  megadni  (nem úgy, mint a DIWSTRT-ben).  Minden
pozíció közt 4 pixel van.  Így a 0-ás pixel a 0-ás pozíció, a 4-es pixel az
1-es pozíció.

A  DDFSTRT és a DIWSTRT pozíciói hatnak egymásra.  Ajánlott, hogy a DDFSTRT
regisztert  16  pixeles felbontásban használjuk.  A hardvernek szüksége van
egy kis idôre az elsô adat kivétele után, mielôtt azt kijelezné.  Ez az oka
annak,  hogy  különbség  van az ablak kezdete és a kijelzés kezdete között.
Kisfelbontás esetén a különbség 8.5, nagyfelbontás esetén 4.5 óraciklus.

Normál  esetben  (kisfelbontás)  a  DDFSTRT értéke ($0038).  Normál esetben
(nagyfelbontás)  a  DDFSTRT  értéke  ($003C).   Ezt  a két értéket a követ-
kezôképpen kaptuk:
                             ($81/2-8.5)=($38)
                             ($81/2-4.5)=($3c)

A DDFSTRT és a DDFSTOP közötti kapcsolat:

           DDFSTRT=DDFSTOP-(8*(szószám-1))  kisfelbontás esetén
           DDFSTRT=DDFSTOP-(8*(szószám-2))  nagyfelbontás esetén

Normál  esetben  kisfelbontásnál  a  DDFSTOP  értéke ($00D0), nagyfelbontás
esetén ($00D4).

A következô példa egy alapkép adatait állítja be:

DDFSTRT EQU     $DFF092
DDFSTOP EQU     $DFFf094
        MOVE.W  #$0038,DDFSTRT
        MOVE.W  #$00d0,DDFSTOP

A  rendszerrel  közölni  kell,  hogy  milyen  hosszú egy vízszintes vonal a
képernyôn.   Ezt  a  moduló értékével kell beállítani.  A moduló értéke azt
adja meg, hogy hány byte van egy vízszintes sor utolsó szava és a következô
sor  elsô  szava  között.   A moduló képessé teszi a rendszert arra, hogy a
bittérkép  adatait  vonalakra ossza, így egy derékszögű koordinátarendszert
hoz  létre.   Alap  ábrázolásnál  a  moduló értéke 0 azért, mert a memória-
terület teljesen magába foglalja az ábrázolandó képet. A következô két ábra
egy  alap  bittérképet  mutat  be  és  azt, hogyan helyezi el a rendszer az
adatokat.

A  bittérkép-címmutatóval  (BPLxPTH  és  BPLxPTL) történik az adatátvitel a
képernyôre.   Ez a mutató dinamikus.  Amikor egy adat átvitele megkezdôdik,
a  mutató  folyamatosan  növekszik.   Így a következô átviendô adatra mutat
(két  byte  átvitele  történik  egyszerre).   Amikor  a  vonalvége feltétel
teljesül  (melyet  a DDFSTOP regiszterben tároltunk) a moduló hozzáadódik a
mutatóhoz,  vagyis  a  mutatók  a  következô  vonal  elsô  byte-jára fognak
mutatni.

Az elsô sor adatai:

Cím:         START       START+2      START+4   ...   START+38

           bal szélsô   következô    következô         utolsó
            adatszó      adatszó      adatszó          adatszó

Miután az elsô vonalat megjelenítette, akkor a bittérkép-mutató (BPLxPTH és
BPLxPTL)  értéke START+40.  Ekkor a moduló (ami 0) hozzáadódik a mutatóhoz,
tehát amikor a következô sor megjelenítése megkezdôdik, a mutató valóban az
általunk  meghatározott  adatra  fog  mutatni.   A  következô  sor adatai a
START+40 címen kezdôdnek.

A második sor adatai:

Cím:        START+40     START+42     START+44  ...   START+78

           bal szélsô   következô    következô         utolsó
            adatszó      adatszó      adatszó          adatszó

Megjegyezzük,  hogy a mutató mindig páros címet tartalmaz, mert az adatokat
mindig szavanként veszi ki a memóriából.

Két különbözô moduló van:  a BPL1MOD a páratlan bittérképeknek, a BPL2MOD a
páros bittérképeknek.

A  következô  példa  beállítja a modulót 0-ra kisfelbontású képen, ahol egy
bittérképet használ.  A bittérkép páratlan sorszámú.

BPL1MOD EQU     $DFF108
        MOVE.W  #0,BPL1MOD


Adatvétel nagyfelbontásban
--------------------------

Amikor nagyfelbontású képet használunk, egy sor megjelenítéséhez 80 byte-ot
kell felhasználni a 40 helyett.


A moduló interlace üzemmódban
-----------------------------

Interlace üzemmódban mindig újra kell definiálni a modulót, mert ilyenkor a
teljes  kép  két  különálló  részre szakad.  Az elsô képfrissítéskor csak a
páratlan  számú  sorok  jelennek  meg,  a második frissítéskor pedig csak a
páros számú sorok.

A  teljes  képernyô  bittérképei  400  sort tartalmaznak 200 helyett.  Fel-
tételezve,  hogy  a kép szélessége 320 pixel, egy lace üzemmódú kép sorai a
következô címekkel kezdôdnek:

                             1.sor : START
                             2.sor : START+40
                             3.sor : START+80
                             4.sor : START+120

és  így  tovább.  Ezért a modulót 40-re kell állítani, hogy a másik képmezô
adatait  átlépjük.   Páratlan mezôk esetén a mutató a START-on, páros mezôk
esetén a START+40-en kezdôdik.

Interlace üzemmódban a mutatók újraírását a copperre bízhatjuk.


A kép megjelenítése
-------------------

A  kép  megjelenítéséhez  a  bittérkép  mutatóit  be  kell  állítani,  és a
bittérkép  DMA-t  be  kell  kapcsolni.   A  DMA-t  a DMACON regiszter BPLEN
bitjének  1-re  írásával kapcsolhatjuk be.  a 7.  fejezetben részletesen le
van írva, hogy ezt a regisztert hogyan kell átírni.

Minden  képfrissítéskor  a mutatókat újra be kell állítani.  Ez az újraírás
azért  szükséges,  mert  a  mutató  a kijelzés közben növekszik a kijelzett
adatoknak  megfelelôen,  és  a következô frissítés kezdetére újra az adatok
elejére  kell,  hogy  mutasson. Ezt az újraírást általában a Copperre lehet
bízni.


Színes képmegjelenítés
----------------------

A  színes megjelenítés engedélyezéséhez kapcsoljuk a BPLCON0 regiszter 9-es
bitjét  1-re.   Ez  engedélyezi a composite videomonitor színes képmegjele-
nítését, az RGB monitorra nincs hatással.


Összefoglalás
-------------

Az alapkép megjelenítésének lépései:

1. A képmezô méretének definiálása
   a. A magasság megadása sorokban
        - 200 maximum no-lace módban
        - 400 maximum lace módban
   b. A szélesség megadása pixelben
        - 320 maximum kisfelbontásban
        - 640 maximum nagyfelbontásban
   c. A képpontok színének meghatározása
        - a színregiszterek feltöltése
        - a pixelek bitmintájának beállítása
        - a bittérképek felépítése
        - a bittérkép regisztereinek beállítása:
           - a bittérépek száma: BPLCON0 regiszter 12-14 bitjei
           - a bittérkép kezdôcíme: BPLxPTH (hosszúszó)
   d. A felbontás mértékének meghatározása
        - kisfelbontás
           - 320 pixel soronként
           - BPLCON0 regiszter 15-ös bitje = 0
        - nagyfelbontás
           - 640 pixel soronként
           - BPLCON0 regiszter 15-ös bitje = 1
   e. Lace/no-lace meghatározása
        - interlace üzemmód:
           - 400 sor
           - BPLCON0 regiszter 2-es bitje = 1
        - non-interlace üzemmód
           - 200 sor
           - BPLCON0 regiszter 2-es bitje = 0

2. Memóriafoglalás. A szükséges byte-ok száma:

     (soronkénti byte-ok száma) * (sorok száma) * (bittérképek száma)

3: A megjelenítô ablak méretének meghatározása:
   a. Az ablak kezdôpozíciója a DIWSTRT regiszterben:
        - vízszintes pozícíó a 0-7 bitekre (alacsony rész)
        - függôleges pozíció a 8-15 bitekre (magas rész)
   b. Az ablak végpozíciója a DIWSTOP regiszterben:
        - vízszintes pozíció a 0-7 bitekre
        - függôleges pozíció a 8-15 bitekre

4: Az adatvételezés kezdetének és végének beállítása:
   a. ugyanúgy, mint (3)-ban a DDFSTRT regiszterben
   b. ugyanúgy, mint (3)-ban a DDFSTOP regiszterben

5: A moduló beírása a BPL1MOD és a BPL2MOD regiszterekbe

6: Egy copperlista írása az újramegjelenítés kezelésére

7: Színes kép engedélyezése a BPLCON0 regiszter 9-es bitjével


Példák egyszerű képmegjelenítésre
---------------------------------

A következô példák bemutatják, hogy hogyan kell a regisztereket beállítani,
és hogyan kell copperlistát írni különbözô képméretek esetén.

Az  elsô  példa  egy  320*200-as  képet  állít  be,  egy  bittérképpel, ami
$21000-nél kezdôdik.  A copperlista $20000-hez kerül.


CUSTOM  EQU     $DFF000
BPLCON0 EQU     $100
BPLCON1 EQU     $102
BPLCON2 EQU     $104
BPL1MOD EQU     $108
DDFSTRT EQU     $092
DDFSTOP EQU     $094
DIWSTRT EQU     $08E
DIWSTOP EQU     $090
VPOSR   EQU     $004
COLOR00 EQU     $180
COLOR01 EQU     $182
COLOR02 EQU     $184
COLOR03 EQU     $186
DMACON  EQU     $096
INTREQ  EQU     $09C
COP1LCH EQU     $080                    ; copper 1-es címregisztere
                                        ; (felsô 3 bit)
        LEA     CUSTOM,A0               ; A0-ban a regiszterek kezdôcíme
        MOVE.W  #$1200,BPLCON0(A0)      ; egy bittérkép, színes kép
        MOVE.W  #0,BPLCON1(A0)          ; vízszintes scroll értéke 1
        MOVE.W  #0,BPL1MOD(A0)          ; a moduló értéke 0
        MOVE.W  #$0038,DDFSTRT(A0)      ; adatvételezés $38-nál kezdôdik
        MOVE.W  #$00D0,DDFSTOP(A0)      ; adatvételezés $D0-nál ér véget
        MOVE.W  #$2C81,DIWSTRT(A0)      ; a DIWSTRT értéke $2C81
        MOVE.W  #$F4C1,DIWSTOP(A0)      ; a DIWSTOP értéke $F4C1
        MOVE.W  #$0F00,COLOR00(A0)      ; a háttérszín piros
        MOVE.W  #$0FF0,COLOR01(A0)      ; az 1-es szín sárga
;
; a bittérkép feltöltése $FF00FF00-al, ez vonalakat hoz létre
;
        MOVE.L  #$21000,A1              ; A1 a bittérképre mutat
        MOVE.L  #$FF00FF00,D0           ; a bitminta, ami a képre kerül
        MOVE.W  #2000,D1                ; 2000 hosszúszó = 8000 byte
;
LOOP:   MOVE.L  D0,(A1)+                ; a hosszúszó beírása
        SUBQ.W  #1,D1                   ; a számláló csökkentése
        BNE     LOOP                    ; vissza, amíg nincs kész
;
; a copperlista beállítása $200000-hez
;
        MOVE.L  #$20000,A1              ; A1 a célra mutat
        LEA     COPPERL,A2              ; A2 a forrásra mutat
CLOOP:  MOVE.L  (A2),(A1)+              ; egy hosszúszó mozgatása
        CMPI.L  #$FFFFFFFE,(A2)+        ; az utolsó hosszúszó ellenôrzése
        BNE     CLOOP                   ; vissza, amíg nincs kész
;
; a Copper beállítása a copperlistára
;
        MOVE.L  #$20000,COP1LCH(A0)     ; a copper címregisztere
        MOVE.W  COPJMP1(A0),D0
;
; DMA beállítása
;
        MOVE.L  #$8380,DMACON(A0)       ; bittérkép és copper DMA be
        BRA     ...                     ; ugrás a következô feladatra
;
; a copperlista adatai
;
        DC.W    $00E0,$0002             ; MOVE $0002 a $0E0 címre (BPL1PTH)
        DC.W    $00E2,$1000             ; MOVE $1000 a $0E2 címre (BPL1PTL)
        DC.W    $FFFF,$FFFE             ; END COPPER LIST


A  következô  példa  egy  nagyfelbontású,  interlace  képet kapcsol be, egy
bittérképpel.   A  szimbólumok azonosak az elôzô példában szereplôkkel, így
ezeket itt már nem ismételjük.

        LEA     CUSTOM,A0               ; a regiszterek kezdôcíme
        MOVE.W  #$9204,BPLCON0(A0)      ; hires, egy bittérkép, lace
        MOVE.W  #0,BPLCON1(A0)          ; vízszintes scroll értéke 0
        MOVE.W  #80,BPL1MOD(A0)         ; moduló=80 (páratlan bittérképek)
        MOVE.W  #80,BPL2MOD(A0)         ; moduló=80 (páros bittérképek)
        MOVE.W  #$003C,DDFSTRT(A0)      ; adatvételezés kezdete
        MOVE.W  #$00D4,DDFSTOP(A0)      ; adatvételezés vége
        MOVE.W  #$2C81,DIWSTRT(A0)      ; ablak kezdete
        MOVE.W  #$F4C1,DIWSTOP(A0)      ; ablak vége
;
; színregiszterek beállítása
;
        MOVE.W  #$000F,COLOR00(A0)      ; háttérszín kék
        MOVE.W  #$0FFF,COLOR01(A0)      ; elôtér fehér
;
; a bittérkép beállítása $20000-ra
;
        LEA     $20000,A1               ; A1 a bittérképre mutat
        LEA     CHARLIST,A2             ; A2 a karakteradatokra mutat
        MOVE.W  #400,D1                 ; 400 sornyi adatmásolás
        MOVE.W  #20,D0                  ; soronként 20 hosszúszó
L1:
        MOVE.L  (A2),(A1)+              ; egy hosszúszó másolása
        SUBQ.W  #1,D0                   ; a számláló csökkentése
        BNE     L1                      ; vissza, amig a sor nincs kész
;
        MOVE.W  #20,D0                  ; a számláló visszaállítása
        ADDQ.L  #4,A2                   ; a következô szóra mutat
        CMPI.L  #$FFFFFFFF,(A2)         ; vége az adatoknak?
        BNE     L2
        LEA     CHARLIST,A2             ; igen, A2 visszaállítása
L2:
        SUBQ.W  #1,D1                   ; sorszámláló csökkentése
        BNE     L1                      ; vissza, amíg minden sor elkészül
;
; DMA indítás
;
        MOVE.W  #$8300,DMACON(A0)       ; csak bittérkép DMA engedélyezése

Mivel ez  a  példa  nem copperlistát használ, ezért szükség van a következô
programrészletre.   Ez  egy ciklus, ami az üres intervallumra vár, és ekkor
kiolvassa  a  VPOSR  regiszter  LOF   bitjét  és  ennek  értékétôl  függôen
$20000-re, vagy $20050-re állítja a bittérkép mutatóját.

VLOOP:  MOVE.W  INTREQ(A0),D0           ; megszakításkérelem olvasása
        AND.W   #$0020,D0               ; csak a szükséges bit marad
        BEQ     VLOOP                   ; vissza, a kép kijelzés alatt áll
        MOVE.W  #$0020,INTREQ(A0)       ; a megszakítás törlése
        MOVE.W  VPOSR(A0),D0            ; LOF kiolvasása
        BPL     VL1                     ; ugrik, ha LOF=0
        MOVE.L  #$20000,BPL1PTH(A0)     ; ha LOF=1, a mutató $20000
        BRA     VLOOP                   ; az egész elölrôl
VL1:
        MOVE.L  #$20050,BPL1PTH(A0)     ; ha LOF=0, a mutató $20050
        BRA     VLOOP                   ; az egész elölrôl
;
; a karakteradatok
;
CHARLIST:
        DC.L    $18FC3DF0,$3C6666D8,$3C66C0CC,$667CC0CC
        DC.L    $7E66C0CC,$C36666D8,$C3FC3DF0,$00000000
        DC.L    $FFFFFFFF


A Dual-Playfield üzemmód
------------------------

A  háttér tervezésében nagy könnyebbséget jelent az, hogy lehetôség van két
képmezô  használatára  egy  helyett.   Dual-Playfield  üzemmódban  az egyik
képmezô  közvetlenül  a másik elôtt jelenik meg.  Például egy akciójátékban
az  egyik  képmezô  lehet  a háttér, a másik képmezô pedig egy vezérlôpult.
Mindkettôt  változtathatjuk  anélkül,  hogy  az  egész  képet kellene újra-
tervezni.  Ezenkívül mozgathatjuk a két képmezôt egymástól függetlenül.

A  Dual-Playfield  ábrázolás hasonló az egyszerű képhez, csupán a következô
pontokban tér el attól:

- Mindkét képmezô egy, kettô vagy három bittérképbôl áll.
- A képmezôk színei (maximum hét plusz háttérszín) függetlenek.
- Egy bitet be kell kapcsolni, hogy ez a lehetôség elôjöjjön.

A  7-es ábrán látható két képmezô mindegyikén a használható színek közül az
egyik átlátszó (0-ás szín az 1-es képmezôn, 8-as szín a 2-es képmezôn).  Az
egyes  képmezôkön  kiválasztott  átlátszó  pixel az alatta levô szín megje-
lenését teszi lehetôvé.

Dual-Playfield  üzemmódban  mindkét képmezô maximum három bittérképet hasz-
nálhat.   A  0-7  színregiszterek  tartoznak  az  1-es  képmezôhöz,  a 8-15
színregiszterek  pedig  a  2-es  képmezôhöz.   A  használatban levô színre-
giszterek számát a használt bittérképek száma határozza meg.


A bittérképek Dual-Playfield üzemmódban
---------------------------------------

A  három  páratlan  számú  bittérképet  (1,  3,  5) a hardver egy csoportba
rendezi.   Így  ezeket  használhatjuk  az  1-es képmezô meghatározására.  A
páros  számú  bittérképek  szintén egy csoportot alkotnak, ezek alakítják a
2-es  képmezôt.   A 8-as ábra bemutatja, hogy az egyes bittérképeket milyen
módon  kapcsolhatjuk  össze.   Megjegyezzük, hogy nagyfelbontás esetén kép-
mezônként  csak  maximum  két  bittérképet használhatunk, az 1-es és a 3-as
bittérképeket  az  1-es  képmezô,  a  2-es  és  a 4-es bittérképeket a 2-es
képmezô használhatja.


Színregiszterek Dual-Playfield módban
-------------------------------------

Ebben  az  üzemmódban  az  1-es  képmezô  színeit  az 1-es, 3-as és az 5-ös
bittérkép  kombinációja adja meg.  Míg az 5-ös bittérkép bitje a legnagyobb
helyiértékű,  addig  az  1-es  bittérkép  bitje  a  legkisebb  helyiértéket
határozza meg.  Így ezek a bitkombinációk az elsô nyolc színregiszter közül
választanak, amint az a következô táblázat alapján nyílvánvaló.

                               1-ES KÉPMEZÔ

                        bitkombináció  színregiszter

                              000       átlátszó
                              001       COLOR1
                              010       COLOR2
                              011       COLOR3
                              100       COLOR4
                              101       COLOR5
                              110       COLOR6
                              111       COLOR7

A  második  képmezô színeit a 2-es, a 4-es és a 6-os bittérképek határozzák
meg.   A  6-os  bittérkép  bitjei  a legmagasabb, a 2-es bittérkép bitjei a
legalacsonyabb  helyiértékű  biteket  adják  a  kiválasztott  színregiszter
meghatározásánál.   Ez  a  három bittérkép adja azokat a biteket, amelyek a
második  nyolc színregiszter közül választanak, amint az a következô táblá-
zatban is látszik.
                               2-ES KÉPMEZÔ

                        bitkombináció  színregiszter

                              000       átlátszó
                              001       COLOR9
                              010       COLOR10
                              011       COLOR11
                              100       COLOR12
                              101       COLOR13
                              110       COLOR14
                              111       COLOR15

A  000  bitkombináció  átlátszó  üzemmódot  kapcsol be, amely a kép mögötti
tárgyakat (másik képmezô, sprite vagy háttérszín) teszi láthatóvá.

A  következô  táblázat  a két képmezô színkiválasztását mutatja be nagyfel-
bontásban.
                               1-ES KÉPMEZÔ

                       bitkombináció   színregiszter

                              00        átlátszó
                              01        COLOR1
                              10        COLOR2
                              11        COLOR3


                               2-ES KÉPMEZÔ

                       bitkombináció   színregiszter

                              00        átlátszó
                              01        COLOR9
                              10        COLOR10
                              11        COLOR11


A képmezôk prioritása és vezérlése
----------------------------------

Mindkét  képmezônek  az 1-esnek vagy a 2-esnek is lehet prioritása.  Ez azt
jelenti,  hogy  egyik képmezô a másik elôtt áll.  A BPLCON2 regiszter 6-os,
PF2PRI  nevű bitje határozza meg a prioritást.  Ha a PF2PRI értéke 1, akkor
a 2-es képmezô van az 1-es fölött, ha az értéke 0, akkor fordítva.

Ezenkívül  a  képmezôk sprite-okhoz viszonyított prioritását is vezérelhet-
jük.  Ennek leírása a 7.  fejezetben található.

A két képmezô a következôkben különbözhet egymástól:

- Különbözô méretet vehetnek fel a memóriában.
- Egymástól függetlenül lehet scrolloztatni ôket.

Megjegyzés:   különös  figyelmet  igényel  az,  amikor  az  egyik  képmezôt
mozgatjuk  és  a  másikat  helyben  hagyjuk.  Ha egy kisfelbontású képmezôt
scrollozunk,   akkor  egy  szóval  többet  kell  kijelölni  adatvételezésre
(nagyfelbontás  esetén  kettôvel  többet  ).   Az adatvételezés kezdetét és
végét  a  mozgatandó  képmezônek  megfelelôen  kell  beállítani,  és  ehhez
igazítani  a  másik képmezôt.  A mozdulatlan képmezô mutatóját és modulóját
2-vel csökkenteni kell kisfelbontás esetén, és 4-gyel nagyfelbontás esetén.


A Dual-Playfield üzemmód aktivizálása
-------------------------------------

A  BPLCON0  regiszter 10-es, DBLPF nevű bitje kapcsolja be a Dual-Palyfield
üzemmódot.   Az  üzemmód  bekapcsolása  megváltoztatja  a  hardver  színvá-
lasztásának  módszerét,  és  a  scrollozási  lehetôségeket:   a  páros és a
páratlan bittérképek egy-egy csoportot alkotnak.


Összefoglalás
-------------

Egy  dupla  képmezôs  kép elôállításának lépései nagyjából hasonlítanak egy
normál kép elôállítására, csak a következô lépésekben térnek el:

-  Színek  betöltése  a  színregiszterekbe úgy, hogy az 1-7 színregiszterek
határozzák  meg  az  1-es  képmezô  színeit,  a 9-15 színregiszterek a 2-es
képmezô  színeit  (persze  csak akkor, ha mindkét képmezô három bittérképet
tartalmaz).

- A bittérképek felépítése.  Ne felejtsük el, hogy az 1-es képmezô az 1-es,
3-as, 5-ös; a 2-es képmezô a 2-es, 4-es, 6-os bittérképet használhatja.

-  A  moduló  beállítása.   Mindkét képmezônek külön moduló regisztere van,
mivel  a  páratlan  és  a  páros  bittérképekhez  más tartozik:  BPL1MOD és
BPL2MOD.

A következô lépések szükségesek:

-  A  prioritás beállítása.  Ha azt akarjuk, hogy a 2-es képmezô takarja az
1-es  képmezôt,  akkor  a  BPLCON2  regiszter 6-os bitjét (PF2PRI) állítsuk
1-re.

-  A  Dual-Playfield üzem aktivizálása.  Állítsuk a BPLCON0 regiszter 10-es
(DBLPF) bitjét 1-re.


Bittérképek és megjelenítô ablakok
----------------------------------

Azt már láttuk, hogy hogyan kell olyan képet elôállítani, ahol a kép mérete
a  memóriában megegyezik az ablak méreteivel.  Ez a fejezet azt mutatja be,
hogy  hogyan kell olyan képet definiálni, amikor a kép a memóriában nagyobb
területet  foglal  le,  mint  amekkora  az  ablakon  át látszik.  Ezenkívül
megtudhatjuk,  hogyan  kell a normál képmezônél kisebb vagy nagyobb ablakot
definiálni, és hogy kell a nagy képet a kis ablakban mozgatni.


Amikor a kép nagyobb, mint az ablak
-----------------------------------

Ha  a  memóriában az ablaknál nagyobb képet állítunk össze, akkor választa-
nunk kell, hogy melyik része kerüljön kijelzésre.  Ez a következôképpen tér
el az eddig látottaktól:

- Ha  a  kép  a  nagyobb  az ablaknál,  akkor be kell állítani a modulókat,
  melyek 0-tól különbözôek lesznek.
- Több memóriát kell lefoglalni a nagyobb képnek.


A moduló beállítása
-------------------

Mivel  a  kép  a  memóriában szélesebb, mint a megjelenítô ablak, ezért úgy
kell  beállítani a modulót, hogy minden sorban jó adat kerüljön kijelzésre.
Például  tegyük  fel, hogy az ablak 320 képpontos, tehát 40 byte-ot jelenít
meg  soronként.   A  kép  a memóriában legyen kétszer ilyen széles, 80 byte
soronként.   Tegyük  fel, hogy a kép bal felét szeretnénk megjeleníteni.  A
9-es  ábra  mutatja  a  kapcsolatot  a  nagy kép és a megjelenítendô félkép
között.

A megjelenítés az elsô sortól kezdôdik, és soronként 40 byte-ot jelenít meg
a rendszer; ezt mutatja a következô ábra.

Az elsô sor adatai:

Cím:          START       START+2      START+4   ...   START+38

            bal szélsô   következô    következô         utolsó
             adatszó      adatszó      adatszó          adatszó

A kép adatvételezése megáll, miután a sor utolsó adatszavát is feldolgozta.
Ezen  a  ponton  a  BPLxPTH  és a BPLxPTL a START+40 címre mutat.  A moduló
értéke  40,  ezt  kell  a címhez  hozzáadni,  hogy  a  következô  sor  elsô
adatszavát kapjuk.  A második sor adatvételezését a következô ábra mutatja.

A második sor adatai:

Cím:         START+80    START+82     START+84  ...   START+118

            bal szélsô   következô    következô         utolsó
             adatszó      adatszó      adatszó          adatszó

Ahhoz,  hogy  a  nagy  kép  jobb  felét  jelenítsük  meg,  át  kell  írni a
bittérképek mutatóit START+40-re, míg a moduló maradjon 40.  Ezt mutatja be
a következô két ábra.

Az elsô sor adatai:

Cím:         START+40    START+42     START+44   ...   START+78

            bal szélsô   következô    következô         utolsó
             adatszó      adatszó      adatszó          adatszó

Most  a  bittérkép mutatói START+80-at tartalmaznak.  A modulót (40) hozzá-
adjuk ehhez, és a következô sor elsô adatszavának címét kapjuk.

A második sor adatai:

Cím:        START+120    START+122    START+124   ...  START+158

            bal szélsô   következô    következô         utolsó
             adatszó      adatszó      adatszó          adatszó

Ne  felejtsük  el, hogy nagyfelbontásban kétszer annyi byte-ot kell feldol-
gozni soronként mint a kisfelbontásban ugyanakkora képméretnél.  Egy normál
méretű kép esetén 40 helyett 80-at.


Az adatvételezés meghatározása
------------------------------

Az  adatvételezést meghatározó regiszterek megadják az adatvételezés kezde-
tét és végét egy soron belül.  Ezen regiszterek beállítását a korábbi feje-
zetekben megtalálhatjuk.


Memóriafoglalás
---------------

Ha  nagyobb  képet  tárolunk,  akkor  ez  nagyobb  memóriát  foglal  le.  A
következô  képlet  megadja,  hogy  mekkora memóriát kell lefoglalni egy kép
számára.

        soronkénti byte-ok száma * sorok száma * bittérképek száma

Ha  az  elôzô  példában  a  kép  két  bittérképbôl  áll, akkor a számítás a
következô:

                         80 * 200 * 2 = 32000 byte

Figyelem,  ez  csak  a  kép memóriaszükséglete, ezen kívül még sprite-okra,
animációra, zenére és a programra is kell hagyni elég memóriát.


A megjelenítôablak kezdôpozíciója
---------------------------------

A  megjelenítôablak  kezdôpozícióját a bal felsô sarkának koordinátái hatá-
rozzák meg.  Egy regiszter, a DIWSTRT tartalmazza mind a vízszintes, mind a
függôleges  koordinátákat.  Nyolc bit határozza meg a vízszintes értékeket,
mely  0-255  között  vehet  fel  értéket.  A 0 a kép bal széle, és az érték
jobbra növekedik.  A kezdôpozíció ezen a tartományon bármit felvehet.

A  függôleges pozíciót is nyolc bit határozza meg.  Az egyes pozíciók fent-
rôl lefelé növekvô értéket kapnak.

Ne  felejtsük  el,  hogy  a  kezdôpozíciót  mindig  kisfelbontású,  no-lace
pixelekben kell számítani.  Ha lace képet állítunk össze, akkor az ablaknak
páros  számú  sort  kell  tartalmaznia, hogy a páros és a páratlan mezôknek
azonos méretük legyen.

A  megjelenítôablak  kezdôpozícióját  úgy állíthatjuk be, hogy a vízszintes
koordinátát a 0-7 bitekre, a függôleges koordinátát a 8-15 bitekre írjuk.


A végpozíció beállítása
-----------------------

A  végpozíció  az  ablak  jobb alsó sarkának koordinátáit tartalmazza.  Egy
regiszter,  a  DIWSTOP  tartalmazza  mindkét koordinátát.  Az elôzô fejeze-
tekben  megtalálható,  hogyan kell ezt a regisztert beállítani.  A pozíciót
mindig kisfelbontású, no-lace pixelben kell számolni.

A  megjelenítôablak  végpozícióját  úgy  állíthatjuk  be, hogy a vízszintes
koordinátát a 0-7 bitekre, a függôleges koordinátát a 8-15 bitekre írjuk.


A képernyôablak maximális mérete
--------------------------------

Az  ablak  maximális  méretét  a  maximális  sor  és  oszlop határozza meg.
Függôlegesen  a  megkötés  egyszerű.   Nem  szabad  adatkijelzést kívánni a
függôleges  üres  intervallumban.   Ez az intervallum a 0-ás sortól a 19-es
sorig  terjed,  ami összesen 20 sor.  Ez azt jelenti, hogy függôlegesen 242
soros lehet egy ablak, illetve 484, ha interlace üzemmód van.

Vízszintesen  a  helyzet  hasonló.   A  hardver határokat szab a balszélnek
(DDFSTRT>=$18)  és  a  jobbszélnek  (DDFSTOP<=$D8).   Ezek  szerint kisfel-
bontásban  maximum  25 szó, nagyfelbontásban 49 szó jeleníthetô meg raszte-
renként.   Azonban  a  vízszintes  üres  periódus  még  tovább  csökkenti a
használható  terület  méretét 376 kisfelbontású pixelre (23.5 szó).  Megje-
gyezzük,  hogy  ha az adatvételezés $38 elôtt kezdôdik, akkor néhány sprite
megsérülhet.


Képmezô mozgatása (scroll)
--------------------------

Egy  képmezôt  úgy  kell  mozgatni, hogy nagyobbra tervezzük, mint a képer-
nyôablak,  és  scrollozzuk.   Ha  a  kép  dupla  képmezôs,  akkor  az egyes
képmezôket külön is mozgathatjuk.

A  kép függôleges mozgatása egyszerű:  ehhez folyamatosan kell csökkenteni,
illetve  növelni  a  bittérképek  kezdôcímét  egy  sor méretével, így a kép
lefelé,  illetve  felfelé  fog  elmozdulni.   Ebbôl  látszik, hogy a teljes
képbôl  mindig  csak  egy  részt fogunk látni, ezért kell a képet nagyobbra
tervezni, mint az ablakot.

A  vízszintes  mozgatás  a  kép  jobbról  balra  vagy  balról  jobbra  való
mozgatását  jelenti.   A vízszintes mozgatás eltér a függôlegestôl.  Minden
sorban  egy szóval többet kell feldolgozni, mint amennyi a képernyôablakból
látszik, és az adatvételezés kezdetét kell késleltetni.

Mindkét  típusú  mozgatást  a  copperre  lehet  bízni  az  üres intervallum
idejére.


Függôleges mozgatás
-------------------

Ha  szükséges, hogy a képernyôablakban fel vagy le mozgassuk a képet, akkor
a következô eljárást érdemes használni.  A bittérkép mutatókat folyamatosan
állítsuk  kisebbre vagy nagyobbra.  Amikor a mutató értékét növeljük, akkor
a  kép  alsóbb  része  válik  láthatóvá,  tehát  a kép felfelé mozog.  Ha a
mutatókat  csökkentjük, a kép felsô része válik láthatóvá, így a kép lefelé
mozog.   Ha  a  kép  200  sorból áll, akkor a lépésköz a kép 1/200-ad része
lehet.   Interlace  üzemmódban a kép 1/400-ad részével lehet mozgatni, ha a
mutatókat  megfelelôen  kezeljük,  ez azonban elég körülményes, ezért ilyen
esetben is ajánlatos 1/200-as lépésközt alkalmazni.

Amikor  egy  bittérképet  függôlegesen akarunk mozgatni, akkor a képet elég
magasnak  kell  tervezni  ahhoz, hogy a mozgatás értelmezve legyen, és kell
egy program, ami a mutatók átírását végzi.

Tegyük  fel,  hogy  egy  képmezôt felfelé kell mozgatni soronként.  Ezt úgy
valósíthatjuk  meg,  hogy  mindegyik  képernyôfrissítéskor a mutató értékét
növeljük  annyivel, hogy elég legyen arra, hogy a következô sorra mutasson.
Normál  méretű  kisfelbontású  kép  esetén,  ha a moduló 0, akkor a növelés
mértéke 40 byte.


Vízszintes mozgatás
-------------------

Lehetôség  van  vízszintesen  balról  jobbra,  és  jobbról balra mozgatni a
képmezôt.   A  mozgatás  sebességét a késleltetéssel határozhatjuk meg.  Ha
vízszintes  mozgatást  alkalmazunk,  akkor  egy szóval szélesebb képet kell
tervezni,  mint  amekkora  a  megjelenítôablak.  Ez a plusz szó nem látszik
egészében  a  képernyôn,  helye az ablak bal szélétôl balra, közvetlenül az
ablak szélénél van.  A késleltetés azt jelenti, hogy a bitsor kijelzése nem
a  DDFSTRT  által  meghatározott  pozíción kezdôdik, hanem ezután annyival,
amennyi  a  késleltetés  értéke.   A  késleltetés  legkisebb  mértéke  egy
kisfelbontású  pixel  mértékének  felel meg.  Ha a késleltetést növeljük, a
kép  jobbra mozdul el.  A késleltetést használva maximum 15 pixellel tudjuk
a  képet  elmozdítani.   Ha  a  kép nagyfelbontású, akkor csak két pixellel
tudjuk  a  mozdításokat  elvégezni.  Megjegyezzük, ekkor nem elég egy plusz
szót  alkalmazni,  hanem  kettôt  kell.   A  11-edik ábra a plusz szót és a
scroll értékét mutatja be.

Megjegyezzük,  hogy  a  scrollozás  miatti  plusz egy szó is le fog tiltani
néhány sprite-ot.

Egy  képmezô  vízszintes  scrollozásának  beállításához a következôket kell
megtennünk:

- Elég  szélesre  kell tervezni a bittérképet, hogy a scroll megvalósítható
  legyen.
- Az  adatvételezés  elejét  a  plusz  szónak (szavaknak)  megfelelôen kell
  beállítani.
- A késleltetést be kell állítani.
- A modulót a plusz szónak (szavaknak) megfelelôen kell beállítani.
- Egy  copperlistát  kell  írni  úgy, hogy a kéleltetést mindig a megfelelô
  értékre állítsa.


Az adatvételezés beállítása
---------------------------

Az  adatvételezés kezdete normál (scroll nélküli) esetben $38.  Ha vízszin-
tes mozgatást  akarunk,  akkor  a plusz szó miatt a megjelenítést e pozíció
elôtt egy szóval kell kezdeni, vagyis ilyenkor a  DDFSTRT-be kerüljön $0030.
Sajnos  ez esetben a 7-es sprite nem használható a DMA-k ütközése miatt.  A
DDFSTOP értéke maradhat úgy, mint normál esetben.  Ne felejtsük el, hogy az
adatvételezés kezdete mindkét képmezôre azonos értéket határoz meg.


A moduló beállítása
-------------------

Mint  mindig,  a  moduló  kettôvel  kevesebb, mint az egyik sor utolsó és a
következô  sor  elsô szava címének különbsége.  Legyen a következô a példa:
a nagy kép 80 byte szélességű, ebbôl 40-el jelenítünk meg egyszerre.  Mivel
a  képet  vízszintesen  el  kell mozgatni, a plusz egy szó miatt 42 byte-ot
kell az adatvételezésre meghatározni.

Az elsô sor adatai:

Cím:         START        START+2     START+4   ...    START+40

            bal szélsô   következô    következô         utolsó
             adatszó      adatszó      adatszó          adatszó

Ezen a pozíción a bittérkép mutató START+42 értéket tartalmaz.  Ahhoz, hogy
a  következô  sor  elején  a  helyes értéket mutassa, 38-at kell hozzáadni,
vagyis a moduló értéke 38 lesz.

Az második sor adatai:

Cím:         START+80    START+82     START+84   ...   START+118

            bal szélsô   következô    következô         utolsó
             adatszó      adatszó      adatszó          adatszó


A késleltetés beállítása
------------------------

A vízszintes scrollnál említett késleltetést a BPLCON1 regiszter 7-0 bitje-
ivel  kell  beállítani.  A késleltetést külön-külön lehet beállítani képme-
zônként.   A  3-0  bitek  az 1-es képmezôhöz (1-es, 3-as, 5-ös bittérképek)
tartoznak, a 7-4 bitek a 2-es képmezôhöz (2-es, 4-es, 6-os bittérképek).

Megjegyzés:   ha  csak  egy  bittérképet akarunk használni, akkor is mind a
nyolc  bitet  be  kell  állítani  úgy,  hogy a két bit-négyesnek ugyanannyi
legyen az értéke.

A következô példa mindkét képmezô késleltetését $7-re állítja:

BPLCON1 EQU     $DFF102
        MOVE.W  #$77,BPLCON1


Összegzés
---------

A  mozgatható kép definiálása hasonló az alapkép definiálásának lépéseihez,
csak a következôkben tér el:

- Az  adatvételezés  beállítása:   az  adatvételezés  kezdetét 16 pixellel
  korábban kell kezdeni, mint normál képnél.
- A  moduló beállítása:  a moduló legyen két byte-tal nagyobb, mint akkor,
  amikor nincsen scroll.

Ezen kívül:

- Függôleges  mozgatásnál a bittérkép mutatókat mindig újra kell  állítani.
  Ezt a műveletet a függôleges üres intervallumben kell megtenni.
- Vízszintes  mozgatáskor  a  késleltetést  kell   beállítnai.   A  BPLCON1
  regiszter 0-7 bitjei határozzák meg a késleltetés mértékét.


Témák haladóknak
----------------

Ez  a fejezet olyan részleteket tárgyal, amiket nem túl gyakran használunk,
és nem is kell ezeket feltétlenül ismernünk.


Képmezôk és más grafikus tárgyak egymásra hatása
------------------------------------------------

A rendszer a képmezôkkel együtt ábrázolja a sprite-okat is.  A 7-es fejezet
bemutatja, hogyan lehet az egyes képmezôknek prioritást adni a sprite-okhoz
képest,  és  hogyan lehet ütköztetni (átfedni) a képmezôket a sprite-okkal,
vagy egymással.


HAM üzemmód
-----------

A  HAM jelentése:  Hold And Modify:  tartás és módosítás.  Ez egy speciális
üzemmód,  melynek  segítségével  4096  szín  jeleníthetô  meg  a  képernyôn
egyidôben.   Normálisan  a  képpontok színei a bittérképek bit kombinációja
által meghatározott színregiszterekben levô színek.  Ezáltal minden pixel a
színregiszterekben tárolt szinek egyikét veheti csak fel.

HAM  üzemmódban azonben ez nem így van.  Egy pixel színét befolásolhatja az
elôtte  kejelzett  pixel  színe.   Az  áramkör  ezt a színt tartja, a három
összetevôje  közül  (piros,  zöld,  kék)  az egyiket megváltoztatja, és így
jelzi ki.

A  HAM  lehetôséget  nyújt  rendkívül jó minôségű, színek és színárnyalatok
képernyôn  való  megjelenítésére.   Például  lehetôségünk  van  16  16 váza
különbözô  színben  való  ábrázolására,  használva  mind a 16 színpalettát.
Azután  mindegyik  vázát  HAM-ban  finom  színárnyalattal  és  kontúrokkal
egészíthetjük  ki.   Megjegyezzük,  hogy  különleges  a  HAM  képpont, mert
egyidôben  csak a három fô komponens közül lehet az egyiket módosítani.  Ez
a hátránya ennek az üzemmódnak.

HAM  üzemmódban mind a hat bittérképet használnunk kell.  Az 5-ös és a 6-os
bittérképek  bitkombinációja  határozza  meg az 1-4 bittérképek kombináció-
jának funkcióját, a következô módon:

- Ha a 6-5 bittérképek  bitjeinek kombinációja 00, akkor normál színválasz-
  tás  következik. Az  1-4  bittérképek  kombinációja  (helyiérték  ebben a
  sorrendben) választ a 0-15 színregiszterek közül.  Ha csak öt bittérképet
  használunk, akkor a  hatodik  bittérkép  adatai  automatikusan  0 értéket
  kapnak.
- Ha  az  5-6 bittérképek kombinációja 01,  akkor a pixel bal szomszédjának
  színét veszi  fel, és  ez  módosul.  A  4-1  bittérképek  a kék összetevô
  módosított értékét határozzák meg.
- Ha  az  5-6 bittérképek kombinációja 10,  akkor a pixel bal szomszédjának
  színét  veszi  fel, és  ez  módosul. A  4-1 bittérképek a piros összetevô
  módosított értékét határozzák meg.
- Ha  az  5-6 bittérképek kombinációja 11,  akkor a pixel bal szomszédjának
  színét  veszi  fel, és  ez  módosul. A  4-1  bittérképek a zöld összetevô
  módosított értékét határozzák meg.

HAM használatakor lehetôség van arra, hogy csupán egy színregisztert defin-
iáljunk,  és  a  képernyô  összes  többi  színét  ennek a színnek a változ-
tatásával hozzuk létre.

A  HAM  üzemmódot  a  BPLCON0 regiszter 11-es bitjével kapcsolhatjuk be.  A
BPLCON0 regiszter következô bitjeit kell ilyenkor beállítani:

- 11-es bit (HOMOD) 1: a HAM bekapcsolása
- 10-es bit (DBLPF) 0: egy képmezô
- 15-ös bit (HIRES) 0: kisfelbontás
- 14-12 bitek (BPU2-BPU0) 101 vagy 110: öt vagy hat bittérkép.

A  következô  példa  egy  hat  bittérképes  képet  állít  elô a HAM üzemmód
használatával.  Mind a 32 színregiszterbe fekete kerül, a kép színeit ennek
a  módosításával  állítjuk  elô.  A szimbólumdefiníciók a megszokottak, így
ezeket itt nem ismételjük.

;
; Elôször a vezérlôregisztereket állítjuk be
;
        LEA     CUSTOM,A0               ; A0: regiszterek kezdôcíme
        MOVE.W  #$6A00,BPLCON0(A0)      ; hat bittérkép, HAM
        MOVE.W  #0,BPLCON1(A0)          ; vízszintes scroll = 0
        MOVE.W  #0,BPL1MOD(A0)          ; páratlan moduló 0
        MOVE.W  #0,BPL2MOD(A0)          ; páros moduló 0
        MOVE.W  #$0038,DDFSTRT(A0)      ; adatvételezés kezdete
        MOVE.W  #$00D0,DDFSTOP(A0)      ; adatvételezés vége
        MOVE.W  #$2C81,DIWSTRT(A0)      ; megjelenítô ablak kezdete
        MOVE.W  #$F4C1,DIWSTOP(A0)      ; megjelenítô ablak vége
;
; A színregiszterek feketére állítása
;
        MOVE.W  #32,D0                  ; a számláló kezdôértéke
        LEA     CUSTOM+COLOR00,A1       ; A1 az elsôre mutat
CREGLOOP:
        MOVE.W  #$0000,(A1)+            ; a fekete szín beírása
        SUBQ.W  #1,D0                   ; a számláló csökkentése
        BNE     CREGLOOP                ; vissza, amíg van színregiszter
;
; A hat bittérkép feltöltése egy jól felismerhetô mintával
;
        MOVE.W  #2000,D0                ; 2000 hosszúszó bittérképenként
        MOVE.L  #$21000,A1              ; A1 az 1-es bittérképre mutat
        MOVE.L  #$23000,A2              ; A2 a 2-es bittérképre mutat
        MOVE.L  #$25000,A3              ; A3 a 3-as bittérképre mutat
        MOVE.L  #$27000,A4              ; A4 a 4-es bittérképre mutat
        MOVE.L  #$29000,A5              ; A5 aZ 5-ös bittérképre mutat
        MOVE.L  #$2B000,A6              ; A6 a 6-os bittérképre mutat
FPLLOOP:
        MOVE.L  #$55555555,(A1)+
        MOVE.L  #$33333333,(A2)+
        MOVE.L  #$0F0F0F0F,(A3)+
        MOVE.L  #$00FF00FF,(A4)+
        MOVE.L  #$FFFFFFFF,(A5)+
        MOVE.L  #$00000000,(A6)+
        SUBQ.W  #1,D0                   ; a számláló csökkentése
        BNE     FPLLOOP                 ; vissza, amíg nincs kész
;
; A copperlista $20000-hez másolása
;
        MOVE.L  #$20000,A1              ; A1 mutat a célra
        LEA     COPPERL,A2              ; A2 mutat a forrásra
CLOOP:
        MOVE.L  (A2),(A1)+              ; egy hosszúszó másolása
        CMPI.L  #$FFFFFFFE,(A2)+        ; a copperlista végének ellenôrzése
        BNE     CLOOP                   ; vissza, amíg az egész nincs kész
;
; A Copper mutatójának beállítása a copperlistára
;
        MOVE.L  #$20000,COP1LCH(A0)     ; a Copper ugróregiszterébe
        MOVE.W  COPJMP1(A0),D0          ; a cím a programszámlálóba
;
; A DMA elindítása
;
        MOVE.W  #$8380,DMACON(A0)       ; bittérkép és Copper engedélyezése
        BRA     ...                     ; következô feladatra
;
; Copperlista a hat bittérképhez
;
COPPERL:
        DC.W    $00E0,$0002             ; 1-es bittérkép mutatója: $21000
        DC.W    $00E2,$1000
        DC.W    $00E4,$0002             ; 2-es bittérkép mutatója: $23000
        DC.W    $00E6,$3000
        DC.W    $00E8,$0002             ; 3-as bittérkép mutatója: $25000
        DC.W    $00EA,$5000
        DC.W    $00EC,$0002             ; 4-es bittérkép mutatója: $27000
        DC.W    $00EE,$7000
        DC.W    $00F0,$0002             ; 5-ös bittérkép mutatója: $29000
        DC.W    $00F2,$9000
        DC.W    $00F4,$0002             ; 6-os bittérkép mutatója: $2B000
        DC.W    $00F6,$B000
        DC.W    $FFFF,$FFFE             ; End Copper List


Egy kép több képmezôvel
-----------------------

A  grafikus  könyvtár  (graphics.library)  többek  között azt a lehetôséget
nyújtja,  hogy  egy  képet  több  részre (ViewPort-ra) bontsunk, amelyeknek
különbözô  palettájuk  és  felbontásuk lehet.  További információk az Amiga
ROM Kernel Manual című könyvben található.


Külsô video forrás használata
-----------------------------

Az  Amigához  külsô  áramkör kapcsolható a Genlock áramkör segítségével.  A
Genlock lehetôséget nyújt arra, hogy külsô video forrásból (mely lehet VCR,
kamera, lézer lemezjátszó) érkezô adatokat dolgozzunk fel.  Amikor Genlock-
ot  használunk,  a  háttérszínt  a  külsô  forrás  határozza  meg.  További
információt a külsô egység használati utasításában találunk.


A regiszterek összefoglalása
----------------------------

Ez  a rész a fejezetben elôforduló regisztereket foglalja össze.  A színre-
giszterek  összefoglalása  a  következô  részben  található.  A függelékben
minden regiszter szerepel.


BPLCON0
-------
Megjegyzés: a regiszter bitjei nem állíthatók egymástól függetlenül.

 0. bit: nem használt
 1. bit: ERSY (külsô szinkronizálás engedélyezése)
         1: engedélyezve
         0: letiltva
 2. bit: LACE (interlace üzemmód engedélyezése)
         1: engedélyezve
         0: letiltva
 3. bit: LPEN (fényceruza engedélyezése)
4-7 bit: nem használt
 8. bit: GAUD (Genlock audio engedélyezése)
         1: engedélyezve
         0: letiltva
 9. bit: COLOR_ON (színek engedélyezése)
         1: engedélyezve
         0: letiltva
10. bit: DBLPF (Dual-Playfield üzemmód engedélyezése)
         1: dupla képmezôs üzem
         0: egy képmezôs üzem
11. bit: HOMOD (HAM engedélyezése)
         1: engedélyezve
         0: letiltva
14-12 bit: BPU2-BPU0 (a bittérképek száma)
         000: csak háttérszín
         001: 1 bittérkép
         010: 2 bittérkép
         011: 3 bittérkép
         100: 4 bittérkép
         101: 5 bittérkép
         110: 6 bittérkép
         111: nem használható
15. bit: HIRES (nagyfelbontás engedélyezése)
         1: nagyfelbontás
         0: kisfelbontás

BPLCON1
-------
3-0 bit : PF1H (3-0) 1-es képmezô késleltetése
7-4 bit : PF2H (3-0) 2-es képmezô késleltetése
15-8 bit: használaton kívül

BPLCON2
-------
 6. bit : PF2PRI
          1: 2-es képmezô az 1-esen
          0: 1-es képmezô a 2-esen
0-5 bit : képmezô-sprite prioritás
7-15 bit: nem használt

DDFSTRT
-------
15-8 bit: nem használt
7-3 bit : az adatvételezés kezdetének pozíciója
2-0 bit : nem használt

DDFSTOP
-------
15-8 bit: nem használt
7-3 bit : az adatvételezés végének pozíciója
2-0 bit : nem használt

BPLxPTH
-------
A bittérkép mutató felsô szava. Az 'x' a bittérkép száma.

BPLxPTL
-------
A bittérkép mutató alsó szava. Az 'x' a bittérkép száma.

DIWSTRT
-------
15-8 bit: A megjelenítôablak kezdôpozíciójának függôleges komponense
7-0 bi t: A megjelenítôablak kezdôpozíciójának vízszintes komponense

DIWSTOP
-------
15-8 bit: A megjelenítôablak végpozíciójának függôleges komponense.
7-0 bit : A megjelenítôablak végpozíciójának vízszintes komponense.

BPL1MOD
-------
A páratlan számú bittérképek modulója.

BPL2MOD
-------
A páros számú bittérképek modulója.


A színválasztás összefoglalása
------------------------------

Ez  a rész a képmezôk színválasztását írja le, színpéldákat tartalmaz, és a
kisfelbontás-nagyfelbontás közötti színválasztási különbségeket részletezi.


A színregiszterek tartalma
--------------------------

A  következô  táblázat  egy  színregiszter  felépítését mutatja be.  Minden
színregiszter csak olvasható típusú.

                           Bitek              Tartalom

                           15-12                semmi
                           11-8                 piros
                            7-4                 zöld
                            3-0                 kék

Színpéldák
----------

A  következô  táblázat  néhány alapvetô színt tartalmaz, a hozzájuk tartozó
hexadecimális értékekkel, amit a színregiszterekbe kell írni.

                        Érték           szín

                        $FFF            fehér
                        $D00            téglavörös
                        $F00            vörös
                        $F80            narancsvörös
                        $F90            narancssárga
                        $FB0            aranysárga
                        $FD0            kadmiumsárga
                        $FF0            citromsárga
                        $BF0            citromzöld
                        $8E0            világoszöld
                        $0F0            zöld
                        $2C0            sötétzöld
                        $0B1            erdôzöld
                        $0BB            világoszöld
                        $0DB            vízszín
                        $1FB            világosvízszín
                        $6FE            égszínkék
                        $6CE            világoskék
                        $00F            kék
                        $61F            élénk kék
                        $06D            sötétkék
                        $91F            bíbor
                        $C1F            ibolya
                        $F1F            liláskék
                        $FAC            rózsaszín
                        $DB9            sárgásbarna
                        $C80            barna
                        $A87            sötétbarna
                        $CCC            világosszürke
                        $999            középszürke
                        $000            fekete


Színválasztás kisfelbontásnál
-----------------------------

A  következô  táblázat azt mutatja, hogy ha a bittérképekrôl érkezô bitkom-
bináció  valamilyen, akkor ahhoz melyik színregiszter tartozik kisfelbontás
esetén.

                normál képmezô          Dual-Playfield
        normál mód      HAM                             színregiszter száma
        5,4,3,2,1     4,3,2,1
        bittérképek  bittérképek
                                        1-es képmezô
                                        5,3,1 bittérképek
        00000           0000                  000               0 (*)
        00001           0001                  001               1
        00010           0010                  010               2
        00011           0011                  011               3
        00100           0100                  100               4
        00101           0101                  101               5
        00110           0110                  110               6
        00111           0111                  111               7
                                        2-es képmezô
                                        6,4,2 bittérképek
        01000           1000                  000 (**)	8
        01001           1001                  001               9
        01010           1010                  010               10
        01011           1011                  011               11
        01100           1100                  100               12
        01101           1101                  101               13
        01110           1110                  110               14
        01111           1111                  111               15
        10000                                                   16
        10001                                                   17
        10010                                                   18
        10011                                                   19
        10100                                                   20
        10101                                                   21
        10110                                                   22
        10111                                                   23
        11000                                                   24
        11001                                                   25
        11010                                                   26
        11011                                                   27
        11100                                                   28
        11101                                                   29
        11110                                                   30
        11111                                                   31

(*) : a 0-ás színregiszter mindig a háttérszínt definiálja
(**): átlátszó mód, a 8-as színregiszter helyett


Színválasztás HAM-ban
---------------------

HAM-ban  a  színt a következô táblázat alapján kapjuk.  Ez az üzemmód akkor
jelentkezik, ha a BPLCON regiszter 10-es bitje 1.

        6-os bittérkép  5-ös bittérkép        Eredmény
              0               0               normál művelet
              0               1               kék   = 4-1 bittérképek
              1               0               vörös = 4-1 bittérképek
              1               1               zöld  = 4-1 bittérképek


Színválasztás nagyfelbontásban
------------------------------

A  következô táblázat a színválasztást mutatja nagyfelbontásban.  Ha a bit-
térképekrôl  érkezô bitkombináció valamilyen, akkor a táblázatban megtalál-
ható a hozzá tartozó színregiszter.

       normál képmezô        Dual-Playfield         színregiszter
       4,3,2,1 bittérképek
                             1-es képmezô
                             3,1 bittérképek
              0000                 00 (*)                  0 (**)
              0001                 01                      1
              0010                 10                      2
              0011                 11                      3
              0100                                         4
              0101                                         5
              0110                                         6
              0111                                         7
                             2-es képmezô
                             4,2 bittérképek
              1000                 00 (*)                  8
              1001                 01                      9
              1010                 10                      10
              1011                 11                      11
              1100                                         12
              1101                                         13
              1110                                         14
              1111                                         15

(*) : átlátszó mód
(**): a 0-ás színregiszter mindig a háttérszínt határozza meg












Bevezetés
---------

A  sprite-ok olyan hardver által készített grafikus tárgyak, amelyeket ter-
vezni  és mozgatni lehet a háttérmzôtôl és egymástól függetlenül.  Az Amiga
képernyôjét  a  hátterek  és a sprite-ok együtt alkotják.  Még összetettebb
animációt  készíthetünk  a  blitter segítségével, aminek leírása a 'BLITTER
HARDVER'  című  fejezetben  található.  A sprite-ok nyolc, különleges célra
használt  sprite  DMA  csatorna  segítségével készülnek.  Az alap sprite 16
pixel  széles,  és  akárhány  pixel  magas.   Három színt használhatunk egy
sprite-on  belül, és a pixel lehet átlátszó.  Ha nagyobb, összetettebb vagy
több  színt  használó  tárgyat  szeretnénk  készíteni,  kombinálhatjuk  a
sprite-okat.   A sprite DMA csatornákat átírhatjuk egy képernyôn belül, így
nem vagyunk nyolc sprite-ra korlátozva.


Néhány szó a fejezetrôl
-----------------------

A fejezet a következô részekre tagolódik:

- Méret, alak, szín és pozíció definiálása
- Kijelzés és mozgatás
- Sprite-ok kombinálása, a méret növelése és még több szín használata
- Nyolcnál több sprite megjelenítése


A sprite formája
----------------

A  sprite  formájának megadásához elôször definiálni kell, azután készíteni
egy  adatstruktúrát  a  memóriában.   A  definiálás  a  sprite karakterisz-
tikájának megadása:

- Maximum 16 pixel szélesség
- Végtelen magasság
- Bármilyen alak
- Három szín (plusz háttérszín)
- Bármilyen pozíció a képernyôn


Pozíció a képernyôn
-------------------

A  sprite  helyzetét a képernyôn egy X,Y számpár adja meg.  A 0,0 pozíció a
képernyô  bal  felsô  sarka.   Egy sprite helyzetének definiálásához az X,Y
koordinátákat  kell  megadni.  Ezt a koordinátát mindig úgy kell számítani,
mint  amikor  a képernyô kisfelbontású (LO-RES) és nincs interlace.  Az X,Y
rendszer,  és  a  sprite-pozíció definiálása az 1-es ábrán látható.  Megje-
gyezzük,  hogy  nem  természetes, de a 0,0 helyzet (az origó) olyan, hogy a
sprite nem látszik a képernyôn.

A  látható  terület méretét befolyásolja a képernyô ablakának mérete.  Lásd
még a 'KÉPMEZÔ HARDVER' című fejezetet.


Vízszintes pozíció
------------------

A  sprite  vízszintes  pozíciója  (X  érték)  bármi lehet a képernyôn 0-tól
447-ig.   Ebbe beletartozik a látható képmezô és a keret, ahol a sprite nem
látszik.  Normál esetben a látható pozíciók 64-tôl 383-ig terjednek (vagyis
320  pixel használható vízszintesen).  A video elektronsugara nagyobb mezôt
pásztáz végig, mégis általában ez mind nem látható a képernyôn.

Ha  egy  64-nél kisebb értéket adunk X értéknek, vagyis a képernyôn kívülre
helyezzük,  a  sprite egy része, vagy az egész takarásban lesz.  Néha éppen
ez szükséges, ekkor azt mondjuk, a sprite el van vágva.

Ha  úgy  akarjuk  megjeleníteni a sprite-ot, hogy ne legyen elvágva, adjunk
64-et  az  X  koordinátájához.   Például, ha azt akarjuk, hogy a sprite bal
felsô  sarka  a  látható képmezô bal szélétôl 94 pixel távolságra legyen, a
következô számítást kell elvégezni:

                                 94+64=158

Tehát az X érték 158 lesz, ezt kell majd az adatstruktúrába beírni.

Megjegyezzük, hogy az X pozíció a legelsô (bal oldali) pixel helyzetét adja
a  teljes  16  pixel  szélességben.   Ha  azonban  a sprite legelsô pixelei
átlátszóként  definiáltak,  akkor  maga  az  alakzat  nem  az X érték által
meghatározott  helyen  jelenik  meg.   Legyen  a sprite alakja a 2-es ábrán
látható  alakú,  az X értéke 158.  Mivel az elsô négy pixel átlátszó, ezért
az alakzat négy pixellel késôbb jelenik meg.  A valóságban tehát az alakzat
a 162-es pozíción áll.


Függôleges pozíció
------------------

Bármilyen  pozíciót  választhatunk  0-tól 262-ig a sprite legfelsô sorának.
Normál esetben a látható tartomány 44-tôl 243-ig tart, vagyis a láthat mezô
200 sorból áll (nincs interlace).  Ha választhatunk egy 44-nél kisebb, vagy
243-nál  nagyobb  értéket, a  sprite  egy része vagy az egész láthatatlanná
válik.

Ahhoz,  hogy  a sprite a látható mezô helyes részén legyen, a kiszámított Y
értékhez  44-et  kell  hozzáadni.  Például tegyük a sprite legfelsô sorát a
látható  mezô  felsô  széle  alá  25  pixellel, ekkor  a következô egyszerű
számítást kell elvégeznünk:

                                 25+44=69

Tehát az adatstruktúrába majd 69 kerül.


Elvágott sprite-ok
------------------

Mint  már  említettük,  egy  sprite  lehet  takarásban  (részlegesen  vagy
egészen),  ha  a képernyô keretébe pozícionáljuk.  A két érték (64 vízszin-
tesen,  44  függôlegesen)  csak  a  normál  esetben  érvényes.   Ezeket  az
értékeket  megváltoztathatjuk,  és  ha  ezt  megtesszük, a sprite takarások
ennek megfelelôen változnak.


A sprite méretei
----------------

A  spite-ok  16 pixel szélesek, és bármilyen magasak, ami legalább egy sor,
de lehet magasabb a képernyônél.  Például meghatározhatunk egy nagyon magas
sprite-ot függôlegesen, úgy hogy csak egy része látszódjon a képernyôn.

A  sprite  méretének  egysége a pixel, ami a képernyô szélességének 320-ad,
magasságának  200-ad  része.   A  pixel  tehát  a  kisfelbontású, interlace
nélküli  képernyô  legkisebb  elemének  felel  meg.   A  sprite-ok  azonban
függetlenek  a  képmezô módjától, így ha változtatjuk a felbontást, vagy az
interlace módot, ez nem módosítja a sprite méretét.


A sprite alakja
---------------

Egy sprite-nak bármilyen alakja lehet, amit 16 pixel szélességen meg tudunk
adni.   A sprite alakjának definiálása abból áll, hogy meghatározzuk minden
egyes  pixelének  színét.   A  következô  két  kép egy példát ad arra, hogy
hogyan  kell egy egyszerű alakot definiálni.  Az elsô kép azt mutatja, hogy
hogyan  rajzoljuk  meg  a  kívánt  tárgyat X-eket használva.  A második kép
mutatja,  hogy  hogyan  kell  ugyanezt  a  sprite-nak  megfelelô  16  pixel
szélességben megrajzolni.  A 0-k azt jelentik, hogy ott a tárgy átlátszó.

                                    XX
                                  XXXXXX
                                XXXXXXXXXX
                                XXXXXXXXXX
                                  XXXXXX
                                    XX

                             0000XX0000000000
                             00XXXXXX00000000
                             XXXXXXXXXX000000
                             XXXXXXXXXX000000
                             00XXXXXX00000000
                             0000XX0000000000

Ebben a példában a tárgy teljes szélessége 10 pixel, átrajzoláskor ez a bal
szélre  került.   Amikor  a  tárgy keskenyebb, mint a sprite, ellenôríznünk
kell, hogy a tárgy a sprite melyik részén van definiálva.  Az elsô példában
az alakzat nem csak az elsô, hanem a 2..7 pozícióról is kezdôdhetett volna.


A sprite színei
---------------

Amikor  a  sprite-ot  egymagában  használjuk  (ez  azt  jelenti,  hogy  nem
összeragasztva,  lásd  késôbb),  minden  pixel  három szín közül az egyiket
veheti  fel,  vagy  átlátszó lehet.  A színeket ugyanúgy határozhatjuk meg,
mint  a  képernyô  színeit.  A 3-as ábra azt mutatja, hogy hogyan határozza
meg minden pixel a saját színét.

A  0-k  és  az 1-ek a két adatszóban definiálják a sprite-ot minden sorban.
Ezek  a  bináris számok mutatnak egyre a négy színregiszter közül.  A nyolc
sprite  a rendszer színregisztereit használja, a 16-tól a 31-ig terjedôket.
A színválasztás céljából a nyolc sprite párokba van rendezve, és minden pár
egy  szín-négyest  használ, ahogy azt a következô táblázat mutatja.  Minden
négyes  elsô  regiszterét  a sprite-ok figyelmen kívül hagyják.  Amikor egy
sprite ezt a regisztert választja, átlátszó módot fog használni.

                   0,1 sprite         háttérszín
                   0,1 sprite         17. színregiszter
                   0,1 sprite         18. színregiszter
                   0,1 sprite         19. színregiszter
                   2,3 sprite         háttérszín
                   2,3 sprite         21. színregiszter
                   2,3 sprite         22. színregiszter
                   2,3 sprite         23. színregiszter
                   4,5 sprite         háttérszín
                   4,5 sprite         25. színregiszter
                   4,5 sprite         26. színregiszter
                   4,5 sprite         27. színregiszter
                   6,7 sprite         háttérszín
                   6,7 sprite         29. színregiszter
                   6,7 sprite         30. színregiszter
                   6,7 sprite         31. színregiszter

Ha  színeket  akarunk  használni  a sprite-ban, ezekbe a regiszterekbe kell
töltreni  a kívánt színeket.  A 'KÉPMEZÔ HARDVER' című fejezetben megtalál-
ható, hogyan kell ezt megtenni.

A  00  bitkombináció  speciális  eset  a többi színhez képest.  Az a pixel,
amely  a  00 értékkel rendelkezik, átlátszó módban jelenik meg, vagyis lát-
szik  mögötte  minden,  még  az  alacsonyabb  prioritású  is.   Az alacsony
prioritás azt jelenti, hogy a magasabb prioritású mögött helyezkedik el.  A
sprite-ok  közötti  prioritás állandó, nem lehet megváltoztatni.  A sprite-
képmezô  közötti  prioritást  azonban  megváltoztathatjuk  (ennek leírása a
'RENDSZER VEZÉRLÉS HARDVER' című fejezetben található).


Sprite tervezés
---------------

Egy  sprite  megtervezését  azzal  kezdjük,  hogy  megrajzoljuk papíron.  A
kívánt  színeket  helyettesítsük  számokkal  0-tól 3-ig. Lássuk a következô
példát, hogy is néz ez ki.

                             0000122332210000
                             0001223333221000
                             0012233333322100
                             0001223333221000
                             0000122332210000

A  következô lépés az, hogy a 0-3 számokat átírjuk bináris alakba, ami majd
az adatstruktúrában meghatározza az egyes pixelek színét.  A következô rész
leírja, hogyan kell ezt megtenni.


Az adatstruktúra felépítése
---------------------------

A  sprite  definiálása  után fel kell építenünk az adatstruktúráját, ami 16
bites szavakból áll egy folytonos memóriaterületen.  Némelyik szó pozíciót,
vagy  vezérlôinformációt  tartalmaz,  és  némelyik színleírást.  Egy sprite
adatstruktúrájának felépítéséhez a következôkre van szükségünk:

1: Írjuk a sprite vízszintes és függôleges pozícióját az elsô szóba.
2: Írjuk a sprite utolsó sorának függôleges pozícióját a második szóba.
3: Számoljuk  át a decimális számokat (0-3)  s sprite rácsos  képén bináris
   szín sorszámmá. Használjuk a bináris értékeket a színleíráshoz, és írjuk
   ezeket a szavakat a struktúrába.
4: Írjunk vezérlô szavakat, ami a struktúra végét jelzi.

A  következô  táblázat  az adatstruktúrát mutatja a memória helyzetével, és
minden szó funkciójával.

     Memóriacím       16 bites szó         Funkció

         N         sprite 1. vezérlôszó    X, Y kezdôpozíció
         N+1       sprite 2. vezérlôszó    utolsó sor Y pozíció
         N+2       színleíró alsó szó      az elsô sor színbitjai
         N+3       színleíró felsô szó     az elsô sor színbitjei
         N+4       színleíró alsó szó      a második sor színbitjei
         N+5       színleíró felsô szó     a második sor színbitjei
                           .
                           .
                           .
                   adat vége szavak        két szó utal a végére

Minden  cím,  amit  a  sprite-ok  használnak,  szóméretű cím.  Szükség lesz
elegendô folytonos memóriára, hogy helyet biztosítsunk két szónak a pozíció
miatt, két szónak soronként, és két adat végét jelzô szónak.

Mivel  ezt  az  adatstruktúrát  speciális chipek használják, meg kell arról
gyôzôdnünk,  hogy  ez  az  adatstruktúra teljes egészében a rendszermemória
alsó 512 K-s részén legyen.


A struktúra elsô szava: SPRxPOS
-------------------------------

Ez  a  szó  tartalmazza  a függôleges (VSTART) és vízszintes (HSTART) kezdô
pozícióit.  Ez az a hely, ahol a sprite bal felsô sarka lesz.

                   15-8 bit: a VSTART alsó nyolc bitje
                    7-0 bit: a HSTART felsô nyolc bitje

A struktúra második szava: SPRxCTL
----------------------------------

Ez  a  szó  tartalmazza  a  sprite  utolsó  sorának  függôleges pozícióját,
valamint  tartalmaz még adatokat az összeragasztott sprite-okra vonatkozóan
(lásd késôbb).
                    15-8 bit: a VSTOP alsó nyolc bitje
                       7 bit: összeragasztásra fenntartva
                     6-3 bit: nincsenek használva, értékük 0
                       2 bit: a VSTART felsô bitje
                       1 bit: a VSTOP felsô bitje
                       0 bit: a HSTART alsó bitje

A (VSTOP-VSTART+1) érték adja meg, hogy milyen magas a sprite.


A sprite színleíró szavai
-------------------------

Két  szó áll rendelkezésre a sprite minden sorának leírására; az alsó, és a
felsô  szó.   A  színleíró  szavak  száma  úgy  számítható,  hogy  a sprite
magasságát  kettôvel  megszorozzuk.  A  felsô  szó  bitjei a színkiválasztó
bináris  szám  baloldali  bitjét  adják,  az  alsó szó bitjei a jobboldalit
minden egyes pixelnél.

Ahhoz,  hogy  meghatározzuk  a színleíró szavakat, elôször a sprite alakját
kell  megtervezni,  úgy,  hogy  minden  pixel  színét 0-3 számok jelentsék.
Minden szám egy színregisztert jelöl ki.  Például lássuk a következô ábrát:

                             0000122332210000
                             0001223333221000
                             0012233333322100
                             0001223333221000
                             0000122332210000

A  következô  lépés, hogy a számokat átszámítsuk bináris számokká.  Az elsô
sor  átszámítva  a  következô ábrán látható.  Az egymás alatt látható szám-
jegyek  együtt  határoznak  meg  egy  pixelszínt.  Egy  párban az alul levô
jelenti a színregiszter számának felsô bitjét, a felül levô az alsó bitjét.
A memóriában ezt a két szót kell írni:

                             0000100110010000
                             0000011111100000

Az  elsô  szó  lesz  a színleíró felsô szó, a második a színleíró alsó szó.
Ugyanígy kell átalakítani a sprite többi sorát is 0-ákra és 1-ekre.

Minden  ilyen  két  bitbôl  álló kombináció egy színregisztert határoz meg.
Mivel  két  bit  4 különbözô értéket vehet fel, ezért ez csak a regiszterek
egy  részébôl  választ.   Például a 0-ás sprite a 17-19 regisztereket hasz-
nálhatja.   A  következô táblázat azt mutatja, hogy az egyes bitkombinációk
melyik színregiszternek felelnek meg.

                        Bináris         Színregiszter
                         szám               száma

                          00               átlátszó
                          01                  17
                          10                  18
                          11                  19

Ne  felejtsük  el,  hogy  a  00  bitkombináció mindig átlátszó módot jelöl,
sohasem a színregisztert.


Az adatvége szó
---------------

Amikor  a  monitor  elektronsugarának  függôleges  számlálója eléri a VSTOP
értékét,  a  következô  két  szót,  amit  az adatstruktúrából kivesz, nem a
színregiszternek  küldi,  hanem  úgy  értelmezi,  mint a struktúra elsô két
szavát.   Ezt  a  két  szót  a  hardver  értelmezi,  ugyanúgy,  mint  a két
pozíciómegadó  szót  a  struktúra  elején.  Ha az itt szereplô VSTART érték
kevesebb,  mint  az  elektronsugár  pillanatnyi értéke, ez a sprite már nem
jelenik meg ezen a képernyôn.  Egyenlôre azt jegyezzük meg, hogy a záró két
szó  legyen  nulla,  a  sprite  újrafelhasználását  pedig  majd  késôbb is-
mertetjük.

A  következô  adatstruktúra az elôzôleg látott tárgyat határozza meg.  Ezek
az adatok a (128,65) pozíciót írják elô.

SPRITE:
        DC.W    $6D60,$7200             ; VSTART,HSTART,VSTOP
        DC.W    $0990,$07E0             ; A leíró szavak elsô párja
        DC.W    $13C8,$0FF0
        DC.W    $23C4,$1FF8
        DC.W    $13C8,$0FF0
        DC.W    $0990,$07E0
        DC.W    $0000,$0000             ; Adatvége jel


A sprite megjelenítése
----------------------

Az adatstruktúra felépítése után utasítani kell a rendszert, hogy jelenítse
is  meg.   Ez  a fejezet azt tárgyalja, hogy hogyan kell automatikusan meg-
jeleníteni  a  sprite-ot.   Ebben  a  módban  a sprite DMA csatorna egyszer
elkezdi  értelmezni  a sprite adatstruktúráját, majd kijelzi azt.  A megje-
lenítés  a  VSTOP  érték  eléréséig  tart.   A kézi módszert késôbb ebben a
fejezetben tárgyaljuk.

Egy sprite kijelzéséhez a következô lépéseket kell végrehajtani:

1: Döntsük el, hogy a nyolc sprite DMA csatorna közül melyiket használjuk.
2: Állítsuk be a sprite mutatókat, hogy a rendszer megtalálja az adatokat.
3: Engedélyezzük a memória hozzáférést, ha még nem tettük volna.
4: Az elektronsugár visszaugrásakor írjuk át a mutatókat.

                              Figyelmeztetés
                              --------------
Ha a sprite DMA-t akkor kapcsoljuk ki, amikor a sprite éppen kijelzés alatt
áll  (VSTART  után és VSTOP elôtt), a rendszer folyamatosan fogja kijelezni
azt  az  adatsort,  amit  utoljára  értelmezett.  Ez esetben egy függôleges
oszlop jelenik meg a képernyôn.  Ez az oka annak, hogy azt javasoljuk, hogy
a  sprite  DMA-t csak függôleges üres intervallumban, például akkor, amikor
az elektronsugár az utolsó sorból visszaugrik az elsô sorba, kapcsoljuk ki,
vagy olyan helyen, ahol biztosan nincs sprite.


DMA kiválasztása, mutatók beállítása
------------------------------------

Ahhoz,  hogy  eldöntsük, melyik sprite DMA csatornát választjuk, figyelembe
kell vennünk a sprite-ok színszervezését és a prioritásukat.

A  sprite  DMA  csatorna  két  mutatót  használ,  hogy  olvasson  a  sprite
adataiból.   Amikor  az  elektronsugár  visszaugrik,  ezeket  a mutatókat a
sprite  adatainak elejére kell állítani.  A mutatók nevei általában SPRxPTH
és SPRxPTL, ahol az 'x' a sprite DMA csatorna száma.  Az SPRxPTH-ba kerül a
sprite  elsô szava címének felsô három bitje, az SPRxPTL-be az alsó tizenöt
bit.  Általában az SPRxPTH-ba írunk egy hosszúszót.

A  következô  példában  a  processzor  beállítja  a  0-ás  sprite mutatóit.
Általában  ezt  a  Copper segítségével tesszük.  A sprite a $20000-ás címen
kezdôdik.

SPR0PTH EQU     $DFF120
SPR0PTL EQU     $DFF122
;
        MOVE.L  #$20000,SPR0PTH

Ezek a mutatók mindig változnak, változásukat a sprite DMA okozza.  Elôször
a  pozícionáló  szavakra mutat, aztán a színleíró szavakra kijelzés közben,
végül az adatvége jelzésre.  Miután kiolvasta a pozícionáló szavakat és el-
helyezte  egy  másik regiszterben, elkezdi a színleíró szavak olvasását.  A
sprite színleíró szavak a sprite adatregiszterbe kerülnek, ezeket használja
a  sprite DMA csatorna, hogy kijelezze az adatokat.  A sprite DMA csatornák
kezelésérôl  információkat  találhatunk  még  a  'HARDVER  RÉSZLETEK'  című
fejezetben.


A címmutatók átírása
--------------------

Ha egy sprite-ot egyszerűen egy helyen akarunk megjeleníteni, akkor a rend-
szer folyamatosan olvassa az adatstruktúrát, és megjeleníti a sprite-ot, az
általunk meghatározott színekben.  Ha ezt a sprite-ot máshol is meg akarjuk
jeleníteni,  akkor  át kell írni a sprite mutatóinak tartalmát az elektron-
sugár  visszaugrásakor.   Ez azért fontos, mert a kijelzés alatt lév sprite
mutatója  növelve  van  annyival, hogy éppen abban a pillanatban kijelzendô
sor adatára mutasson.

A  következô  programban  a  mutató  átírása  abban a rutinban van, ahol az
elektronsugár éppen üres helyen van.


Példa a sprite megjelenítésére
------------------------------
A példa megjelenít egy űrhajót a (65,128) pozíción.  Az egyenlôségtevések a
szokásosak, ezért itt nem ismételjük meg.

;
; Elôször egy egyszrű bittérképet kapcsoliunk be
;
        LEA     CUSTOM,A0               ; a regiszterek kezdôcíme
        MOVE.W  #$1200,BPLCON0(A0)      ; egy bittérkép, szín
        MOVE.W  #$0000,BPL1MOD(A0)      ; moduló=0
        MOVE.W  #$0000,BPLCON1(A0)      ; vízszintes scroll=0
        MOVE.W  #$0024,BPLCON2(A0)      ; sprite a képmezô elôtt
        MOVE.W  #$0038,DDFSTRT(A0)      ; adat kezdet
        MOVE.W  #$00D0,DDVSTOP(A0)      ; adat vége
        MOVE.W  #$2C81,DIWSTRT(A0)      ; ablak kezdete
        MOVE.W  #$F4C1,DIWSTOP(A0)      ; ablak vége
;
; Színregiszterek beállítása
;
        MOVE.W  #$0008,COLOR00(A0)      ; háttér: sötétkék
        MOVE.W  #$0000,COLOR01(A0)      ; elôtér: fekete
        MOVE.W  #$0FF0,COLOR17(A0)      ; 17-es szín: sárga
        MOVE.W  #$00FF,COLOR18(A0)      ; 18-as szín: cián
        MOVE.W  #$0F0F,COLOR19(A0)      ; 19-es szín: lila
;
; A copperlista $20000-hoz másolása
;
        MOVE.L  #$20000,A1              ; A1 a célra mutat
        LEA     COPPERL,A2              ; A2 a forrásra mutat
CLOOP:
        MOVE.L  (A2),(A1)+              ; hosszúszavak másolása
        CMP.L   #$FFFFFFFE,(A2)+        ; a lista végének ellenôrzése
        BNE     CLOOP                   ; vissza, amíg nincs kész
;
; A sprite másolása $25000-hoz
;
        MOVE.L  #$25000,A1              ; A1 a célra mutat
        LEA     SPRITE,A2               ; A2 a forrásra mutat
SPRLOOP:
        MOVE.L  (A2),(A1)+              ; hosszúszavak másolása
        CMP.L   #$00000000,(A2)+        ; a sprite végének ellenôrzése
        BNE     SPRLOOP	                ; vissza, amíg nincs kész
;
; Készítünk most egy ál sprite-ot $30000-nál. Mind a nyolc sprite-ot
; aktivizáljuk majd, de csak egyet használunk. A maradék hét sprite
; mutatója fog majd ide mutatni.
;
        MOVE.L  #$00000000,$30000       ; az ál-sprite beírása
;
; A Copper a copperlistára mutat
;
        MOVE.L  #$20000,CUSTOM+COP1LC
;
; A bittérkép feltötlése $FFFFFFFF-fel
;
        MOVE.L  #$21000,A1              ; az A1 a bittérképre mutat
        MOVE.W  #2000,D0                ; 2000 hosszúszó=8000 byte
FLOOP:
        MOVE.L  #$FFFFFFFF,(A1)+
        SUBQ    #1,D0
        BNE     FLOOP
;
; DMA kezdete
;
        MOVE.W  CUSTOM+COPJMP,D0        ; a Copper programszámlálója érv.
        MOVE.W  #$83A0,(CUSTOM+DMACON)  ; bittérkép, copper és sprite DMA
        BRA     ...                     ; a program folytatása
;
; A következô lista a bittérkép és a nyolc sprite elôállítását végzi.
; A bittérkép $21000-nál, a 0-ás sprite $25000-nál, a többi $30000-nál
; van.
;
COPPERL:
        DC.W    $00E0,$0002             ; bittérkép = $21000
        DC.W    $00E2,$1000
        DC.W    $0120,$0002             ; 0-ás sprite = $25000
        DC.W    $0122,$2500
        DC.W    $0124,$0003             ; 1-es sprite = $30000
        DC.W    $0126,$0000
        DC.W    $0128,$0003             ; 2-es sprite = $30000
        DC.W    $012A,$0000
        DC.W    $012C,$0003             ; 3-as sprite = $30000
        DC.W    $012E,$0000
        DC.W    $0130,$0003             ; 4-es sprite = $30000
        DC.W    $0132,$0000
        DC.W    $0134,$0003             ; 5-ös sprite = $30000
        DC.W    $0136,$0000
        DC.W    $0138,$0003             ; 6-es sprite = $30000
        DC.W    $013A,$0000
        DC.W    $013C,$0003             ; 7-es sprite = $30000
        DC.W    $013E,$0000
        DC.W    $FFFF,$FFFE             ; END COPPER LIST
;
; Sprite adatok
;
SPRITE:
        DC.W    $6D60,$7200             ; VSTART,HSTART,VSTOP
        DC.W    $0990,$07E0             ; a leíró szavak elsô párja
        DC.W    $13C8,$0FF0
        DC.W    $23C4,$1FF8
        DC.W    $13C8,$00F8
        DC.W    $0990,$07E0
        DC.W    $0000,$0000             ; adatvége jel


A sprite mozgatása
------------------

Egy  automatikus módban meghatározott sprite mozgását úgy érhetjük el, hogy
az adatstruktúrájában mindig átírjuk a pozíciót.  Minden megjelenítés elôtt
a  pozíció  újra  kiolvasódik,  és  a  sprite  újrarajzolódik.  Ha a sprite
pozícióját  mindíg  újraírjuk,  mielôtt újra kirajzolódna, a sprite mozogva
fog megjelenni a képernyôn.

Figyelnünk  kell  arra, hogy ne mozgassuk a sprite-ot, vagyis ne írjuk át a
pozícionáló  szavakat  akkor, amikor ezeket arra használja a rendszer, hogy
megtalálja,  mikor  kell  elkezdeni  a  sprite-ot  rajzolni.   Ha  erre nem
figyelünk,  elôfordulhat,  hogy  az  elektronsugár  eléri a sprite tetejét,
ekkor  megváltoztatjuk  a  pozíciót, és  a  sprite  végét  csak a következô
képernyô  frissítésekor  találja  meg.   Ekkor  egy  villanást látunk, és a
képernyô  összezavarodik.   Tehát  a pozícióért felelôs szavakat csak akkor
írjuk át, amikor a rendszer nem próbálja használni azokat.  Általában az az
idô megfelelô a cserére, amikor az elektronsugár a legalsó sorból az elsôre
ugrik.   Ezért  általában  a  mozgatást az elektronsugár visszatérési taszk
részeként írjuk meg, amit a Copper kezel.  Ezt látjuk a lenti példán is.

Ha  a sprite-ok mozognak a képernyôn, elôfordulhat, hogy összeütköznek egy-
mással,  vagy  egyikük a két háttérmezô valamelyikével.  Ezeknek az ütközé-
seknek  a  kezelésére  hardver  eszköz  áll rendelkezésünkre.  Az ütközések
lekérdezését  például  arra  is használhatjuk, hogy egy általunk megrajzolt
határok  között  tartsuk  a  sprite-ot.   Az  ütközések  leírása a hetedik,
'RENDSZER VEZÉRÉS HARDVER' című fejezetben található.

A  következô  példa  a  sprite  mozgását  mutatja  be.   A sprite a képerny
keretén belül pattog, mindig megváltoztatva a sebességét, ha 'falat' talál.

A  sprite  pozíciója  az VSTART és HSTART-ban van, a memóriában a $25000-ás
címen,  az  VSTOP  a $25002-ás címen van.  Ezt a pozíciót kell átírni, hogy
mozogjon a sprite.  Minden képfrissítéskor az VSTART értéke 1-gyel nô (vagy
csökken),  a  HSTART  értéke  2-vel.   Ezután  az új VSTOP értékét VSTART+6
képlet alapján kiszámítjuk minden esetben.

        MOVE.B  #151,D0                 ; vízszintes számláló
        MOVE.B  #194,D1                 ; függôleges számláló
        MOVE.B  #64,D2                  ; vízszintes pozíció
        MOVE.B  #44,D3                  ; függôleges pozíció
        MOVE.B  #1,D4                   ; vízszintes sebesség
        MOVE.B  #1,D5                   ; függôleges sebesség
;
; Itt most megvárjuk, hogy az elektronsugár az utolsó sorba érjen, ennek
; lekérdezése az INTREQ regiszter alapján történik. . Ez biztosítja, hogy
; ne legyen a már említett villanás és összezavarodás
;
VLOOP:
        MOVE.W  CUSTOM+INTREQ,D6        ; a megszakítás szó kiolvasása
        AND.W   #$0020,D6               ; csak a lényeges bit marad
        BEQ     VLOOP                   ; vissza, amíg a bit nem 1
        MOVE.W  #$0020,CUSTOM+INTREQ    ; a bit bekapcs., tehát visszaírás
;
        ADD.B   D4,D2                   ; vízszintes növekmény
        SUBQ.B  #1,D0                   ; vízszintes számláló csöllentése
        BNE     L1
        MOVE.B  #151,D0                 ; vízszintes számláló visszatöltése
        EOR.B   #$FE,D4                 ; növekmény=-növekmény
L1:
        MOVE.B  D2,$25001               ; új HSTART beírása
        ADD.B   D5,D3                   ; függôleges növekmény
        SUBQ.B  #1,D1                   ; függôleges száml. csökkentése
        BNE     L2
        MOVE.B  #194,D1                 ; függôleges száml. visszatöltése
        EOR.B   #$FE,D5                 ; növekmény=-növekmény
L2:
        MOVE.B  D3,$25000               ; új VSTART beírása
        MOVE.B  D3,D6                   ; az új VSTOP-ot kell kiszámítani
        ADD.B   #6,D6                   ; az új VSTOP mindíg VSTART+6
        MOVE.B  D6,$25002               ; az új VSTOP beírása
        BRA     VLOOP


Járulékos sprite készítés
-------------------------

Járulékos  sprite  használatához  készíteni  kell  mind  a nyolc sprite-hoz
adatstruktúrát,  és  beállítani az SPR1PTH és az SPTR1PTL nevű mutatókat az
1-es sprite DMA csatornának, az SPR2PTH és SPR2PTL-t a 2-es csatornának, és
így tovább.

Megjegyezzük,  hogy  amikor egy sprite számára engedélyezzük a DMA-t, akkor
engedélyezzük  mind a nyolcnak, automatikus módban.  Tehát ezt a lépést nem
kell  megismételni,  ha  járulékos  sprite-ot használunk.  Ha egyszer enge-
délyezzük  s  sprite  DMA  csatornát, akkor már a sprite mutatóknak inicia-
lizálva  kell  lenniük,  vagy  egy  valóságos  sprite-ként,  vagy egy null-
sprite-ként.   Egy  inicializálatlan  sprite  nem  túl  kellemes  látvány a
képernyôn megjelenve.

Ismételjük át, hogy az egyes sprite-ok melyik színregisztert használják:

                        Sprite száma   Színregiszterek

                           0 és 1          17-19
                           2 és 3          21-23
                           4 és 5          25-27
                           6 és 7          29-31

Amikor  több,  mint  egy sprite-ot használunk, tudnunk kell, hogy milyen az
egymás  közötti  prioritásuk,  vagyis,  hogy melyik látszik a másik elôtt a
képernyôn.   Minden  sprite-nak  fix  prioritása  van,  ami  egymás  között
érvényes.   A  legkisebb  sorszámú  sprite-nak van a legnagyobb prioritása,
vagyis  ez  látszik  a  többi  sprite  között  legelôl; a  legnagyobb számú
sprite-nak pedig a legkisebb a prioritása.  Ez látszik az 5-ös ábrán is.


A sprite DMA csatornák újrahasználata
-------------------------------------

Mind  a nyolc sprite DMA csatorna képes arra, hogy egynél több, függetlenül
vezérelhetô  tárgyat készítsen.  Elôfordulhat, hogy szükségünk van nyolcnál
több tárgyra, mert például néhányat összeragasztott módban használunk, vagy
színesebb,  nagyobb  tárgyakat készítünk, vagy az átfedést használjuk, hogy
összetettebb  képet  állítsunk  elô.   Minden sprite DMA csatornát többször
felhasználhatunk  egy  képernyôfrissítés  alatt,  amint  azt  a  6-os  ábra
mutatja.

Egy szimpla sprite adatsrtuktúrájában két nulla értékű szó jelzi, hogy vége
az  adatoknak, a sprite DMA csatorna nem próbál több adatot innen venni már
ezen  a  képernyôfrissítésen.   A  sprite  DMA  csatornát  úgy  kell  újra
felhasználni,  hogy  ezt a két nulla értékű szót kicseréljük, és egy teljes
sprite adatstruktúrát helyezünk itt el.  Egy kikötés van, hogy ez a második
struktúra  a  képernyôn  lejjebbi pozíciót adjon meg, mint az elôzô.  A két
nulla  értékű  szót  az  adatstruktúra végére kell tenni.  A következô ábra
mutatja, hogy a 6-os képen látható sprite struktúráját hogyan kell megadni.

Az  egyetlen megszorítás, hogy ha többször használjuk ugyanazt a sprite DMA
csatornát, akkor az egymást követô alakzatok között legalább egy vízszintes
pixelsort  ki  kell  hagyni.  A sprite DMA csatornának ugyanis szüksége van
arra  az  idôre, amíg az üres soron átmegy, mert ekkor értelmezi a pozíciót
leíró szavakat.

A  következô  példa  kijelez egy 'űrhajót' és azután megjeleníti egyanazt a
sprite-ot  egy  másik  tárgyként.   Mivel  az  elôzô listától csak a sprite
adataiban  van  eltérés,  ezért  csak  azt  írjuk itt le.  Azonban a sprite
jobban látszódik, ha a színeit megváltoztatjuk, ezért még azt is megadjuk.

             memóriacímek    ++++++++++++++++
             lefelé          ++++++++++++++++
             növekednek
                             ++++++++++++++++
                             ++++++++++++++++
                                  ------        Az elsô tárgy leírása
                                  ------
                                  ------
                             ++++++++++++++++
                             ++++++++++++++++


                             ++++++++++++++++
                             ++++++++++++++++

                             ++++++++++++++++
                             ++++++++++++++++
                                  ------        A második tárgy leírása
                                  ------
                                  ------
                             ++++++++++++++++
                             ++++++++++++++++

        LEA     CUSTOM,A0
        MOVE.W  #$0F00,COLOR17(A0)      ; 17-es szín piros
        MOVE.W  #$0FF0,COLOR18(A0)      ; 18-as szín sárga
        MOVE.W  #$0FFF,COLOR19(A0)      ; 19-es szín fehér
SPRITE:
        DC.W    $6D60,$7200
        DC.W    $0900,$07E0
        DC.W    $13C8,$0FF0
        DC.W    $23C4,$1FF8
        DC.W    $13C8,$0FF0
        DC.W    $0990,$07E0
        DC.W    $8080,$8D00     ; FSTRART,HSTART,VSTOP az új sprite-hoz
        DC.W    $1818,$0000
        DC.W    $7E7E,$0000
        DC.W    $7FFE,$0000
        DC.W    $FFFF,$2000
        DC.W    $FFFF,$2000
        DC.W    $FFFF,$3000
        DC.W    $FFFF,$3000
        DC.W    $7FFE,$1800
        DC.W    $7FFE,$0C00
        DC.W    $3FFC,$0000
        DC.W    $0FF0,$0000
        DC.W    $03C0,$0000
        DC.W    $0180,$0000
        DC.W    $0000,$0000     ; sprite adatok vége


Spite-ok takarása
-----------------

Összetettebb  és  nagyobb  mozgó tárgyakat készíthetünk a takarás kihaszná-
lásával.   A  takarás,  vagy  átfedés egyszerűen azt jelenti, hogy két vagy
több sprite azonos vagy közeli pozíción van a képernyôn.  A közeli pozíción
most   azt  értjük,  hogy  vízszintesen  legfeljebb  16  pixel  legyen  a
különbségük.

A  beépített  prioritás biztosít arról, hogy az egyik sprite a másik mögött
jelenjen  meg,  amikor  fedésbe kerülnek.  A prioritásért felelôs áramkör a
legkisebb  számú  sprite-nak  adja  a  legnagyobb  prioritást, a legnagyobb
számúnak  pedig  a  legkisebbet.   Tehát,  ha átfedést használunk, meg kell
arról  gyôzôdnünk,  hogy  a  háttérsprite-nak  nagyobb  a  száma,  mint  az
elôtérnek.   A  7-es  képen  látható  példában  a  rácsnak  egy kisebb szám
sprite-ban kell lennie, mint az 'E' betűnek.

Készíthetünk  16  pixelnél szélesebb sprite-ot úgy, hogy kettôt közvetlenül
egymás mellé teszünk.  A 8-as ábra azt mutatja, hogy hogyan lehet kétszeres
szélességű tárgyakat készíteni, két sprite egymás mellé helyezésével.


Összeragasztott sprite-ok
-------------------------

Készíthentünk  olyan  sprite-ot,  aminek  tizenöt  különbözô  színe  (plusz
háttérszín)  lehet  a  három  szín  (plusz  háttérszín) helyett, két sprite
összeragasztásával.   Egy  ilyen  sprite elkészítéséhez a következôket kell
megtennünk:

1: Használjunk  két  csatornát  sprite-onként,  ezeket  azonos  méretűre
   tervezzük, és azonos pozícióra tegyük ôket.
2: Kapcsoljuk be az ATTACH nevű bitet a sprite adatstruktúrájának második
   szavában.

A  tizenöt  szín,  amelyeket  választhatunk,  a teljes sprite színregiszter
készlet,  ami  17-tôl  31-ig  terjed.   Ez  a különleges színbôség abból az
egyszerű  ténybôl  adódik,  hogy  most  pixelenként  négy  bit  áll rendel-
kezésünkre  a  szín meghatározására, az eddigi kettô helyett.  Minden egyes
sprite  az  összeragasztott  párban  két-két  bitet  ad  az összeragasztott
sprite-okból  álló  tárgy  minden pixeléhez, ami a színkiválasztáshoz kell.
Például,  ha  a  0-ás  és  1-es  csatornát használjuk, akkor mindkét sprite
színleíró  szavai  közül  az  elsô  szópár  kombinálódik az összeragasztott
sprite-ok elsô sorával.

A sprite-okat a következô kombinációkban ragaszthatjuk össze:

                       1-es sprite a 0-ás sprite-tal
                       3-as sprite a 2-es sprite-tal
                       5-ös sprite a 4-es sprite-tal
                       7-es sprite a 6-os sprite-tal

Több  ilyen  kombinációt,  akár  az  összeset  is használhatjuk egyszerre a
képernyôn.   A  következô  példa azt mutatja, hogy mit kell tenni, ha színt
akarunk  használni,  a  0-ás és 1-es sprite DMA csatornáival.  Itt éppen öt
szín, plusz transzparens van a sprite-ban.

                             0000154444510000
                             0001564444651000
                             0015676446765100
                             0001564444651000
                             0000154444510000

Az  elsô  két sor meghatározza az adatstruktúra négy szavát úgy, ahogy az a
következô ábrán látszik.

   Pixelsorszám: 15 14 13 12 11 10  9  8  7  6  5  4  3  2  1  0
          1.sor:  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0
          2.sor:  0  0  0  0  0  1  1  1  1  1  1  0  0  0  0  0
          3.sor:  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0
          4.sor:  0  0  0  0  1  1  0  0  0  0  1  1  0  0  0  0

A  bináris  számok 0-tól 15-ig a színregiszterek közül választanak, amelyek
17-tôl 31-ig terjednek, mint azt a következô táblázat mutatja:


                 Decimális         Bináris      Színregiszter

                     0              0000            átlátszó
                     1              0001            17
                     2              0010            18
                     3              0010            19
                     4              0100            20
                     5              0101            21
                     6              0110            22
                     7              0111            23
                     8              1000            24
                     9              1001            25
                    10              1010            26
                    11              1011            27
                    12              1100            28
                    13              1101            29
                    14              1110            30
                    15              1111            31

A  16-os  színregisztert  sohasem  használjuk,  mert  ha  ezt választjuk, a
háttérszín jelenik meg.

A  nagyobb  számú  sprite  (a mi esetünkben az 1-es) adja a magasabb helyi-
értékű  bitpárt  (a  baloldalit) a bináris számban.  Az adatszó legmagasabb
helyiértékű  bitje  adja  a  legszélsô  pixelt  a bal oldalon minden sprite
esetén.  Tehát, amit az adatstruktúrába kell írni, az a következô:

        1-es sor: 1-es sprite magas adatszó az 1. sorban
        2-es sor: 1-es sprite alacsony adatszó az 1. sorban
        3-as sor: 0-ás sprite adatszó az 1.sorban
        4-es sor: 0-ás sprite alacsony adatszó az 1. sorban

Az  összeragasztás  akkor  történik  meg,  amikor  a  páratlan számú sprite
adatstruktúrája  második szavának 7.  bitjét, az ATTACH bitet bekapcsoljuk.
Tehát,  ha  ki akarjuk próbálni példánkat, be kell kapcsolni az 1-es sprite
2.  szavának 7.  bitjét.

Amikor  a  sprite-ok  mozognak,  a copperlistában levô programnak vigyáznia
kell,  hogy  az  összeragasztott  sprite-ok  együtt mozogjanak, hogy mindig
azonos pozíción legyenek.  Ha a két sprite nem marad együtt, megváltoznak a
színei.  Mindkét sprite visszatér három szín plusz háttérszín módba, de nem
úgy,  mintha  egyszerű  sprite-ok lennének.  A kisebb számú sprite színei a
17-19  lesznek,  míg  a  nagyobb  számú  sprite  a  20-as,  24-es  és 28-as
színregisztereket fogja használni.

A  következô  adatstruktúra  a  háttérszínű  űrhajóhoz  készült, két sprite
összeragasztásával.

SPRITE0:
        DC.W    $6D60,$7200     ; VSTART=65, HSTART=128
        DC.W    $0C30,$0000     ; az elsô színleíró szó
        DC.W    $1818,$0420
        DC.W    $342C,$0E70
        DC.W    $1818,$0420
        DC.W    $0C30,$0000
        DC.W    $0000,$0000     ; 0-ás sprite vége

SPRITE1:
        DC.W    $6D60,$7280     ; ATTACH bit = 1
        DC.W    $07E0,$0000     ; az elsô színleíró szó
        DC.W    $0FF0,$0000
        DC.W    $1FF8,$0000
        DC.W    $0FF0,$0000
        DC.W    $07E0,$0000
        DC.W    $0000,$0000     ; 1-es sprite vége


Kézi üzemmód
------------

Majdnem  mindig  az  a legjobb, ha a DMA csatornákat automatikus üzemmódban
használjuk.   Náha  azonban  hasznos  lehet az, hogy ezeket a regisztereket
közvetlenül  a mikroprocesszorral töltsük be.  Ha a sprite-ot kézi üzemmód-
ban  használjuk,  az  nem  foglal  le DMA csatornát.  A kézi üzemmód sprite
olyan  DMA csatornás sprite-ra hasonlít, ami a képernyô tetejétôl az aljáig
ér.   A  sprite-okat  aktivizálhatjuk kézi üzemmódban akkor is, ha a sprite
DMA ki van kapcsolva.

A sprite-ot kézi üzemmódban úgy lehet megjeleníteni, hogy az SPRxDATB és az
SPRxDATA  regiszterekbe  írunk  (ilyen sorrendben).  Azért kell az SPRxDATA
regiszterbe  írni  utoljára, mert ez gondoskodik a sprite megjelenítésérôl.
Az  adat, amit beírtunk a regiszterbe, minden rasztersorban megjelenik azon
a  vízszintes pozíción, amit az SPRxPOS és az SPRxCTL regiszterek megfelelô
részébe  írtunk.   Ha  az  adatok  folytonossága megszakad, az eredmény egy
függôleges csík lesz a képernyôn.

A  sprite  kejelzését  az SPRxCTL regiszterbe való írással lehet befejezni.
Az SPRxPOS regiszterbe való írással a sprite-ot vízszintesen lehet mozgatni
ugyanúgy, mint a normál üzemmódú sprite-ot.


Sprite hardver részletek
------------------------

A  sprite-okat  az  az áramkör készíti el, amit a 9-es ábrán láthatunk.  Az
ábra  blokksémán  mutatja  be,  hogyan  lesz  a  színleíró szópárból pontok
halmaza a képernyôn.

Az áramkör elemeinek leírása a következô:

Sprite adatregiszterek:
Az  SPRxDATA  és  az  SPRxDATB  tartalmazzák  mind a nyolc sprite színleíró
szavának  egyikét, éppen az aktuálisan kijelzettet.  A sprite szélessége 16
pixel,  a  két  szó  képes  arra,  hogy  minden  pixel helyén három szín és
átlátszás közül választhat.  Ennyit nyújt két bit.

Párhuzamos-soros átalakító:
A  sprite  adatregisztereinek  mind a 16 bitje egyenként üzen a színválaszt
áramkörnek, éppen akkor, amikor a kijelzés ôt érinti.
Közvetlenül  azután,  hogy  az  adat  átalakult  az  adatregiszterbôl,  a
párhuzamos-soros  átalakítók  elkezdik  eltolni  a  biteket az átalakítóból
kifelé,  a  legmagasabb helyiértékűvel (a balszélsôvel) kezdve.  Az eltolás
egy  kisfelbontású pixel kifejezéséhez szükséges idôn belül megtörténik, és
16-szor ismétlôdik, hogy minden pixel kijelzésre kerüljön.  Az eltolás és a
kijelzés  nem kezdôdik újra addig, amíg új adat nem töltôdik az átalakítóba
az adatregiszterekbôl.
Mivel a videoképet elôállító elektronsugár a képernyôn balról jobbra halad,
és  az elôször kijelzett pixel az adatszavak legfelsô bitjei, a jól címzett
elsô  bit éppen jó sorrendben, a megfelelô helyre fogja kirajzolni az egész
sprite-sort.

Soros sprite video adat:
A sprite adatai a prioritás áramkörbe mennek, hogy az eldöntse a prioritást
a sprite-ok és a háttér között.

Sprite pozíció regiszterek:
Ezek  az  SPRxPOS  nevű  regiszterek  tartalmazzák  mind  a  nyolc  sprite
vízszintes (X) és függôleges (Y) pozícióját.

Sprite kontroll regiszterek:
Ezek  az  SPRxCTL nevű regiszterek tartalmazzák mind a nyolc sprite végének
függôleges pozícióját.

Sugárszámláló:
A  sugárszámláló  informálja  a  rendszert  az  elektronsugár  pillanatnyi
helyzetérôl.

Összehasonlító:
Ez  a  berendezés  összehasonlítja  a  sugárszámláló  értékét  az  SPRxPOS
regiszterben  levô  Y  értékkel.   Ha  az elektronsugár elérte a sprite bal
felsô  sarkának  pozícióját,  az összehasonlító berendezés egy jelet küld a
párhuzamos-soros átalakítónak, és a sprite kijelzése elkezdôdik.

A 9-es ábra a következôket mutatja:

A sprite  kontroll  regiszterekbe  való írás felfüggeszti az összehasonlító
áramkör  működését.   Ez  megelôzi,  hogy  a  rendszer  outputot küldjön az
adatregiszterekbôl az átalakítóba, vagy a képernyôre.

A  sprite  adatregiszterébe (SPRxDATA) való írás újraindítja az összehason-
lító  áramkör  működését.   Ez engedélyezi az outputot a képernyôre, akkor,
amikor az elektronsugár számlálója egyenlô az SPRxPOS regiszterek egyikének
függôleges összetevôjével.

Ha  az  összehasonlító  engedi,  a sprite adatai elindulnak a képernyôre, a
baloldali bittel kezdve.  A sprite adatai az SPRxPOS vízszintes összetevôje
által meghatározott pozíción jelennek meg.

Amíg  az  összehasonlító  engedélyez,  a  sprite  adatregisztere folyamatos
kijelzés alatt áll a kiválasztott vízszintes pozíción.

Az  adatregiszterben  levô adatokat nem lehet megváltoztatni. A felhasználó
sem írhatja át, és a DMA csatorna sem.


A  fent leírt  részek  automatikus üzemmódban, tehát DMA csatornát használó
sprite  megjelenítését végzi a következôképpen:  a sprite DMA módban van, a
18  bites  sprite pointer (az SPRxPTH és SPRxPTL komponensei) már átvette a
sprite  adatstruktúrájának  elsô  két  szavát.   Ez a két szó tartalmazza a
sprite  elejét  és  végét  definiáló pozíciókat.  Ezután a regiszter átírja
tartalmát  az  SPRxPOS  és  SPRxCTL  regiszterekbe. Utána a mutatókban levô
érték a sprite adatainak kezdôímére mutat (a sprite elsô sorának alsó leíró
szavára).

Az  SPRxCTL-be  való  írás letiltja a sprite kijelzését.  Most a sprite DMA
addig fog várni, amíg az elektronsugár számlálója el nem éri az SPRxPOS-ban
levô  VSTART  (Y)  értékét.   Amikor  a  két  érték  megegyezik, a rendszer
engedélyezi a sprite-ot.

A  sprite  DMA  csatorna  megvizsgálja az SPRxCTL regiszter VSTOP (a sprite
utolsó  sora  utáni  raszter sorszáma) és az SPRxPOS VSTART értékét, azért,
hogy tudja, hány sprite adatot kell az adatstruktúrából kivenni.  Soronként
két  szót  kell  kivenni  és  beírni  az  adatregiszterekbe.   Az  elsôt az
SPRxDATA, a másodikat az SPRxDATB regiszterbe kell írni.

Az  adat  kivétele  és  a  regiszterbe írása akkor következik be, amikor az
alektronsugár  a  sor végérôl a következô sor elejére ugrik, tehát messze a
képernyô  bal  oldalának  kezdetétôl.  A sprite egy sorának kijelzése akkor
kezdôdik,  amikor  az  elektronsugár vízszintes számlálója eléri az SPRxPOS
HSTART  komponensének  értékét.   Az  adatátadásnak  olyan  idôpontban kell
bekövetkeznie,  amikor biztosan nincs sprite kijelzés alatt.  Ezért kell az
említett intervallumot kihasználni.

Ha  a  VSTOP-VSTART  értéke  nulla,  a sprite megjelenítése befejezôdik.  A
következô  szópárt  is ki kell azonban venni az adatstruktúrából, de ez nem
az adatregiszterbe kerül, hanem az SPRxPOS és az SPRxCTL újbóli kitöltésére
használja fel a rendszer.

Amikor a sprite-ot egy képernyôn csak egy tárgy megjelenítésére használjuk,
akkor  is betöltôdik a színleíró szavak után álló elsô szópár az SPRxPOS és
az  SPRxCTL  regiszterekbe.   Ha  nem  kell  újabb tárgyat megjeleníteni, a
színleíró szópárokat követô szópár legyen csupa nulla.


A regiszterek összefoglalása
----------------------------

Nyolc  regisztercsoport  van  a  sprite-ok leírására.  Mind a nyolc csoport
öt-öt  regiszterbôl áll.  Itt csak a 0-ás sprite regisztereit részletezzük.
Az  összes  többi  hasonló, csak a regiszterek nevében levô szám változik a
sprite számának megfelelôen.


Mutatók
-------

A  mutatók  olyan  regiszterek,  amelyeket a rendszer arra használ, hogy az
éppen használatban levô sprite adatra mutasson.  A képernyô kijelzése alatt
ezen  regiszterek  értéke  nô,  hogy  a  folyamat alatt mindig helyes címre
mutasson.   Emiatt  az  elektronsugár  visszafutásakor  a  mutatók  értékét
frissíteni kell.


Az SPR0PTL és az SPR0PTL
------------------------

ez  a  regiszterpár  egy 18 bites mutatót tartalmaz, a 0-ás sprite adatának
címzésére.   Az  SPR0PTH  a  felsô  három, az SPR0PTL az alsó tizenöt bitet
tartalmazza.   Mivel  ez  a  két  regiszter  közvetlenül  egymás  után áll,
egyetlen hozzúszó beírásával módosítható tartalmuk.


Vezérlôregiszterek
------------------

Az SPR0POS
----------

Ez  a  nullás  sprite pozíciójáért felelôs regiszter.  Ez a regiszter hatá-
rozza  meg,  hogy  a sprite bal felsô sarka milyen pozíción legyen a képer-
nyôn.  Az SPR0POS regiszter által meghatározott pozíció így az elsô színle-
író  szópár  legfelsô  bitjéé  lesz.  Ne felejtsük el, hogy a spritepozíció
miníg  320*200-as felbontásban értendô, függetlenül a képmezô felbontásának
mértékétôl.

A bitek kiosztása:
                 15-8 bit: függôleges kezdôpozíció (V7-V0)
                  7-0 bit: vízszintes kezdôpozíció (H8-H1)

Ezt a regisztert normál esetben csak a DMA írhatja át.


Az SPR0CTL
----------

Ezt  a  regisztert  normál  esetben csak a DMA használja.  Azokat az infor-
mációkat  tartalmazza,  amelyek  a sprite adatainak kivételének befejezését
irányítják az adatstruktúrából.

A bitek kiosztása:
              15-8 bit: a sprite függôleges pozíciója (V7-V0)

7-es  bit:   ATTACH bit, a sprite-ok összeragasztását végzi.  Ez a bit csak
páratlan  számú  sprite-ok  esetében  van  értelmezve.  Arra utal, hogy két
sprite,  a  0-ás és az 1-es (vagy 2, 3, vagy 4, 5, vagy 6, 7) együtt értel-
mezôdik,  így  négy bit mélységig választhatunk színeket benne.  A páratlan
számú  (nagyobb  sorszámú)  sprite tartalmazza a magasabb helyiérték szópá-
rokat.   Az összeragasztott sprite-ot lehet függôlegesen és vízszintesen is
mozgatni.   Hogy  a  négy  bites  színválasztást  megtartsuk,  a két össze-
ragasztott  sprite-ot  mindig  azonos pozíción kell tartanunk, hogy egymást
átfedjék.

6-3 bit: bôvítésre fenntartva (értékük nulla)
2. bit: a VSTART 8. bitje
1. bit: a VSTOP  8. bitje
0. bit: a HSTART 0. bitje


Az adatregiszterek
------------------

A  következô  regisztereket normál esetben csak a DMA használhatja, habár a
fô  processzor  is  hozzáfér.   Ezeket  a  regisztereket  a  rendszer  arra
használja,  hogy  a sprite adatszerkezetébôl kivett szavakat addig tárolja,
amíg a kijelzésük befejezôdik.

                         SPR0DATA        SPR0DATB
                         SPR1DATA        SPR1DATB
                         SPR2DATA        SPR2DATB
                         SPR3DATA        SPR3DATB
                         SPR4DATA        SPR4DATB
                         SPR5DATA        SPR5DATB
                         SPR6DATA        SPR6DATB
                         SPR7DATA        SPR7DATB


A sprite színregiszterek összefoglalása
---------------------------------------

A sprite adatregiszterek tartalma választ a sprite minden pixelének színt a
rendszer  színregiszter  készletébôl,  a  következô táblázat alapján.  Ha a
sprite  normál  módú,  vagyis  három  szín  és  átlátszó,  akkor a kövekezô
táblázat a meghatározó:

                       sprite  érték    színregiszter

                        0, 1    00      átlátszó
                                01      17
                                10      18
                                11      19

                        2, 3    00      átlátszó
                                01      21
                                10      22
                                11      23

                        4, 5    00      átlátszó
                                01      25
                                10      26
                                11      27

                        6, 7    00      átlátszó
                                01      29
                                10      30
                                11      31

Ha  a sprite összeragasztott üzemmódú, a következô táblázat határozza meg a
színeit:
                               érték    színregiszter

                                0000    átlátszó
                                0001    17
                                0010    18
                                0011    19
                                0100    20
                                0101    21
                                0110    22
                                0111    23
                                1000    24
                                1001    25
                                1010    26
                                1011    27
                                1100    28
                                1101    29
                                1110    30
                                1111    31











Bevezetés
---------

Ez  a  fejezet  bemutatja, hogy hogyan lehet az audio hardverét közvetlenül
elérni, hogy hangokat készítsünk.  A fontosabb részek a következôk:

- A számítógépes hangelôállítás tömör áttekintése.
- Egyszerű és összetett hangok elôállítása.
- A hangcsatornák speciális esetei.
- Minôségi hangok elôállítása a rendszer korlátozásaival.

A fejezet végén található értékek segítenek valóságos zenéket elôállítani.

Ez  a fejezet nem törekszik a számítógépes hengelôállítás részletes bemuta-
tására, ez egy sokkal hosszabb leírásban lenne csak lehetséges.  A cél csak
az  lehet,  hogy  bemutassuk  azokat  a  módszereket,  amelyek segítségével
hangelôállítás  lehetséges.   Ez  érdekes,  de  bonyolult dolog és rengeteg
próbálgatást, javítást igényel.

A  következô  munkák  további  információkat  tartalmaznak  a  számítógépes
hangelôállításról:

- Wayne A. Bateman, Introduction to Computer Music (New York Yonn Wiley and
  Sons 1980)
- Hal  Chamberlain, Musical Applications of Microprocessors  (Rochelle Park
  New Yersey: Hayden, 1980)


Bevezetés a hangelôállításba
----------------------------

A  hang  a  levegôben terjed, fülünk dobhártyájáig, mint a levegô nyomáskü-
lönbségének  ismételt ciklusai.  Egy hangot ábrázolni lehet grafikonon, ami
a levegô nyomását mutatja az idô függvényében.  A hang jellemzôit meg lehet
határozni  a  grafikon alapján.  Ha a hullámforma szabályos és ismétlôdô, a
hang  egy  természetes hangszer hangjára fog hasonlítani.  Ha a hullámforma
szabálytalan,  a  hang egy csattanásra vagy vízcsobogásra fog hasonlítani.A
hullámforma  egy  ismétlôdését  nevezzük  a  hang  egy  ciklusának.  A hang
magassága  (frekvenciája)  attól  függ,  hogy  a ciklus hányszor ismétlôdik
másodpercenként.  Az  ember  20-20000 másodpercenkénti ciklussal rendelkezô
hangokat  képes  érzékelni.   A  hullámforma amplitúdója (a grafikon legma-
gasabb  pontja)  meghatározza a hangerôt.  Végül a grafikon alakja meghatá-
rozza  a  hangzás  minôségét  vagy  hangszínét.   Az  1-es  ábra egy fontos
hullámformát, a színuszhullámot mutat be, egy ciklussal képviselve az egész
hangot.

Az  elektronikus  hangrögzítô  és visszajátszó berendezések a hangot teljes
mértékben a frekvenciával és az amplitúdóval jellemzik.  A frekvencia azt a
számot  adja,  ahány  ciklus  van  egy  másodpercen  belül.   A  frekvencia
mértékegysége  a  hertz  (Hz),  ami  egy  ciklus  másodpercenként.  Nagyobb
mennyiségeket kilohertzekben (KHz) vagy megahertzben (MHz) adunk meg.

Egy  hang  érzékelt  magasságát  legfôképpen  a  frekvencia adja meg.  Ha a
frekvenciát  növeljük,  a  hangmagasság  emelkedik.   A  kapcsolat közöttük
exponenciális.   Ha  egy  hang frekvenciáját 100 Hz-rôl 200 Hz-re növeljük,
akkor  ez  egy  nagy  ugrás, de ha 1000-hz-rôl 1100 Hz-re növeljük, azt már
nehéz észrevenni.  A zenei hangmagasságokat oktávok határozzák meg.  Ha két
hang különbsége egy oktáv, akkor a magasabb hang frekvenciája kétszerese az
alacsonyabb hangénak.

A  hang  másik  paramétere az amplitúdó. Elektromos áramkörben az amplitúdó
határozza  meg  a körben levô feszültséget.  Ha a jelek hangszóróba mennek,
az  amplitúdót  watt-ban  adják  meg.  Az érzékelt hangerôsséget decibelben
(db)  mérik.  Az ember kb 120 db-es tartományban hall.  Nagyjából minden 10
db  kétszerez  a hangon, és 1 db a legkisebb változás amit érzékelni lehet.
A hangerô, vagyis a hang amplitúdója logaritmikus kapcsolatban van a db-ben
kifejezett értékkel.

A  színuszhullám  frekvenciája  és amplitúdója teljesen független.  Ahogy a
hangot  halljuk,  mégis  van  valami  kapcsolat a hangerô és a hangmagasság
között.   Alacsony  frekvenciás hangok esetén a hangerô gyorsabban csökken,
mint nagyfrekvenciás hangok esetén.

Egy hang harmadik paramétere a hullámforma, ami a felharmonikusok hiányától
vagy meglététôl függ.  Minden összetett hullámforma különbözô frekvenciájú,
amplitúdójú  és  fázisú (a hullám kezdôpozíciója) színuszhullámok keveréke.
Ezek a komponensek a felharmónikusok.  A négyszögjel például végtelen számú
felharmónikussal rendelkezik.

Összefoglalva,  minden  hangot a frekvencia, amplitúdó és a felharmonikusok
relatív  amplitúdója  segítségével  írhatunk  le.  Ezek megfelelôje a hang-
magasság,  hangerô  és  a hangszín.  Ha ezeket a paramétereket az idô függ-
vényében változtatjuk, változó hangot kapunk.

Egy  analóg  hangelôállító  berendezés,  mint például a magnó, a hangokat a
levegô  fokozatmentes nyomásváltozásainak megfelelô hullámforma és frekven-
ciaként  tárolja.   A  magnó  ezután  a  hangot  úgy  adja  vissza,  hogy a
hullámformákat egy erôsítôbe küldi, ami analóg feszültség-hullámokk alaítja
át.  Az erôsítô ezeket a jeleket egy hangszóróba küldi, ami tovább alakítja
levegôrezgéssé, amit a hallgató már képes érzékelni.

A  számítógép  nem  képes  analóg  hullámformát  tárolni.   A  számítógépes
hangelôállításban a hullámformát egy véges számsorozattal kell megadni.  Az
átalakítás  a  következô:  osszuk az idôtengelyt egyenlô részekre úgy, hogy
elég  kicsi  egységeket  kapjunk, hogy a grafikon szomszédos értékei már ne
térjenek  el  nagy mértékben egymástól.  Az így kapott helyeken vegyünk fel
pontokat  a hang grafikonja alapján.  Az egyes pontokat mintáknak nevezzük.
Ezeket  a  mintákat  kell  a memóriába írni, és ezt visszajátszhatjuk olyan
frekvenciával,  amit  megadunk.   A  számítógép  továbbítja  a mintákat egy
digitális-analóg  átalakítónak (DAC), ami analóg feszültséghullámokat állít
elô.   Ezek a hullámok egy erôsítôbe kerülnek, onnan pedig egy hangszóróba,
ami megszólaltatja a hangot.

A  2-es  ábra  példát  mutat  a  színuszhullámra,  a  négyszögjelre  és  a
háromszögjelelre,  a mintákat tartalmazó táblázattal együtt.  Megjegyezzük,
hogy  a  rajzon kevesebb pont van, mint ahány mintát tartalmaz az ábra.  Az
amplitúdó tengelyen 127 a felsô és -128 az alsó határ.


Az Amiga hangelôállító hardvere
-------------------------------

az  Amiga  négy  hangcsatornával  rendelkezik.   Minden csatornát egymástól
függetlenül  lehet  programozni, ezenkívül összekapcsolhatunk két csatornát
modulációval, vagy kombinálhatunk két csatornát sztereo hatás eléréséhez.

Minden  hangcsatorna  tartalmaz  egy nyolcbites digitális-analóg átalakítót
egy-egy  DMA-val  meghajtva.   Az  audio DMA két mintát képes venni raszte-
renként.   Az  audio  DMA  képes egy változatlan hullámformát automatikusan
ismételni.

Két  módszer  van hangelôállításra az Amigán:  automatikus üzemmódban (DMA)
vagy  közvetlen  üzemmódban (DMA nélkül).  Ha automatikus üzemmódot haszná-
lunk,   a   rendszer   automatikusan   veszi   az   adatokat  a  közvetlen
memóriahozzáférést használva.


A hang alakítása és lejátszása
------------------------------

Ez  a  fejezet  bemutatja,  hogyan  kell egy egyszerű hangot elkészíteni és
hogyan  kell azt lejátszani.  A legtöbb tudnivalót tartalmazza, ami szüksé-
ges a hangelôállításhoz Amigán.

Egy állandó hang elôállításához a következô lépésekre van szükség:

1: El kell dönteni, hogy melyik csatornát használjuk.
2: A hullámforma elkészítése és a mintatáblázat tárolása a memóriában.
3: Mutatók beállítása az adatok elejére, és a hosszuk megadása.
4: A hangerô beállítása.
5: A frekvencia beállítása.
6: A DMA engedélyezése.


Választás a csatornák között
----------------------------

Az Amigának négy audio csatornája van.  A 0-ás és a 3-as csatorna a sztereo
csatlakozó  bal, az 1-es és a 2-es csatorna a jobboldali dugóhoz van kötve.
A csatorna kiválasztásánál erre kell figyelni.


A hullámforma megadása
----------------------

Az  a  hullámforma,  ami a  fejezetben  példaként  szerepelt,  egy egyszerű
színuszhullám,  amely  egy  tiszta  hangot  határoz  meg.   A  memóriában a
hullámból  egy  teljes ciklust kell tárolni.  A ciklus elsô és utolsó adata
által  meghatározott értékeknek közel kell esnie egymáshoz.  Ez biztosítja,
hogy  folyamatos ismétléskor a hullámforma által keltett hang folyamatosnak
hasson.

Az  adatok  nyolcbites egységekre bomlanak, minden ilyen egység egy minta a
hullámformából.   Minden  adatszó,  amit  a DMA kivesz az adatok közül, két
mintát tartalmaz.  Egy minta -128-tól +127-ig vehet fel értéket.

A  következô  példa  adatai egy színuszhullámot közelítenek.  Megjegyezzük,
hogy  az  adatok  byte-onként  vannak tárolva, az elsô adat van a legkisebb
számú  címen,  a második a következôn és így tovább.  Ezenkívül fontos még,
hogy  az elsô byte szóhatárra kerüljön.  Ez azért fontos, mert az audio DMA
az adatokat szó egységben veszi, és mint két byte-ot kezeli.

A  0-ás  hangcsatorna  használatához  az  adatok kezdôcímét írjuk az AUD0LC
regiszterbe.   Az  AUDxLC regiszter két 16 bites regiszter kombinációja, az
AUDxLCH  és  az  AUDxLCL  regisztereké.   Mivel  a  címet,  amit  az AUDxLC
regiszterbe írunk a DMA használja, ennek a címnek az alsó 512 Kbyte-ra kell
mutatnia a RAM-ban.

Hangadatok ->          AUD0LC(*)       100        98
                       AUD0LC+2         92        83
                       AUD0LC+4         71        56
                       AUD0LC+6         38        20
                       AUD0LC+8          0       -20
                          .            -38       -56
                          .            -71       -83
                          .            -92       -98
                          .           -100       -98
                          .            -92       -83
                          .           -100       -98
                          .            -92       -83
                          .            -71       -56
                          .            -38       -20
                          .              0        20
                          .             38        56
                          .             71        83
                       AUD0LC+30        92        98


Az adatok átadása a rendszernek
-------------------------------

Ahhoz,  hogy  a  rendszer  a sorbarendezett adatokat átvegye, meg kell adni
neki az adatok kezdôcímét és a hosszát szavakban.

A  hang  adatainak  kezdôcímét  az AUDxLCH és az AUDxLCL regiszterekbe kell
beírni  (felsô  három  és  az  alsó 15 bit).  Mivel a két regiszter egymást
követi  cím  szerint,  egy  hosszúszó  beírásával  az  AUDxLCH-ba  lehet  a
kezdôcímet  beállítani.   A  névben szereplô 'x' a csatorna számát jelenti,
ahol a hang megjelenik.  Értéke 0, 1, 2 vagy 3 lehet.

Ezek  a  regiszterek  pozíció  regiszterek,  nem  pedig  mutatók,  vagyis a
tartalmukat  csak  egyszer  kell  beírni, nem kell utána újraindítani akkor
sem,  ha  a  hullámformát  ismételve  szólaltatjuk  meg.  Amikor a rendszer
kiolvasta  az  utolsó  adatszót,  ezt  a  regisztert  használja,  hogy újra
megtalálja  az  adatok  elejét.   Legyen  most  az elsô adat az 'AUDIODATA'
címen,  és  használjuk  a  0-ás  csatornát.   Ezt  a  következôképpen  kell
beállítani:

AUD0LC  EQU     AUD0LCH                 ; a regiszterek címe
WHERE0DATA:
        LEA     AUDIODATA,A0            ; a 32 bites cím
        MOVE.L  A0,AUD0LC               ; beírása a regiszterbe

Az  adatok hossza a minták száma osztva kettôvel, vagyis az adatszavak szá-
ma.   A  már  említett  mintakészlet  hossza  16 szó.  Az adatok hosszát az
AUDxLEN  regiszterbe  kell  írni, ahol az 'x' jelentése az aktuális csator-
naszám.  A 0-ás csatorna hossz regiszterét így kell 16-ra állítani:

SETAUD0LENGTH:
        MOVE.W  #16,AUD0LEN


A hangerô beállítása
--------------------

A  hangerô, amit most leírunk, az általános hangerô, ami az adott csatornán
érkezik.   A  relatív  hangerôt a hullámforma amplitúdója adja meg.  Minden
csatornának  van  egy hatbites hangerôregisztere.  Az adott csatorna hange-
rejét úgy kell megadni, hogy az AUDxVOL regiszterbe írjuk a kívánt értéket,
ami  0-64  értéket  vehet  fel.   Ez a szám decibel értéket határoz meg.  A
fejezet végén  van egy táblázat, ami azt tartalmazza, hogy az egyes hangerô
értékek  hány db-t határoznak meg.  Ha a hangerô 64 és az amplitúdó 128, az
output  feszültség  -0.4  és  +0.4 volt között változik.  A 0-64 értéket az
AUDxVOL regiszter 5-0 bitjeire kell írni.  Például:

SETAUD0VOLUME:
        MOVE.W  #48,AUD0VOL

A  decibel  értékei  negatív  számok,  kivéve a maximális 0 értéket, mert a
hangrögzítô eszközök így mutatják a felvételi szintet.  Általában a 0 szint
az  optimális  felvétel  szintje.   Minden  ami  ez  alatt  van, az negatív
mennyiség.


A frekvencia beállítása
-----------------------

Az  elôállított  hang  magassága a frekvenciájától függ.  A rendszernek úgy
kell  megadni  a frekvenciát, hogy a minták közti periódust adjuk meg.  Ezt
az  intervallumot  rendszerciklusokban  kell  megadni.  Ez az a szám, ahány
ilyen  ciklust  fog  várni  a  rendszer két minta elküldése között.  Minden
csatornának  külön  van  periódus  regisztere.  Ezt a regisztert a rendszer
folyamatos  visszaszámlálásra  használja.   Ha  az idôregiszter értéke 0-ra
csökkent,  akkor  egy  új  mintát  vesz  az  adatokból,  és  elküldi  a D/A
átalakítónak.   Az  Amigán  a  periódust  óraciklusokban  kell  megadni.  A
minimális  periódus  124  óraciklus mintánként, a maximális periódus 65535.
Ezenkívül  van  még egy lehetôség jobb minôségű hangok elôállítására, ennek
leírása  késôbb  következik.   Megjegyezzük,  hogy  kisebb periódus nagyobb
frekvenciát, nagyobb periódus alacsonyabb frekvenciát határoz meg.


A periódus értékének határai
----------------------------

A  periódus  beállítását  az  korlátozza, hogy hány DMA ciklus tartozik egy
csatornához.   Minden  csatornához  egy  DMA  résidô  tartozik  egy raszter
megjelenítése  alatt.   Egy audio DMA két adatot képes raszterenként venni.
A következô képlet adja a másodpercenkénti feldolgozott minták maximumát:

          minta         raszter         képernyô          minta
        2------- * 262,5-------- * 59,94--------- = 31469---------
         raszter        képernyô        másodperc        másodperc

Az  így  kapott 31469 csak elméleti érték.  A hardvert csak 28867 minta/sec
sebességre  tervezték.   A rendszer idôintervalluma 279.365 nanosec, vagyis
0.279365  mikrosec.   A maximális 28867 minta/sec-nek 34.642 mikrosec/minta
felel meg.  A periódus értékét a következô képlet alapján lehet számítani.

                                     minta intervallum
                    periódus érték = -----------------
                                      óra intervallum

Tehát  a  minimális  periódus  értéket  úgy  kapjuk  meg,  ha  a  34.642
mikrosec/minta értékét elosztjuk a mikrosec/ciklus érétékkel:

                           34.642 mikrosec/minta
      minimális periódus =------------------------ = 124 cilus/minta
                          0.279365 mikrosec/ciklus

Tehát  a  legkisebb érték, amit a periódus regiszterbe írhatunk 124, hogy a
DMA  képes legyen az adatok kivételére.  Ha ennél kevesebbet írunk, akkor a
számláló  0-ra csökkenésekor a DMA még nem lesz képes új adat vételére, így
az alôzô adatot használja újból.


A periódusérték beállítása
--------------------------

Miután  meghatároztuk, hogy hány ciklus legyen két adatvételezés között, ki
kell számítanunk a periódusértéket, amit majd a periódus regiszterbe írunk.
A képlet a következô:

                                      egy minta ideje
                    periódusérték = -------------------
                                    egy óraciklus ideje

A  következô  példa 1 KHz-es színuszhullámot állít elô nyolc mintát tartal-
mazó táblázattal (négy adatszó).  A hullám a hármas ábrán látható, a minták
értékei a következôk:


                        0,90,127,90,0,-90,-127,-90


Ahhoz,  hogy  a  hullám 1 KHz-es frekvencián szóljon (1000 ciklus másodper-
cenként),  ahhoz  az  kell,  hogy a teljes ciklus 1/1000-ed másodpercenként
ismétlôdjön.   A  számítógépnek azonban a minták közötti idôt kell megadni,
ami  ennek  1/8-ad  része.   Így  lesz  az  1000  mikrosec/hullám-ból  125
mikrosec/minta.  A periódusérték kiszámítása a következô:

                             125 mikrosec/minta           ciklus
           periódusérték = ------------------------ = 447 ------
                           0.279365 mikrosec/ciklus       minta

A periódus beállításához a periódusértéket az AUDxPER nevű regiszterbe kell
írni.  A regiszter nevében szereplô 'x' helyére a használni kívánt csatorna
számát kell írni.  A következô példa azt mutatja, hogyan kell a 447 értéket
a 0-ás csatorna periódusregiszterébe írni:

SETAUD0PERIOD:
        MOVE.W  #447,AUD0PER

Hogy  elkerüljük  a  hangzásban  a torzulásokat, tartsuk be a periódusérté-
kekkel  kapcsolatos  korlátozásokat.   A  zenei  hangmagasság és a periódus
közötti kapcsolat a fejezet végén található táblázat adja meg.


A hullámforma lejátszása
------------------------

Miután  definiáltuk  a  hang adatainak kezdôcímét, hosszát, a hangerôt és a
periódust,  akkor  lejátszhatjuk  a hangot, az audio DMA elindításával.  Ez
indítja  meg  a  hang kibocsájtását.  Ha a DMA-t elindítottuk, a hang addig
hallható,  amíg  nem  állítottuk  be.   Így  a  hullámforma  újra  és  újra
ismétlôdik,  folyamatos  hangot elôállítva.  A rendszer a pozícióregisztert
használja, hogy újra és újra megtalálja az adatok kezdôcímét.

A  csatorna elindításához írjunk 1-et a DMACON regiszter AUDxEN bitjébe.  A
DMA  elindításához  írjunk  1-et  a  DMACON  regiszter  DMAEN  bitjébe.   A
következô táblázat ezen biteket, és jelentéseiket tartalmazzák.

DMACON
------
Bit  Név     Funkció

15   SETCLR  Ha ezt a bitet 1-re állítjuk, a DMACONW regiszter azon bitjei
             állítódnak, melyek ebben a regiszterben 1-esek.
 9   DMAEN   közvetlen  memóriahozzáférés  csak akkor  történhet,  ha ez a
             bit 1.
 3   AUD3EN  3-as hangcsatorna engedélyezô bitje
 2   AUD2EN  2-es hangcsatorna engedélyezô bitje
 1   AUD1EN  1-es hangcsatorna engedélyezô bitje
 0   AUD0EN  0-ás hangcsatorna engedélyezô bitje

Például, ha a 0-ás csatornát akarjuk használni, írjunk 1-et a 9-es
bitbe, hogy engedélyezzük a DMA-t és szintén 1-et a 0-ás bitbe, hogy
engedélyezzük a 0-ás csatornát. A következô példa ezt szemlélteti:

SET     EQU     $08000
AUD0EN  EQU     $01
DMAEN   EQU     $01
BEGINCHAN0:
        MOVE.W  #(SET+AUD0EN+DMAEN),DMACONW


Az audio DMA leállítása
-----------------------

Egy  csatornát  az  AUDxEN  bit  törlésével  lehet  kikapcsolni.   Ha aztán
újraindítjuk,  akkor  már nem arról a pontról fog indulni a lejátszás, ahol
azt  abbahagyta.  Amikor a csatornát engedélyezzük, az adatvételezés újra a
pozícióregiszterek  által  meghatározott  címen,  vagyis  a memóriatáblázat
elején  kezdi  a  feldolgozást.  Ha a csatornát csak egy nagyon kicsi idôre
kapcsoltuk ki (két mintaperiódusnál kevesebbre), akkor elképzelhetô, hogy a
hang ugyanonnan folytatja, ahol abbahagyta.  A következô példa azt mutatja,
hogy hogyan kell egy csatornát kikapcsolni:

CLEAR   EQU     0
STOPAUDCHAN0:
        MOVE.W  #(CLEAR+AUD0EN),DMACONW


Összefoglalás
-------------

A következô lépések szükségesek egy egyszerű hang elôállításához:

1: Definiáljuk a hullámformát

2: Készítsük  el  a  mintatáblázatot  az  adatpárokból  (adatszavakból).
   Általában egy mintatáblázat egy hullámformát határoz meg.

3: Állítsuk be a pozícióregisztereket:
                         AUDxLCH (felsô három bit)
                         AUDxLCL (alsó tizenöt bit)

4: A memóriatáblázat hosszának beírása az  AUDxLEN  regiszterbe.  Ez a szám
   adja meg, hogy hány adatot kell ismételni.

5: Állítsuk be a hangerôt az AUDxCOL regiszterrel.

6: Állítsuk be a frekvenciát az AUDxPER regiszterrel

7: Indítsuk el az audio DMA-t úgy, hogy 1-et írunk a 9-es (DMAEN) bitbe,
   1-et a SETCLR bitbe, és az AUDxEN bitbe vagy bitekbe.


Példa
-----

	A következô példa összegyűjti az elôzô bekezdésekben szereplô
programrészleteket és így eredményül a 0-ás csatornán egy színuszhullámot
indít el.

AUD0LC  EQU     AUD0LCH
SET     EQU     $08000
CLEAR   EQU     0
AUD0EN  EQU     $01
DMAEN   EQU     $0200

        DS.W                                    ; szóhatár miatt
SINEDATA:
        DC.B    0,90,127,90,0,-90,-127,-90

        LEA     SINEDATA,A0
        MOVE.L  A0,AUD0LC                       ; adatok kezdôcíme
        MOVE.W  #4,AUD0LEN                      ; adatok hossza
        MOVE.W  #64,AUD0VOL                     ; max. hangerô
        MOVE.W  #447,AUD0PER                    ; frekvencia
        MOVW.W  #(SET+DMAEN+AUD0EN),DMACONW     ; bekapcsolás


Összetett hang elôállítása
--------------------------

Az  egyszerű  hangok  elôállítása  mellett  készíthetünk náluk bonyolultabb
hangokat, például zenét több szólamban vagy modulált hangokat.


Hangsorozatok
-------------

Az  egyes hangokat úgy állíthatjuk egymás után, hogy miután elindítottuk az
elsô  hangot, megváltoztatjuk  a  regiszterek értékét úgy, hogy a következô
hangnak  megfelelô  értéket  vegyék fel.  Ezt könnyű megtenni a back-up re-
giszterek  és  az  audio  megszakítások  miatt.   A  pozíció  és a hosszre-
gisztereket  az  audio  DMA a csatorna elindítása elôtt egyszer olvassa ki.
Ezután  ezeket az értékeket tárolja a back-up regiszterekben.  Miután a DMA
kiolvasta  a  regiszterek  értékét, megváltoztathatjuk ôket anélkül, hogy a
már  elrendezett  műveletet  összezavarnánk.  A folyamat tehát a következô:
töltsük  fel  a  regisztereket,  indítsuk  el  a  hangot, ezután írjuk át a
regiszterek értékét úgy, hogy a következô hangnak megfelelô legyen.

A  megszakítás  közvetlenül  azután  jön  létre,  amikor  a DMA kiolvasta a
pozíció-  és  hosszregisztereket és ezek tartalmát a back-up regiszterekben
tárolta.   Ha  a megszakítás létrejött, átírhatjuk a regisztereket a követ-
kezô  hullámformának  megfelelôen.  A back-up regiszterek miatt kell mindig
egy lépéssel elôbbre járnunk és így a hangzás folytonos és egyenletes lesz.

Ha  nem írjuk át a regisztereket, a pillanatnyi hullámforma fog ismétlôdni.
Mindig amikor a hossz számlálója 0-ra csökken, a pozíció és a hossz értékek
újratöltôdnek, így megint ugyanarra a hullámformára fognak utalni.


Példa
-----

A  következô  példa lépésrôl lépésre részletezi az audio DMA tevékenységét.
Tegyük  fel,  hogy egy színuszhullámot és egy háromszögjelet akarunk válto-
gatva  megszólaltatni.  A következô példa bemutatja, hogy kell a programnak
és  a DMA-nak együtt működnie.  A példa feltételezi, hogy a két hullámforma
azonos  hosszúságú  és  a  frekvencia  és  a  hangerô is ugyanaz a két hang
esetén.

Ha (hullám = háromszög)
        írj AUD0LC-be színuszadatot
különben ha (hullám  = színusz)
        írj AUD0LC-be háromszögadatot

        FÔPROGRAM

        1. Hangerô, frekvencia, hossz beállítás
        2. írj AUD0LC-be színuszadatot
        3. DMA elindítása
        4. Folytatás valami mással

        A RENDSZER FELADATAI

        ahogy a DMA elindul:

        a. Az AUD0LEN regiszter másolása back-up regiszterbe
        b. Az AUD0LC regiszter másolása back-up regiszterbe
        c. Megszakításküldés a 68000-nek
        d. Minden engedélyezett résidôben egy új adat kivétele


Több hang egyidôben
-------------------

Több  hang  hallatszik,  ha  több  csatornát  használunk  úgy,  hogy minden
csatornába  más  hangot töltünk.  Ezenkívül ha összegezzük több hullámforma
adatait  egy  csatornába,  akkor  is több hang hallatszik egyidôben.  Mivel
négy  hangcsatorna  van, melyek egymástól függetlenül programozhatók, ezért
minden csatornán egymástól független hangokat játszhatunk le.


Modulált hangok
---------------

Még  összetettebb hangot állíthatunk elô a hangcsatornák modulálásával.  Ez
a  lehetôség növeli a hangelôállítás sokszinűségét.  A csatornákat modulál-
hatjuk  frekvencia  vagy  amplitúdó  szerint, de a kettôt is alkalmazhatjuk
egyidôben.

Az  amplitúdó moduláció a hang erejét befolyásolja.  Ezt gyakran használjuk
vibráló,  remegô  hangok  elôállítására.   A  frekvencia-moduláció  a  hang
periódusértékét  befolyásolja.  Az alap hullámforma nem változik, azonban a
hangmagasság emelkedik és esik a moduláció által meghatározva.

A  rendszer  egyik  csatornával modulálja a másikat, amikor összeragasztjuk
ôket.  Az ADKCON regiszter bitjei határozzák meg, hogy az adatok miként ér-
kezzenek  a  csatornából  (lásd  a  táblázatot).  Általában minden csatorna
hangot  állít elô, amikor engedélyezve van.  Ha egy csatorna 'attach' bitje
1,  akkor  az abbahagyja a hangot, és az adatait a nála eggyel bagyobb szám
csatorna  hangjának modulálására bocsájtja.  Ha egy csatornát modulátorként
használunk,  az  adatai  két byte méretű egységekben kezeli a rendszer, nem
pedig  szóméretben.   A  modulátor csatornából érkezô adatszavak a modulált
csatorna  címregiszterébe  íródnak  amikor  a  modulátor csatorna periódus-
regisztere lefut.

Ha  az audio outputot csak amplitúdó szerint akarjuk modulálni, a csatornát
hangerô  modulátorként kell bekapcsolni.  A modulátor csatorna adatait sza-
vak sorozatával kell megadni (minden adatszó hangerô információt tartalmaz)
a következô formában:
                         Bit     Funkció
                         15-7    használaton kívül
                         6-0     hangerôinformáció

Ha  csak  a  frekvencia modulációt akarjuk használni, a csatornát periódus-
modulátorként  kell bekapcsolni.  A modulátor csatorna adatait szavak soro-
zatával  kell  megadni úgy, hogy minden szó periódus információt tartalmaz.
A formátum a következô:

                        Bit     Funkció
                        15-0    periódusinformáció

Ha mindkét modulációt használni akarjuk, a csatornát mindkét moduláció sze-
rint be kell kapcsolnunk.  Például, ha a 0-ás csatornát mindkét modulációra
hasznáni  kívánjuk,  akkor  két  bitet  kell bekapcsolnunk:  a 0-ás bitet a
hangerô,  a  4-es  bitet  a  periódus moduláció miatt. Ha mindkét moduláció
aktív,  akkor  a  modulátor csatorna adatait felváltva hangerô, és periódus
információkkal kell kitölteni.

A  következô táblázat a modulátor csatorna adatainak funkcióját tartalmazza
a négy lehetséges esetben.

                nincs           mindkét         csak            csak
                moduláció       moduláció       periódus        hangerô
Adatszavak                      aktív           moduláció       moduláció

1. szó          adat,adat       hangerô         periódus        hangerô
2. szó          adat,adat       periódis        periódus        hangerô
3. szó          adat,adat       hangerô         periódus        hangerô
4. szó          adat,adat       periódus        periódus        hangerô


A modulátor és a modulált csatornák adatainak hossza teljesen független.

A  rendszer  elôre meghatározott módon kapcsolja össze a csatornákat, amint
azt a következô táblázatban látjuk.  Ha egy csatornát modulátorként akarunk
használni, a megfelelô bitet 1-re kell állítani.  Ha egy csatorna két bitje
közül az egyiket 1-re állítjuk, a csatorna hangkibocsájtása megszűnik, és a
csatorna  az  eggyel  nagyobb számú csatornához kapcsolódik.  Éppen ezért a
3-as  csatornát  nem használhatjuk modulátorként.  Ha a 3-as csatorna egyik
bitjét 1-re állítjuk, ez csak annyit eredményez, hogy a csatorna elhallgat.

ADKCON
------

Bit    Név      Funkció
7      ATPER3   a 3-as csatorna kikapcsolása
6      ATPER2   a 2-es csatorna modulálja a 3-as csatornát (periódus)
5      ATPER1   az 1-es csatorna modulálja a 2-es csatornát (periódus)
4      ATPER0   a 0-ás csatorna modulálja az 1-es csatornát (periódus)
3      ATVOL3   a 3-as csatorna kikapcsolása
2      ATVOL2   a 2-es csatorna modulálja a 3-as csatornát (amplitúdó)
1      ATVOL1   az 1-es csatorna modulálja a 2-as csatornát (amplitúdó)
0      ATVOL0   a 0-ás csatorna modulálja az 1-es csatornát (amplitúdó)


Jó minôségű hang elôállítása
----------------------------

Amikor jó minôségű hangot készítünk, a következôkre kell figyelnünk:

- A hullámforma átmenetei.
- A megfelelô frekvencia.
- A rejtett torzítások.
- Zajcsökkentés.
- A torzítások elkerülése.
- Az aluláteresztô szűrô korlátai.


Hullámforma átmenet készítése
-----------------------------

Ahhoz,  hogy elkerüljük a nem kívánt zajokat a hullámforma megváltoztatása-
kor,  a  változásnak  simának kell lennie.  A csattanásokat úgy kerülhetjük
el,  hogy megvizsgáljuk, hogy a hullámforma vége és az eleje megközelítôleg
azonos értéket kapjon.  A pukkanásokat úgy kerülhetjük el, ha a hullámforma
elejét  egy zéruspontnak választjuk.  A dobbanásokat úgy kerülhetjük el, ha
az  összes hullámforma amplitúdóátlaga körülbelül azonos értékű.  Az ampli-
túdóátlag a minták összege osztava a minták számával.


A megfelelô frekvencia
----------------------

Ha szükséges, hogy pontosan állítsuk be a frekvenciát, elôfordulhat, hogy a
pontos  érték valahol két lehetséges érték között van, de egyikhez sem elég
közel.  Ilyen esetetben növelnünk kell a hullámforma adatainak hosszát, így
lehetôségünk lesz a pontosabb beállításra.

Nagyobb frekvencia esetén szükség lehet, hogy a hullámforma táblázat egynél
több  teljes  ciklust  tartalmazzon, hogy a megfelelô frekvenciát be tudjuk
állítani.  Ezt mutatja a 4-es ábra.


Hatékonyság
-----------

Számos  esetben  a  hangkezelô rendszer belebonyolódik az audio DMA kezelé-
sébe.   Ha egy sima folytonos hangot állítunk elô, elkerülhetjük ezt.  Ha a
rendszernek túl kicsi audiopuffert adunk, nagyon gyakran fog megszakakítást
küldeni  a  processzornak,  mivel azt mindig megteszi, amikor a hullámforma
végére  ért,  és  a  mutatókat  újraállította.   Ha  csak  egy hullámformát
használunk,  a hardver a mutatók állítását elvégzi, szükségtelen a szoftver
beavatkozása.

Egy  elôzô rész már leírta, hogy hogyan kell a hullámformákat egymáshoz il-
leszteni,  a  megszakítások és a pozícióregiszterek segítségével.  Ha a ké-
szülô  rendszerünk már elég túlterhelt, akkor elôfordulhat, hogy nem tudunk
elég  idôben  válaszolni a megszakításra, így nem lesz sima a hullámváltás.
Ezért  ajánlatos  a  lehetô  leghosszabb  audio táblázat használata, amikor
folytonos hang elôállítása szükséges.  A 68000-es fel irányul megszakítások
számának minimalizálása tehát az audio DMA számára hasznos lehet.


Zajcsökkentés
-------------

Ahhoz,  hogy csökkentsük a zajszintet és pontos hangzást érjünk el, ki kell
használni  a  (-128,127)  intervallumot  amikor  a  hullámforma  táblázatot
összeállítjuk.  Ez csökkenti azt, hogy mennyi zaj (minôségi hiba) adódjon a
kívánt hullámformához.  A minôségi hiba a kerekítések miatt lép fel.  Mivel
egy  hullámforma  megadásához  az  amplitúdó értékeket egész számokkal kell
megadni,  ezért a valóságos értékeket kerekítenünk kell.  A kerekített és a
valóságos érték közötti különbség a minôségi hiba vagy zaj.

Ha  kétszeres  amplitúdót  használunk,  a  zaj  a  felére  csökken,  mert a
hullámforma lépésközei azonosak maradtak, de a pontosság kétszeresére nôtt.
Például ha a hullámformát a (-3,+3) intervallumban írjuk le, sokkal nagyobb
a  kerekítési  hiba,  mintha  a  (-128,+127)  intervallumot használnánk.  A
használt  intervallum  növelésével  arányosan  csökken a zajhatás.  Ha halk
hangot  akarunk  elôállítani, akkor  is  használjuk  ki  a teljes amplitúdó
skálát.  Ilyenkor a hang halkítását a hangerô csökkentésével érjük el.


Rejtett torzítások
------------------

Amikor  a  hullámformát lejátsszuk, egy mellékhatás jön létre, ha a beállí-
tott  frekvencia  kioltja  vagy  erôsíti az alôállítani kívánt frekvenciát.
Emiatt  két  járulékos  frekvencia  jön létre:  az egyik a beállított és az
elô-  állítandó  frekvencia  különbsége,  a  másik  a kettô összege.  Ezt a
jelenséget nevezzük rejtett torzításnak.

A  rejtett  torzítás  megszűnik,  ha  a  beállított frekvencia és az output
frekvencia  legalább  7  KHz-cel  tér el egymástól.  Ha ez így van, akkor a
kioltó frekvencia az aluláteresztô szűrô intervallumán kívül esik.  Az 5-ös
ábra mutatja be a szűrô működését.

A  6-os  ábra mutatja, hogy ha 12 KHz-et állítunk be egy 4 KHz-es hang elô-
állításához,  akkor  mindkét  torzító  frekvencia kívüleshet a szűrô inter-
vallumán.
                              12 + 4 = 16 KHz
                              12 - 4 =  8 KHz

Amint  a  7-es ábrán láthatjuk, 12 KHz-es minta-frekvenciával elôállított 4
KHz-es  hang  esetén  a torzítást nem tudjuk elkerülni, mert a 12-4 = 8 KHz
átmegy a szűrôn, így megjelenik az outputon.

A  bemutatott  példák  is  mutatják,  hogy  miért  kell  legalább  7 KHz-es
különbség a minta-frekvencia és az output frekvencia között.  Ha ez megvan,
akkor  a  torzító  frekvenciák  nem  jutnak  át az aluláteresztô szűrôn.  A
számítás tehát a következô:

   maximális minta - frekvencia = maximális frekvencia összetevô + 7 KHz

A  maximális  frekvencia összetevôinek akkor van értelme, ha a kibocsájtott
hang nem egyszerű színuszhullám, hanem több hullámforma keveréke.


Az aluláteresztô szűrô
----------------------

A  rendszer  tartalmaz egy aluláteresztô szűrôt, ami a rejtett torzításokat
korlátozza,  ahogyan  azt  az  elôzô részben tárgyaltuk.  A szűrô 7 KHz-nél
aktivizálódik,  és  innen  kezdve  fokozatosan  szűri  ki  a hangokat.  A 7
KHz-nél  magasabb hangokat általában nem lehet tisztán hallani.  Ezért ha a
0-7  KHz-es  tartományban  készítünk  hangokat  (akármilyen bonyolultat), a
minta  frekvencia  ne  legyen  nagyobb  14  KHz-nél  alacsonyabb,  vagyis a
beállított frekvencia legyen a (124,256) intervallumban.

320-as  periódusnál  a 0-7 KHz-es tartomány magasabb frekvenciáit elveszít-
jük, ahogy azt a következô táblázat mutatja.

                  minta           minta           maximális output
                  periódus        frekv. (KHz)    frekv. (KHz)
maximális
minta-frekv.        124              29                7

minimális
minta-frekv.        256              14                7

minta-frekv.
kevés 7 KHz-hez     320              11                4


Közvetlen (DMA nélküli) audio output
------------------------------------

Lehetôség  van  arra,  hogy  hangot  úgy állítsunk elô, hogy nem egy listát
készítünk  a  memóriában, hanem az audio output regiszterbe egyesével írjuk
az  adatokat.   Ez a módszer nagyon lefoglalja a processzort, ezért ezt nem
ajánljuk hangelôállításra.

Amikor a közvetlen audio outputot használjuk, az audio DMA-t nem kell enge-
délyezni,  így  a  megszakítások idôköze megváltozik.  Normál esetben akkor
keletkezik  megszakítás,  amikor a DMA kiolvasta a csatorna címregiszterét,
közvetlen  output esetén mindig megszakítás váltódik ki, amikor egy adatszó
az outputra kerül.

Eltérés a DMA vezérelt automatikus outputtól, hogy ha nem írunk új adatot a
regiszterbe  amíg a következô minta intervallum következik, akkor az output
folytonossága megszakad.  Az utolsó érték megmarad a D/A átalakításban.

A  hangerôt  és  a  periódust  be  kell  állítani  közvetlen  audio  output
használatakor.


A zenei hangskála
-----------------

Ez  a  fejezet  egy  közelítô  értéket ad minden hanghoz a hangskálában.  A
periódus  oszlopban található az az érték, amit a periódus regiszterbe kell
írni (AUDxLEN=8).

                 Periódus   Hang    Ideális      Közelító
                                   frekvencia   frekvencia

                   508       A        440.0        440.4
                   480       A#       466.2        466.1
                   453       B        493.9        493.9
                   428       C        523.3        522.7
                   404       C#       554.4        553.8
                   381       D        587.3        587.2
                   360       D#       622.3        621.4
                   339       E        659.3        659.9
                   320       F        698.5        699.1
                   302       F#       740.0        740.8
                   285       G        784.0        785.0
                   269       G#       830.6        831.7

                   254       A        880.0        880.8
                   240       A#       932.3        932.2
                   226       B        987.8        989.9
                   214       C       1046.5       1045.4
                   202       C#      1108.7       1107.5
                   190       D       1174.7       1177.5
                   180       D#      1244.5       1242.9
                   170       E       1318.5       1316.0
                   160       F       1396.9       1398.3
                   151       F#      1480.0       1481.6
                   143       G       1568.0       1564.5
                   135       G#      1661.2       1657.2

Megjegyzések a táblázathoz:

Mint  a  táblázatban látjuk, az A hangnak 440.0 Hz frekvencia felel meg, az
A#-nek  pedig  466.2.   Ez a 440.0-nak egy számszorosa.  A B hang is ugyan-
ennyiszeres  frekvenciával rendelkezik az A#-hoz képest.  Ugyanez a helyzet
a többi hanggal is:  C, C#, D, D#, E, F, F#, G, G# és ismét A, aminek 880.0
Hz  a  frekvenciája.  Így már nyilvánvaló, hogy a szomszédos hangok közötti
szorzószám  a  2 tizenkettedik gyöke (kb 1.059463).  Ezt a táblázatot akkor
használjuk,  ha  a hullámforma a 2-nek az n-edik hatványa db.  byte-tal van
megadva  (az  n  egész  szám).   Például  az  A  hang  440.0  Hz-cel és 508
periódussal, a táblázat ezt 16 byte-os mintatáblázattal írja le:

                    3579545 órajel/sec
            --------------------------------- = 16 minta/ciklus
            508 órajel/minta * 440 ciklus/sec
                                                        (n = 4)

Emiatt  ha  a  440.0  Hz-es A hangot 254 periódusértékkel indítjuk, akkor a
mintatáblázatnak 32 mintát kell tartalmaznia (AUDxLEN=16).

A  fô  szabály:  ha kétszerezzük a frekvenciát (felezzük a periódus értéke-
ket)  akkor  a  hang egy oktávval feljebb kerül.  Így ha a C-t játsszuk 256
periódussal,  azután  ugyanezt  a  hangot 128-cal, akkor ez az egy oktávval
feljebbi C-t adja eredményül.

Mielôtt alacsonyabb hangokat használnánk, olvassuk el a 'Rejtet torzítások'
című részt.


Hangerôtáblázat
---------------

A következô táblázat megadja, hogy az egyes decibel értékeknek milyen érték
felel meg az Amiga rendszerében.

                   hangerô  decibel   hangerô  decibel

                      64     0.0         32     -6.0
                      63    -0.1         31     -6.3
                      62    -0.3         30     -6.6
                      61    -0.4         29     -6.9
                      60    -0.6         28     -7.2
                      59    -0.7         27     -7.5
                      58    -0.9         26     -7.8
                      57    -1.0         25     -8.2
                      56    -1.2         24     -8.5
                      55    -1.3         23     -8.9
                      54    -1.5         22     -9.3
                      53    -1.6         21     -9.7
                      52    -1.8         20    -10.1
                      51    -2.0         19    -10.5
                      50    -2.1         18    -11.0
                      49    -2.3         17    -11.5
                      48    -2.5         16    -12.0
                      47    -2.7         15    -12.6
                      46    -2.9         14    -13.2
                      45    -3.1         13    -13.8
                      44    -3.3         12    -14.5
                      43    -3.5         11    -15.3
                      42    -3.7         10    -16.1
                      41    -3.9          9    -17.0
                      40    -4.1          8    -18.1
                      39    -4.3          7    -19.2
                      38    -4.5          6    -20.6
                      37    -4.8          5    -22.1
                      36    -5.0          4    -24.1
                      35    -5.2          3    -26.6
                      34    -5.5          2    -30.1
                      33    -5.8          1    -36.1
                                          0    -végtelen

Az audio állapot-gép
--------------------

Az  egyes  állapotokat  a  8-as  ábra  mutatja  be.  Minden csatornához egy
állapotgép  tartozik.   A  gépben  nyolc  állapotot különböztetünk meg.  Az
állapot-gét  frekvenciája  a  rendszer  órajelére  épül, 3.58 MHz.  A nyolc
állapotból  három  haszontalan  van,  ezek  csak a várakozó állapotba (000)
juttatják a gépet.  A maradék állapotok közül az egyik a megszakítást jelzi
(a processzor adja az adatokat), a többi DMA műveletet jelez (az Agnus adja
az adatokat).

Egy  megszakítás  által  indított  műveletbôl  a  fôciklusba  (010  és  011
állapotok)  való  visszatérés  közvetlenül  akkor  következik  be, amikor a
processzor az adatot beírta.  A 010 állapotban a felsô, a 011 állapotban az
alsó byte van outputon.  A 010->011->010 változások mindig akkor történnek,
amikor  a  periódusszámláló  0-ra  csökkent.   Ekkor  a  periódus regiszter
újratöltôdik.   Amikor a processzor törli a megszakítást, a gép visszatér a
fô  vagy  várakozási  ciklusba.   Megszakítás akkor generálódik, amikor egy
adatszó mozgatása megtörtént (011->010).

Egy DMA által vezérelt műveletkor a gép 001 állapotba kerül, és DMA kérelem
megy az Agnus chip felé, amikor a DMA bekapcsolódik.  A futószalag technika
miatt  az  elsô adatszót egybôl el kell dobni.  Amikor ez az adatszó megér-
kezik, 101 állapot alakul ki; ekkor a következô adatszó kérelme már kiment.
Amikor  az  adat megérkezik, az állapot 010 lesz és a fô ciklus addig foly-
tatódik,  amíg a DMA-t ki nem kapcsoljuk.  A hossz számláló eggyel csökken,
amikor  egy  adat érkezik.  Amikor ez végetér, egy DMA újraindítási kérelem
megy  az Agnus felé a normál DMA kérelemmel együtt.  Ez utasítja az Agnust,
hogy  állítsa  a  mutatókat  a táblázat elejére. Ezenkívül a hossz számláló
értéke is újratöltôdik és egy megszakítási kérelem indul nem sokkal azután,
hogy  a számláló értéke 1-re csökkent.  A megszakítási kérelem akkor indul,
amikor a táblázat utolsó adatszavának outputja megkezdôdött.

DMA  kérelem  és  újraindítási  kérelem minden raszter kijelzésekor megy az
Agnus  felé és az adat kb.  14 óraciklussal késôbb érkezik meg (egy óracik-
lus 280 ns idôtartamú).

Ha modulációt használunk, akkor a dolgok egy kicsit másképpen futnak.  Ha a
hangerômodulációt  használjuk,  akkor  a kérelmek úgy érkeznek, mint normál
műveleteknél  (011-010  váltáskor).   Ha  frekvencia modulációt használunk,
akkor  a  kérelmek  a  010->011  váltáskor érkeznek.  Ha mindkét modulációt
használjuk, akkor mindkét váltásnál érkezik DMA kérelem.

Ha  a  minta  frekvenciát  magasabbra állítjuk, mint a maximum (kb 29 KHz),
akkor  a  bufferben  lévô két minta fog ismétlôdni.  Ha a szűrô ki van kap-
csolva,  és  a  hangerô  maximális  ($40),  akkor egészen 1.79 MHz-ig lehet
frekvenciát  elôállítani.   A  modulációt a memóriában úgy kell elhelyezni,
hogy a páros byte-okon pozitív, a páratlanokon negatív érték legyen.


Az  állapotgép  diagramján  látható  szimbólunok magyarázatát tartalmazza a
következô  lista.  A  nagybetűs  nevek  külsô jelek, a kisbetűs nevek belsô
jelölések.

AUDxON   : DMA bekapcsolása. Az 'x' a csatorna számát jelenti.
AUDxIP   : audio megszakítás folyamatban  (input a megszakítás áramkörtôl a
           csatornába)
AUDxIR   : audio megszakítás  kérelem (output  a csatornából  a megszakítás
           áramkörbe)
intreq1  : megszakításkérelem, ami összefügg az intreq2-vel
intreq2  : a megszakításkérelem kész.  A kérelem a következô 011-010 váltás
           után jön.
AUDxDAT  : adat betöltés. A csatornába egy 16 bites adat kerül
AUDxDR   : DMA kérelem az Agnus felé egy adatszóért
AUDxDSR  : DMA kérelem az Agnus felé a mutatók újraállításáért
dmasen   : újrakezdés kérelmének engedélyezése
percntrld: a periódusregiszter újratöltése.  Általában a  processzor  végzi
           ezt az AUDxPER regiszterrel (ezenkívül a frekvencia moduláció is
           átírhatja)
percount : a periódus számlálójának csökkentése
perfin   : a periódus számlálója 1-re csökkent (vége)
lencntrld: a hossz számláló újratöltése
lencount : a hossz számláló csökkentése
lenfin   : a hossz számláló 1-re csökkent (vége)
volcntrld: a hangerô újratöltése
pbufld1  : az output buffer betöltése
pbufld2  : az output buffer betöltése 010->011  váltáskor frekvencia modu-
           láció esetén
AUDxAV   : hangerômoduláció. Az adat a következô csatorna periódus regisz-
           terébe megy a D/A átalakító helyett
AUDxAP   : frekvenciamoduláció. Az adat a következô csatorna periódos  re-
           giszterébe  megy a D/A átalakító helyett
penhi    : az adat felsô 8 bitjének engedélyezi az utat a D/A átalakítóba
napnav   : nincs moduláció  vagy  csak  hangerômoduláció van.  Feltétel  a
           normál DMA-ra és megszakításkérelemre
sq2,1,0  : Az állapotbitek  nevei a legmagasabb helyiértéktôl a legalacso-
           nyabbig.















Bevezetés
---------

A blitter egy nagy teljesítményű grafikus eszköz, ami maximum négy DMA csa-
tornát  kezelhet.   A  műveletek,  amiket  a regisztereinek beállítása után
végez,  számottevôen  gyorsabbak,  mint  ha  azt  a  68000-es  csinálná.  A
blittert  adatmásolásra  lehet  használni,  ez magában foglalja a derékszög
koordináta-rendszerben  való másolást és sajátos átalakításokat.  Ezekkel a
lehetôségekkel  grafikus  tárgyakat készíthetünk.  A blitterrel még egyenes
vonalat is rajzolhatunk.  A blitter egy műveletét néha blit-nek nevezzük.

A  blitter  négy DMA csatornát használhat.  Három DMA csatorna van az adat-
forrásra  a memóriából a blitterbe.  Ezeket sourceA, sourceB és sourceC-nek
hívjuk.   A  negyedik  DMA  csatorna  a destinationD.  Amint azt még késôbb
látni  fogjuk,  nem  szükséges  minden esetben használni a három forráscsa-
tornát, azonban a célcsatorna mindig kell.

Minden  csatornát  egymástól  függetlenül  lehet  engedélyezni,  a  BLTCON0
regiszter  11,  10,  9  és  8-as bitjével.  Ezeknek a biteknek a neve USEA,
USEB,  USEC  és  USED.  Mindhárom forrás (ha engedélyeztük ôket) futószalag
technikával  veszi  az  adatokat  a  memóriából  egy  regiszterbe, hogy ott
elvégzett logikai műveletek után a célba juttassa ôket.  Minden csatornának
saját memóriamutató és moduló regisztere van.

A  következôkben  felsoroljuk  a  blitter  műveleteit.  Minden itt szereplô
műveletet  késôbb  részletezünk.  Ezenkívül  érdemes a függelékben szereplô
'BLT'-vel kezdôdô regisztereket átnézni.

- Adatmásolás. A blitter az alsó 512 KByte-os memóriában képes bittérképen
levô alakokat másolni.

- Többszörös mutatók és modulók. A blitter különbözô mutatókat és modulókat
nyújt a forrásoknak és a célnak. Ez lehetôvé teszi a képernyôn levô nagyobb
tárgyak mozgatását.

- Növekvô  és csökkenô címzés.  A blitter képes növekvô és  csökkenô módban
címezni.   Ez  azt jelenti, hogy a blitter képes arra, hogy a források és a
cél  kezdôcímeit a memóriarész elejének vagy végének tekintse, és a munkája
során ezt megfelelôen növelje vagy csökkentse.

- Koordináta vagy lineáris címkezelés.  A blitter képes egy téglalapot vagy
egyenes vonalat kezelni.

- Logikai  műveletek.   A blitter nemcsak egyszerűen átmásolja  az adatot a
forrásból  a  célba,  hanem  a három forrás együttesen határozza meg azt az
értéket, ami majd a célba jut.  Mielôtt a blitter dolgozni kezdene, be kell
állítani,  hogy  a  három  forrásól  milyen  logikai műveletek elvégzésével
legyen  célbakerülô  az  adat.   A  három forráson 256 féle műveletet lehet
elvégezni.

- Eltolás.   A  blitter  képes  egy vagy két forrásból  jövô adatot maximum
tizenöt  bittel  eltolni, ezzel a grafikus elemeket szóhatáron is keresztül
mozgathatjuk.

- Maszkolás.   A  blitter képes lefedni minden sor bal- és jobboldalán levô
szavát.  A maszkolás a blitter adataiban soronként az elsô és az utols szót
érinti.  Ezt a jobb- és a baloldalon elvégzett logikai művelet nyújtja.

- Nulla  érzékelés.   A  blitter  képes a műveletek e redményétôl függôen a
memóriába  visszaírni  az értéket, vagy csak visszaírás nélkül továbblépni.
Ezt  a lehetôséget hardver által segített szoftver ütközésvizsgálatra lehet
használni.

- Területkitöltés.   A  blitter  képes  elôre  megrajzolt  vonalak  közötti
területet kitölteni.

- Egyenesrajzolás.   A  blitter  képes  megszokott  egyenest  húzni bármely
szöggel  és  elôre  meghatározott mintával.  Képes olyan egyenest rajzolni,
amely  vízszintes soronként egy pixelt tartalmaz (ez a speciális mód kell a
területkitöltô blitter művelethez).


Adatmásolás
-----------

A blitter elsôdleges feladata az adatmásolás a memóriában egyszerre nagyobb
egységeket  kezelve.   Másolás  közben  képes  műveleteket  is  végezni  az
adattal.   A  blitter  neve  a  Block  Image Transferrer rövidítése, aminek
jelentése képblokk áthelyezô.

A  képeket  a  memóriában  lineáris formában szokás tárolni.  Minden adatsz
egy  címen  helyezkedik  el, ami eggyel nagyobb, mint a tôle balra álló, és
minden sor elsô szava az alôzô sor utolsó szava után áll.

                           20 21 22 23 24 25 26
                           27 28 29 30 31 32 33
                           34 35 36 37 38 39 40
                           41 42 43 44 45 46 47
                           48 49 50 51 52 53 54
                           55 56 57 58 59 60 61

Az elôzô ábra egy kép egyetlen bittérképét mutatja, ami a memóriában 20-tól
61-ig  tart.   Minden  egyes cím egy szót jelent (16 pixel) a képe egyetlen
bittérképén.   Ha az ábra 16 színbôl áll, akkor négy ilyen bittérképet kell
a memóriában elhelyeznünk, és négy másolással kell ezt mozgatnunk.

A  blitter nagyon hatékonyan képes az adatmásolásra, mert csak az adatblokk
kezdôcímét  (20),  a cél kezdôcímét, az adatblokk magasságát (6) és széles-
ségét  (7)  kell  megadnunk.   Ezután  a  blitter automatikusan mozgatja az
adatokat  egyesével akkor, amikor az adatbusz éppen nem foglalt.  Amikor az
átmásolás befejezôdött, a blitter egy jelzôvel és egy megszakítással üzen a
processzornak.

Megjegyezzük,  hogy  a  másolás (mozgatás) a memóriában történik, ami lehet
éppen a kijelzésre beállított memória is.


Mutatók és modulók
------------------

A  mutatók  olyan  regiszterek, amelyek források és a cél aktuális szavának
címére  mutatnak.   Mivel  a mutatók 512 KByte-os memóriát képesek kezelni,
erre  két  16  bites  regiszter  kell.   Például  a sourceA csatornának két
címregisztere  van.  A BLTAPTL tartalmazza a cím alsó részét (15-0 biteket)
és  a  BLTAPTH  tartalmazza  a cím felsô részét (18-16 biteket).  A mutatók
szóhatárra mutatnak, ezért a nullás bit mindig nulla kell, hogy legyen.

A  következô  regiszterek a B, C és D csatornák mutatói:  BLTBPTL, BLTBPTH,
BLTCPTL, BLTCPTH, BLTDPTL és BLTDPTH.  A BLTxPTx írásmód a címregiszterekre
általában vonatkozik.

A  blitter  a  moduló  regisztereket  arra használja, hogy segítségével egy
nagyobb  képbôl  kisebb  részleteket is kijelölhessünk.  A moduló a nagyobb
kép  és  a kisebb részlet szélességének különbsége.  A blitter négy modulót
különböztet  meg:   BLTAMOD, BLTBMOD, BLTCMOD és BLTDMOD.  Ez azt a lehetô-
séget nyújtja, hogy a forrásoknak és a célnak lehet különbözô mérete is.

A  modulók  16 bites számok.  Amikor ezek hozzáadódnak a címregiszterekhez,
akkor  megfelelôen bôvítve  kerülnek  a  műveletbe, hogy a mutatók legfelsô
bitjei  is  a  helyes  értéket kapják eredményül.  Mivel a mutatók szavakat
címeznek, a moduló nullás bitje mindig nulla.

A  következô  ábra  azt  mutatja, hogyan lehet egy nagy bittérképen egy kis
részletet  kijelölni  a  blitternek.   A  számok  a képet tartalmazó szavak
címeit jelentik.
                           -------------------- <- nagy bittérkép
                           20 21 22 23 24 25 26

                           27 28 29 30 31 32 33
                                 -------- <- kicsi részlet
                           34 35 36 37 38 39 40

                           41 42 43 44 45 46 47

                           48 49 50 51 52 53 54
                                 --------
                           55 56 57 58 59 60 61
                           --------------------

Megjegyezzük,  hogy  ha  csak a kis részletet akarjuk kezelni a blitterrel,
akkor az ennek megfelelô címsorozat a következô:

                       36,37,38,,43,44,45,,50,51,52

Ez  a  sorozat  megköveteli, hogy a növekmény +1 legyen minden cím után, és
minden  sor végén  még négy adódjon a címhez, hogy így a mutató a következô
sorra  mutasson.  Ezt a négyes ugrást nevezzük modulónak, és értéke egyenlô
a nagy bittérkép és a kis részlet szélességének különbségével.

A  blitternek  négy  különálló moduló regisztere van.  Három a forrásnak és
egy  a  çélnak.  Ez  teszi lehetôvé, hogy a nagy bittérkép mérete különbözô
legyen az egyes csatornák esetén, de a kis részlet méretének azonosnak kell
lennie.

Megjegyezzük,  hogy  ugyan  a  hardver  a  mutatókat  csak szavak címzésére
engedélyezi, amikor a regiszterekbe írunk a 68000-essel, akkor az értékeket
byte-okban  kell  megadni. Az elôzô példában tehát a megállapított 4 moduló
érték miatt a regiszterbe 8-at kell írni.


Növekvô és csökkenô címzés
--------------------------

Fontos,  hogy  lehetôség  legyen a feldolgozás irányának vezérlésére akkor,
amikor  a  forrás  és  a cél területe átfedi egymást.  Növekvô vagy csökken
címzést  akkor  állítunk  be,  ha  a forrás és a cél által kijelölt terület
átfedi egymást adatmásolás, vagy területfeltöltés esetén.

Ha  egy adatblokkot akarunk magasabb címre másolni, úgy, hogy a forrás és a
cél területe átfedje egymást, akkor kell a csökkenô címzést választani.  Ha
egy  adatblokkot akarunk alacsonyabb címre másolni, úgy, hogy a forrás és a
cél  területe  átfedje  egymást,  akkor növekvô címzést kell választani.  A
csökkenô címzést a BLTCON1 regiszter 1-es bitjével választhatjuk ki.

Ha  a  forrás és a cél területe átfedi egymást, egy lehetséges megoldás az,
hogy  a  forrást  elmásoljuk  egy  távoli  helyre,  és  ezután  a másolatot
használjuk  forrásként.   Ahhoz,  hogy  elkerüljük  az  adatok elvesztését,
mindíg  ellenôríznünk  kell,  hogy  a másolás irányát helyesen választottuk
meg, vagy pedig a forrást vagy a célt el kell tolni.

A  fejezet  végén  levô táblázat segít megfigyelni, hogy az egyes műveletek
milyen  sorban  követik  egymást  a  blitter  működése  közben.   Érdemes a
megjegyzésekre figyelni, mert ezek segíthetnek a képrajzolásban.


Koordináta vagy lineáris címkezelés
-----------------------------------

A  BLTSIZE regiszterrel jelölhetjük ki a blitter által kezelendô képrészlet
méreteit.   A  BLTxPTx  regiszterek a memóriában a blokkok kezdôcímét adják
meg.   A  blitter   hozzáad  (növekvô  címzésnél),   vagy  kivon  (csökkenô
címzésnél)  ezekbôl  a  regiszterekbôl kettôt minden 16 bites másolás után,
amíg  a  BLTSIZE  regiszter  vízszintes komponense tart.  Ekkor a mutatóhoz
hozzádódik  a  moduló  (BLTxMOD).  A moduló értéke azt adja meg, hogy a sor
végét  követ  szó  címéhez  mennyit  kell  adni, hogy  a következô sor elsô
szavának címét kapjuk.

A blitter lineárisan kezeli a címeket, ha BLTSIZE regiszter vízszintes vagy
függôleges komponensét 1-re állítjuk.


A blitter logikai műveletei
---------------------------

A blitter logikai egysége három forrást használ (A, B, C).  Ez a három for-
rás  általában  egy-egy  bittérkép  különbözô  képekrôl.   Mivel a kijelölt
részlet  pontokból  áll,  az  egészre  azonos  logikai  műveletek  lesznek
végrehajtva.  Célunknak megfelelôen kell a műveletet definiálni, ehhez csak
annyi  szükséges,  hogy  leírjuk, milyen legyen a célba jutó bit a források
összes  kombinációja  esetén.   A  forrásokból  jövô  biteknek  az  összes
variációja csupán nyolc.  Mind a nyolc esetben meg kell határoznunk, hogy a
célba  jutó  bit  1 vagy 0 legyen.  Ezeket az információkat egyetlen helyre
kell  összegyűjteni,  meghatározott formában a BLTCON0 regiszter LF vezérlô
byte-jába  írva,  ahogy azt késôbb látni fogjuk.  Ez a byte határozza meg a
blitter  működését,  a  256  lehetséges  műveletvégzés közül választva, egy
adott blit idejére.

Például,  ha  az LF byte értéke $80 (=10000000 binárisan), akkor csak abban
az  esetben  lesz a célbit 1, ha mindhárom forrásból 1 érkezik.  Minden más
variációban  az  eremény 0 lesz, mert az LF byte 6-0 bitjei, amelyek ezeket
az  eseteket  írják  le, mind 0-ák.  A következô részek két megközelítésben
tárgyalják  az LF byte beállításának módját.  Az egyik logikai műveletekkel
írja le, a másik Venn-diagrammal.


Az LF byte meghatározása logikai úton
-------------------------------------

Mivel  a  blitter  logikai  úton  kombinálja  az  adatbiteket  a  különbözô
bittérképekrôl adatmozgatás közben, ezért hatékonyan használhatjuk grafikák
rajzolására,  animációra.   Például  készíthetünk egy tárgyat kombinálva az
elôzôleg  megrajzolt  háttérrel  (akár  egy  autót  is  mozgathatunk  a már
megrajzolt házak elôtt).

Ezt  a  következô módon érhetjük el:  rajzoljuk meg a hátteret, és az autót
is.   Elôször  mentsük el a hátteret, ahol majd az autó megjelenik.  Ezután
rajzoljuk  ki  (vagyis  másoljuk  a háttérre) a kocsit az elsô pozíciójára.
Aztán  a  hátteret  másoljuk  vissza a helyére, és mentsük el az új helyzet
hátterét.  Az elmentés, kirajzolás, visszamásolás folyamatossága biztosítja
a kívánt hatást.

Legyen  a  sourceA  az  autó körvonala (maszkja), a sourceB az autó bittér-
képeinek  egyike, a sourceC pedig a házak adatai vagy a háttér. A következô
művelet  elmenti  a háttér azon részét, ahol az autó majd megjelenik (a bal
oldalon a cél, a jobb oldalon a források vannak).

                                  T = AC

Ez a  művelet  azt  eredményezi,  hogy a héttérnek az a része, ahol az autó
maszkja és a háttér bitje 1, egy ideiglenese munkaterületre kerül.

Most az autó a háttérre kerül a következô művelettel:
                                         _
                                C = AB + AC

Ebben  a  műveletben  a C a célterület, vagyis amit a háttérre másolunk.  A
háttérre  az  autó adata (B) kerül, ha a maszk (A) is 1, de (vagy) a háttér
adata (C) kerül, ha a maszk (A) 0.

Most a hátteret kell visszaállítani (az autó új helyzetben való kirajzolása
miatt) a következô művelettel:

                                  C = AT

Ez a művelet a háttérre (C) rajzolja az ideiglenesen elmentett hátteret (T)
ott, ahol a maszk (A) értéke is 1.

Ha  az  autó  maszkját és adatait eltoljuk egy új pozícióra és ismételjük a
fenti három lépést, az autó mozogva fog a háttér (házak) elôtt megjelenni.


Logikai műveletek-részhalmazvariációk
-------------------------------------

A  blitter a logikai műveleteket részhalmazok kombinálásával végzi el.  Egy
részhalmaz  a  három forrás egy kombinációja, így összesen nyolc részhalmaz
van.
                                              _
A következô példa két részhalmazt (ABC-t és ABC-t) használ:
                                           _
                               D = ABC + ABC
                                                         _
Ez azt jelenti, hogy a D értéke 1, ha az ABC=1 vagy az ABC=1.

Más  szavakkal  ugyanez:   a D akkor 1, ha az A és a B is 1.  Ennek az oka,
hogy az elôzô sort így is lehet írni:
                                          _
                              D = AB (C + C)
              _                                                     _
Azonban  a (C+C) mindíg igaz, így írhatjuk, hogy D=AB.  Emiatt az ABC és az
ABC  kiválasztása eredményezi majd a D=AB műveletet.  Ezt a két részhalmazt
a BLTCON0 regiszter 7-es és 6-os bitjével választhatjuk ki.

A  részhalmazok,  amiket  a BLTCON0 regiszterrel választhatunk ki, a követ-
kezôk:
                                      _   _   __ _   _ _ __  ___
                Részhalmaz:      ABC ABC ABC ABC ABC ABC ABC ABC
                BLTCON0 LF7-LF0:  7   6   5   4   3   2   1   0

Mivel nyolc részhalmaz van, ezért 256 különbözô műveletet definiálhatunk.


A legfontosabb műveletek táblázata
----------------------------------

A kényelem kedvéért a következô táblázat a legfontosabb műveletekkel:

                       Művelet        LFbyte

                        D=A             F0
                          _
                        D=A             0F

                        D=B             CC
                          _
                        D=B             33

                        D=C             AA
                          _
                        D=C             55

                        D=AC            A0
                           _
                        D=AC            50

                        D=AB            C0
                           _
                        D=AB            30
                          _
                        D=AB            0C
                          __
                        D=AB            03

                        D=BC            88
                           _
                        D=BC            44
                          _
                        D=BC            22
                          __
                        D=AC            11
                          _
                        D=AC            0A
                          __
                        D=AC            05

                        D=A+B           FC
                          _
                        D=A+B           CF

                        D=A+C           FA
                          _
                        D=A+C           AF

                        D=B+C           EE
                          _
                        D=B+C           BB
                            _
                        D=A+B           F3
                          _ _
                        D=A+B           3F
                            _
                        D=A+C           F5
                          _ _
                        D=A+C           5F
                            _
                        D=B+C           DD
                          _ _
                        D=B+C           77
                             _
                        D=AB+AC         CA


Művelet -> LF kód átalakítás
----------------------------

A  következô  rész  egy példát ad arra, hogy a művelet felírása után hogyan
lehet  az  LF  byte-ot kiszámítani.  Az eredményt az elôzô táblázat alapján
ellenôrízhetjük.
                             _
                        D=AB+AC                 (kiindulási művelet)
                               _  _    _
                        D=AB(C+C)+AC(B+B)       (1-gyel megszoroztuk)
                                _ _   __
                        D=ABC+ABC+ABC+ABC       (a művelet végsô alakja)

A  művelet  utolsó  alakja  már csak olyan tagokat tartalmaz, amelyek az LF
byte  egy-egy bitjének felelnek meg.  Az LF byte-ban ezeket a biteket 1-re,
a többit 0-ra kell állítani.
                      _  _   __ _   _ _ __  ___
                ABC ABC ABC ABC ABC ABC ABC ABC  lehetséges variációk
                 1   1   0   0   1   0   1   0   LF binárisan
                 -------------   -------------
                       C               A         LF byte hex.-ben


Az LF byte meghatározása Venn-diagrammal
----------------------------------------

A Venn-diagramm segít az LF byte meghatározásában.  A Venn-diagram nem más,
mint  három  halmaz grafikus ábrázolása, amint az az 1-es ábrán látszik.  A
rajzon a 0-7 számok egy-egy részhalmazt jelentenek.  Ha meghatároztuk, hogy
a  források  milyen  kombinációja  adjon  az  eredményben 1-et, akkor ezt a
megfelelô  részhalmazokkal  kiválaszthatjuk.   A  kiválasztott részhalmazok
számához  1-et,  a többihez 0-át kell írni, amint azt a következô példákban
látni fugjuk.


Példák a Venn-diagramm értelmezésére
------------------------------------

1. Ha  a  D=A műveletet választjuk, akkor venni kell  az összes  részhalmaz
számát,  ami  az  A  halmazban  van.   Ezek  a  részhalmazok  a következôk:
7,6,5,4.  Ekkor ezekhez a számokhoz 1-et, a többihez 0-át kell írni.

                        7 6 5 4 3 2 1 0   részhalmaz sorszám
                        1 1 1 1 0 0 0 0   a kiválasztott részhalmazok
                        ------- -------
                           F       0

2. Ha  olyan  műveletet választunk,  amelyben két  halmaz szerepel, akkor a
két  halmaz közös területén lévô részhalmazokat kell venni.  Például legyen
a  művelet:  AB; (A 'és' B) az A és a B halmaz közös részét jelenti.  Ehhez
a területhez a 6-os és a 7-es részhalmazok tartoznak.

                              7 6 5 4 3 2 1 0
                              1 1 0 0 0 0 0 0
                              ------- -------
                                 C       0
                                           _
3.  Ha a nem műveletet választjuk, például A, akkor azokat a részhalmazokat
kell venni, amelyek nem tartoznak a halmazhoz.

4. Ha  műveleteket  kombinálunk,   akkor  egy  egyszerű  (megengedô) 'vagy'
műveletet  kell  elvégezni  a  bináris részeredményekkel.  Például az AB+BC
eredménye:
                                AB=11001000
                                BC=10001000
                                   --------
                                   11001000=$C8
Eltolás
-------

Amikor a képeket 16 bites szavakon tároljuk, és így akarjuk mozgatni, szük-
ség  van  arra,  hogy a kép egy másik bitpozíción kezdôdjön az adatmozgatás
elôtt és után.

A már említett példában, ahol az autó mozog a házak elôtt, az autó maszkját
és  bittérképét  rajzolásonként  el kell tolni.  A mozgatás folyamán így az
autó  körvonala  és  adata a 16 bitpozíción belül minden lehetséges értéket
felvesz.   Ez  teszi  szükségessé, hogy a blitter képes legyen adatmozgatás
közben nagy sebességű eltolásra.

Ennek megfelelôen a blitter tartalmaz egy eltoló áramkört, amit az A és a B
forrás  használhat.   Az  áramkör  e  két  forrás adatait 0-15 bittel képes
eltolni.  Ez az eltoló teszi lehetôvé a képek mozgatását pixelenként, mégha
a képet 16 bites szavakon tároljuk is.

Két  vezérlôje  van  az  eltolásnak.  A BLTCON0 regiszter 12-15 bitjei az A
forrás  eltolásának  mértékét  adják.  A BLTCON1 regiszter 12-15 bitjei a B
forrás  eltolásának  mértékét  adják.   Mindkét  értéket általában ugyanúgy
állítjuk  be.   Az  eltolást  egy  speciális  esetben a vonalrajzolásban is
használjuk.


Maszkolás
---------

Ha egy tárgy szélessége nem 16 bit, vagy annak többszöröse, akkor a blitter
képes  a  tárgy  bal  oldalát,  jobb  oldalát  vagy  mindkettôt  letakarni
(maszkolni),  hogy  munka  közben  csak  a  tényleges  terület  tartozzon a
tárgyhoz.   Az  elsô  és  az  utolsó maszkolása különösen akkor hasznos, ha
például  egy  karakterkészletet  a memóriában pakolt formában (a szomszédos
betűk összeérnek) kell tárolnunk.

Például legyen a 'H' és az 'I' pakolt formában:

                              111     1111111
                               11     11  11
                               11     11  11
                               111111111  11
                               11     11  11
                               11     11  11
                              111     1111111

Az  'I'  betű  leválasztásához  az elsô 11 bitet kell maszkolni.  A blitter
tartalmazza  ezt  a  lehetôséget, amit az elsô-szómaszkolásnak nevezünk.  A
blitter  ezt a funkciót csak minden sor elsô szavára alkalmazza.  A sourceA
azon bitjei jelennek csak meg, ahol az elsô-szómaszk bitje 1.

Például  ha  az  elsô-szómaszk  (BLTAFWM) értéke 0000000000001111, akkor az
elôzô példában látható forrás helyett a következôvel dolgozik a blitter:

                                   1111
                                    11
                                    11
                                    11
                                    11
                                    11
                                   1111

Ugyanez  történik  utolsó-szómaszkolásnál is (BLTALWM) a sourceA adataival.
Ezt  kihasználva  lehet  egy  forrás  adataiból kiemelni a szükséges részt,
amelynek eleje és vége szóhatárok között van.

Ha  a  kezelendô terület csak egy szó szélességű, (mint amit eddig láttunk)
az elsô és az utolsó szó azonos, így a maszkolás is kétrétegű.  A forrásból
adatbit  akkor  érkezik,  ha  mindkét maszkolás azt engedi.  Az elôzô példa
feltételezi, hogy az utolsó-szómaszk értéke csupa 1, vagyis $FFFF.


Nulla figyelés
--------------

A  blitternek  van  egy  bitje,  ami  azt ellenôrzi, hogy az eredmény csupa
nullából  áll-e.   A  jelzôbit  (a DMACONR regiszter 13.  BZERO nevű bitje)
akkor igaz értékű, ha az eredmény csupa nulla.

Ezt  a  lehetôséget  általában tárgyak ütközésének vizsgálatára használjuk.
Ilyenkor  a  D=AB  műveletet  kell  választani, és ha az eredmény nem csupa
nulla, akkor az A és a B forrásból érkezô tárgyak átfedik egymást.

Amikor  a  művelete elvégzésével csak az a cél, hogy az ütközést eldöntsük,
az eredmény elkészítését letilthatjuk (a cél csatornára nem kerül adat, így
idôt és óraciklusokat nyerünk).  A BLTCON0 regiszter USED bitjét kell ehhez
kikapcsolni.


Területkitöltés
---------------

A  blitter  képes arra, hogy adatmásolás közben zárt grafikus ábrát töltsön
ki.   Ennek  a  szolgáltatásnak  egyetlen  megkötése  van,  az, hogy a zárt
alakzat  folyamatos és egy képpont vastag vonallal legyen megrajzolva.  Ezt
a speciális vonalrajzolást is tartalmazza a blitter.


Normál területkitöltés
----------------------

A következô ábrra egy tipikus területkitöltô folyamatot mutat be:

                          elôtte           utána

                         001000100       001111100
                         001000100       001111100
                         001000100       001111100
                         001000100       001111100

A blitter elôször megrajzolta a két függôleges egyenest, azután kitöltötte
a közöttük levô területet.  A területkitöltéshez a következô lépéseket kell
tennünk (megjegyezzük,hogy a területkitöltést egy másik, hasonló művelettel
egyidôben végezhetjük, de általában mégis különválasztjuk a kettôt):

1. Állítsuk  be  a  modukókat  a  teljes  kép  minusz  a kitöltendô ablak
szélességére.
                          BLTxMOD (x=A, B, C, D)

2.   Állítsuk  a forrás és a cél mutatóit azonos értékre.  Csak egy forrást
kell  kijelölni.   A  mutatókat a kezelendô téglalap jobb alsó szavára kell
állítani (az utolsóra).

                      BLPxPTH,BLTxPTL (x=A, B, C, D)

3. A műveletvégzés (címzés) irányát állítsuk csökkenô üzemmódra. A
területkijelölés csak csökkenô (jobbról balra) irányban lehetséges.

                          BLTCON1 1-es bitje = 1

4. Állítsuk be az 'FCI' bitet aszerint, hogy milyen kitöltést kívánunk.

                          BLTCON1 2-es bitje = 0

Ez a kezdôállapotot 0-ra állítja.

5. Határozzuk meg a téglalap méreteit, amelyeket használni akarunk. Ezt az
értéket a BLTSIZE regiszterbe kell írni, és ezzel a művelet elindul.

Minden sor jobb oldalán a blitter a kezdeti logikai állapotot az FCI bitbôl
veszi.  Ahogy végigpásztázza a forrásterületet (jobbról balra), minden 1-es
bit  invertálja  a  blitter rajzolási módját (0-ról 1-re, vagy 1-rôl 0-ra).
Ez  addig  folytatódik,  amíg  el  nem  éri  a forrásterület bal szélét.  A
következô ábra egy példa a területkitöltésre.  Az FCI bit itt 0 értékű.

                        elôtte              utána

                     1   1  1   1        11111  11111
                     1   1  1   1        11111  11111
                      1  1   1  1         1111   1111
                       1 1    1 1          111    111
                        11     11           11     11
                       1 1    1 1          111    111
                      1  1   1  1         1111   1111
                     1   1  1   1        11111  11111

Ha az FCI bit értéke 1 lenne 0 helyett, akkor az eredmény a következô:

                        elôtte             utána

                    1   1  1   1      111   11111   11
                    1   1  1   1      111   11111   11
                     1  1   1  1      1111  111111  11
                      1 1    1 1      11111 1111111 11
                       11     11      1111111111111111
                      1 1    1 1      11111 1111111 11
                     1  1   1  1      1111  111111  11
                    1   1  1   1      111   11111   11

Kizáró területkitöltés
----------------------

A  BLTCON1  regiszterben két bit van amivel a területkitöltést engedélyezni
lehet.  Az  egyik  az  IFE  (megengedô)  a másik az EFE (kizáró).  Az elôzô
példákban az IFE módot használtuk.

A  kizáró területkitöltési mód azt jelenti, hogy a kitöltés bal szélén szűk
területeket kell kitölteni és éles képre van szükségünk.  A következô példa
ezt az üzemmódot mutatja be.

                     1   1  1   1         1111    1111
                      1  1   1  1          111     111
                       1 1    1 1           11      11
                        11     11            1       1
                       1 1    1 1           11      11
                      1  1   1  1          111     111
                     1   1  1   1         1111    1111

Egyenesrajzolás
---------------

Az  eddig  leírt funkciókon kívül a blitter képes még egyenesrajzolásra is.
Az  egyenesrajzolás-üzemmódot  a BLTCON1 regiszter 0-ás bitjének 1-re állí-
tásával  lehet  bekapcsolni.  Ez esetben a BLTCON0 és a BLTCON1 regiszterek
bitjei  átdefiniálódnak.   A  függelékben  ezeknek a biteknek a leírását is
megtaláljuk.

Egyenesrajzoláshoz a blitter a következô sajátosságokkal rendelkezik:

- Az egyenes hossza maximum 1024 pixel.
- Normál és inverz vonalat képes rajzolni.
- A vonal mintázata programozható.
- Speciális (egy képpont rasztersoronként) üzemmód választható.

A  blitter regisztereinek funkciója megváltozik egyenesrazjolás üzemmódban.
A  következô  táblázat ezeket a jelentéseket tartalmazza.  A függelék ennél
részletesebb leírást tartalmaz az egyenesrajzolásról.

Regiszter bit     bit
név       szám    név    állapot   jelentés

BLTCON0   15-12   START            az elsô pixel vízszintes pozíciója
BLTCON0   11-8    USE     1011     kötelezô az egyenesrajzoláshoz
BLTCON1   15-12   BSH     0        0-ás bit mintája
BLTCON1   5                        foglalt
BLTCON1   4-2                      a kiválasztott nyolcad
BLTCON1   1       SING    0,1      egy bitszélesség beállítása
BLTCON1   0       LINE    1        egyenesrajzolás engedélyezése
BLTADAT   mind            8000     index a vonalrajzoláshoz
BLTBDAT   mind            0-ffff   a vonal mintázata
BLTSIZE   5-0     w       02       vonalrajzolásra kell
BLTSIZE   15-6    h                a vonal hossza
BLTAMOD   mind                     2(2Y-2X)    (*)
BLTBMOD   mind                     2(2Y)       (*)
BLTCMOD   mind                     a teljes kép szélessége
BLTDMOD   mind                     a teljes kép szélessége
BLTAPT    mind                     (2Y-X)      (*)
BLTCPT    mind                     a vonal kezdôcíme
BLTDPT    mind                     a vonal kezdôcíme

(*): az  X  és az Y jelentése:  a vonalhoz tartozó téglalap szélessége és
magassága.


Nyolcadok vonalrajzoláshoz
--------------------------

A  számítógépes  grafikában  általában  amikor egyenest rajzolunk, meg kell
különböztetni  nyolc esetet attól függôen, hogy az egyenes melyik nyolcadba
esik.   A 2-es ábrán azt látjuk, hogy az Amiga az egyes nyolcadokhoz milyen
számot rendel.  Az ábrán a vastag vonalak az x és az y tengelyek.

A nyolcadokra épülô egyenesrajzolás egy egyszerűsítés, ami az x és -x, y és
-y közötti szimmetria miatt lehetséges.  A megfelelô nyolcad kódját a többi
adattal együtt át kell adni a blitternek.

A  2-es  ábrán  zárójelben  lévô számok a nyolcad sorszámát, a többi szám a
BLTCON1  regiszter  4, 3, 2 bitjeinek tartalmát jelentik, amint az a követ-
kezô  táblázatban  is  látszik.   Ezenkívül még érdemes a BLTCON1 regiszter
leírása után lévô táblázatot is megnézni.

                      BLTCON1 bitjei       nyolcad
                          4,3,2            sorszám

                           110                0
                           001                1
                           011                2
                           111                3
                           101                4
                           100                5
                           000                6
                           100                7


Blitterműveletek és a rendszer DMA
----------------------------------

A  blitter  műveletei  befolyással  vannak  a  rendszer  többi  részére.  A
következô rész leírja, hogy a rendszer miként befolyásolja a blitter DMA, a
résidô engedélyezését, a 68000-es, a bittérkép, a blitter és a Copper közös
buszhasználatát és a különbözô képmezô méreteket.


A blitter DMA prioritása
------------------------

A blitter a működéséhez szükséges adatvételezést, módosítást és visszaírást
a  DMA-n  keresztül  végzi.   Ezért  a memóriahozzáférésen osztoznia kell a
rendszerrel és a többi egységgel.  Minden készüléknek van egy meghatározott
prioritása,  ami  utal  az egység fontosságára a többi berendezéshez viszo-
nyítva.

A  lemez  DMA, az audio DMA, a blitter DMA, a bittérkép DMA és a sprite DMA
mind a legmagasabb prioritással rendelkeznek.  A bittérkép prioritása bizo-
nyos  esetekben magasabb, mint a sprite prioritása.  Mind a négy egység le-
foglal valamennyi résidôt minden raszter kijelzésének kezdetekor.  Ha vala-
melyik  egység nem tart igényt a résidôre, akkor a lehetôség nyitva áll egy
másik  egységnek.  Azért van ezeknek az egységeknek elsôdleges prioritásuk,
mert  egy  kimaradt  DMA  ciklus  adatok  elvesztését,  zajt a zenében vagy
megsérült képet okozna.

A  következô  prioritásszint  a Copperé.  Azért alacsonyabb a prioritása az
elôzôeknél,  mert  a  műveleteit  úgyis a teljes képmezô területén végzi az
elektronsugár pásztázásával szinkronban.

A  legalacsonyabb prioritású a blitter és a 68000-es ebben a sorrendben.  A
blitter kapott magasabb prioritást, mert adatmásolást, módosítást, egyenes-
rajzolást sokkal gyorsabban képes végezni, mint a 68000-es.


A DMA résidô foglalása
----------------------

Egy  vízszintes  vonal  megrajzolása alatt (kb 63 ms) 227.5 színciklus vagy
memóriahozzáférési ciklus van.  Egy memória ciklus kb 280 ns idôtartamú.  A
teljes  227.5  ciklus  tartalmazza  a  képmegjelenítést  és  a megjelenítés
nélküli idôt is.  A teljes idôbôl csak 226 ciklus van amelyben lehetséges a
résidô  lefoglalása  azoknak az egységeknek a számára, amelyeknek szükségük
van a memóriahozzáférésre.

A résidô lefoglalása raszterenként a következô:

- 4 ciklus a memóriafrissítésre
- 3 ciklus a lemez DMA-nak
- 4 ciklus az audio DMA-nak (2 byte csatornánként)
- 16 ciklus a sprite DMA-nak (2 szó csatornánként)
- 80 ciklus a bittérkép DMA-nak.

A 3-as ábra azt mutatja, hogy a teljes raszteren belül az egyes ciklusoknál
hogyan érvényesül a résidô lefoglalása.


A bittérkép és a processzor közös buszhasználata
------------------------------------------------

A  68000-es  csak  a  páros  ciklusokat  használja  a memória elérésére.  A
processzor  egy teljes utasítás végrehajtása idejének felét használja belsô
műveletekre, a másik felét pedig a memória elérésére.  A váltakozó ciklusok
miatt  úgy tűnik, mintha a processzor használná egész idô alatt a buszt, és
mintha teljes sebességgel dolgozna.

Némely  processzor-utasítás  nem  egészen  illeszkedik ahhoz, hoygy a páros
ciklusnál  használhatja a memóriabuszt.  Ilyenkor kimaradhat egy használhat
cilus,  és  a  processzornak várnia kell, amíg egy új páros ciklus érkezik.
Azonban a legtöbb utasítás nem okoz cikluskimaradást, így a 68000-es teljes
sebességgel futhat, ha nincs blitter DMA.

    <----------------- átlagos processzor utasítás ------------------>
    <-------------------------------><------------------------------->
     Belsô műveletek végzésére.       A memória elérése.
     Páratlan ciklus más egységek     Páros ciklus a 68000-es részére
     számára.

Ha  a képmezô négy vagy annál kevesebb kisfelbontású bittérképet tartalmaz,
akkor  a  processzor  biztosan használhatja a páros ciklusokat (ha már kész
erre,  és  nincs nála magasabb prioritású egység).  Azonban ha négynél több
bittérkép  van, akkor a bittérkép DMA elkezd ciklusokat lopni a 68000-estôl
kijelzés közben.

Ha  a  kép  hat  bittérkép mély, kisfelbontású, 320 pixel széles, akkor egy
raszter  alatt  160  résidôt  foglal  le  a bittérkép DMA, és ezek 50%-át a
processzortól  lopja  el.   Ennyivel  kevesebb  lehetôsége  van  ilyenkor a
68000-esnek, mintha csak négy bittérképet használna.

                   T                                 T+7
                   +         *         +         *
                 (---)(---)(---)(---)(---)(---)(---)(---)
                        4    6    2         3    5    1

+: nyitott rés, amit a processzor használhat
*: rés, amit nem használhat a 68000-es a bittérkép miatt.

Ha  négy  nagyfelbontású  bittérképet határozunk meg (640 pixel szélesség),
akkor  a  bittérkép  DMA-nak  szüksége van az összes résidôre a képkijelzés
ideje  alatt,  hogy  feldolgozza a soronként 40 szónyi memóriát.  40 szó, 4
bittérkép  vagyis  40*4=160  résidôre  van  szüksége.   Emiatt a processzor
működése teljesen megszűnik a kép kijelzése alatt.

A következô rajz a résidô lefoglalását mutatja nagyfelbontás esetén:

                   T                                 T+7
                 (---)(---)(---)(---)(---)(---)(---)(---)


Különbözô képméretek hatása
---------------------------

Minden  vízszintes  raszter normál méret esetén 320 pixel széles kisfelbon-
tásban,  640  pixel nagyfelbontásban.  Így 20 vagy 40 sz feldolgozására van
szükség  raszterenként.  Ha scrolloztatni akarjuk, akkor még egy plusz szót
kell meghatároznunk soronként.

A  kijelzés  mérete  állítható, amint az a 3.  fejezetben le van írva, és a
bittérkép  DMA  prioritása  magasabb  mint  a  sprite DMA prioritása, így a
nagyobb képernyôk blokkolhatják a nagyobb számú sprite-okat.


A blitter műveleteinek hatása
-----------------------------

Mint már említettük, a blitternek magasabb a prioritása mint a processzoré.
Bizonyos esetekben azonban a blitter és a processzor képes együtt használni
a memóriát.  Ha megadjuk a lehetôséget a blitter minden használható résidôt
el  fog  lopni  a  processzortól.   A  bittérkép,  a  lemez és az audio DMA
elsôbbséget  élvez  a  blitterrel  szemben, így ezeket nem tudja blokkolni.
Van  egy  bit,  amelynek  a  beállításától  függ,  hogy  a blitter teljesen
blokkolja-e  a  processzort.   A  bit neve BLTPRI és a DMACONW regiszterben
található.

Ha  a  BLTPRI értéke 1, a blitter minden elérhetô ciklus magának foglal le.
Ez potencionálisan az összes ciklus.

Ha  a  BLTPRI  értéke  0,  a DMA vezérlô figyelni fog a processzor memória-
igényére.  Ha a 68000-es három ciklus óta kielégítetlen, a blitter átadja a
buszt egy ciklus idejére.

A  következô  táblázat  az  összes  lehetséges műveletvégzést tartalmazza a
hozzájuk tartozó memóriahozzáféréssel.  A táblázat egy művelet három szavát
tartalmazza  (az  elsôt,  egy  középsôt  és  az  utolsót),  és  azt, hogy a
ciklusfoglalások milyen sorrendben történnek.  A következô megállapodásokat
tesszük a táblázatra:

- A, B és C forrást jelölnek.
- D a célt jelöli.
- A  toldalékszám  egy  betű után arra utal, hogy a művelet  során az adott
csatornán  hányadik  szó  halad  át.   Például A0 az elsô szó kivétele az A
forrásból, A1 egy közbensô szó kivétele az A forrásból, az A2 az utolsó szó
kivétele az A forrásból.

BPLCON0    Aktív
  USE    csatornák   ciklussorrend

   F       ABCD      A0 B0 C0 -- A1 B1 C1 D0 A2 B2 C2 D1 D2
   E       ABC       A0 B0 C0 A1 B1 C1 A2 B2 C2
   D       AB D      A0 B0 -- A1 B1 D0 A2 B2 D1 -- D2
   C       AB        A0 B0 -- A1 B1 -- A2 B2
   B       A CD      A0 C0 -- A1 C1 D0 A2 C2 D1 -- D2
   A       A C       A0 C0 A1 C1 A2 C2
   9       A  D      A0 -- A1 D0 A2 D1 -- D2
   8       A         A0 -- A1 -- A2
   7        BCD      B0 C0 -- -- B1 C1 D0 -- B2 C2 D1 -- D2
   6        BC       B0 C0 -- B1 C1 -- B2 C2
   5        B D      B0 -- -- B1 D0 -- B2 D1 -- D2
   4        B        B0 -- -- B1 -- -- B2
   3         CD      C0 -- -- C1 D0 -- C2 D1 -- D2
   2         C       C0 -- C1 -- C2
   1          D      D0 -- D1 -- D2
   0       semmi     -- -- -- --

Mwgjegyzések:

- Nincs területkitöltés
- Három szón végzett művelet
- Tipikus műveletvégzési sorrend:  minden forrásból kétszer olvas,  mire az
elsô adat a célba kerül.  Figyelni kell erre a jelenségre, ha a forrás és a
cél átfedésbe kerül.

Az  elôzô  táblázat  csak a tipikus műveletvégzési sorrendet mutatja be.  A
ciklusok állandóan változnak a művelet módjától, a processzor hatáskörétôl,
bittérképektôl és a többi DMA csatornától függôen.


Egy teljes blitter példa
------------------------

A  következô  példa  beállítja  a  blittert, hogy töröljön a memóriában egy
blok-  kot.  A  program  feltételezi,  hogy  rendelkezésre állnak megfelelô
include file-ok, hogy a szimbólumok definiálva legyenek.

Ez  a program csak egy egyszerű példa.  Azok a programozók, akik a blittert
közvetlenül  akarják  használni,  egyszerűbben kezelhetik az OwnBlitter (),
DisownBlitter () és WaitBlit () rutinok meghívásával.  A függvények leírása
az 'AmigaROM Kernel Manual'-ban található.

include exec/types.i
include hardware/custom.i
include hardware/blit.i

        xref    _custom
;
; Az elôzô művelet végére vár
;
WAITBLIT:
        BTST    #DMAB_BLTDONE-8,DMACONR(A1)
        BNE.S   WAITBLIT
        RTS
;
; Amikor a művelet befejezôdött, a blitter mutatója a következô feldol-
; gozandó szóra mutat.
; A0 az elsô törlendô szó
; D0 a törlendô memória hossza
;
CLEARMEM:
        LEA     _CUSTOM,A1              ; a regiszterek báziscíme
        MOVE.L  A0,BLTPTD(A1)           ; a cél beállítása
        CLR.W   BLTMOD(A1)              ; a moduló törlése
        ASR.L   #1,D0                   ; a szavak száma
        CLR.W   BLTCON1(A1)             ; nincs speciális üzemmód
        MOVE.W  #DEST,BLTCON0(A1)       ; csak a cél van kijelölve
;
; Ez a rutin szétvágja a műveletet több részre, így tölti fel a blittert
; balról kezdve
;
        MOVEQ   #$3F,D1
        AND.W   D1,D1
        BEQ.S   LABEL1
        SUB.L   D1,D0
        OR      #$40,D1
        MOVE.W  D1,BLTSIZE(A1)
LABEL1:
                                        Megjegyzés: a D1 felsô szava 0000
        MOVE.W  #$FFC0,D1               ; a felsô bitek
        AND.W   D0,D1                   ; 10 továbbit bit kiemelése
        BEQ.S   LABEL2                  ; van még más?
        SUB.L   D1,D0                   ; hány 128 Kbyte-os blokk van még?
        BSR     WAITBLIT                ; vár a következô m`velet végétr
        MOVE.W  D0,BLTSIZE(A1)          ; a következô művelet indítása
LABEL2:
        SWAP    D0
        BEQ.S   DONE                    ; felsô bitek ellenôrzése
        CLR.W   D1                      ; 128 Kbyte-os művelet egy idôben
LOOP:
        BSR     WAITBLIT
        MOVE.W  D1,BLTSIZE(A1)
        SUBQ.W  #1,D0
        BNE.S   LOOP
DONE:
;
; Kilépés. Megjegyezzük, hogy az utolsó művelet még folyamatban lehet.
; Az Amiga rendszer szoftverének egyik elônye, hogy az ilyen
; szinkronizálást elvégzi.
;
        RTS

Blitter blokkdiagram
--------------------

A 4-es ábra egy 16 bites művelet elvégzésének diagramját mutatja. Ez az
ábra nem tartalmazza az egyenesrajzolás hardverét.

(1): A  bal felsô sarokban lévô rész az elsô és  az utolsó szó  maszkolását
végzi.   Amikor  a művelet egy szó szélességű területre vonatkozik, mindkét
maszkolás ugyanarra a szóra érvényes.

(2): Eltoló  berendezések  (jobb  felsô sarok és bal oldal középen).   A 16
bites  adatot  32  bites  eltoló  tolja  el meghatározott mértékkel, amit a
BLTCON0 és BLTCON1 regiszterek írásával állíthatunk be.

(3): Művelet  generátor  (jobb  oldal  középen).  A bitekkel  kiválasztható
műveleteket illusztrálja.

(4): Az  ábra mutatja, hogy ha területkijelölést  választunk,  ez a művelet
egy szokványos művelettel egy idôben futhat.

(5): Az ábra alján látszik,  hogy a generált adat elkerüli,  hogy beírása a
blitter vezérlô bitjeit használja.

(6): Nem  látszik az ábrán a nullaellenôrzô áramkör,  ami a generált  bitek
mindegyikét  felhasználja.   Ha  legalább  egy  1-es  bit  generálódott, az
eredmény 1 lesz.














Bevezetés
---------

Ez  a  fejezet  az  Amiga  rendszerének vezérlô hardverét tárgyalja, magába
foglalva a következô ténákat:

- Hogyan lehet a képmezôk és a sprite-ok relatív prioritását állítani.
- Hogyan lehet a grafikus tárgyak ütközését ellenôrízni.
- Hogyan vezérelhetô a DMA.
- Hogyan lehet megszakításokat vezérelni és érzékelni.


Video prioritás
---------------

Vezérelni  tudjuk  a  különbözô  grafikus  tárgyak prioritását a képernyôn,
ezáltal  háromdimenziós  kép  illúzióját  kelthetjük.   Ez  a  fejezet  azt
mutatja,  hogy  hogyan állíthatjuk be a képmezôk prioritását a sprite-okhoz
képest.


Rögzített sprite prioritások
----------------------------

A  sprite-ok  közötti  relatív prioritás nem változtatható.  Az alacsonyabb
számú  sprite-oknak  magasabb  a  prioritásuk,  ezért  ezek  a  többi elôtt
látszódnak  átfedéskor.   A  prioritást  illusztrálja  az  SPR fejezet 5-ös
ábrája.


A sprite-ok csoportosítása
--------------------------

A  prioritás  és  az  ütközés  szempontjából  a  sprite-okat négy csoportba
osztjuk, mindegyik csoport két-két sprite-ot tartalmaz:

                            0-ás és 1-es sprite
                            2-es és 3-as sprite
                            4-es és 5-ös sprite
                            6-os és 7-es sprite


A prioritás értelmezése
-----------------------

A  video  prioritás fogalmát könnyen megérthetjük az 1-es ábra alapján:  az
egyik kezünk négy ujja a négy pár sprite-ot jelképezi, míg másik kezünk két
ujja  a  két  képmezôt.   A  négy ujjunk sorrendjét nem tudjuk felcserélni,
ahogy  nem  tudjuk s sprite-ok relatív prioritását változtatni.  A négy ujj
közé  a  két  ujjat  számos  módon  fűzhetjük  egymásba,  ugyanúgy, ahogy a
sprite-ok  jelennek  meg a képek elôtt és mögött.  Ezt illusztrálja az 1-es
ábra.

Négy  lehetséges  helyre  tehetjük  az  egyes képmezôket:  0-1 sprite-ok el
(0),  0-1  és 2-3 sprite-ok közé (1), 2-3 és 4-5 sprite-ok közé (2), 4-5 és
6-7  sprite-ok  közé  (3),  vagy  a 6-7 sprite-ok mögé.  Ezek a lehetôségek
mindkét képmezônek adottak.

Az  elôzô  bekezdésben  a  zárójelben lévô szám adja azt az értéket, amit a
prioritást  vezérlô  regiszterbe  kell  írni,  ha  a hozzá tartozó takarás-
kombinációt akarjuk beállítani.

Az  egyes  képmezôk  relatív  prioritását  is  állíthatjuk, ezzel növelve a
variációk számát.


A prioritás beállítása
----------------------

A  prioritás vezérlô regiszter segítségével beállíthatjuk, hogy mely grafi-
kus  tárgyak  látszódjanak  a többi elôtt, és mely grafikák a többi mögött.
Normál  esetben az 1-es képmezô a 2-es képmezô elôtt jelenik meg.  A PF2PRI
nevű  bittel  lehet  a két képmezô közötti prioritást beállítani.  A teljes
prioritást a BPLCON2 regiszterrel állíthatjuk be a következô módon:

Bit     Név       Funkció

15-7              használaton kívül, értéke 0
  6     PF2PRI    a 2-es képmezô prioritása
 5-3    PF2P2-0   2-es képemzô és a sprite-ok prioritása
 2-0    PF1P2-0   1-es képemzô és a sprite-ok prioritása

A  PF1P2-PF1P0-ban  beállított  bináris érték által meghatározott prioritás
láncot  mutatja a következô táblázat.  Az itt található értékek megegyeznek
az elôzô bekezdésben szereplô leírással.

                  Érték        prioritás sorrendje

                   000    PF1    SP01  SP23  SP45  SP67
                   001    SP01   PF1   SP23  SP45  SP67
                   010    SP01   SP23  PF1   SP45  SP67
                   011    SP01   SP23  SP45  PF1   SP67
                   100    SP01   SP23  SP45  SP67  PF1

A  táblázatban használt jelölések:  PF1:  1-es képemzô, SP01:  a 0-ás és az
1-es  sprite-ok  csoportja,  SP23:   a  2-es és a 3-as sprite-ok csoportja,
SP45:   a  4-es  és  az  5-ös  sprite-ok csoportja, SP67:  a 6-os és a 7-es
sprite-ok csoportja.

A  PF2P2-PF2P0 bitek a 2-es képmezôt helyezik el a sprite-ok között.  Azon-
ban  a PF2PRI nevű bit azt határozza meg, hogy a két képmezô egymást hogyan
takarja.   A  követkeąô  példa  lehetséges, de egy kicsit furcsa beállítást
tartalmaz:
                   Bit:  15-7  PF2PRI  PF2P2-0  PF1P2-0

Ennek eredménye a következô:

Az  1-es  képmezô takarja a 0-ás és az 1-es sprite-okat, és a 0-3 sprite-ok
takarják  a 2-es képmezôt.  A 2-es képemzô azonban takarja az 1-es képmezôt
mindenhol,  ahol átfedésbe kerülnek, és a 2-es képmezô nincs blokkolva a 03
sprite-ok valamelyikével.


Ütközésvizsgálat
----------------

A  hardver lehetôséget nyújt két spritecsoport ütközésének vagy egy sprite-
csoport  és  egy  képmezô  vagy  két képmezô és ezek bármilyen kombinációja
ütközésének lekérdezésére.

Az  ütközések elsô fajtája egy gyakori játékokban való alkalmazás, amikor a
lövedék  és  a  játékos ütközik.  A második típus, amikor a mozgó tárgyak a
kijelölt  képhatárral  ütköznek.  A harmadik típus, amikor egy képrészletet
definiálunk  egy  sajátos tárgyként, és ezt blitter segítségével mozgatjuk.
Ezt  képmezô-animációnak  hívjuk.  Tegyük fel, az egyes képmezô háttérként,
vagy játéktérként van definiálva, a másik képmezôt tárgyak definiálására (a
sprite-okkal együtt) használjuk.  Így képesek vagyunk érzékelni az ütközést
a képemzô-tárgy és egy sprite között, és a két képmezô között.


Az ütközés meghatározása
------------------------

A  video  output  akkor  alakul  ki,  amikor  az  összes  bittérképrôl és a
sprite-okról  megérkeztek  az  adatok,  és ezek összekombinálódtak.  Minden
képponton  a  legnagyobb  prioritású  tárgy  jelenik  meg.   Ütközés  akkor
történik,  ha  egy  pozíción  több  tárgy  is áll.  Ez a jelenség egy bitet
beállít az ütközés regiszterben.


Az ütközés adatainak értelmezése
--------------------------------

Az  ütközés  (neve  CLXDAT)  csak olvasható regiszter.  Ha ezt a regisztert
olvassuk,  akkor  tartalma  automatikusan  törlôdik.   A következô táblázat
tartalmazza a bitek funkcióját:

Bit      ütközés tipusa
 15      semmi
 14      4-es (vagy 5-ös) sprite a 6-os (vagy 7-es) sprite-tal
 13      2-es (vagy 3-as) sprite a 6-os (vagy 7-es) sprite-tal
 12      2-es (vagy 3-as) sprite a 4-es (vagy 5-ös) sprite-tal
 11      0-ás (vagy 1-es) sprite a 6-os (vagy 7-es) sprite-tal
 10      0-ás (vagy 1-es) sprite a 4-os (vagy 5-ös) sprite-tal
  9      0-ás (vagy 1-es) sprite a 2-es (vagy 3-as) sprite-tal
  8      páros bittérkép a 6-os (vagy 7-es) sprite-tal
  7      páros bittérkép a 4-es (vagy 5-ös) sprite-tal
  6      páros bittérkép a 2-es (vagy 3-as) sprite-tal
  5      páros bittérkép a 0-ás (vagy 1-es) sprite-tal
  4      páratlan bittérkép a 6-os (vagy 7-es) sprite-tal
  3      páratlan bittérkép a 4-es (vagy 5-ös) sprite-tal
  2      páratlan bittérkép a 2-es (vagy 3-as) sprite-tal
  1      páratlan bittérkép a 0-ás (vagy 1-es) sprite-tal
  0      páratlan bittérkép a páros bittérképpel


Az  elôzô  táblázatban  a  zárójelben  szereplô szám arra utal, hogy azok a
sprite-ok  csak  akkor vesznek részt az ütközés vizsgálatában, ha ezt külön
kérjük.   Az  ütközés  vezérlô regiszter bitjeivel lehet beállítani, hogy a
páratlan  számú  sprite-okat  a rendszer figyelmen kívül hagyja-e, vagy egy
csoportba sorolja a párjával.

Megjegyezzük,  hogy  a  bittérképekre  vonatkozó ütközésvizsgálat független
attól,  hogy a kép dupla képmezôs vagy normál.  Az ütközésvizsgálat mindkét
esetben csak arra utal, hogy a páros és a páratlan bittérképek ütköztek-e.


Az ütközésvizsgálat vezérlése
-----------------------------

Az  ütközés  vezérlô regiszter (neve CLXCON) bitjeivel az ütközés vizsgálat
karakterisztikáját  lehet  beállítani.   A  bitek  funkcióját  a  következô
táblázat tartalmazza:

 Bit      Név     Funkció

  15      ENSP7   7-es sprite engedélyezése
  14      ENSP5   5-ös sprite engedélyezése
  13      ENSP3   3-as sprite engedélyezése
  12      ENSP1   1-es sprite engedélyezése
  11      ENBP6   6-os bittérkép engedélyezése
  10      ENBP5   5-ös bittérkép engedélyezése
   9      ENBP4   4-es bittérkép engedélyezése
   8      ENBP3   3-as bittérkép engedélyezése
   7      ENBP2   2-es bittérkép engedélyezése
   6      ENBP1   1-es bittérkép engedélyezése
   5      MVBP6   6-os bittérkép ütközésmintája
   4      MVBP5   5-ös bittérkép ütközésmintája
   3      MVBP4   4-es bittérkép ütközésmintája
   2      MVBP3   3-as bittérkép ütközésmintája
   1      MVBP2   2-es bittérkép ütközésmintája
   0      MVBP1   1-es bittérkép ütközésmintája


A  12-15 bitek azt határozzák meg, hogy az ütközés vizsgálatakor a páratlan
számú sprite-ok részt vegyenek-e, vagy sem.  A páros számú sprite-ok mindig
résztvesznek  az  ütközés  vizsgálatában.  A 11-6 bitek azt határozzák meg,
hogy  az  egyes bittérképek részt vegyenek-e az ütközés vizsgálatában, vagy
sem.   Az 5-0 bitekkel egy mintát lehet beállítani.  A rendszer akkor jelez
ütközést,  ha  az  itt  beállított  minta  ütközik  valamivel.   Ezt  akkor
használhatjuk,  ha azt akarjuk például megtudni, hogy egy sprite ütközött-e
'valami  zölddel'  vagy  'valami  kékkel'.   Ezáltal lehetôségünk nyílik az
ütközések pontos érzékelésére, és az egyes típusok elkülönítésére.

MEGJEGYZÉS:   Ez  a  regiszter  csak  írható.   Ha  az  összes  bittérképet
letiltjuk, akkor az ütközés mindig létrejön.


Elektronsugár pozíciójának érzékelése
-------------------------------------

Néha  szükség  lehet  arra, hogy a processzort szinkronizáljuk az elektron-
sugárral.   Elôfordulhat,  hogy  a képmemóriát azután akarjuk újraállítani,
hogy a kijelzés már elkezdôdött.

Az  elektronsugár  pozíciója meghatározható, így a programunk a sugár álla-
potától  függôen  végezheti feladatát.  Megjegyezzük, hogy a Copper is ren-
delkezik  azzal  a lehetôséggel, hogy az elektronsugár pozíciójától függôen
végezzen  regiszterekbe  írásokat.   Ennek leírása a 2-es fejezetben talál-
ható.

Ha  fényceruzát  használunk,  akkor  ezen  a  címen  nem  az  elektronsugár
pozíciója,  hanem  a  fényceruza  pozíciója van.  Ennek részletes leírása a
8-as fejezetben található.


A sugárszámláló használata
--------------------------

Az  elektronsugár  pozícióját  négy  regiszter  tartalmazza.   Ezek leírása
látható a következô táblázatban:

VPOSR (csak olvasható)

15. bit : LOF (hosszú keret) a LACE üzemmód inicializálása
14-1 bit: használaton kívül
0. bit  : függôleges pozíció felsô (8-as) bitje. Ez a bit ad lehetôséget a
          PAL rendszerben való 313 vonal ábrázolására PAL verziós Amigán.

VHPOSR (csak olvasható)

15-8 bit: a függôleges pozíció alsó bitjei (7-0)
7-0 bit : a vízszintes pozíció bitjei (8-1). Az egység a képernyô széles-
          ségének 160-ad része.

VPOSW (csak írható)

A bitek funkciója azonos a VPOSR regiszterével

VHPOSW (csak írható)

A  bitek  funkciója  azonos a VHPOSR regiszterével.  A számlál szinkronizá-
lására használjuk.


Általában  a  regiszterpárokat  (VPOSR,  VHPOSR  és VPOSW, VHPOSW) egyetlen
hosszúszós címzéssel írjuk be.  Ilyenkor a legnagyobb helyiérték regisztert
kell címezni:  VPOSR-t vagy VPOSW-t.


Megszakítások
-------------

A rendszer a 68000-es processzor megszakításainak egy sorát tartja fenn.  A
megszakítások  különféle formáit generálják a külsô chipek és a hardver.  A
hét lehetséges megszakításból így hatfélét lehet generálni.


Maszkolhatatlan megszakítás
---------------------------

A  7-es  szintű  megszakítás a maszkolhatatlan megszakítás.  Ezt a rendszer
nem  képes  sehogyan  sem  elôállítani.   A  68000-es  megszakítási vonalai
(IPL2-IPL0) a  bôvítô  portra  vannak  vezetve, így onnan ezt a 7-es szintű
megszakítást elôállíthatjuk.


Maszkolható megszakítások
-------------------------

Ezek  az  1-6  szintű megszakítások.  A rendszer regisztereivel ezek a meg-
szakítások maszkolhatók, így ha akarjuk, bármelyik generálása letiltható.


Felhasználói interfész a megszakítási rendszerhez
-------------------------------------------------

A  rendszerszoftvert úgy tervezték, hogy pontosan kezelje az összes hardver
megszakítást 1-tôl 6-ig.  Két megszakítási vonalat a bôvítô portra vezettek
ki, az INT2-t és az INT6-ot.  Mindkét vonal aktív szintje alacsony.  Ezeket
a  vonalakat  lehet külsô források megszakításainak generálására használni.
Ezeket  a  vonalakat  külsô  alacsony  és  külsô  magas névvel ismertetjük.
Ezeket  a megszakítási vonalakat is a perifériás chip-pel összekötötték, és
ezek a 2-es és a 6-os szintű megszakításokat állítják elô.


Megszakításokat vezérlô regiszterek
-----------------------------------

Két  megszakítási  regiszter van:  az egyik engedélyezô, a másik kérelmezô.
Mindkét regiszternek külön van az írható és az olvasható része.

A regiszterek a következôk:

INTENA:   megszakítás  engedélyezô regiszter.  Csak írható.  Beállítja vagy
törli az INTENAR bitjeit.

INTENAR:   csak  olvasható.   Az  INTENA regiszter tartalmát olvashatjuk ki
belôle.

INTREQ:   csak  írható.   Megszakítás  kérelem.   Használatával megszakítás
végrehajtására kényszeríthetjük a processzort (szoftvermegszakítás).  Ezen-
kívül  a  megszakítást  kérô  lábak  törlésére  is  használhatjuk, amikor a
megszakítás végrehajtása befejezôdött.

INTREQR:   csak  olvasható.   A  megszakításkérelem  olvasása.  Tartalmazza
azokat a biteket, melyekkel meghatározható a megszakítás kérésének adatai.

A  kérelem  regiszterének  bitjei  azonos funkciókkal bírnak, mint az enge-
délyezô  regiszter  megfelelô  bitjei.  Az egyetlen különbség annyi, hogy a
csak olvasható regiszterekben a 15-ös bitnek nincs funkciója.


A bitek törlése és beállítása
-----------------------------

A  megszakítási regiszterek beállítása a DMA vezérlô regisztereinek beállí-
tásához  hasonlóan  elég  speciális.   Ezen regiszterek 15-ös bitjének neve
SET/CLR.

Ha  egy  bitet  1-re  akarunk  állítani, akkor a megfelelô bitet és a 15-ös
bitet 1-re kell állítani és az így kapott értéket kell a regiszterbe írni.

A  14-0  bitek  az  ún.   bit kiválasztások.  Írjunk 1-et azokba a bitekbe,
amiket  meg  akarunk  változtatni,  és  1-et  vagy  0-t a 15-ös bitbe attól
függôen,  hogy  beállítani vagy törölni kívánjuk a kiválasztott biteket.  A
14-0  pozíción  azoknak  a  biteknek  nem  változik az értékük, amikbe 0-át
írunk.   Ha  ezekben  a regiszterekben néhány bitet be akarunk állítani, és
néhányat törölni, akkor kétszer kell beleírni.


A fô megszakítás engedélyezése
------------------------------

Az  INTENA  regiszter  14-es  bitje a fô megszakítás engedélyezô.  Ha ezt a
bitet  nem  állítjuk 1-re, akkor az összes megszakítás tiltva marad.  Ezt a
bitet  arra  használhatjuk,  hogy  ideiglenesen  letiltjuk  vele  az összes
megszakítást, amíg néhány kritikus dolgot elvégzünk a processzorral.

MEGJEGYZÉS:   ezt  a  bitet csak engedélyezés/letiltás vezérlésére használ-
hatjuk.  Ezen a pozíción nem kérhetünk 'fô' megszakítást.


Külsô megszakítások
-------------------

A  megszakítási  regiszterek 13-as és a 3-as bitje a külsô megszakításoknak
van  lefoglalva.   A  13-as bit akkor változik 1-re, amikor a rendszer INT6
nevű  vonala  logikai  0  állapotba  kerül.   A  13-as  bit  egy 6-os szint
megszakítást  generál.  A  3-as bit akkor változik 1-re, amikor a rendszerű
INT2  nevű  vonala  logikai  0  állapotba  kerül.   A  3-as  bit 2-es szint
megszakítást generál.


Az elektronsugár megszakítása
-----------------------------

Az  5-ös  bit (VERTB) megszakítást vált ki akkor, amikor az elektronsugár a
0-ás  raszterbe  ér.  Ez a függôleges üres intervallum kezdete.  A rendszer
gyakran  használja  ezt  a  megszakítást  különbözô  feladatok elvégzésére,
például  a  mutatók  újraírására,  a  copperlista változtatására és még sok
másra is.

Az üres intervallum minimális hossza 20 raszter, a 0-ás sorban kezdôdik, és
a  20-as  sorig  tart.   Ezt  a  határt  azonban  megváltoztathatjuk,  ha a
megjelenítôablak  kezdetét  átállítjuk.   Ennek  leírása  a 3-as fejezetben
található.

Ha  ez  a  bôvítés  nem  elég, akkor a Coppert használhatjuk egy 3-as szint
megszakítás  generálására.  A  Copper  megszakítása  lehet az ablak legalsó
sora után közvetlenül.


A Copper megszakítása
---------------------

A 4-es bit a Copper megszakításának bitje.  Ez egy 3-as szintű megszakítást
generál.   Mivel  a  Copper  képes  bármely regiszter értékéhez hozzáférni,
ezért a megszakítási regisztereket is képes olvasni és átírni.  Ezt a bitet
a rendszer azonban arra használja, hogy a Copper megszakítását azonosítsa.

Általában  ezt  a  bitet arra használjuk, hogy eldöntsük, hogy az elektron-
sugár  elérte-e  már  a  meghatározott pozíciót vagy sem.  Ha igen, akkor a
megfelelô feladatot el lehet végezni.


Az audio megszakításai
----------------------

A  10-7  bitek (AUD3-AUD0) a hangcsatornákhoz vannak rendelve.  Az AUDx bit
az x-edik csatornához kapcsolódik (x=0,1,2,3).

Ezek  a  bitek  4-es szintű megszakítást hoznak létre.  Ha a hangot automa-
tikus  módban (DMA-val) hozzuk létre, akkor a megszakítás abban a pillanat-
ban  jön  létre,  amikor  a  hangtáblázatból  az utolsó adatot is kivette a
rendszer.   Kézi  üzemmódban (DMA nélkül) ez akkor következik be, amikor az
adatregiszter  kész egy újabb adat fogadására. További információ található
az 5-ös fejezetben a megszakításokról.


A blitter megszakítása
----------------------

A  6-os  bit  (BLIT)  egy 3-as szintű megszakítást generál.  Ha ez a bit 1,
akkor  a  blitter  elvégezte  a  kijelölt  feladatát,  és  kész  egy  újabb
befogadására.


A lemezegység megszakítása
--------------------------

A  12-es és az 1-es bit kapcsolódik a lemezegységhez.  A 12-es bit (DSKSYN)
arra  utal,  hogy  a  lemez  szinkron  regiszterének  tartalma megegyezik a
lemezrôl érkezô adattal.  Ez egy 5-ös szintű megszkítást hoz létre.

Az  1-es  bit  (DSKBLK) arra utal, hogy az adatblokknak vége van.  Ezt arra
lehet  felhasználni,  hogy  a kijelölt DMA művelet végét jelezze.  Ez a bit
egy 1-es szintű megszakítást generál.  A lemezegység megszakításairól még a
8-as fejezetben olvashatunk.


A soros port megszakításai
--------------------------

A soros port megszakításai a megszakítás regiszter következô bitjeivel függ
össze:

A  11-es  bit (RBF) arra utal, hogy az UART input buffere adatot tartalmaz,
amit kiolvashatunk.  Ez a bit egy 5-ös szintű megszakítást generál.

A  0-ás  bit (TBE) arra utal, hogy az UART output buffere adatot igényel és
ezt most beírhatjuk.  Ez a bit egy 1-es szintű megszakítást eredményez.


DMA vezérlés
------------

Több  DMA  funkció  működik  a rendszer műveletei közben. Van egy olvasható
regiszter  ugyanúgy,  mint ahogy írható van.  Ennek a regiszternek a segít-
ségével  határozhatjuk  meg,  hogy  mely  DMA-k  legyenek  engedélyezve.  A
regiszterek neve a következô:

              DMACONR: DMA vezérlô regiszter - csak olvasható
              DMACON : DMA vezérlô regiszter - csak írható

A következô táblázat tartalmazza a regiszter bitjeinek funkcióját.

 Bit    Név      Funkció

  15    SET/CLR  a beállítás/törlés jelzôbitje
  14     BBUSY   blitter foglalt jelzôbit
  13     BZERO   csak olvasható.  Értéke 1,  ha az  egész  blitter  művelet
                 alatt az eredmény mindig 0 volt.
12,11            használaton kívül
  10    BLTPRI   ha a bit értéke 1,  akkor a  blitternek  elsôbbsége  van a
                 processzor elôtt. Ha a bit értéke 0, akkor ez az elsôbbség
                 csak részleges.
   9    DMAEN    a fô DMA engedélyezése
   8    BPLEN    bittérkép DMA engedélyezése
   7    COPEN    Copper DMA engedélyezése
   6    BLTEN    blitter DMA engedélyezése
   5    SPREN    sprite DMA engedélyezése
   4    DSKEN    lemez DMA engedélyezése
  3-0   AUDxEN   audio DMA engedélyezése. Az x jelenti a csatorna számát.

A  DMA  kezelésével  kapcsolatban  a  következô  fejezetekben  találunk még
információkat:
                          Sprite   : 4-es fejezet
                          Bittérkép: 3-as fejezet
                          Blitter  : 6-os fejezet
                          Disk     : 8-as fejezet
                          Audio    : 5-ös fejezet
                          Copper   : 2-es fejezet














Bevezetés
---------

Ez  a  fejezet  azzal  foglalkozik,  hogy  az  Amiga miként tud kapcsolatot
létesíteni a külvilággal.  A fejezet a következô témákat dolgozza fel:

- Egér (botkormány), fényceruza portok
- Lemezvezérlô
- Billentyűzet
- Párhuzamos I/O interfész
- RS-232-C kompatibilis soros interfész
- RAM kártya (512 Kbyte-os bôvítéshez)
- Bôvítô busz interfész
- Audio output
- Video output (RGB, NTSC, RF modulátor)


Vezérlôport interfész
---------------------

A  számítógépben  van  két  kilenctűs  csatlakozó, amin keresztül különbözô
vezérlô  egységeket  csatlakoztathatunk.   Az  1-es  ábra azt mutatja, hogy
milyen ez a csatlakozó és milyen a szabványos dugója.


A vezérlô port olvasása
-----------------------

Az  egér,  a  botkormány  és  a  fényceruza azonos csatlakozót használ, bár
működésük  alapvetôen különbözô.  Emiatt az adott eszköz által használt tűk
funkciója függ a vezérlô típusától.


Egér és pozícionáló gömb
------------------------

Az  egér  és  a pozícionáló gömb inputja azonos kapcsolókat használ, mint a
botkormány.  A közöttük lévô kapcsolat a következô:  a botkormány 'jobb' és
'hátra'  vonalát  használja  az  egér  és  a  pozícionáló  gömb  vízszintes
elmozdulásának  értelmezésére,  a  'bal'  és  'elôre'  vonalakat  pedig  a
függôlegesre.

Amikor  impulzusok  érkeznek  az  egérbôl,  vagy  a pozícionáló gömbbôl egy
mozdulat hatására, akkor egy számláló csökken, vagy növekszik, hogy kövesse
a  mozgást.  A leírás következô részei csak az egérrel foglalkoznak, mert a
pozícionáló gömb teljesen azonosan működik.


A mozgás irányának vizsgálata
-----------------------------

Képzeljük el, hogy az egér egy rajz fölött mozog.  Ez a mozgás megjelenik a
képernyôn,  egy  egérrel vezérelt tárgy mozgásaként.  Mivel a mozgás minden
iránya  pontosan  a  tárgy  mozgásává  alakul,  a  képernyôn  a rajz pontos
másolata jelenik meg.

A  számláló  növekszik, ha az egér jobbra vagy lefelé mozog, és csökken, ha
az  egér  balra vagy felfelé mozog.  Az X,Y koordináták utalnak a képernyôn
lévô  tárgy pozíciójára.  Az X=0 és Y=0 pozíció a képernyô bal felsô sarka.
Az X=Xmax és Y=Ymax pozíció a képernyô jobb alsó sarka.


A számlálók olvasása
--------------------

Az  egér  (pozícionáló  gömb) számlálói olvasásra hozzáférhetôk.  A regisz-
terek  címének  neve:   JOY0DAT és JOY1DAT.  Ezek tartalmazzák a bal (0) és
jobb  (1)  vezérlôport  adatait.   Mindkét  regiszter  16  bites.   A bitek
kiosztása:

15-8 bit: egér (pozícionáló gömb) függôleges számlálója
 7-0 bit: egér (pozícionáló gömb) vízszintes számlálója


A számlálók határértékei
------------------------

Ezek  a  számlálók  körbefutnak pozitív és negatív irányban is.  Ha ellenô-
rízni  akarjuk,  hogy  az egér milyen mozgást végez, az egyik képernyôfris-
sítéskor  el  kell menteni a számláló értékét, és ezt ki kell vonni a szám-
láló  következô  képfrissítéskori  értékébôl.   A különbség meghatározza az
egér  pozícióját  és sebességét.  A számláló értékét minden képfrissítéskor
ki  kell olvasni, hogy mindig ismerjük az egér mozgását az utolsó kiolvasás
óta.

Az  egér  kb.   200  számláló  impulzust küld 1 inches (2.54 cm) elmozdulás
közben,  vízszintes  és  függôleges  irányban  is.   Egy másodperc alatt 60
képfrissítés  történik.   Ha képfrissítésenként kiolvassuk a számlálót, két
egymás  utáni  érték  nagyon  valószínű, hogy nem tér el egymástól 127-tel,
vagy  annál  többel.   Ez  csak akkor történhet meg, ha az egér 72 inch/sec
(6.6 Km/h) sebességgel mozog, ez pedig valószínűtlenül nagy sebesség.

Ha  két  egymást  követô  értékbôl  kivonjuk  egymást, a különbség abszolút
értéke  fogja  megadni  a  sebességet.   A  különbség elôjele (pozitív vagy
negatív) meghatározza, hogy az egér melyik irányba mozog.

A  következô  táblázat megadja az összes esetet, ami elôfordulhat két mérés
esetén.  A táblázat a számlálókat elôjel nélkülinek tekinti.


            Elôzô érték    Pillanatnyi érték     Irány

                 200              100            fel (bal)
                 100              200            le (jobb)
                 200               45            le (*)
                  45              200            fel (**)

Megjegyzések:
(*) :  Mivel  200-45=155,  ami  nagyobb  mint  127,  a  valóságos  érték
       255-(200-45)=100,  és  az  irány:  'le'.
(**):  45-200=-155.   Mivel  a -155 abszulút értéke  meghaladja a 127-et, a
       valóságos érték 255+(-155)=100, és az irány:  'fel'.

Az  Amiga egerén két gomb van, azonban a vezérlô port áramköre az egeret és
a pozícionáló gömböt hárommal kezeli.

-  Az 1.  gomb (bal oldalon az Amiga egéren) a vezérlô port 6.  tűjéhez van
kapcsolva.   A  trigger  vonalat  a  PA7  (port 1 tűzgomb) és a PA6 (port 0
tűzgomb)  biteken  keresztül lehet olvasni.  A logikai 1 állapot jelentése:
'kapcsoló nyitva', a 0 állapot jelentése:  'kapcsoló zárva'.

-  A 2.  gomb (jobb oldalon az Amiga egéren) a vezérlô port 9.  tűjéhez van
kapcsolva.   Ezt  mint potenciométert lehet olvasni.  A potenciométer olva-
sására még visszatérünk.

-  A 3.  gombot csak akkor használhatjuk, ha egy más típusú vezérlô eszközt
csatlakoztatunk.  Ez a gomb a vezérlô port 5.  tűjéhez van kapcsolva.


A botkormány
------------

A  botkormány négy egyszerű iránnyal rendelkezik, mindegyikhez egy kapcsoló
tartozik.   A  kapcsolók  egy-egy  tűre vannak kötve.  Az 1-es, 2-es, 3-as,
4-es  tűkhöz az elôre, hátra, balra, jobbra irányok tartoznak.  A tűzgomb a
6.  tűhöz van kötve.

Minden  kapcsoló  alapállapotban  nyitva  van.   Ez az 1 logikai állapotnak
felel  meg.   Ha  a  kapcsoló  zár, vagyis földre köt, a logikai érték 0-ra
vált.  A föld a 8. tű.

A  botkormány adatainak olvasása nem túl egyszerű, mert regiszterei hasonló
elvűek,  mint az egér regiszterei.  Ezek a regiszterek a JOY0DAT (port0) és
a JOY1DAT (port1).  A következô ábra azt mutatja, hogyan kell feldolgozni a
botkormány adatait.


Adatbit   Működés

   1      'jobb' irány kapcsoló
   9      'bal' irány kapcsoló
1 XOR 0   a 0-ás és az 1-es bitek kizáró vagy művelete adja a 'hátra'
          irányt
9 XOR 8   a 8-as és a 9-es bitek kizáró vagy művelete adja az 'elôre'
          irányt

Az analóg vezérlôk
------------------

Mindkét  vezérlôport képes két változtatható ellenállásra épülô berendezést
kezelni  (ezeket  hívjuk analóg vezérlôknek).  Ez a fejezet azt részletezi,
hogy  hogyan  kell  ezeknek a beviteli eszközöknek lekérdezni az állapotát.
Az  analóg  vezérlôknek  két nagy csoportja van:  a potenciométer pár és az
X-Y  analóg  botkormány.   Egy  potenciométer  pár  tartalmaz két független
egységet,  mindkét  egység  egy  ellenállásból  és  egy  tűzgombból áll, és
mindkettô egy csatoló egységgel kapcsolódik a vezérlôporthoz.  Az általános
összeállítás a 2-es ábrán látható.

Egy  X-Y  analóg  botkormányban a két ellenállás egyenként az X és Y tenge-
lyekre  vannak  kapcsolva.   A  következô  táblázat  az  általános összeál-
lításokat tartalmazza.

          tű    egér        pot.méter     analóg       botkormány
               poz.gömb       pár       botkormány

          1   F impulzus    semmi        semmi          elôre (*)
          2   V impulzus    semmi        semmi          hátra (*)
          3   FQ impulzus   bal gomb     1-es gomb      balra (*)
          4   VQ impulzus   jobb gomb    2-es gomb      jobbra (*)
          5   3-as gomb     jobb pot.m   X pot.m        semmi
          6   1-es gomb     semmi        semmi          1-es gomb
          7   +5V           +5V          +5V            +5V
          8   föld          föld         föld           föld
          9   2-es gomb     bal pot.m    Y pot.m        2-es gomb

(*): aktív állapotban alacsony


Analóg vezérlôk gombjának olvasása
----------------------------------

A  potenciométerre  épülô  vezérlô  két  gombjának lekérdezése megegyezik a
botkormány gombjának lekérdezésével.


Analóg vezérlôk pozícióleolvasása
---------------------------------

Az  analóg vezérlôk pozíciójának lekérdezését egy elôzetes munka vezeti be.
Normál esetben ezt az elektronsugár visszatérô idejében kell elvégezni.  Ez
a művelet az operációs rendszer részét alkotja.

Az  elektronsugár visszatérésekor a POTGO nevű regiszterbe kell egy értéket
írni.   Ez  az  érték  egy  standard X-Y botkormány esetén $0001.  A beírás
hatására  bizonyos  hardver  elemek működésbe lépnek, amik a potenciométert
olvassák,  és  nullára  állítják a POT regisztereket (ezek leírására késôbb
kerül sor).

Az  olvasó  áramkör  reset állapotba tér az elsô hét-nyolc raszter kijelzé-
séig.  Ezt követôen egy kondenzátornak töltést küld ellenálláson keresztül.
Minden  vízszintes vonalnál ezután az áramkör összehasonlítja a kondenzátor
töltését  egy  beállított  értékkel.   Ha  a töltés kevesebb, egy számlálót
növel,  ha  a töltés több, a számláló értéke nem változik a következô POTGO
írásáig.


A változó ellenállás hatása
---------------------------

Normál  esetben  a  POTGO-t a képernyô tetején adjuk ki, és a pot regiszter
értékét  az  elektronsugár  visszaugrásakor  olvassuk  ki  azelôtt,  hogy a
következô  POTGO-t  kiadnánk.   (Mégegyszer  megjegyezzük,  hogy mindezt az
operációs rendszer elvégzi).

A rendszerben semmi sincs, ami megakadályozná, hogy a számlálók túlcsordul-
janak (vagyis a 255-ös értéket meghaladják).  A rendszer azonban olyan kié-
pítésű, hogy egy képernyô alatt mégsem lehetséges a túlcsordulás.  Ez teszi
lehetôvé, hogy biztosak legyünk abban, hogy a számláló nem csordult túl.

262  vagy  263  raszter van az NTSC képen, a POT számlálók pedig 8 bitesek,
így  maximális  értékük  255.   Ez az oka annak, hogy a vezérlô áramkör vár
hét-nyolc rasztert, mielôtt mérni kezd.  Ezzel a 255-ös túlcsordulást elôzi
meg.


Az analóg vezérlôk regiszterei
------------------------------

A következô regiszterek az analóg vezérlôket kezelik:

             POT0DAT: 0-ás port adata (függôleges/vízszintes)
             POT1DAT: 1-es port adata (függôleges/vízszintes)

A bitek kiosztása:

                        15-8 bit: POT0Y vagy POT1Y
                         7-0 bit: POT0X vagy POT1X

Az  összes  számláló  értéke 0-ra áll, amikor a POTGO-t beírjuk.  A számlá-
lókat ezután egy képfrissítéssel kell kiolvasni.


A potenciométer adatai
----------------------

Az  ellenállásnak lineáris potenciométernek kell lennie, és ennek maximális
ellenállása nem lehet több 528K-nál (470K +/-10% ajánlott).  Ez egy konden-
zátorra  van  kötve,  melynek  kapacitása  0.047 uf (+/-10%) és a maximális
töltési ideje 16.6 millisec (egy képfrissítés).


Fényceruza
----------

Fényceruzát csak a bal oldali (0) portba kapcsolhatunk.  Ez a kapcsolás nem
látható az elôzô ábrán.  Fényceruza esetén a tűkiosztás a következô:

                      Tű      Funkció

                      7       +5V
                      8       föld
                      5       ceruza a képernyôhöz ér
                      6       érzékelô pozíciója

Az  5-ös  tűn  levô  kapcsoló alapállapotban nyitva van, azonban záródhat a
földhöz.  Ez a kapcsoló a fényceruza orrában van, így akkor zár, amikor azt
hozzányomjuk  a  képernyôhöz.   Megjegyezzük, hogy ez a kapcsoló a potenci-
ométerek  egyikének  inputjához  van csatolva, tehát ennek megfelelôen kell
kezelni.   A  6.  tű a normál botkormány egy irányát használja, ami trigger
kapcsoló.

A fényceruza működése (ha engedélyezve van):

1: Amikor  az  elektronsugár  a  bal  felsô  sarokba  ugrik,  a  fényceruza
automatikusan újra engedélyezôdik.
2: Az  elektronsugár  a  képet soronként  balról jobbra készíti,  a sorokat
pedig fentrôl lefelé.
3: A  fényceruza  egy  trigger  jelet küld abban a pillanatban,  amikor  az
elektronsugár elhalad az orra elôtt.
4: Ez  a  trigger  jel  utasítja a  belsô áramkört,  hogy mentse el a VPOSR
regiszter  tartalmát.   Ennek segítségével lehet meghatározni a hely pontos
függôleges és vízszintes pozícióját, ahol a fényceruza a képernyôhöz ért.


A fényceruza regisztereinek olvasása
------------------------------------

A  fényceruza  regisztereinek címe megegyezik az elektronsugár pozíciójának
számlálójával.  Ezek a következôk:

VPOSR : 15.  bit: long frame
        14-1 bit: használaton kívül
        0.   bit: F8, a függôleges pozíció legmagasabb bitje

VHPOSR: 15-8 bit: F7-F0, a függôleges pozíció
         7-0 bit: V8-V1, vízszintes pozíció

A  két  regisztert  egyszerre címezhetjük hosszúszóként a VPOSR regiszteren
keresztül.

A pozíciót a következô felbontásban kapjuk:

Függôlegesen: 1 vízszintes sor no-lace esetén
              2 vízszintes sor lace esetén
Vízszintesen: 2 kisfelbontású pixel kis és nagy felbontásban is.

A  fényceruza  engedélyezéséhez  a  BPLCON0 regiszter 3-as bitjét 1-re kell
írni.   Ha  egyszer  a  fénuyceruza  engedélyezve  van,  és egy trigger jel
érkezett,  a  VPOSR  regiszterben lévô érték befagy (a számláló továbbmegy,
csak  a  kiolvasott  érték  nem  változik).  Ez a befagyás a függôleges 20.
pozíción  szűnik meg.  A rendszerben nincs olyan bit, ami azt mutatná, hogy
a trigger jel megérkezett-e, ezt azonban a következôképpen dönthetjük el:

1: Olvassuk ki a VPOSR (hosszúszó) regisztert kétszer.
2: Ha a két érték nem azonos, a trigger jel még nem érkezett meg.
3: Ha  a két érték egyezik, akkor a 32 bites adat  felsô 15 bitjét le  kell
takarni,  és  az  így  kapott  értéket  össze  kell  hasonlítani $10500-lal
(Y=261).
4: Ha a VPOSR regiszter értéke nagyobb mint $10500,  akkor még nem érkezett
trigger  jel  az  utolsó  képmezô  teteje  óta.   Ha az érték kisebb, akkor
érkezett trigger jel, és a kiolvasott érték éppen ennek a pozíciója.

Valamivel  egyszerűbb  a  következô módszer, amivel a fényceruza pozícióját
lekérdezhetjük.  Néha ez látszik célravezetôbbnek.

1: Olvassuk  ki  a VPOSR regiszter 32 bites tartalmát  (egyszer)  az Y=0 és
Y=20 közti intervallumban.
2: Takarjuk  le  a  32  bites  adat  felsô 15 bitjét  és hasonlítsuk  össze
$10500-lal (Y=261).
3: Ha  a  VPOSR  regiszter  értéke nagyobb  $10500-nál,  akkor még nem jött
trigger  jel  az utolsó képfrissítés óta.  Ha az érték kisebb, a fényceruza
küldött trigger jelet, és a kiolvasott érték a ceruza pozíciója.


Speciális vezérlôk csatlakoztatása
----------------------------------

Az  Amiga  képes  az  itt  leírt  beviteli  eszközökön kívül egyéb vezérlôk
olvasására  és értelmezésére, a vezérlô vonalakra épített POTGO regiszteren
keresztül  (címe:   $DFF034).  Az itt található leírás alapján az egyes tűk
funkcióját átdefiniálhatjuk az új vezérlônek megfelelôen.

A következô táblázat egy részlet a függelékbôl, ami a POTGO regisztert írja
le.   A  POTGO  (címe:  $DFF034) regiszter csak írható, és a vezérlô portot
kezeli.   A  POTGOR (címe:  $DFF016) regiszter csak olvasható, és szintén a
vezérlô  portot  kezeli.   Ez  a két regiszter együtt használja a négybites
kétirányú I/O portot, aminek négy tű felel meg.

Bit    Név     Funkció

15     OUTRY   output engedélyezés a jobboldali port 9. tűjén
14     DATRY   I/O adat a jobboldali port 9. tűjén
13     OUTRX   output engedélyezés a jobboldali port 5. tűjén
12     DATRX   I/O adat a jobboldali port 9. tűjén
11     OUTLY   output engedélyezés a balboldali port 9. tűjén
10     DATLY   I/O adat a balboldali port 9. tűjén
 9     OUTLX   output engedélyezés a balboldali port 5. tűjén
 8     DATLX   I/O adat a balboldali port 5. tűjén
7-1    X       chip azonosítására foglalt
 0     START   kondenzátor töltésének elindítása

Nemcsak  potenciométer  olvasására  használhatjuk, hanem mint egy négybites
I/O portot is lehet használni.  Ez azt a hatást nyújtja, mintha még két-két
tű lenne mindkét vezérlô portban általános I/O célra.

Ha  egy OUTxx bitet magasra állítunk, ezzel a potenciométert leválasztjuk a
portról.   Ami  a  DAT..  bitek tartalma (1 vagy 0), az fog a megfelelô tűn
megjelenni.

Ha  inputként  akarjuk  használni  a  portot, írjunk a POTGO-ba csupa 0-át.
Ezután  a csak olvasható POTGOR regiszterbôl beolvashatjuk a tűk állapotát.
Az  input  biteket  befolyásolja  a  START bit a POTGO regiszterben.  Ezt a
jelet  használjuk  a  tűzgomb  lekérdezésére.  Hogy ezt megtegyük, állítsuk
magasra  a vonalakat (az OUT..  és a DAT..  biteket 1-re).  Amikor a gombot
valaki  megnyomja,  a vonal záródik a földdel, és a POTGOR olvasása 0-át ad
eredményül.  Ha a gomb nincs lenyomva, az eredmény 1 lesz.


Lemezvezérlô
------------

A  lemezvezérlô  ebben  a  rendszerben  négy  darab  3.5  vagy  5.25 inches
lemezegységet  tud kezelni.  Egy 3.5-ös lemezegység beépítve van az alapgép
dobozába, a többit kívülre csatlakoztathatjuk.

A lemezműveleter elvégzésére számos regiszter van. Ezek a következô csopor-
tokba oszlanak:

- kiválasztás, motor vezérlés, érzékelés
- lemez DMA csatorna vezérlés, DMA engedélyezés
- lemez adatainak írása/olvasása
- lemez formázásának vezérlése
- megszakítások generálása


Kiválasztás, vezérlés, érzékelés
--------------------------------

A  lemez  alrendszer  két  8520-as  portot és egy FLAGS megszakítási portot
használ.  A bitek leírása következô táblázatban van.

A  CIA-A  (címe:  $BFE001) portnak négy input bitet biztosít az alrendszer.
A CIA-B (címe:  $BFD000) port teljesen az output biteknek van kialakítva.

Port  Tű   Név        Funkció

CIAA  PA5  DSKRDY*    lemez kész (aktívan alacsony)
CIAA  PA4  DSKTRACK0* A fejek  éppen a  0-ás  track felett vannak  (aktívan
                      alacsony)
CIAA  PA3  DISKPROT*  A lemez írásvédett (aktívan alacsony)
CIAA  PA2  DSKCHANGE* A lemezt kivette valaki az egységbôl. Ez a jel  addig
                      marad,  amíg a fejek arrébb nem lépnek (aktívan  ala-
                      csony)
CIAB  PB7  DSKMOTOR*  A lemez motorjának vezérlése (aktívan alacsony). Ez a
                      jel nem standard az Amigán. A bit értéke nem változik
                      meg, amíg a SEL* bitet be nem kapcsoljuk,  és addig a
                      motor állapota sem változik. Minden program, ami több
                      meghatót használ,  a kiválasztás elôtt állítja be ezt
                      a bitet,  és a lemezegység  emlékezni  fog a  motorja
                      állapotára  amíg nincs  kiválasztva.  Minden meghajtó
                      motorja ki van kapcsolva reset után.
CIAB  PB6  DSKSEL3*   3-as meghajtó kiválasztása (aktívan alacsony)
CIAB  PB5  DSKSEL2*   2-es meghajtó kiválasztása (aktívan alacsony)
CIAB  PB4  DSKSEL1*   1-es meghajtó kiválasztása (aktívan alacsony)
CIAB  PB3  DSKSEL0*   0-ás meghajtó kiválasztása (aktívan alacsony)
CIAB  PB2  DSKSIDE*   A két fej közül választás.  A 0 jelenti a felsô fejet.
CIAB  PB1  DSKDIREC   A  fejek  elmozdulásának iránya.  A 0 jelenti a közép-
                      pont felé való mozgást.  A 0-ás track a lemez külsején
                      van.
CIAB  PB0  DSKSTEP*   A meghajtó fejeinek léptetése.  Ezt a bitet mindig im-
                      pulzusként  kell mezelni  (elôször alacsony, aztán ma-
                      gas).  Ha a bitet  alacsonyan  hagyjuk,  és közben más
                      meghajtót választunk, akkor a rendszer megzavarodik.
CIAB FLAG  DSKINDEX*  ($BFDD00 4. bitje) Ezzel lehet egy 6-os szintű megsza-
                      kítást kérni.

Lemez DMA vezérlés
------------------

Az  adatok  normál  esetben  a lemezrôl a memóriába és vissza DMA csatornán
keresztül mennek.  A lemez DMA-t négy dolog vezérli:

- A mozgatandó adat memóriaterületére mutató vektor.
- A DMA-val mozgatandó adat hossza.
- Az adat áramlásának iránya (olvasás/írás).
- DMA engedélyezése.


Mutató az adatra
----------------

Egy  19  bit  méretű  mutatót  kell  beállítanunk,  ami  kijelöli  annak  a
memóriaterületnek  a kezdetét, ahonnan adatot kell írni, vagy ahova olvasni
kell  a  lemezrôl.   A  legalacsonyabb  bitnek  0-nak kell lenni, mert ez a
memóriacím nem lehet páratlan szám.

Ezt  a  címet  a DSKPTH és a DSKPTL nevű regiszterekbe kell írni.  A DSKPTH
tartalmazza  a  felsô három bitet, a DSKPTL pedig az alsó tizenhatot.  Ez a
két  regiszter  a memóriában közvetlenül egymás után áll egy hosszúsz hatá-
ron,  így egyetlen címzéssel a mutató beírható.  A címzés legyen hosszúszó,
és a DSKPTH-ras mutasson.


Hossz, irány, DMA engedélyezése
-------------------------------

Az  összes  vezérlô  bit,  ami ebben a rendszerben elôfordul, mind egyetlen
regiszterben  található,  a  DSKLEN-ben.  A  bitek  kiosztása  a  következô
táblázatban található:

Bit   Név     Funkció

15    DMAEN   Lemez DMA engedélyezés
14    WRITE   Lemez írás, ha az értéke 1
13-0  LENGTH  A mozgatandó szavak száma

A DMAEN nevű bitet és a rendszer DMA bitet helyesen kell beállítani, hogy a
lemez  DMA engedélyezése megtörténjen.  Ezzel kapcsolatban további informá-
ciókat találunk a 7.  fejezetben.

A  hardver  megkövetel  egy speciális folyamatot a DMA beindításakor.  Ez a
sorrend  megakadályozza  a  véletlenszerű  lemezírást.   Röviden  a  DSKLEN
regiszterben  lévô  bitet  kétszer  kell  bekapcsolni, hogy engedélyezzük a
lemez DMA-t.  Az egész folyamat a következô:

1: Állítsuk $4000-ra a DSKLEN regisztert, hogy a DMA ki legyen kapcsolva.
2: Helyezzük a kívánt értéket a DSKLEN regiszterbe.
3: Írjuk mégegyszer ezt az értéket a regiszterbe, ezzel a DMA elindul.
4: Amikor a  DMA  elvégezte feladatát,  állítsuk a  DSKLEN-t $4000-ra, hogy
   megakadályozzuk a véletlenszerű lemezreírást.

Minden  adatszó  transzformálásakor  a  LENGTH érték csökken.  Minden adat-
transzformáláskor a DSKPTH, DSKPTL nevű mutató értéke növekszik.  A feladat
elvégzésekor  a  mutató arra a szóra mutat, amit a következô menetben lehet
olvasni,  vagy  írni. Amikor a LENGTH értéke 0-ra csökken, a transzformáció
véget ér.

A  lemezrôl  való  olvasás  egy ajánlott módja, hogy olvassunk be egy egész
track-et  egy  bufferbe,  és  ezután  a memóriában keressük meg a szükséges
szektorokat.   Ezzel az eljárással csak egyszer kell olvasni egy track-rôl.
Ezenkívül  így  nem  jutunk  idôzavarba,  így  más  magas prioritás alrend-
szereknek (grafika, audio) a futás engedélyezett.

Ha  nincs  elég  memória  egy  track  betöltésére, vagy más okból nem lehet
egyszerre  egy  egész  track-et  tárolni,  a hardver lehetôséget ad szektor
keresésére.   Van  egy regiszter, ami lekérdezi, hogy az adatáramlás milyen
állapotban van.

A  hardverben van egy hiba, ami miatt az utoljára küldött adat utolsó három
bitje  elveszik,  és  a  bejövô  adatoknál  is  ez a helyzet, így egy lemez
olvasási műveletnél a DMA egy szóval kevesebbet ad, mint amennyit kértünk.


Egyéb lemezvezérlô regiszterek
------------------------------

Számos  regiszter  kapcsolódik  még  a  lemezműveletekhez,  amelyeket  itt
határozunk meg.

DSKBYTR - adat és állapot beolvasása
------------------------------------

Ez  a regiszter a lemezvezérlô adatbuffere.  Olvasás üzemmódban a lemez egy
byte-ot  olvas  be  egyszerre.  Amikor egy byte megérkezik a regiszterbe, a
BYTEREADY  bit  igaz állapotba kerül, és akkor törlôdik, amikor a DSKBYTR-t
kiolvassuk.

A  DSKBYTR  regisztert  a  rendszer  programja  kezeli,  mert  az  olvasást
szinkronizálni  kell az adat rotációjával.  A regiszter bitjeinek leírása a
következô:

Bit  Név        Funkció

15   BYTEREADY  Arra utal, hogy a regiszter érvényes adatbyte-ot tartalmaz.
                Az olvasás törli ezt a bitet.
14   DMAON      A DMA bit (a DSKLEN regiszterben) engedélyez, a DMACON bit-
                jei szintén. Az összes DMA bitnek bekapcsolva kell  lennie,
                hogy a lemez DMA valóban engedélyezve legyen.
13   DISKWRITE  A lemezre való írás  engedélyezésének bitje  (a DSKLEN  re-
                giszterben).
12   WORDEQUAL  Arra utal, hogy a DISKSYNC regiszter egyenlô a lemezrôl jö-
                vô adattal.  A bit  állapota addig  igaz,  amíg az adatáram
                megfelel a DSKSYNC-nek (ez kb. két mikroszekundum).
11-8            Nem használható.
7-0  DATA       A lemez adatbyte-ja.


ADKCON és ADKCONR
-----------------

A regiszter írható címe az ADKCON, az olvasható címe az ADKCONR.  Az utolsó
nyolc bitet az audio áramkör használja.  A többi bit leírása a következô:

Bit  Név        Funkció

15   CLR/SET    Használata azonos a DMA engedélyezô bittel. 1-nek kell len-
                nie, ha beállítani akarunk, 0-nak, ha törölni.
14   PRECOMP1   Precomp felsô bitje.
13   PRECOMP2   Precomp alsó bitje. A kombinációk: 00: semmi
                                                   01: 140 ns
                                                   10: 280 ns
                                                   11: 560 ns
12   MFMPREC    A 0 érték GCR-t jelent, az 1 érték MFM-et.
11   UARTBRK    Az 1 érték a Paula chip serial portját 0-ra állítja (ez egy
                RS-232-C break).
10   WORDSYNC   Az 1-es érték engedélyezi a szinkronizálást, és elindítja a
                lemez DMA-t egy szó beolvasására.  A szinkron szó a DSKSYNC
                regiszterben van.
 9   MSBSYNC    Az 1-es érték az MSB mikrosec/bit sebességet határoz meg.
 8   FAST       Az 1-es érték  2 mikrosec/bit sebességet határoz meg (álta-
                lában MFM). A 0 érték 4 mikrosec/bit sebességet határoz meg
                (általában GCR).
7-4  ATPER0-3   Audio vezérlô (nem lemez).
3-0  ATVOL3-0   Audio vezérlô (nem lemez).

Az  Apple  típusú  számítógép  a GCR formátum egy változatát használja.  Az
Apple  formátumó  lemezen  az  adatbyte-ok  legfelsô  bitje  mindig 1.  GCR
formátumú  lemez  olvasásakor ezt át kell egy táblázat (nibble-izer) segít-
ségével  fordítani.   A 9-es bit 1-es értéke utasítja a lemezvezérlôt, hogy
ezt a szinkronizációs bitet keresse minden byte-ban.

A  DSKSYNC  regisztert  az input adatáram szinkronizálásárea használhatjuk.
Ha az ADKCON regiszterben lévô WORDEQUAL bitet 1-re állítottuk, akkor addig
nem érkezik adat a lemezrôl, amíg nem talált egy olyan szót, ami megegyezik
a DSKSYNC regiszterben tárolttal.  Amikor a DSKSYNC-ben lévô szó megvan, az
INTREQ  regiszterben  lévô  DSKSYNC  nevű bit 1-re vált. Az INTREQ-ban lévô
DSKSYNC bit független a WORDEQUAL bittôl.


DSKDAT és DSKDATR - az adatregiszterek
--------------------------------------

Ezeket  a  regisztereket  csak  ellenôrzésre  használhatjuk.  A DSKDAT csak
írható, a DSKDATR csak olvasható.  Ez a regiszter a lemez DMA adat buffere.
Két  byte-ot tartalmaz, amit ki kell írni, vagy be kell olvasni a lemezrôl.
Az  írás  üzemmódot a DSKLEN regiszter 14-es bitjével lehet bekapcsolni.  A
DMA  vezérlô  automatikusan  végzi  az  adatátadást a RAM és ez a regiszter
között.


A lemezegység megszakításai
---------------------------

A lemezvezérlô kétféle megszakítást képes elôidézni:

- DSKSYNC (5-ös szint, INTREQ 12-es bitje):  az input adatáram megegyezik a
  DSKSYNC regiszter tartalmával.
- DSKBLK (1-es szint, INTREQ 1-es bitje): a lemez DMA működése befejezôdött

Mindkét megszakítás magyarázata megtalálható a 7. fejezetben.


A billentyűzet
--------------

A  billentyűzet  egy 8520 CIA chiphez kapcsolt vonalpáron keresztül kapcso-
lódik.   A  két vonal a következô:  CNT:  input a billentyűzetrôl és az SP:
input, output.


A billentyűzetadat fogadása
---------------------------

A  CNT  vonalat  a CLOCK vonalnak használjuk.  Ennek a vonalnak a változása
jelenti egy-egy bit érkezését a billentyűzetrôl.  A billentyűzet akkor küld
ezen a vonalon jelet, amikor az SP vonalon a küldendô adat egy bitje már be
van  állítva.   Ez  a  jel  egy  alacsony  szintű impulzus.  Az impulzust a
felfutó él váltja ki.

A  8520-as chip fel van szerelve egy belsô soros eltoló regiszterrel, ami a
CNT  vonalat  órajelként,  az SP vonalat adatjelként használja.  A függelék
tartalmazza a 8520-asra vonatkozó adatokat.

Miután  egy adatbyte megérkezik a billentyűzetrôl, egy megszakítást generál
a  8520-as  a  processzornak.   A  billentyűzet  vár  egy  kézfogás jelre a
rendszer  felôl,  és  amíg  ez  nem  érkezik  meg,  nem  küld új adatot.  A
'kézfogás'  jelentése,  hogy  a  rendszer  az SP vonalat alacsonyta állítja
legalább 75 mikrosec ideig.

Ha  egy  újabb  billentyű  lenyomódik,  mielôtt a rendszer fogadta volna az
elôzôt, a billentyűzet processzor (a billentyűzetbe építve) tárolja azt egy
bufferben, aminek a hossza megközelítôleg 10 billentyűkód (a billentyűkódok
magyarázata a következô részben van).


A beérkezô adat típusa
----------------------

A  billentyűzetrôl  érkezô  adatok nem ASCII formátumú karakterek.  Ezek az
adatok  billentyűkód  formátumúak.  Ezek a kódok magukba foglalják a lenyo-
mást  és  a felengedést is.  Tehát a programunk e két kódhalmazból pontosan
meg tudja határozni, hogy mi is történt a billentyűzeten.

A  következô  részben  a  billentyűkódok találhatók.  Az itt levô értékek a
billentyű  lenyomásakor  keletkeznek.   A  billentyű  felengegedése  az itt
található értéknél $80-nal többet generál.  A 3-as képen egy rajz található
a billentyűzetrôl.

A 128 lehetséges billentyűkódot logikailag csoportokba foglaljuk:

$00-$37:  ezek a billentyűk a fô billentyűtestben vannak.  Ezek országfüggô
helyzetűek, pozíciójuk változó lehet.

$40-$4F:   ezeknek  a  billentyűknek  speciális  jelentésük  van, általában
azonosak minden billentyűzeten.

                        $40: space
                        $41: backspace
                        $42: tab
                        $43: ENTER (num.bill)
                        $44: Return
                        $45: ESC
                        $46: Delete
                        $4A: - (num.bill)
                        $4C: Cursor fel
                        $4D: cursor le
                        $4E: cursor elôre
                        $4F: cursor vissza

$50-$5F: a funkcióbillentyűk kódja:

                        $50-$59: F1-F10
                        $5F: HELP

$60-$67: a minôsítô billentyűk kódja:

                        $60: bal SHIFT
                        $61: jobb SHIFT
                        $62: Caps Lock
                        $63: CTRL
                        $64: bal ALT
                        $65: jobb ALT
                        $66: bal Amiga
                        $67: jobb Amiga

$68-$77: nincsenek kiosztva

$F0-$FF:   ezek a kódok a 6500-68000 kommunikációra vannak fenntartva, ezek
nem  billentyűkódok.   Ezeknek  nincs  elengedési és lenyomási jelzôjük.  A
leírásukhoz a 8 bites alakban kell öket vizsgálni:

$F9: Az utolsó billentyűkód rossz, a következô ugyanaz lesz.
$FA: A billentyűzet buffer túlcsordult.
$FC: A billentyűzet tesztje hibával akadt el.
$FD: Kódsorozat kezdete (resetnél)
$FE: Kódsorozat vége.

Ezeket a kódokat a rendszer kiszűri.


A billentyűzet korlátozásai
---------------------------

Az  Amiga  billentyűzete,  amit  a  3-as  ábrán  látunk,  egy  sorokból  és
oszlopokból  álló  mátrix,  az egyes billentyűk a mátrix keresztezôdéseiben
vannak.  Ez az oka annak a jelenségnek, amit szellemnek hívunk.

A  szellem  jelensége  az  jelenti, hogy bizonyos billentyű kombinációk egy
szellem  kódot  erdeményeznek.   Például  nyomjuk  le  az  'A'  és  az  'S'
billentyűket,  és  tartsuk  mindkettôt lent.  Ekkor nyomjuk meg a 'Z'-t, és
ekkor  látjuk,  hogy  nemcsak  a  'Z',  hanem 'X' is érkezett a rendszerbe.
Ebben az esetben az 'X' egy szellem.

A  billentyűzetet  úgy tervezték, hogy ez a jelenség normál esetben gépelés
közben  sohasem  fordul elô, csak olyan ritka esetben, amit mi is leírtunk.
Normál esetben az ujjak elfogynak, mielôtt szellemet idéznének elô.

Megjegyezzük,  hogy  van  hét  olyan billentyű, ami nincs benn a mátrixban,
tehát  ezek nem vesznek részt a szellem elôidézésében.  Ezek a billentyűk a
következôk:  CTRL, a két SHIFT, a két Amiga és a két ALT.


Párhuzamos input/output interfész
---------------------------------

Az  általános  célú  interfész  a  számítógép  hátulján  található.   Ez  a
csatlakozópár  25  hüvellyel  ellátott  fele.  Ezt a csatlakozót általánban
párhuzamos  nyomtatók  kapcsolására  használjuk.   Az egyes tűk jelentése a
függelékben szerepel.


Soros interfész
---------------

A  25  tűs  D-tipusú tűs csatlakozó a gép hátulján egy általános célú soros
interfész.   Ez sokfajta perifériát tud kezelni, például modemet vagy soros
nyomtatót.  Az egyes tűk jelentése a függelékben szerepel.


Bevezetés a soros áramkörhöz
----------------------------

Az  áramkör neve, ami a soros adatforgalmat irányítja, UART.  Az UART képes
olyan  átviteli sebességet használni, amit megadunk neki.  Képes küldeni és
fogadni adatokat nyolc vagy kilenc bit hosszúsággal.

Az  UART érzékeli a túlfutási hibákat, például ha a külsô egység gyorsabban
küldi  az  adatokat,  mint  ahogy ezt az adatfogadó regiszterbôl kivennénk.
Ezenkívül  van egy állapotbit, ami jelzi, ha a fogadó buffer betelt, vagy a
küldô  buffer  üres.   Az  állapotbit  jelzi  azt  is,  ha  az összes bitet
elküldte.  Ezeket a részleteket a következô részben írjuk le.


Az átviteli sebesség beállítása
-------------------------------

Az átviteli sebességet a SERPER nevű regiszter vezérli.  A SERPER regiszter
14-0  bitjei  a meghatározók.  Ha azen bitek értéke N, akkor az UART minden
N+1-edik színciklusban (279.4 ns) küld vagy fogad egy bitet.


Az adatfogadás üzemmód beállítása
---------------------------------

A  bitek  számát,  ami  az  adatfogadó  regiszter megtelését határozza meg,
nyolcnak  vagy  kilencnek  adhatjuk  meg.  Mindkét esetben a fogadó áramkör
feltételez  egy  startbitet,  nyolc  vagy  kilenc adatbitet és legalább egy
stopbitet.  Ezek a bitek a legtöbb esetben 0-ák.

A SERPER csak írható regiszter.


Az adatfogadó regiszter tartalma
--------------------------------

A  soros  input adatfogadó regiszter 16 bit széles.  Ez a regiszter nemcsak
az input adatokat tartalmazza, hanem az állapotbiteket is, melyek leírása a
következô:

Az adatbitek a SERDATR regiszterben jelennek meg az állapotbitekkel együtt.
Ez a regiszter a soros eltoló regiszterhez van kapcsolva.

Az adat  bitenként jön a soros-párhuzamos átalakítóból.  Amikor a megfelelô
számú  bit  megérkezett,  az  adat  átkerül a SERDATR regiszterbe, és ekkor
kapunk egy jelzést, hogy az adat készen van.

Amikor  az  adatot  megkaptuk  az  áramkör  újra  kész egy adat fogadására.
Miután  az adatfogadás jelet megkaptuk, egy karakternyi (8-10 bitnyi) idônk
van,  hogy  az adatot feldolgozzzuk és a megszakítást töröljük. A következô
táblázat a SERDATR regiszter bitjeinek jelentését írja le.

Bit  Név       Funkció

15   OVRUN     A bit arra utal, hogy egy új adat érkezett, de az elôzôt még
               nem olvasta ki a processzor. Ezt elkerülhetjük az INTREQ re-
               giszter RBF (11-es) bitjének törlésével.
14   RBF       Ha a bit értéke 1, az arra utal,  hogy az adat kész,  hogy a
               processzor  feldolgozza.  Miután  kiolvastuk  az adatot,  az
               INTREQ regiszter  RBF  bitjét ellenôrízzük, hogy a túlfutást
               elkerüljük.
13   TBE       Amikor ez a bit 1, a SERDAT regiszter  tartalma már átkerült
               a soros eltoló regiszterbe, tehát a SERDAT új adat feldolgo-
               zására képes. Ezt a bitet általában teljes duplex műveletek-
               nél használjuk.
12   TSRE      Amikor ez a bit 1,  az output eltoló regiszter befejezte fe-
               ladatát, az összes adatot elküldte és a regiszter éppen tét-
               len. Ha megállunk az  adatok írásával,  a bit értéke 1 lesz,
               miután az eltoló és a SERDAT  regiszter pillanatnyi értékeit
               elküldte. Ezt a bitet félduplex műveleteknél  használjuk.
11   RXD       A Paula chip RXD tűjének közvetlen másolata. Használaton kí-
               vül.
10             Használaton kívül.
 9   STP       A stopbit, ha 9 adatbitet határozunk meg.
 8   STP       A stopbit, ha 8 adatbitet határozunk meg.
     DB8       A 9-edik adatbit, ha 9 adatbitet határozunk meg.
7-0  DB-DB0    A fogadó adat alsó nyolc bitje.


Az output adatok elküldése
--------------------------

Az  output  vonalakon  való  adatkivitelt a SERDAT regiszterbe való írással
érhetjük  el.   Ez a regiszter csak írható.  Az adat elküldésének sebessége
azonos  azzal  a sebességgel, amit olvasáskor beállítottunk.  Az elküldendô
adat  a  SERDAT  regiszterben van, amint azt az elôzôkben már részleteztük.
Közvetlenül  azután,  hogy az adatot beírtuk ebbe a regiszterbe, a rendszer
elkezdi annak elküldését a kiválasztott sebességgel.

A  művelet  megkezdésekor az adat átmegy a SERDAT-ból a soros eltol regisz-
terbe.   Amikor ez az átírás megtörtént, a SERDAT új adat fogadására képes;
a TBE megszakítás jelzi ezt a tényt.

Az  adat  az  eltoló regiszterbôl bitenként kerül ki a meghatározott idôin-
tervallumonként  a  legalsó  bittel  kezdve.  Az eltolás addig folytatódik,
amíg  az  utolsó  eltolást követôen az UART nem jelzi az adatok elfogyását,
ami azt jelenti, hogy csak 0-ák maradtak a regiszterben.

A  SERDAT egy 16 bites regiszter, ami így lehetôvé teszi az elküldendô adat
formátumának  vezérlését.   A  megszokott  adatformátum  a  következô:  egy
startbit, nyolc adatbit, két stopbit.  A következô ábrák ezt mutatják be.

Eltolás elôtt:

              15 14 13 12 11 10  9  8  7  6  5  4  3  2  1  0
              -----------------------------------------------
              0  0  0  0  0  0  0  1  <---- 8 adatbit  ---->
              -----------------------------------------------
                        ---> az eltolás iránya --->

Eltolás után:

              15 14 13 12 11 10  9  8  7  6  5  4  3  2  1  0
              -----------------------------------------------
              0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0 ---> 1
              -----------------------------------------------
                                csupa nulla

A  regiszter  eltolása akkor áll meg, amikor az utoljára kitolt bit 1, és a
regiszter  maradék  része  csupa  0.   Amikor  a  regiszterbe  egy nullától
különbözô érték kerül, az eltolások újból megkezdôdnek.


A regiszter tartalmának meghatározása
-------------------------------------

Írjuk  az elküldendô adatot a SERDAT regiszter alsó 8 (vagy 9) bitjére.  Az
adatbitek  fölé  (a  7.   vagy 8.  bit fölé) írjunk annyi 1-es bitet, ahány
stopbitet  kell  küldeni  az adattal.  Általában egy vagy két bitet küldünk
stopbitként.   A startbit elküldése független a regiszter tartalmától.  Egy
startbit  automatikusan generálódik, mielôtt az elsô bit elindul.  A SERDAT
regiszterbe  való  írás  elindítja  az adatküldést.  Ha a regiszterbe csupa
0-át írunk, az adatküldés nem indul el.


Az audio output csatlakozók
---------------------------

Az Amiga outputja két különbözô formában jelenik meg:

- Sztereo output csatlakozók. Egy pár RCA csatlakozó sztereo erôsítôhöz.
- RF  audio.   Ha  TV-t  használunk  az  Amigához képernyôként,  a 3/4 RF a
modulátor  hangokat  a  TV  hangszóróján  keresztül közvetíti.  Itt mindkét
csatorna együtt jelenik meg.


Megjelenítô output csatlakozók
------------------------------

Az  Amiga  hátulján lévô 23 tűs csatlakozó kétfajta jelet tartalmaz a video
outputra.   Különbözô kábelekkel mindkét jel felhasználható.  A két típus a
következô:

- RGB monitorok ('analóg RGB').  Négy outputot nyújt:  vörös (R), zöld (G),
kék  (B)  és szinkronizáló (sync).  Ezek a vonalak akár 4096 különbözô szín
elôállítására is alkalmasak a képernyôn.

-  Digitális  RGB monitor.  Öt outputja van:  vörös (R), zöld (G), kék (B),
fél  intenzitás  (I)  és sync.  Minden output szint 0 vagy 1, így az összes
kimeneti  lehetôség  15, mert a 0000 és 0001 azonos színt állítanak elô (ha
nincs szín, nincs értelme a fél és a teljes intenzitásnak).













Ez  a  függelék  a regiszterek rövid összefoglalását adja abc sorrendben és
tartalmazza  az  egyes bitek funkcióit.  Ezeket a regisztereket a speciális
chipek  (Agnus,  Denise,  Paula)  használják  adatmozgatásra.   Ezenkívül a
Copper  is  képes  ezeket a regisztereket írni.  Ha a porcesszorral akarjuk
ezeket  a  regisztereket  átírni, akkor  a  cím  kiszámításához a következô
műveletet kell elvégezni:

                   processzorcím = (chip cím) + $DFF000

ADKCON
------
Cím: 09E - csak írható - Paula - hang és lemezvezérlô

ADKCONR
-------
Cím: 010 - csak olvasható - Paula - hang és lemezvezérlô

Bit     Név       Használat

15      SET/CLR   vezérlô bit, amely meghatározza, hogy az ezzel együtt be-
                  írt 1-es  bitek helyén  a megfelelô funkció beállítódjon,
                  vagy törlôdjön. Azok a funkciók, ahova 0-át írunk  válto-
                  zatlanul maradnak.
14-13   PRECOMP1-0      Kód     Érték
                        00      semmi
                        01      140 ns
                        10      280 ns
                        11      560 ns
12      MFMPREC   1=MFM, 0=GCR.
11      UARTBRK   egy UART megszakítást vált ki (törli TXD-t)
10      WORDSYNC  az olvasás  szinkronizálását engedélyezi.  A szinkron szó
                  a 07E címen van (DSKSYNC).
 9      MSBSYNC   a lemez olvasásánál a szinkronizáció a legmagasabb helyi-
                  értékű bit szerint lesz.
 8      FAST      a lemez órájának beállítása: 1=gyors (2us),0=lassú (4us).
                  Gyors: MFM, lassú: MFM vagy GCR.
 7      USE3PN    a 3-as hangcsatorna moduláljon (semmit)
 6      USE2P3    a 2-es csatorna modulálja a 3-ast frekvencia szerint
 5      USE1P2    az 1-es csatorna modulálja a 2-est frekvencia szerint
 4      USE0P1    a 0-ás csatorna modulálja az 1-est frekvencia szerint
 3      USE3VN    a 3-as csatorna moduláljon (semmit)
 2      USE2V3    a 2-es csatorna modulálja a 3-ast hangerô szerint
 1      USE1V2    az 1-es csatorna modulálja a 2-est hangerô szerint
 0      USE0V1    a 0-ás csatorna modulálja az 1-est hangerô szerint

Megjegyzés:   ha  mindkét  moduláció  be  van  kapcsolva, akkor periódus és
hangerô  értékek  váltakozva  követik egymást.  Hangerô, periódos, hangerô,
periódus...

---------------------------------------------------------------------------

AUDxLCH
-------
Cím: 0A0 - csak írható - Agnus - hangcsatorna pozíciója (felsô 3 bit)

AUDxLCL
-------
Cím: 0A2 - csak írható - Agnus - hangcsatorna pozíciója (alsó 15 bit)

Ez a regiszterpár az x-edik hangcsatorna (x=0,1,2,3) pozíciójára mutat.  Ez
nem  mutató,  tehát  csak egyszer kell beállítani, és ha kell, az értékét a
rendszer újraírja.

---------------------------------------------------------------------------

AUDxLEN
-------
Cím: 0A4 - csak írható - Paula - hangcsatorna hossza

Ez  a  regiszter az x-edik hangcsatorna adatainak hosszát (a szavak számát)
tartalmazza.

---------------------------------------------------------------------------

AUDxPER
-------
Cím: 0A6 - csak írható - Paula - hangcsatorna períódusa

Ez  a  regiszter  az  x-edit  hangcsatorna periódus értékét tartalmazza.  A
minimális  periódus  124  színciklus,  tehát  a legkisebb érték amit ebbe a
regiszterbe  írhatunk,  az 124.  Ez a korlát 28.86 KHz-es felsô korlátozást
szab.

---------------------------------------------------------------------------

AUDxVOL
-------
Cím: 0A8 - csak írható - Paula - hangcsatorna hangereje

Ez  a  regiszter az x-edik hangcsatorna hangerejének értékét tartalmzza.  A
6-0 bitek 65 különbözô értéket határoznak meg a következôképpen:

Bit     Használat

15-7    használaton kívül
6       a hangerôt a maximumra állítja
5-0     a hangerô 64 különbözô értékét határozza meg

---------------------------------------------------------------------------

AUDxDAT
-------
Cím: 0AA - csak írható - Paula - hangcsatorna adata

Ez  a  regiszter  az  x-edik  hangcsatorna  DMA  adatbuffere.   Kér byte-ot
tartalmaz,  amit  majd  outputra  kell  küldeni.  Az adatok 2-es komplemens
módban  vannak  kódolva.   A  DMA vezérlô automatikusan veszi az adatokat a
RAM-ból  és  ezen  a  bufferen  keresztül  továbbítja a D/A átalakítóba.  A
processzor  is képes közvetlenül írni ebbe a regiszterbe.  Amikor az adatok
továbbítása befejezôdött, akkor egy megszakítást vált ki a DMA.

---------------------------------------------------------------------------

BLTxPTH
-------
Cím: 050 - csak írható - Agnus - blitter mutató (felsô 3 bit)

BLTxPTL
-------
Cím: 052 - csak írható - Agnus - blitter muataó (alsó 15 bit)

Ez  a regiszterpár a blitter forrásainak (x=A,B,C) vagy a céljának (x=D) 18
bites  címét  tartalmazza.   Ezeket  a regisztereket elôre be kell állítani
arra  a  címre,  amit  a blitterrel fel akarunk dolgozni.  Miután a blitter
végzett a feldadatával, ez a regiszterpár az utolsó adat címére fog mutatni
(plusz a meduló értékével növelve).
EGYENESRAJZOLÁS:   a  BLTAPTL  regiszter  akkumulátorként  üzemel,  be kell
tölteni  a  (2Y-X) értéket, ahol az X/Y az egyenest magába foglaló téglalap
mérete.  A BLTCPT és BLTDPT regiszterekbe (az L-be és a H-ba is) az egyenes
kezdôcímét kell beírni.

---------------------------------------------------------------------------

BLTxMOD
-------
Cím: 064 - csak írható - Agnus - blitter moduló

Ez  a  regiszter  tartalmazza  a  blitter forrásainak (x=A,B,C) és a célnak
(x=D)  a  modulóját.   A  moduló egy szám, amely a címhez adódik minden sor
végén,  hogy  így  a  helyes címre mutasson a következô sor elején.  Minden
forrásnak  és  a  célnak külön modulója van.  Így a forrásoknak és a célnak
különbözô mérete lehet.
EGYENESRAJZOLÁS:   a  BLTAMOD  regiszterbe a (4Y-4X) értéket, a BLTBMOD re-
giszterbe a (4Y) értéket kell beírni.  A BLTCMOD és a BLTDMOD regiszterekbe
annak  a  képnek  a  szélességét kell (byte-okban) beírni, ahova az egyenes
kerül.  Álatlában ez a képernyô szélességének kétszerese.

---------------------------------------------------------------------------

BLTAFWM
-------
Cím: 044 - csak írható - Agnus - blitter elsô szómaszk a forrásA-n

BLTALWM
-------
Cím: 046 - csak írható - Agnus - blitter utolsó szómaszk a forrásA-n

Mielôtt  egy sor elsô és utolsó szava bemegy a blitterbe, elôször ezekkel a
regiszterekkel egy ÉS műveletet végez.  Ezeket a regiszterekt csupa 1-essel
kell feltölteni, ha területkitöltô vagy egyenesrajzoló üzemmódot kapcsolunk
be.

---------------------------------------------------------------------------

BLTxDAT
-------
Cím: -74 - csak írható - Agnus - blitter forrás adatregiszter

Ez a regiszter tartalmazza a források (x=A,B,C) adatait a blitter műveletei
közben.  Ezt a regisztert általában a DMA írja át, de elôre beállíthatjuk a
processzorral is.
EGYENESRAJZOLÁS:   a  BLTADAT regisztert indexként használja a rendszer, és
$8000-al  kell  feltölteni.  BLTBDAT regiszterbe az egyenes mintázatát kell
beállítani.  Ha csupa 1-est írunk bele, akkor az egyenes folytomos lesz.

---------------------------------------------------------------------------

BLTDDAT
-------

A  blitter  céljának  adatregisztere.  Ez a regiszter tartalmazza a blitter
eredményét  addig,  amíg a RAM-ba nem íródnak.  Ez egy ál-regiszter, a pro-
cesszorral  nem olvasható.  Az adatátadás automatikus a blitter műveletének
ideje alatt.

---------------------------------------------------------------------------

BLTCON0
-------
Cím: 040 - csak írható - Agnus - blitter 0-ás vezérlôregiszter

BLTCON1
-------
Cím: 042 - csak írható - Agnus - blitter 1-es vezérlôregiszter

Ezt  a  két regisztert együtt kell használni a blitter műveletetének vezér-
lésére.   Két alap mód van, amik közül a BLTCON1-es regiszter 0-ás bitjével
lehet választani.
                              Területkitöltés

                       Bit      BLTCON0       BLTCON1

                       15        ASH3           BSH3
                       14        ASH2           BSH2
                       13        ASH1           BSH1
                       12        ASA0           BSH0
                       11        USEA             x
                       10        USEB             x
                        9        USEC             x
                        8        USED             x
                        7        LF7              x
                        6        LF6              x
                        5        LF5              x
                        4        LF4            EFE
                        3        LF3            IFE
                        2        LF2            FCI
                        1        LF1            DESC
                        0        LF0           LINE(=0)

ASH3-0: az A forrás eltolásának mértéke
BSH3-0: a B forrás eltolásának mértéke
USEA  : vezérlôbit az A forrás használatához
USEB  : vezérlôbit a B forrás használatához
USEC  : vezérlôbit a C forrás használatához
USED  : vezérlôbit a D cél használatához
LF7-0 : a logikai művelet beállítása
EFE   : kizáró területkitöltés
IFE   : megengedô területkitöltés
FCI   : a kitöltés kezôállapota
DESC  : csökkenô címzés vezérlôbitje
LINE  : egyenesrajzolás, ha az értéke 0.

                              Egyenesrajzolás

                     Bit     BLTCON0         BLTCON1

                     15      START3          TEXTURE3
                     14      START2          TEXTURE2
                     13      START1          TEXTURE1
                     12      START0          TEXTURE0
                     11         1                0
                     10         0                0
                      9         1                0
                      8         1                0
                      7        LF7               0
                      6        LF6             SIGN
                      5        LF5               0
                      4        LF4              SUD
                      3        LF3              SUL
                      2        LF2              AUL
                      1        LF1             SING
                      0        LF0            LINE(=0)

START3-0: az egyenes kezdôpozíciója
LF7-0   : logikai művelet, kötelezôen $4A
LINE    : egyenesrajzolás vezérlôbitje
SIGN    : sign flag
SING    : raszterenként egy pixel egyenesben
SUD     : néha fel vagy le
SUL     : néha fel vagy balra
AUL     : mindig fel vagy balra

A fenti három bit a következôképpen választ a nyolcadok közül:

                   nyolcad         SUD     SUL     AUL
                   -------         ---     ---     ---
                      0             1       1       0
                      1             0       0       1
                      2             0       1       1
                      3             1       1       1
                      4             1       0       1
                      5             0       1       0
                      6             0       0       0
                      7             1       0       0

---------------------------------------------------------------------------

BLTSIZE
-------
Cím: 058 - csak írható - Agnus - blitter start és méret

Ez  a  regiszter  tartalmazza annak a területnek a méretét, amire a blitter
művelete  vonatkozik  (egyenesrajzolás  üzemmódban  a  magasság  legyen  az
egyenes  hossza,  a  szélesség  legyen  2).   Mivel  ennek a regiszternek a
beírása  indítja  a  blitter  műveletvégzését,  ezért ezt a regisztert kell
utoljára  beállítani.   A  15-6 bitekre kell a magasságot pixelben megadni.
Mivel  ez  10  bit,  ezért a maximális magasság 1024 pixel.  Az 5-0 bitekre
kell  a  szélességet  írni  szavakban.  Mivel ez hat bit, ezért a maximális
szélesség 64 szó, vagyis 1024 pixel.
EGYENESRAJZOLÁS:   ez  a  regiszter  az  egyenes  hosszát határozza meg, és
elindítja  a  rajzolást.  A 15-6 bitekre kell az egyenes hosszát írni pixe-
lekben (ez maximum 1024).  Az 5-0 bitekre mindíg 000010 értéket kell írni.

---------------------------------------------------------------------------

BPLxPTH
-------
Cím: 0E0 - csak írható - Agnus - bittérkép mutató (felsô 3 bit)

BPLxPTL
-------
Cím: 0E2 - csak írható - Agnus - bittérkép muatató (alsó 15 bit)

Ez  a  regiszterpár  tartalmazza  a  bittérképek  (x=1,2,3,4,5,6)  18 bites
mutatóját.   Ezt  a  mutatót minden képfrissítéskor újra kell írni a Copper
vagy a processzor segítségével.

---------------------------------------------------------------------------

BPLxDAT
-------
Cím: 110 - csak írható - Denise - bittérkép adat

Ezek  a  regisztek  (x=1,2,3,4,5,6)  fogadják  az  adatokat, amiket a DMA a
RAM-ból  vesz  a  megfelelô  muatatók alapján.  A processzor is képes arra,
hogy  írjon  ezekbe a regiszterekbe, melyek egy hatszavas bufferként működ-
nek.   A párhuzamos-soros átalakítás akkor kezdôdik, amikor az 1-es bittér-
kép  adatregiszterébe  írunk.   A  szavak  legfelsô helyiértékű bitje (MSB)
kerül elôször kejelzésre, így ez jelenik meg a bal oldalon.

---------------------------------------------------------------------------

BPL1MOD
-------
Cím: 108 - csak írható - Agnus - bittérkép moduló (páratlan)

BPL2MOD
-------
Cím: 10A - csak írható - Agnus - bittérkép moduló (páros)

Ezek  a  regiszterek tartalmazzák a páros és páratlan bittérképekhez tartoz
modulókat.   A  moduló  egy  szám,  ami  minden  sor  végén  hozzáadódik  a
mutatóhoz, így a következô sor elején a megfelelô címre fog mutatni.  Mivel
a  páros  és  a páratlan bittérképeknek külön van moduló regiszterük, ezért
ezeknek a bittérképeknek különbözô méretük lehet.

---------------------------------------------------------------------------

BPLCON0
-------
Cím: 100 - csak írható - Agnus, Denise - 0-ás vezérlôregiszter

BPLCON1
-------
Cím: 102 - csak írható - Denise - 1-es vezérlôregiszter

BPLCON2
-------
Cím: 104 - csak írható - Denise - 2-es vezérlôregiszter

Bit   BPLCON0   BPLCON1   BPLCON2

15      HIRES       x        x
14      BPU2        x        x
13      BPU1        x        x
12      BPU0        x        x
11      HOMOD       x        x
10      DBLPF       x        x
 9      COLOR       x        x
 8      GAUD        x        x
 7        x       PF2H3      x
 6        x       PF2H2    PF2PRI
 5        x       PF2H1    PF2P2
 4        x       PF2H0    PF2P1
 3      LPEN      PF1H3    PF2P0
 2      LACE      PF1H2    PF1P2
 1      ERSY      PF1H1    PF1P1
 0        x       PF1H0    PF1P0

HIRES : nagyfelbontás (640)
BPU   : bittérképek száma (0-6)
HOMOD : HAM üzemmód
DBLPF : dupla képmezôs üzemmód (PF1: páratlan, PF2: páros bittérképek)
COLOR : composite video engedélyezés
GAUD  : genlock audio engedélyezés
LPEN  : fényceruza engedélyezés
LACE  : interlace üzemmód
ERSY  : külsô szinkronizáció engedélyezése
PF2PRI: a 2-es képmezô takarja az 1-es képemzôt
PF2P  : 2-es képmezô és a sprite-ok takarása
PF1P  : 1-es képmezô és a sprite-ok takarása
PF2H  : 2-es képmezô késleltetése (scroll)
PF1H  : 1-es képmezô késleltetése (scroll)

---------------------------------------------------------------------------

CLXCON
------
Cím: 098 - csak írható - Denise - ütközések vezérlése

Ez  a  regiszter határozza meg, hogy mely bittérképek vegyenek részt az üt-
közésvizsgálatban,  és a résztvevôk milyen kombinációban idézzenek el ütkö-
zést.   Ezenkívül  meghatározza,  hogy  a páratlan számú sprite-ok is részt
vegyenek-e az ütközésekben.

Bit  Név    Leírás

15   ENSP7  A 7-es sprite engedélyezése
14   ENSP5  Az 5-ös sprite engedélyezése
13   ENSP3  A 3-as sprite engedélyezése
12   ENSP1  Az 1-es sprite engedélyezése
11   ENBP6  A 6-os bittérkép engedélyezése
10   ENBP5  Az 5-ös bittérkép engedélyezése
 9   ENBP4  A 4-es bittérkép engedélyezése
 8   ENBP3  A 3-as bittérkép engedélyezése
 7   ENBP2  A 2-es bittérkép engedélyezése
 6   ENBP1  Az 1-es bittérkép engedélyezése
 5   MVBP6  A 6-os bittérkép ütközési értéke
 4   MVBP5  Az 5-ös bittérkép ütközési értéke
 3   MVBP4  A 4-es bittérkép ütközési értéke
 2   MVBP3  A 3-as bittérkép ütközési értéke
 1   MVBP2  A 2-es bittérkép ütközési értéke
 0   MVBP1  Az 1-es bittérkép ütközési értéke

Megjegyzés:   a  letiltott  képek nem vesznek részt az ütközésvizsgálatban.
Ha az összes bittérképet letiltjuk, akkor folyamatosan generálódik ütközés.

---------------------------------------------------------------------------

CLXDAT
------
Cím: 00E - csak olvasható - Denise - ütközés adatregisztere

Ez  a  regiszter  olvassa  és törli az ütközések adatregiszterét.  az egyes
bitek jelentése a következô táblázatban van.
Megjegyzés:   az  1-es  képmezô  az  összes  engedélyezett  páratlan  számú
bittérkép, a 2-es képmezô az összes engedélyezett páros számú bittérkép.

Bit  Ütközés

15   Használaton kívül
14   4-es (vagy 5-ös) és a 6-os (vagy 7-es) sprite
13   2-es (vagy 3-as) és a 6-os (vagy 7-es) sprite
12   2-es (vagy 3-as) és a 4-es (vagy 5-ös) sprite
11   0-ás (vagy 1-es) és a 6-os (vagy 7-es) sprite
10   0-ás (vagy 1-es) és a 4-es (vagy 5-ös) sprite
 9   0-ás (vagy 1-es) és a 2-es (vagy 3-as) sprite
 8   2-es képmezô és a 6-os (vagy 7-es) sprite
 7   2-es képmezô és a 4-os (vagy 5-es) sprite
 6   2-es képmezô és a 2-os (vagy 3-es) sprite
 5   2-es képmezô és a 0-os (vagy 1-es) sprite
 4   1-es képmezô és a 6-os (vagy 7-es) sprite
 3   1-es képmezô és a 4-os (vagy 5-es) sprite
 2   1-es képmezô és a 2-os (vagy 3-es) sprite
 1   1-es képmezô és a 0-os (vagy 1-es) sprite
 0   1-es és a 2-es képmezô

---------------------------------------------------------------------------

COLORxx
-------
Cím: 180 - csak írható - Denise - színtáblázat

32  színregiszter  van  (x=0-31), ezeket gyakran a színpalettának nevezzük.
Minden  regiszter  12  biten  tárol  egy  színt  RGB  rendszerben.  A bitek
jelentése a követlezô:

Bit    Funkció

15-12  használaton kívül
11- 8  vörös
 7- 4  zöld
 3- 0  kék

---------------------------------------------------------------------------

COPCON
------
Cím: 02E - csak írható - Agnus - Copper vezérlôregiszter

Ez  egy  egybites  regiszter.   Az  egyetlen  feladata, hogy engedélyezze a
Coppernek a blitterhez való hozzáférést.  Ez a bit bekapcsoláskor törlôdik,
tehát  ekkor  a  Copper  nem  képes  a  blittert elérni.  A bit neve CDANG,
helyiértéke 1.

---------------------------------------------------------------------------

COPJMP1
-------
Cím: 088 - strobe - Agnus - copper elsô újraindítási címe

COPJMP2
-------
Cím: 08A - strobe - Agnus - copper második újraindítási címe

Ha  ezekbe  a  regiszterekbe  írunk,  akkor a Copper az elsô vagy a második
pozícióregisztert  használva  közvetlenül  ugrik  a meghatározott címre.  A
Copper maga is írhat ezekbe a regiszterekbe, így maga is elôidézhet ugrást.

---------------------------------------------------------------------------

COP1LCH
-------
Cím: 080 - csak írható - Agnus - 1. Copper pozícióregiszter (felsô 3 bit)

COP1LCL
-------
Cím: 082 - csak írható - Agnus - 1. Copper pozícióregiszter (alsó 15 bit)

COP2LCH
-------
Cím: 084 - csak írható - Agnus - 2. Copper pozícióregiszter (felsô 3 bit)

COP2LCL
-------
Cím: 086 - csak írható - Agnus - 2. Copper pozícióregiszter (alsó 15 bit)

Ezek a regiszterek tartalmazzák azokat a címeket, amikre az elôzô leírásban
utaltunk.

---------------------------------------------------------------------------

COPINS
------
Cím: 08C - csak írható - Agnus - Copper utasításregisztere

Ez  a  regiszter egy ál-cím.  A Copper ide írja az utasítását, amikor azt a
saját  utasításregiszterébe írja.  Ez minden Copper cikluskor bekövetkezik,
kivéve a WAIT második ciklusát.  A három utasítástipus a következô:

MOVE; adatbeírás egy regiszterbe
WAIT: egy képernyôpozícióra vár
SKIP: pozíciótól függôen átlépi a következô utasítást

                           MOVE        WAIT        SKIP

                  Bit    IR1  IR2    IR1  IR2    IR1  IR2

                  15      x   RD15   VP7  BFD    VP7  BFD
                  14      x   RD14   VP6  VE6    VP6  VE6
                  13      x   RD13   VP5  VE5    VP5  VE5
                  12      x   RD12   VP4  VE4    VP4  VE4
                  11      x   RD11   VP3  VE3    VP3  VE3
                  10      x   RD10   VP2  VE2    VP2  VE2
                   9      x   RD09   VP1  VE1    VP1  VE1
                   8     DA8  RD08   VP0  VE0    VP0  VE0
                   7     DA7  RD07   HP8  HE8    HP8  HE8
                   6     DA6  RD06   HP7  HE7    HP7  HE7
                   5     DA5  RD05   HP6  HE6    HP6  HE6
                   4     DA4  RD04   HP5  HE5    HP5  HE5
                   3     DA3  RD03   HP4  HE4    HP4  HE4
                   2     DA2  RD02   HP3  HE3    HP3  HE3
                   1     DA1  RD01   HP2  HE2    HP2  HE2
                   0      0   RD00    1    0      1    1

IR1: elsô utasításregiszter
IR2: második utasításregiszter
DA : a MOVE utasítás céljának címe
RD : a MOVE utasítás RAM-beli adata
VP : az elektronsugár pozíciójának függôleges bitjei
HP : az elektronsugár pozíciójának vízszintes bitjei
VE : az összehasonlítás engedélyezése (maszk)
HE : az összehasonlítás engedélyezése (maszk)
BFD: ha ez a bit 1, akkor a 'blitter végzett; flag nem befolyásolja a Cop-
     pert. Ha a bit 0, akkor a megadott feltételen túl a 'blitter végzett'
     bitnek is igaznak kell lennie,hogy a feltétel teljesüljön. Megjegyez-
     zük, hogy a V7 összehasonlítást nem lehet maszkolni.

A  Copper  egy  két-ciklusos  gép,  de  a  memóriabusza  csak  a  páratlan
ciklusokban  van  szüksége  (négy  ciklus  utasításonként).  Ez gondoskodik
arról,  hogy  elkerülje  az  ütközést  a  képmegjelenítéssel,  a  hang-  és
lemezlkezeléssel,  a  memóriafrissítéssel  és a sprite-okkal, melyek csak a
páros  ciklusokat használják.  Emiatt a Coppernek kell (és van is) magasabb
prioritás mint a blitternek és a processzornak.

---------------------------------------------------------------------------

DIWSTRT
-------
Cím: 08E - csak írható - Agnus - a megjelenítôablak kezdete

DIWSTOP
-------
Cím: 090 - csak írható - Agnus - a megjelenítôablak vége

Ezek  a  regiszterek  a  megjelenítôablak  bal  felsô és a jobb alsó sarkát
állítják  be.   A  15-8 bitek (V7-V0) tartalmazzák a függôleges pozíciót, a
7-0 bitek (H7-H0) a vízszintes pozíciót.  A DIWSTRT a képernyô felsô 2/3-ad
részét  és  a  bal  3/4-ed részét éri el (V8=0, H8=0). A DIWSTOP a képernyô
alsó 1/2-ed részét és a jobb 1/4-ed részét éri el (V8=/V7, H8=1).

---------------------------------------------------------------------------

DDFSTRT
-------
Cím: 092 - csak írható - Agnus - adatvételezés kezdete

DDFSTOP
-------
Cím: 094 - csak írható - Agnus - adatvételezés vége

Ezek  a  regiszterek  az  adatvételezés szélességét ée helyzetét határozzák
meg.   Az  adatvételezés  kezdetének  és végének függôleges pozíciója mege-
gyezik  a  megjelenítôablak kezdetével és végével.  A vízszintes pozíciót a
7-2 bitel (H8-H3) határozzák meg.  A többi bitnek 0-nak kell lennie.

---------------------------------------------------------------------------

DMACON
------
Cím: 096 - csak írható - Agnus, Denise, Paula - DMA vezérlôregisztere

DMACONR
-------
Cím: 002 - csak olvasható - Agnus, Denise, Paula - DMA vezérlôregisztere

Bit  Név      Leírás

15   SET/CLR  beírást/törlést vezérlô bit
14   BBUSY    blitter dolgozik (csak olvasható)
13   BZERO    a blitter eredménye csupa nulla volt (csak olvasható)
12   x
11   x
10   BLTPRI   blitter prioritása a processzor felett
 9   DMAEN    minden DMA engedélyezése
 8   BPLEN    bittérkép DMA engedélyezése
 7   COPEN    Copper DMA engedélyezése
 6   BLTEN    blitter DMA engedélyezése
 5   SPREN    sprite DMA engedélyezése
 4   DSKEN    lemez DMA engedélyezése
 3   AUD3EN   3-as hangcsatorna engedélyezése
 2   AUD2EN   2-es hangcsatorna engedélyezése
 1   AUD1EN   1-es hangcsatorna engedélyezése
 0   AUD0EN   0-ás hangcsatorna engedélyezése

---------------------------------------------------------------------------

DSKPTH
------
Cím: 020 - csak írható - Agnus - lemez mutató (felsô 3 bit)

DSKPTL
------
Cím: 022 - csak írható - Agnus - lemez mutató (alsó 15 bit)

Ezek a regiszterek tartalmazzák a lemez DMA 18 bites címét.  Ezt a címet be
kell állítani, mielôtt a DMA-t bekapcsoljuk.

---------------------------------------------------------------------------

DSKLEN
------
Cím: 024 - csak írható - Paula - lemezhossz

13-0 biteken. Ezenkívül tartalmaz még két vezérlôbitet is.
15. bit: lemez DMA engedélyezése
14. bit: írás/olvasás. Ha 1, akkor a lemez DMA a RAM-ból a lemezre írja az
         adatokat, ha 0, akkor a lemezrôl olvasa a RAM-ba.

---------------------------------------------------------------------------

DSKDAT
------
Cím: 026 - csak írható - Paula - lemez adatregisztere

DSKDATR
-------
Cím: 008 - csak olvasható - Paula - lemez adatregisztere

Ezek  a  regiszterek a lemezműveletek adatbufferei.  Tartalmuk két byte.  A
DMA  vezérlô  automatikusan  ezeken a regisztereken keresztül továbbítja az
adatokat  a  RAM  és a lemez között.  Ha az utolsó adat is megérkezett, egy
lemez blokk megszakítás váltódik ki a rendszerben.

---------------------------------------------------------------------------

DSKBYTR
-------
Cím: 01A - csak olvasható - Paula - lemez adatbyte állapot

Ez  a  regiszter a lemezegység processzorának adatbuffere.  Az adatok byte-
onként  kerülnek  ebbe a regiszterbe, és ilyenkor a 15-ös bit (DSKBYT) 1-re
állítódik,  ez  jelzi,  hogy  egy  byte megérkezett.  A 14-es bit (DMAON) a
DSKLEN  regiszter  15-ös  és a DMACON 9-es bitjének ÉS kapcsolata.  A 13-as
bit  a  DSKLEN  regiszter 14-es bitjének másolata.  A 12-es bit (WORDEQUAL)
értéke 1, ha a DSKSYNC értéke megegyezik a lemezrôl érkezô adattal.  A 11-8
bitek használaton kívül vannak.  A 7-0 bitek tartalmazzák az adatbyte-ot.

---------------------------------------------------------------------------

DSKSYNC
-------
Cím: 07E - csak írható - Paula - szinkron regiszter

Ez a regiszter tartalmazza a szinkronizációs értéket lemezrôl való olvasás-
kor.  Lásd még az ADKCON regiszter 10-es bitjét.

---------------------------------------------------------------------------

INTREQ
------
Cím: 09C - csak írható - Paula - megszakítás regisztere

INTREQR
-------
Cím: 01E - csak olvasható - Paula - megszakítás regisztere

Ezek  a  regiszterek  tartalmazzák  a  megszakítás kérelmeket.  A biteket a
processzorral írhatjuk át,jelentésük azonos a következô regiszterleírással.

---------------------------------------------------------------------------

INTENA
------
Cím: 09A - csak írható - Paula - megszakítás engedélyezô bitek

INTENAR
-------
Cím: 01C - csak olvasható - Paula - megszakítás engedélyezô bitek

Ez  a regiszter tartalmazza a megszakításokat engedélyezô biteket.  A bitek
jelentése a következô:

Bit  Név     Szint  Leírás

15   SET/CLR        beállítás/törlés vezérlô bit
14   INTEN          minden megszakítás engedélyezése
13   EXTER     6    külsô megszakítás
12   DSKSYN    5    a lemezrôl szinkronjel érkezett
11   RBF       5    soros port fogadó buffere megtelt
10   AUD3      4    3-as hangcsatorna blokk véget ért
 9   AUD2      4    2-es hangcsatorna blokk véget ért
 8   AUD1      4    1-es hangcsatorna blokk véget ért
 7   AUD0      4    0-ás hangcsatorna blokk véget ért
 6   BLIT      3    blitter végzett
 5   VERTB     3    függôleges üres intervallum kezdete
 4   COPER     3    Copper
 3   PORTS     2    I/O portok és az órák
 2   SOFT      1    szoftvermegszakítás
 1   DSKBLK    1    lemezblokk kész
 0   TBE       1    soros port küldô buffere üres

---------------------------------------------------------------------------

JOY0DAT
-------
Cím: 00A - csak olvasható - Denise - botkormány-egér 0. adat

JOY1DAT
-------
Cím: 00C - csak olvasható - Denise - botkormány-egér 1. adat

Mindkét  regiszter egy 8 bites egér-számlálót olvas.  0=bal oldali vezérlô,
1=jobb  oldali (összesen négy van).  A 15-8 bitek az Y értéket adják, a 7-0
bitek  az  X-et.   A botkormány lekérdezésekor ne felejtsük el, hogy ezek a
funkciók alacsony állapotnál aktívak.  Az irányok a következôk:

                        elôre: (9-es bit) XOR (8-as bit)
                        balra: 9-es bit
                        hátra: (1-es bit) XOR (0-ás bit)
                        jobbra: 1-es bit

---------------------------------------------------------------------------

JOYTEST
-------
Cím: 036 - csak írható - Denise - ellenôrzôregiszter

A bitek kiosztása a következô:

Bit : 15  14  13  12  11  10  09  08  07  06  05  04  03  02  01  00
0DAT: Y7  Y6  Y5  Y4  Y3  Y2  xx  xx  X7  X6  X5  X4  X3  X2  xx  xx
1DAT: Y7  Y6  Y5  Y4  Y3  Y2  xx  xx  X7  X6  X5  X4  X3  X2  xx  xx

---------------------------------------------------------------------------

POT0DAT
-------
Cím: 012 - csak olvasható - Paula - bal potméter adata

POT1DAT
Cím: 014 - csak olvasható - Paula - jobb potméter adata

Mindkét regiszter egy potméter párt olvas.  A bitek kiosztása a következô:

Bit : 15  14  13  12  11  10  09  08  07  06  05  04  03  02  01  00
Jobb: Y7  Y6  Y5  Y4  Y3  Y2  Y1  Y0  X7  X6  X5  X4  X3  X2  X1  X0
Bal : Y7  Y6  Y5  Y4  Y3  Y2  Y1  Y0  X7  X6  X5  X4  X3  X2  X1  X0

---------------------------------------------------------------------------

POTGO
-----
Cím: 034 - csak írható - Paula - adatírás és indítás

POTGOR
------
Cím: 016 - csak olvasható - Paula - adatolvasás

Ez  a  regiszter  egy  négybites  I/O  portot vezérel.  A bitek kiosztása a
következô:

Bit  Név    Leírás

15   OUTRY  a Paula 36-os tűjén az output engedélyezve
14   DATRY  I/O adat a Paula 36-os tűjén
13   OUTRX  a Paula 35-ös tűjén az output engedélyezve
12   DATRX  I/O adat a Paula 35-ös tűjén
11   OUTLY  a Paula 33-as tűjén az output engedélyezve
10   DATLY  I/O adat a Paula 33-as tűjén
 9   OUTLX  a Paula 32-es tűjén az output engedélyezve
 8   DATLX  I/O adat a Paula 32-es tűjén
7-1    0    foglalt
 0   START  a mérést indítja el

---------------------------------------------------------------------------

REFPTR
------
Cím: 028 - csak írható - Agnus - frissítô mutató

Ezt a regisztert a rendszer a memóriafrissítésre használja.

---------------------------------------------------------------------------

SERDAT
------
Cím: 030 - csak írható - Paula - soros port adatregisztere

Ez  a  regiszter  a tartalmát egy küldô bufferbe írja.  Innen a hardver egy
eltoló  eljárással  soros adattá alakítja, és így küldi a soros portra.  Ha
az adat elment, egy megszakítás generálódik.  A stopbitet az adat részeként
kell  beírni.   A  stopbit  helyzete  határozza  meg  az  adat  hosszát.  A
következô táblázatban az 'S' jelenti a stopbitet, a 'D' az adatbitet.

Bit: 15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00
      0  0  0  0  0  0  S D8 D7 D6 D5 D4 D3 D2 D1 D0

---------------------------------------------------------------------------

SERDATR
-------
Cím: 018 - csak olvasható - Paula - soros port adat és állapot

Ez  a  regiszter  olvassa  az adatokat az adatfogadó regiszterbôl.  Az adat
akkor  kerül  be,  amikor  a  fogadó  buffer megtelt.  Ezenkívül még néhány
állapotbit is van ebben a regiszterben.

Bit  Név      Leírás

15   OVRUN    soros port adatfogadása túlfutott
14   RBF      a fogadó buffer megtelet
13   TBE      a küldô buffer megtelt
12   TSRE     a küldô eltoló regiszter üres
11   RXD      RXD tű UART adatot fogad
10    0       használaton kívül
 9   STP      stopbit
 8   STP-DB8  stopbit vagy adatbit
 7   DB7      adatbit
 6   DB6      adatbit
 5   DB5      adatbit
 4   DB4      adatbit
 3   DB3      adatbit
 2   DB2      adatbit
 1   DB1      adatbit
 0   DB0      adatbit

---------------------------------------------------------------------------

SERPER
------
Cím: 032 - csak írható - Paula - soros port vezérlô regisztere

Ha  a  15-ös  bit  értéke  1,  akkor  a  soros porton 9 bites adatok mennek
keresztül,  egyébként  8  bitesek.   A maradék 15 biten (14-0) a soros port
sebessége  állítható  be.   Ha  ezen bitek értéke N, akkor egy bit továbbí-
tásának ideje (N+1)*0.2794 msec.

---------------------------------------------------------------------------

SPRxPTH
-------
Cím: 120 - csak írható - Agnus - sprite mutató (felsô 3 bit)

SPRxPTL
-------
Cím: 122 - csak írható - Agnus - sprite mutató (alsó 15 bit)

Ezek  a  regiszterpárok  a  sprite-ok  (x=0,1,2,3,4,5,6,7)  18  bites címet
tartalmazzák.  Ezeket a regisztereket minden képfrissítéskor újra kell írni
a processzorral vagy a Copperrel.

---------------------------------------------------------------------------

SPRxPOS
-------
Cím: 140 - csak írható - Agnus, Denise - sprite pozíció

SPRxCTL
-------
Cím: 142 - csak írható - Agnus, Denise - sprite vezérlôregiszter

Ezek  a  regiszterek  határozzák  meg a sprite pozícióját, méretét és egyéb
tulajdonságát.   Általában  ezeket  a regisztereket a DMA írja át, de ezt a
processzor is megteheti.
Az  SPRxPOS  regiszter  bitkiosztása  a következô:  15-8 bitek:  függôleges
kezdôpozíció, 7-0 bitek:  vízszintes kezdôpozíció.
Az  SPRxCTL  regiszter  bitkiosztása  a következô:  15-8 bitek:  függôleges
végpozíció,  7-es  bit:   összeragasztás, 6-4 bitek használaton kívül, 2-es
bit:   függôleges  kezdôpozíció  legfelsô  bitje,  1-es  bit:   függôleges
végpozíció  legfelsô  bitje,  0-ás  bit:   vízszintes  kezdôpozíció legalsó
bitje.

---------------------------------------------------------------------------

SPRxDATA
--------
Cím: 144 - csak írható - Denise - sprite adatregiszter

SPRxDATB
--------

Ezek  a regiszterek a sprite adatregiszterei.  Álatlában a DMA írja át eze-
ket  a  regisztereket, azonban erre a processzor is képes.  Amikor a sprite
pozíciója  megegyezik az elektronsugár pozíciójával, akkor ezen regiszterek
egy  eltoló  regiszterbe kerülnek és egyesével jutnak a képernyôre.  Megje-
gyezzük,  hogy  az  A  bufferbe  való  írás  engedélyezi  a  sprite-ot,  az
SPRxCTL-be való írás pedig letiltja.

---------------------------------------------------------------------------

STREQU
------
Cím: 038 - strobe - Denise - vízszintes szinkron a VB-vel és EQU-val

STRVBL
------
Cím: 03A - strobe - Denise - vízszintes szinkronizálás a VB-vel

STRHOR
------
Cím: 03C - strobe - Denise, Paula - vízszintes szinkronizálás

STRLONG
-------
Cím: 03E - strobe - Denise - egyeztetés hosszú vonallal

Ezek  a regiszterek a memóriafrissítés módját állítják be.  A VB jelentése:
függôleges üres intervallum.

---------------------------------------------------------------------------

VPOSR
-----
Cím: 004 - csak olvasható - Agnus - függôleges MSB

VPOSW
-----
Cím: 02A - csak írható - Agnus - függôleges MSB

A 15-ös bit jelentése:  hosszú keret, a 0-ás bit pedig a függôleges pozíció
legmagasabb helyiértékű bitje.

---------------------------------------------------------------------------

VHPOSR
------
Cím: 006 - csak olvasható - Agnus - elektronsugár, fényceruza pozíció

VHPOSW
------
Cím:  02C - csak írható - Agnus - elektronsugár, fényceruza pozíció

A 15-8 bitek a függôleges pozíciót adják meg, a 7-0 bitek a vízszintest.  A
felbontás a képernyô szélességének 1/160-ad része (280 ns).

---------------------------------------------------------------------------














Regiszterek cím szerinti sorrendben.

Cím  Név          Cím  Név          Cím  Név          Cím  Név

000  BLTDDAT      070  BLTCDAT      0E0  BPL1PTH      150  SPR2POS
002  DMACONR      072  BLTBDAT      0E2  BPL1PTL      152  SPR2CTL
004  VPOSR        074  BLTADAT      0E4  BPL2PTH      154  SPR2DATA
006  VHPOSR       076               0E6  BPL2PTL      156  SPR2DATB
008  DSKDATR      078               0E8  BPL3PTH      158  SPR3POS
00A  JOY0DAT      07A               0EA  BPL3PTL      15A  SPR3CTL
00C  JOY1DAT      07C               0EC  BPL4PTH      15C  SPR3DATA
00E  CLXDAT       07E  DSKSYNC      0EE  BPL4PTL      15E  SPR3DATB
010  ADKCONR      080  COP1LCH      0F0  BPL5PTH      160  SPR4POS
012  POT0DAT      082  COP1LCL      0F2  BPL5PTL      162  SPR4CTL
014  POT1DAT      084  COP2LCH      0F4  BPL6PTH      164  SPR4DATA
016  POTGOR       086  COP2LCL      0F6  BPL6PTL      166  SPR4DATB
018  SERDATR      088  COPJMP1      0F8               168  SPR5POS
01A  DSKBYTR      08A  COPJMP2      0FA               16A  SPR5CTL
01C  INTENAR      08C  COPINS       0FC               16C  SPR5DATA
01E  INTREQR      08E  DIWSTRT      0FE               16E  SPR5DATB
020  DSKPTH       090  DIWSTOP      100  BPLCON0      170  SPR6POS
022  DSKPTL       092  DDFSTRT      102  BPLCON1      172  SPR6CTL
024  DSKLEN       094  DDFSTOP      104  BPLCON2      174  SPR6DATA
026  DSKDAT       096  DMACON       106               176  SPR6DATB
028  REFPTR       098  CLXCON       108  BPL1MOD      178  SPR7POS
02A  VPOSW        09A  INTENA       10A  BPL2MOD      17A  SPR7CTL
02C  VHPOSW       09C  INTREQ       10C               17C  SPR7DATA
02E  COPCON       09E  ADKCON       10E               17E  SPR7DATB
030  SERDAT       0A0  AUD0LCH      110  BPL1DAT      180  COLOR00
032  SERPER       0A2  AUD0LCL      112  BPL2DAT      182  COLOR01
034  POTGO        0A4  AUD0LEN      114  BPL3DAT      184  COLOR02
036  JOYTEST      0A6  AUD0PER      116  BPL4DAT      186  COLOR03
038  STREQU       0A8  AUD0VOL      118  BPL5DAT      188  COLOR04
03A  STRVBL       0AA  AUD0DAT      11A  BPL6DAT      18A  COLOR05
03C  STRHOR       0AC               11C               18C  COLOR06
03E  STRLONG      0AE               11E               18E  COLOR07
040  BLTCON0      0B0  AUD1LCH      120  SPR0PTH      190  COLOR08
042  BLTCON1      0B2  AUD1LCL      122  SPR0PTL      192  COLOR09
044  BLTAFWM      0B4  AUD1LEN      124  SPR1PTH      194  COLOR10
046  BLTALWM      0B6  AUD1PER      126  SPR1PTL      196  COLOR11
048  BLTCPTH      0B8  AUD1VOL      128  SPR2PTH      198  COLOR12
04A  BLTCPTL      0BA  AUD1DAT      12A  SPR2PTL      19A  COLOR13
04C  BLTBPTH      0BC               12C  SPR3PTH      19C  COLOR14
04E  BLTBPTL      0BE               12E  SPR3PTL      19E  COLOR15
050  BLTAPTH      0C0  AUD2LCH      130  SPR4PTH      1A0  COLOR16
052  BLTAPTL      0C2  AUD2LCL      132  SPR4PTL      1A2  COLOR17
054  BLTDPTH      0C4  AUD2LEN      134  SPR5PTH      1A4  COLOR18
056  BLTDPTL      0C6  AUD2PER      136  SPR5PTL      1A6  COLOR19
058  BLTSIZE      0C8  AUD2VOL      138  SPR6PTH      1A8  COLOR20
05A               0CA  AUD2DAT      13A  SPR6PTL      1AA  COLOR21
05C               0CC               13C  SPR7PTH      1AC  COLOR22
05E               0CE               13E  SPR7PTL      1AE  COLOR23
060  BLTCMOD      0D0  AUD0LCH      140  SPR0POS      1B0  COLOR24
062  BLTBMOD      0D2  AUD0LCL      142  SPR0CTL      1B2  COLOR25
064  BLTAMOD      0D4  AUD0LEN      144  SPR0DATA     1B4  COLOR26
066  BLTDMOD      0D6  AUD0PER      146  SPR0DATB     1B6  COLOR27
068               0D8  AUD0VOL      148  SPR1POS      1B8  COLOR28
06A               0DA  AUD0DAT      14A  SPR1CTL      1BA  COLOR29
06C               0DC               14C  SPR1DATA     1BC  COLOR30
06E               0DE               14E  SPR1DATB     1BE  COLOR31















A chipek lábkiosztása

Megjegyzés: a '*' jelentése: alacsony aktív szintű jel


                                   Agnus
                                   -----
Tű  Név    Irány  Funkció

 1  D8      I/O   adatbusz 8
 2  D7      I/O   adatbusz 7
 3  D6      I/O   adatbusz 6
 4  D5      I/O   adatbusz 5
 5  D4      I/O   adatbusz 4
 6  D3      I/O   adatbusz 3
 7  D2      I/O   adatbusz 2
 8  D1      I/O   adatbusz 1
 9  D0      I/O   adatbusz 0
10  VCC      I    +5V
11  RES*     I    rendszer reset
12  INT3*    O    3-as szintű megszakítás
13  DMAL     I    DMA kérelem
14  BLS*     I    blitter slowdown
15  DBR*     O    adatbusz kérelem
16  ARW*     O    Agnus RAM-ba írás
17  RGA8    I/O   regiszter cím 8
18  RGA7    I/O   regiszter cím 7
19  RGA6    I/O   regiszter cím 6
20  RGA5    I/O   regiszter cím 5
21  RGA4    I/O   regiszter cím 4
22  RGA3    I/O   regiszter cím 3
23  RGA2    I/O   regiszter cím 2
24  RGA1    I/O   regiszter cím 1
25  CCK      I    szín-óraciklus
26  CCKQ     I    szín-óraciklus késleltetés
27  VSS      I    föld
28  DRA0     O    dinamikus RAM cím 0
29  DRA1     O    dinamikus RAM cím 1
30  DRA2     O    dinamikus RAM cím 2
31  DRA3     O    dinamikus RAM cím 3
32  DRA4     O    dinamikus RAM cím 4
33  DRA5     O    dinamikus RAM cím 5
34  DRA6     O    dinamikus RAM cím 6
35  DRA7     O    dinamikus RAM cím 7
36  DRA8     O    dinamikus RAM cím 8
37  LP*      I    fényceruza input
38  VSY*    I/O   függôleges szinkronizáció
39  CSY*     O    composite szinkronizáció
40  HSY*    I/O   vízszintes szinkronizáció
41  VSS      I    föld
42  D15     I/O   adatbusz 15
43  D14     I/O   adatbusz 14
44  D13     I/O   adatbusz 13
45  D12     I/O   adatbusz 12
46  D11     I/O   adatbusz 11
47  D10     I/O   adatbusz 10
48  D9      I/O   adatbusz 9


                                  Denise
                                  ------
Tű  Név    Irány  Funkció

 1  D6      I/O   adatbusz 6
 2  D5      I/O   adatbusz 5
 3  D4      I/O   adatbusz 4
 4  D3      I/O   adatbusz 3
 5  D2      I/O   adatbusz 2
 6  D1      I/O   adatbusz 1
 7  D0      I/O   adatbusz 0
 8  M1H      I    1-es egér vízszintes
 9  M0H      I    0-ás egér vízszintes
10  RGA8    I/O   regiszter cím 8
11  RGA7    I/O   regiszter cím 7
12  RGA6    I/O   regiszter cím 6
13  RGA5    I/O   regiszter cím 5
14  RGA4    I/O   regiszter cím 4
15  RGA3    I/O   regiszter cím 3
16  RGA2    I/O   regiszter cím 2
17  RGA1    I/O   regiszter cím 1
18  BURST*   O    színszakadás
19  VCC      I    +5V
20  R0       O    vörös 0-ás bit
21  R1       O    vörös 1-es bit
22  R2       O    vörös 2-es bit
23  R3       O    vörös 3-as bit
24  B0       O    kék 0-ás bit
25  B1       O    kék 1-es bit
26  B2       O    kék 2-es bit
27  B3       O    kél 3-as bit
28  G0       O    zöld 0-ás bit
29  G1       O    zöld 1-es bit
30  G2       O    zöld 2-es bit
31  G3       O    zöld 3-as bit
32  N/C      -    nincs bekötve
33  ZD*      O    háttér indikátor
34  N/C      -    nincs bekötve
35  7M       I    7.15909 MHz
36  CCK      I    szín óraciklus
37  VSS      I    föld
38  M0V      I    0-ás egér függôleges
39  M1V      I    1-es egér függôleges
40  D15     I/O   adatbusz 15
41  D14     I/O   adatbusz 14
42  D13     I/O   adatbusz 13
43  D12     I/O   adatbusz 12
44  D11     I/O   adatbusz 11
45  D10     I/O   adatbusz 10
46  D9      I/O   adatbusz 9
47  D8      I/O   adatbusz 8
48  D7      I/O   adatbusz 7


                                   Paula
                                   -----
Tű  Név    Irány  Funkció

 1  D8      I/O   adatbusz 8
 2  D7      I/O   adatbusz 7
 3  D6      I/O   adatbusz 6
 4  D5      I/O   adatbusz 5
 5  D4      I/O   adatbusz 4
 6  D3      I/O   adatbusz 3
 7  D2      I/O   adatbusz 2
 8  VSS      I    föld
 9  D1      I/O   adatbusz 1
10  D0      I/O   adatbusz 0
11  RES*     I    rendszer reset
12  DMAL     O    DMA kérelem vonala
13  IPL0*    O    megszakítás vonal 0
14  IPL1*    O    megszakítás vonal 1
15  IPL2*    O    megszakítás vonal 2
16  INT2*    I    megszakítás szintje 2
17  INT3*    I    megszakítás szintje 3
18  INT6*    I    megszakítás szintje 6
19  RGA8    I/O   regiszter cím 8
20  RGA7    I/O   regiszter cím 7
21  RGA6    I/O   regiszter cím 6
22  RGA5    I/O   regiszter cím 5
23  RGA4    I/O   regiszter cím 4
24  RGA3    I/O   regiszter cím 3
25  RGA2    I/O   regiszter cím 2
26  RGA1    I/O   regiszter cím 1
27  VCC      I    +5V
28  CCK      I    szín óraciklus
29  CCKQ     I    szín óracilus késleltetése
30  AUDB     O    jobb oldali hang
31  AUDA     O    bal oldali hang
32  POT0X   I/O   POT 0X
33  POT0Y   I/O   POT 0Y
34  VSSANA   I    analóg föld
35  POT1X   I/O   POT 1X
36  POT1Y   I/O   POT 1Y
37  DKRD*    I    lemez olvasás adat
38  DKWD*    O    lemez írás adat
39  DKWE     O    lemez írás engedélyezése
40  TXD      O    soros port adatküldés
41  RXD      I    soros port adatfogadás
42  D15     I/O   adatbusz 15
43  D14     I/O   adatbusz 14
44  D13     I/O   adatbusz 13
45  D12     I/O   adatbusz 12
46  D11     I/O   adatbusz 11
47  D10     I/O   adatbusz 10
48  D9      I/O   adatbusz 9













Memóriatérkép
-------------

Cím              Tartalom

000000 - 03FFFF  256 Kbyte RAM

040000 - 07FFFF  256 Kbyte RAM

080000 - 1FFFFF  használaton kívül

200000 - 9FFFFF  külsô bôvítés

A00000 - BEFFFF  használaton kívül

BFD000 - BFDF00  8520-B (hozzáférés csak a páros címeken)
   -        -
BFE001 - BFEF01  8520-A (hozzáférés csak a páratlan címeken)
   -        -    Az aláhúzott számjegy választ a 8520-as 16 regisztere
                 közül.


C00000 - DFEFFF  foglalt késôbbi használatra

DFF000 - DFFFFF  speciális célú chipek regiszterei, ahol az utolsó
                 három számjegy választja ki a regiszter címét.

E00000 - E7FFFF  foglalt késôbbi bôvítésekre

E80000 - EFFFFF  bôvítô rés dekódolás

F00000 - F7FFFF  használaton kívül

F80000 - FFFFFF  rendszer ROM
                 A fejlesztôi ROM-ok FE0000-nál kezdôdnek.
                 A végleges ROM várhatóan FC0000-nál fog kezdôdni.


A 8520-as regiszterei a következôk:

8520-A  8520-B  Név   Funkció

BFE001  BFD000  PRA   periféria adatregiszter A
BFE101  BFD100  PRB   periféria adatregiszter B
BFE201  BFD200  DDRB  adatirány regiszter A
BFE301  BFD300  DDRA  adatirány regiszter B
BFE401  BFD400  TALO  óra A alsó regiszter
BFE501  BFD500  TAHI  óra A felsô regiszter
BFE601  BFD600  TBLO  óra B alsó regiszter
BFE701  BFD700  TBHI  óra B felsô regiszter
BFE801  BFD800        tárgy legalsó bit
BFE901  BFD900        tárgy 8-15 bitek
BFEA01  BFDA00        tárgy legfelsô bit
BFEB01  BFDB00        nincs bekötve
BFEC01  BFDC00  SDR   soros port adatregisztere
BFED01  BFDD00  ICR   megszakítás vezérlôregiszter
BFEE01  BFDE00  CRA   vezérlôregiszter A
BFEF01  BFDF00  CRB   vezérlôregiszter B













Interfészek

Ez  a függelék négy részre osztható:  az elsô rész a külsô csatlakozók láb-
kiosztását  írja  le.  A második rész azon lábak leírását tartalmazza, ame-
lyek  funkciója  nem  egyértelmű.  A harmadik rész a bels csatlakozásokról,
például  a  lemezegységrôl ír.  A negyedik rész a csatlakozások programozá-
sáról  ír.   A  harmadik  és  a  negyedik  rész feltétlenül szükséges lehet
rendszerprogramozóknak, de mások is jó ha tudnak a kapcsolások logikájáról.
A külsô portokat a rendszer maga kezeli, így a programozónak nem kell azzal
foglalkozni, hogy egy adat éppen milyen formában érkezett a külvilából.


1. rész: külsô csatlakozások
----------------------------

Soros port:
(DB25 J6)

Megjegyzés: a középsô oszlop az Amiga lábkiosztása található, a másik kettô
csak összehasonlításul van jelen.

Láb  RS232  Amiga  Hayes  Leírás

 1   GND    GND           föld
 2   TXD    TXD    TXD    küldött adat
 3   RXD    RXD    RXD    fogadott adat
 4   RTS    RTS           küldés kérelem
 5   CTS    CTS    CTS    küldés törlés
 6   DSR    DSR    DSR    adat kész
 7   GND    GND    GND    rendszer föld
 8   CD     CD     CD     carrier ellenôrzés
 9
10
11
12   S.SD
13   S.CTS
14   S.TXD  -5V           -5V tápfeszültség
15   TXC    AUDO          audio out
16   S.RXD  AUDI          audio in
17   RXC    EB            716 KHz
18          INT2*         megszakítás szintje
19   S.RTS
20   DTR    DTR           utolsó adat kész
21   SQD    +5V           +5V
22   RI
23   SS     +12V          +12V
24   TXC1   C2*           3.58MHz
25   RESB*                rendszer reset


Párhuzamos port:
(DB25 J8)

 1  DRDY*           14  GND
 2  D0              15  GND
 3  D1              16  GND
 4  D2              17  GND
 5  D3              18  GND
 6  D4              19  GND
 7  D5              20  GND
 8  D6              21  GND
 9  D7              22  GND
10  ACK*            23  +5V
11  BUSY (adat)     24
12  POUT (clk)      25  RESET*
13  SHL


Billentyűzet:
(RJ11 J9)

1  +5V
2  CLOCK
3  DATA
4  GND


RGB:
(DB23 J3)

 1  XCLK*           13  GNDRTN
 2  XCLKEN*         14  ZD*
 3  RED             15  C1*
 4  GREEN           16  GND
 5  BLUE            17  GND
 6  DI              18  GND
 7  DB              19  GND
 8  DG              20  GND
 9  DR              21  -5V
10  CSYNC*          22  +12V
11  HSYNC*          23  -5V
12  VSYNC*


TV video:
(8 tűs DIN J2)

1  N.C.
2  GND
3  bal hang
4  COMP VIDEO
5  GND
6  N.C.
7  +12V
8  jobb hang


Külsô lemez:
(DB23 J7)

 1  RDY*            13  SIDEB*
 2  DKRD*           14  WPRO*
 3  GND             15  TK0*
 4  GND             16  DKWEB*
 5  GND             17  DKWDB*
 6  GND             18  STEPB*
 7  GND             19  DIRB
 8  MTRXD*          20  SEL3B*
 9  SEL2B*          21  SEL1B*
10  DRESB*          22  INDEX*
11  CHNG*           23  +12V
12  +5V


RAMEX:
(66 TűS NYÁKvég [.156] P1)

 1  GND              A  GND
 2  D15              B  D14
 3  +5V              C  +5V
 4  D12              D  D13
 5  GND              E  GND
 6  D11              F  D10
 7  +5V              H  +5V
 8  D8               J  D9
 9  GND              K  GND
10  D7               L  D6
11  +5V              M  +5V
12  D4               N  D5
13  GND              P  GND
14  D3               R  D2
15  +5V              S  +5V
16  D0               T  D1
17  GND              U  GND
18  DRA4             V  DRA3
19  DRA5             W  DRA2
20  DRA6             X  DRA1
21  DRA7             Y  DRA0
22  GND              Z  GND
23  RAS*            AA  RRW*
24  GND             BB  GND
25  GND             CC  GND
26  CASU0*          DD  CASU1*
27  GND             EE  GND
28  CASL0*          FF  CASL1*
29  +5V             HH  +5V
30  +5V             JJ  +5V


EXPANSION:
(86 tűs NYÁKvég [.1] P2)

 1  GND             44  IPL2*
 2  GND             45  A16
 3  GND             46  BERR*
 4  GND             47  A17
 5  +5V             48  VPA*
 6  +5V             49  GND
 7  EXP             50  E
 8  -5V             51  VMA*
 9  EXP             52  A18
10  +12V            53  RES*
11  EXP             54  A19
12  CONFIG          55  HLT*
13  GND             56  A20
14  C3*             57  A22
15  CDAC            58  A21
16  C1*             59  A23
17  OVR*            60  BR*
18  XRDY            61  GND
19  INT2*           62  BGACK*
20  PALOPE*         63  PD15
21  A5              64  BG*
22  INT6*           65  PD14
23  A6              66  DTACK*
24  A4              67  PD13
25  GND             68  PRW*
26  A3              69  PD12
27  A2              70  LDS*
28  A7              71  PD11
29  A1              72  UDS*
30  A8              73  GND
31  FC0             74  AS*
32  A9              75  PD0
33  FC1             76  PD10
34  A10             77  PD1
35  FC2             78  PD9
36  A11             79  PD2
37  GND             80  PD8
38  A12             81  PD3
39  A13             82  PD7
40  IPL0*           83  PD4
41  A14             84  PD6
42  IPL1            85  GND
43  A15             86  PD5


POWER:
(7 tű [.156] J14)

1  -5V
2  +12V
3  GND
4  GND
5  +5V
6  +5V
7  tick


JOYSTICKS:
(DB9 J11=jobb J12=bal)

1  elôre* (egér függôleges)
2  hátra* (egér vízszintes)
3  bal* (egér függôQ)
4  jobb* (egér vízszQ)
5  POT X (vagy 3-as gomb)
6  tűz* (vagy 1-es gomb)
7  +5V
8  GND
9  POT Y (vagy 2-es gomb)


A következô táblázat az összes csatlakozás maximális terhelését tartalmazza
a különbözô tápfeszültségeknek megfelelôen:

port             +5V  +12V  -5V

RF modulátor           60
RGB              300  175    50
soros port       100   50    50
külsô lemez      270  160
párhuzamos port  100
bôvítô port     1000   50    50
0-ás joystick    125
1-es joystick    125


2. rész: a külvilág
-------------------

A párhuzamos interfész csatlakozója
-----------------------------------

A  25  tűs  D-tipusú  csatlakozót  általában  nyomtató  csatlakoztatására
használjuk.   Az interfészt azonban adatok fogadására is használhatjuk, sôt
kétirányú adatforgalmat is kialakíthatunk rajta.

Néhány megjegyzés:  a DRDY (adat kész) és az ACK vonalakat szinkronizálásra
használjuk.   A  BUSY,  POUT,  SEL  vonalak  általános  célú  I/O  vonalak.
Nyomtató  csatlakoztatása  esetén  a  BUSY  jelzi,  hogy a nyomtató buffere
megtelt, a POUT jelzi, hogy a papír elfogyott.


Párhuzamos port output ciklusa

PA, PB ##><##################################><##
          <---T1--->          <------T2------>
DRDY*  ------------           -----------------------
                    ----------
                    <---T3--->
                    <----T4---->
                                <---T5--->
ACK*   -------------------------          ----------
                                ----------

    Mikroszekundum

    Min.  Typ.  Max.
T1: 4.3   -x-   5.3
T2: nsp   -x-   upc
T3: nsp   1.4   nsp
T4:  0    -x-   upc
T5: nsp   -x-   upc

msp: nincs meghatározva
upc: programozható


Párhuzamos port input ciklusa

PA, PB ##><##################################><##
          <---T1--->                      <T2>
DRDY*  ------------           -----------------------
                    ----------
                    <---T3--->
                    <----T4---->
                                <---T5--->
ACK*   -------------------------          ----------
                                ----------

    Mikroszekundum

    Min.  Typ.  Max.
T1:  0    -x-   upc
T2: nsp   -x-   upc
T3: nsp   -x-   upc
T4: upc   -x-   upc
T5: nsp   1.4   nsp

msp: nincs meghatározva
upc: programozható


A soros interfész csatlakozó
----------------------------

Ezt  a  25  tűs  D-tipusú  csatlakozót  RS232-C kapcsolására használhatjuk.
Néhány  megjegyzés:   az  AUDO  vonalon a baloldal (0, 3-as csatornák) hang
jelenik  meg,  amit  a  modembe vezethetünk.  Az AUDI vonalon beérkezô hang
keverve a jobboldali (1, 2-es csatornák) hangal együtt jelenik meg.

A  maximális  műveleti  frekvencia  19.2 KHz.  Azonban a MIDI adapterrel az
31.25  KHz-re növelhetô.  A modemvezérlôk (CTS, RTS, DTR, DSR, CD) teljesen
programozhatók.

A soros port elektronikája:

output   Min.  Typ.  Max.
V0(-):   -2.5  -x-   -5.5  V   az output feszültségtartománya
V0(+):   8     -x-   13.2  V   az output feszültségtartománya
I0:            -x-   10    ma  input áram

input    Min.  Typ.  Max.
V1(+):   3     -x-   25    V   az input feszültségtartománya
V1(-):   -25   -x-   0.5   V   az input feszültségtartomány
I1:      0.3   -x-   10    ma  input áram

Azok  a  lábak  amik  nincsenek  bekötve,  úgy  viselkednek, mintha pozitív
feszültség lenne rákötve.


A gameport csatlakozója
-----------------------

Ezen a porton keresztül a következô eszközök csatolhatók:

1. egér vagy pozícionáló gömb, maximum 3 gombbal.
2. digitális botkormány maximum 2 gombbal.
3. potméter vagy analóg botkormány maximum 2 gombbal.
4. fényceruza orr-gombbal.

Az egér és a pozícionáló gömb olyan berendezések, amelyek a síkbeli mozgást
impulzusokká  alakítják.  A JOY0DAT és a JOY1DAT regiszterek tartalmazzák a
számlálókat  úgy,  hogy  az  Y  érték  van  a magas byte-ban, az X érték az
alacsony byte-ban.  A mozgás a következôt eredményezi:

fel   : Y csökken
le    : Y nô
jobbra: X nô
balra : X csökken

Az  elmozdulás  meghatározásához  a következôket kell tenni:  olvassuk ki a
JOYxDAT-ot  kétszer, és a két értéket vonjuk ki egymásból (moduló 128!).  A
különbség  megadja  az  elmozdulás mértékét.  Az Amiga szoftvere ezt minden
képfrissítéskor elvégzi.

A  tűzgombok egyszerű, nyitott állású gombok.  A PRA0 7-es bit a baloldali,
a  PRA0 6-os bit a jobboldali vezérlôport gombja.  Mielôtt ezeket a regisz-
tereket kiolvasnánk, törölni kell az adatirány regisztert, hogy input üzem-
módot  állítsunk  be.   Eközben  nem szabad a DDRA0 többi bitjét megváltoz-
tatni.  Ajánlatos ezt ROM rutin segítségével megtenni.

Az analóg beviteli eszközök lineáris potenciométereket tartalmaznak, melyek
maximum  470 +/-10 %KOhm-osak.  A JOYxDAT tartalmazza az Y és az X potméte-
rek  digitalizált értékét 256*Y+X alakban.  Ha a külsô ellenállás nô, akkor
ez az érték is nô.  Az Amiga a következô lépésekben olvassa a potmétereket:

1: A POTxDAT regiszterek újraállítódnak, és az input kondenzátorok kisülnek
   az elsô 7 (261) vagy 8 (262) raszterben.
2: Minden további raszterben az inputok összehasonlítódnak egy belsô érték-
   kel.
3: Ha az egyik input megegyezik az értékkel,  akkor a hozzátartozó számláló
   növekedése megáll az egész képfrissítés idejére.
4: Amely  input  nem  érte  el  a küszöbértéket,  az ahhoz tartozó számláló
   tovább növekedik.

Megjegyzés:  a POTY és a POTX bemenetek működnek a jobboldali, és a haszná-
laton kívüli egérgombokként.  A nyitott kapcsoló négy ellenállással, a zárt
kapcsoló  kis ellenállással jelentkezik.  Ajánlatos ezeket az információkat
a ROM segítségével kezelni.

A  fényceruza  egy optoelektronikai eszköz, melynek meghatározható a képer-
nyôn a helyzete.  Amikor az elektronsugár elhalad a fényceruza elôtt, akkor
egy impulzus jelenik meg.  Ebbôl már meghatározható a fényceruza pozíciója,
amint az le van írva a 8-as fejezetben.


Külsô lemezegység csatlakoztatása
---------------------------------

Az  Amiga  hátoldalán levô 23 tűs D-tipusú csatlakozút általában MFM lemez-
egységek kapcsolására használjuk.

A  lemezegység kezelése a 8-as fejezetben megtalálható.  Ezenkívül a lemez-
egység  nyújt  egy  azonosítási  módot:  kapcsoljuk be, azután ki a motort.
Ekkor  indítsunk  egy  32  lépéses  ciklust  és  olvassuk be a soros adatot
(RDY*).  Mivel ez a vonal alacsony aktív szinttel rendelkezik, a beolvasott
adatot invertálni kell.  Ez az adat adja meg a lemezegység azonosítóját:

$0000 0000 - nincs lemezegység
$FFFF FFFF - standard 3.5-ös lemez
$5555 5555 - 48 TPI, DS DD

Megjegyzések:   a  külsô  lemezegység kábele ne legyen 1 méternél hosszabb.
Maximum 3 külsô lemezegység csatlakoztatható.


3. rész: belsô csatlakoztatások
-------------------------------

Belsô lemezegység:
(34 tű J10)

 1  GND               18  DIRB
 2  CHNG*             19  GND
 3  GND               20  STEPB*
 4  MTR0D* (led)      21  GND
 5  GND               22  DKWDB*
 6  N.C.              23  GND
 7  GND               24  DKWEB*
 8  INDEX*            25  GND
 9  GND               26  TK0*
10  SEL0B*            27  GND
11  GND               28  WPRO*
12  N.C.              29  GND
13  GND               30  DKRD*
14  N.C.              31  GND
15  GND               32  SIDEB*
16  MTR0D*            33  GND
17  GND               34  RDY*


Belsô lemez tápfeszültsége:
(4 tű J13)

1  +12V
2  GND
3  GND
4  +5V


4. rész: 8520-as port
---------------------

Cím: $BFFE01   adatbitek 7-0  (A12*)  (int2)

PA7..gameport 1, 6-os tű (tűzgomb*)
PA6..gameport 0, 6-os tű (tűzgomb*)
PA5..RDY*      lemez kész*
PA4..TK0*      lemez 00-ás track*
PA3..WPRO*     lemez írásvédô*
PA2..CHNG*     lemezcsere*
PA1..LED*      led (0=fényes)
PA0..OVL       memóriaátfedés

SP..KDAT       billentyűzet adat
CNT..KCLK
PB7..P7        adat7
PB6..P6        adat6
PB5..P5        adat5      Centronics
PB4..P4        adat4      párhuzamos
PB3..P3        adat3      interfész
PB2..P2        adat2      adat
PB1..P1        adat1
PB0..P0        adat0

PC..DRDY*      Centronics vezérlô
F..ACK*


Cím: $BFDEFE   15-8 adatbitek (A13*)  (int6)

PA7..DTR*
PA6..RTS*
PA5..carrier ellenôrzés
PA4..CTS*
PA3..DSR*
PA2..SEL
PA1..POUT      kifogyott a papír
PA0..BUSY

SP..BUSY       Commodore
CNT..POUT      Commodore

PB7..MTR*      motor
PB6..SEL3*     3-as külsô drive kiválasztása
PB5..SEL2*     2-es külsô drive kiválasztása
PB4..SEL1*     1-es külsô drive kiválasztása
PB3..SEL0*     belsô drive kiválasztása
PB2..SIDE*     oldal kiválasztás
PB1..DIR       irány
PB0..STEP      lépés

PC             használaton kívül
F..INDEX*      lemez index*













Az adapterek
------------

CIAB címtérkép
--------------

        Adatbitek
Cím       7     6      5      4      3     2      1      0

BFD000  /DTR  /RTS   /CD    /CTS   /DSR   SEL    POUT  BUSY
BFD100  /MTR  /SEL3  /SEL2  /SEL1  /SEL0  /SIDE  DIR   /STEP
BFD200  az A kapu adatiránya (BFD000) 1=output
BFD300  a B kapu adatiránya (BFD100) 1=output
BFD400  CIAB A óra alsó byte
BFD500  CIAB A óra felsô byte
BFD600  CIAB B óra alsó byte
BFD700  CIAB B óra felsô byte
BFD800  vízszintes szinkron 7-0 bitek
BFD900  vízszintes szinkron 15-8 bitek
BFDA00  vízszintes szinkron 23-16 bitek
BFDB00  használaton kívül
BFDC00  CIAB soros port adatregisztere
BFDD00  CIAB megszakítás vezrérlô regisztere
BFDE00  CIAB A vezérlôregisztere
BFDF00  CIAB B vezérlôregisztere

Megjegyzés: a CIAB INT6-ot generál.


CIAA címtérkép
--------------

        Adatbitek
Cím       7     6      5      4      3     2      1      0

BFE001  /FIR1 /FIR0  /RDY   /TK0   /WPRO /CHNG  /LED    OVL
BFE101  párhuzamos port
BFE201  az A kapu adatiránya (BFE001) 1=output
BFE301  a B kapu adatiránya (BFE101) 1=output
BFE401  CIAA A óra alsó byte
BFE501  CIAA A óra felsô byte
BFE601  CIAA B óra alsó byte
BFE701  CIAA B óra felsô byte
BFE801  60 Hz számlálója 7-0 bytek
BFE901  60 Hz számlálója 15-8 bitek
BFEA01  60 Hz számlálója 23-16 bitek
BFEB01  használaton kívül
BFEC01  CIAA soros port adatregisztere (billentyűzet)
BFED01  CIAA megszakítás vezérlô regisztere
BFEE01  CIAA A vezérlôregisztere
BFEF01  CIAA B vezérlôregisztere

Megjegyzés: a CIAA INT2-t generál.


Az interfész jelei
------------------

Óra input:
A 02 óra TTL kompatibilis, és a belsô berendezések használják az adatbuszon
való kommunikálás idôzítésére.

CS - cship kiválasztás input:
Ha  ez  a  vonal  alacsony  szintű,  amikor  a  02  magas,  akkor a 8520-as
adatvonalai használhatók.  Ha a vonal magas, akkor ez nem lehetséges.

R/W - olvasás/írás input:
Ez  a  jel az adatirányt befolyásolja a 8520-as és a külvilág között.  Ha a
vonal  magas,  akkor  az  adatok  a  CIA-ból  kifelé  áramlanak, ha a vonal
alacsony, akkor befelé.

RS3-RS0 - cím input:
Ezek  a  vonalak  választanak  a  regiszterek közül, melyek leírása feljebb
található.

DB7-DB0 - adatbusz input/output:
Ez a nyolc vonal közvetíti az adatokat a CIA-k és a memóriabusz között.

IRQ - megszakítás kérelem output:
Ez  a  vonal közvetlenül a processzor megszakítás input vonalára van kötve.
A vonal aktív, ha alacsony szintű, és passzív, ha magas szintű.

RES - reset input:
Ha  ez  a  vonal  alacsony  szintre  kerül, az összes regiszter törlôdik, a
portok inputra állítódnak, és az órák is törlôdnek.


Regisztertérkép
---------------

Mindkét  CIA-nak  van  16  regisztere,  melyet  írni és olvasni lehet.  Itt
található a regiszterek listája, és az elérésük módja.

8520-A  8520-B  RS3  RS2  RS1  RS0  Szám  Név   Jelentés

BFE001  BFD000   0    0    0    0    0    PRA   adatregiszter A
BFE101  BFD100   0    0    0    1    1    PRB   adatregiszter B
BFE201  BFD200   0    0    1    0    2    DDRA  adatirány A
BFE301  BFD300   0    0    1    1    3    DDRB  adatirány B
BFE401  BFD400   0    1    0    0    4    TALO  óra A alacsony byte
BFE501  BFD500   0    1    0    1    5    TAHI  óra A magas byte
BFE601  BFD600   0    1    1    0    6    TBLO  óra B alacsony byte
BFE701  BFD700   0    1    1    1    7    TBHI  óra B magas byte
BFE801  BFD800   1    0    0    0    8          tárgy LSB
BFE901  BFD900   1    0    0    1    9          tárgy 8-15
BFEA01  BFDA00   1    0    1    0    A          tárgy MSB
BFEB01  BFDB00   1    0    1    1    B          tárgy bekötve
BFEC01  BFDC00   1    1    0    0    C    SDR   soros adatregiszter
BFED01  BFDD00   1    1    0    1    D    ICR   megsz. vezérlô regiszter
BFEE01  BFDE00   1    1    1    0    E    CRA   A vezérlôregiszter
BFEF01  BFDF00   1    1    1    1    F    CRB   B vezérlôregiszter

Megjegyzés:   az  operációs  rendszer  mind  a  négy órát használja.  Ha az
operációs  rendszer  alatt futtatjuk a programunkat, akkor erre figyelemmel
kell lenni.

8520A-óraA:  soros port idôzítése.  Ha nem használjuk a soros portot, akkor
az óra más célra felhasználható.

8520A-óraB:   videosugár  követô.   A  rendszer  akkor  használja, amikor a
blittert  a  video  sugárral  idôzítjük.   Bôvebb leírás a rendszerszoftver
kézikönyvében  a  QBSBlit()  leírásánál  található.  Ha nincs ilyen művelet
folyamatban, akkor használható ez az óra is.

8520B-óraA: billentyűzet. Folyamatosan fut, amíg az EXEC-é a vezérlés.

8520B-óraB:   virtuális  óra.  Amíg a rendszer vezérlésben van, addig ez az
óra foglalt a megszakítások és a taszkok kapcsolóinak kezelésére.


A regiszterek leírása
---------------------

I/O portok (PRA,PRB.DDRA,DDRB)

Mindkét  port  (A,B)  egy  8 bites adatregiszterbôl és egy nyolcbites adat-
irányregiszterbôl  áll.   Ha  egy  bit  az adatirányregiszterben 1, akkor a
hozzá  tartozó  adatbit  output  típusú  lesz.   Amikor  az  adatregisztert
olvassuk, akkor a port lábainak aktuális értékét kapjuk.  Mindkét port CMOS
és TTL kompatibilis.  A normál adatmozgáson kívül a PB6 és a PB7 portok óra
funkciókat is ellátnak.

Kézfogás:

A  kézfogás  a  PC  és  a  FLAG  vonalakon keresztül zajlik.  A PC alacsony
szintre  kerül  3  ciklussal a B port kiolvasása után.  Ez a jel arra utal,
hogy  az  adatot  fogadták.   Ha  mindkét  portot (A,B) használjuk 16 bites
adatforgalomra, akkor mindig az A portot kell elôször írni vagy olvasni.  A
FLAG  láb  egy  lefutó jelre érzékeny bemenet, így egy másik PC jelét lehet
vele fogni.  Minden lefutó él a FLAG-et 1-re állítja.

Az órák:

Ezek  az intervallum órák 16 bites olvasható és 16 bites írható részre osz-
lanak.   Értékük  addig  csökken, amíg 0-ra nem ér.  Ennek az ideje függ az
input  frekvenciától.   Az  órákat  egymástól  függetlenül  vagy összefűzve
használhatjuk.   Az  órákkal  így  késleltetést,  különböz  impulzusszéles-
ségeket,  és  hullámformákat  készíthetünk.   A  CNT  inputot  felhasználva
impulzusokat számlálhatunk, és frekvenciát mérhetünk.

START/STOP:

Ezzel a bittel lehet az órát megállítani és újraindítani a 68000-essel.

BP on/off:

Ezzel  a  vezérlô bittel lehet az óra lefutását kiküldeni a B portra.  Az A
óra  lefutása  a  PB6-on  jelenik meg, a B óra lefutása a PB7-en.  Ez a bit
felülírja  az  adatirány  meghatározását,  attól  függetlenül  ez a két bit
output lesz.

TOGGLE/PULSE:

Ez  a  bit határozza meg a PB vonalon jelentkezô jel impulzusainak tipusát.
A  PB  vagy  átbillen az ellenkezô állapotba minden utasításnál, vagy pedig
egy ütem idôtartamával azonos hosszúságú pozitív impulzust állít elô.

ONE-SHOT/CONTINUOUS:

One-Shot  üzemmódban  az óra a közbensô (csak írható) tár értékétôl indulva
visszaszámol nullára, generál egy megszakítást, a számlálóba újra betölti a
tár  értékét, majd leáll.  Folyamatos (continuous) üzemmódban az elôzôekben
ismertetett folyamat ciklikusan ismétlôdik.

FORCELOAD:

Ez  a  bit  lehetôvé  teszi,  hogy  az  óra  értékét  bármikor  újratöltsük
függetlenül attól, hogy az óra éppen jár-e vagy sem.


INPUT módok:

Ezekkel  a  bitekkel lehet meghatározni azt, hogy milyen esemény csökkentse
az  óra  értékét.  Az A órát a 02 impulzusok vagy a CNT lábra küldött külsô
impulzusok  csökkenthetik.   A B órát csökkentheti a 02 impulzus, külsô CNT
impulzus,  az  A  óra  aláfutása,  az  A  óra aláfutása a CNT magas szintje
esetén.

Az  átmeneti  tár  értéke  az  óra  számlálójába  megy  minden aláfutáskor,
beíráskor.  Ha az óra jár, akkor a beírt érték az átmeneti tárba kerül, nem
a számlálóba.

TIME OF DAY óra:

A  TOD 24 bites bináris számláló, melynek az értékét a lefutó élek növelik.
Az órához tartozik egy riasztó regiszter is, amellyel bármikor megszakítást
idézhetünk  elô.   Ez a regiszter ugyanazt a címet foglalja el, mint a TOD,
így  az  elérést  egy  vezérlô  bit  biztosítja.   A  riasztó  csak írható,
olvasáskor  pedig  a  TOD  értékét  kapjuk.  Az idô pontos beállításához és
olvasásához  tudnunk  kell a következôket:  az óraregiszter írásakor az óra
automatikusan  leáll, csak akkor indul újra, ha az 1/10 másodperc regiszter
írása  véget  ért.  Az óra leolvasása közben elôfordulhat egy átvitel a már
olvasott  regiszterbe,  ami  pontatlansághoz  vezetne,  ha  az óraregiszter
olvasásának  pillanatában  a  leolvasott értéket nem rögzítenénk.  Emiatt a
leolvasott érték mindig a közbesô tárba kerül.  A közbensô tár csak az 1/10
másodpercek  olvasása  után  szabadul  fel  ismét.   A CRB7 bit 1-es értéke
határozza meg a riasztó regisztert.


Soros port (SDR)
----------------

INPUT:  az adatok az eltoló regiszterbe kerülnek, és ha a nyolcadik adat is
megérkezett, akkor egy megszakítás generálódik.

OUTPUT:   az  A  óra generálja a baudrate értékét.  A maximális értéke a 02
osztva  4-gyel,  de  ezt inkább a fizikai összekötés korlátolja szabja meg.
Az  adatátadást  az A óra folyamatos üzemre való beállításával kezdjük.  Az
adatot  az  eltoló  regiszterbe  kell  juttatni, ahonnan bitenként távozik.
Nyolc  CNT  impulzus  után  egy  megszakítás  generálódik,  mivel  új  adat
küldésére kész a gép.

KÉTIRÁNYÚSÁG:   ez a lehetôség arra ad alkalmat, hogy több 8520-ast kössünk
össze  egy buszként.  Ilyenkor az egyik CIA-t mint központot, a többit mint
alegységet kell összeépíteni.


Megszakítás vezérlô regiszter
-----------------------------

Öt lehetôség van megszakítás generálására:

- az A óra alulcsordult
- a B óra alulcsordult
- TOD riasztás
- soros port üres/megtelt
- jel érkezett a flag lábon

Egyetlen  regiszterben  vannak  a  megszakítás  adatai  és a maszkbitek.  A
regiszter  (ICR)  tahát  egy  csak írható maszk, és egy csak olvasható adat
regiszterre  különül.   Ha  egy megszakítás generálódik, a megfelelô bit az
adatregiszterben 1-re vált.  Bármelyik megszakítás, mely engedélyezve van a
maszk  regiszterben (értéke 1), az adatregiszter legmagasabb bitjét is 1-re
állítja,  és  az  IRQ  vonalát  alacsony  szintre viszi.  Amikor az adatre-
gisztert kiolvassuk, tartalma törlôdik, és az IRQ vonal ismét magas szintre
kerül.   A  maszk  regiszter  beállítása  a  következô:  válasszuk ki, hogy
melyik  bitet  akarjuk megváltoztatni, és ezt vegyük 1-nek.  Attól függôen,
hogy  törölni  vagy beírni akarjuk, legyen a legfelsô bit 0 vagy 1.  Az így
összegzett értéket egyben írjuk a maszk adatregiszterbe.  Így azok a bitek,
amiket nem  választottunk  ki,  nem változnak.  A két regiszter a következô
formátumú:

               Cím  Név  D7   D6  D5  D4   D3  D2    D1  D0
                D   ICR  IR   0   0   FLG  SP  ALRM  TB  TA    (adat)
                D   ICR  S/C  x   x   FLG  SP  ALRM  TB  TA


Vezérlô regiszterek
-------------------

Két  vezérlô  regiszter van a 8520-asban:  CRA az A órához, CRB a B órához.
A regiszterek formája a következô:

CRA:

Bit  Név      Funkció

 0   START    1=az A óra indul, 0=az A óra megáll
 1   PBON     1=az A óra alulcsordulását a PB6 láb jelzi
 2   OUTMODE  1=az A óra minden alulcsordulása invertálja a PB6-ot
              0=az A óra alulcsordulása egy rendszerütem idôtartamú
              HI impulzust állít elô a PB6-on
 3   RUNMODE  1=one-shot, 0=continuous
 4   LOAD     1=új kezôértéket kell betölteni az A órába. Ez a bit
              strobe-ként működik. Értékét minden feltétlen betöltésnél
              újtra be kell állítani.
 5   INMODE   0=az A óra a 02 impulzusokat számlálja
              1=az A óra a felfutó CNT jeleket számlálja
 6   SPMODE   0=soros port input
              1=soros port output
 7   TOD IN   az óra léptéke: 0=60Hz, 1=50Hz


CRB:

 0   START    1=az B óra indul, 0=az B óra megáll
 1   PBON     1=az B óra alulcsordulását a PB7 láb jelzi
 2   OUTMODE  1=az B óra minden alulcsordulása invertálja a PB7-et
              0=az B óra alulcsordulása egy rendszerütem idôtartamú
              HI impulzust állít elô a PB7-en
 3   RUNMODE  1=one-shot, 0=continuous
 4   LOAD     1=új kezôértéket kell betölteni az A órába. Ez a bit
              strobe-ként működik. Értékét minden feltétlen betöltésnél
              újtra be kell állítani.
6,5  INMODE   CRB6  CRB5  kiválasztott üzemmód:
                0     0   a B óra a 02 impulzusokat számlálja
                1     0   a B óra a CNT felfutásait számlálja
                1     1   a B óra az A óra lefutásait számlálja
                1     1   a B óra az A óra lefutásait számlálja, ha a
                          CNT láb magas szinten van.
 7   ALARM    1=a TOD-ba való írás a riasztást állítja be
              0=a TOD-ba való írás az órát állítja be
              olvasáskor mindig a TOD értékét kapjuk











A billentyűzet interfész
------------------------

A  billentyűzetet  és  a  számítógépet  egy négyeres kábel kapcsolja össze.
Jelentésük  a  következô:   5 volt tápfeszültség, föld és két jel:  KCLK és
KDAT.  A  KCLK  egyirányú,  mindig  a  billentyűzet  küld adatot a gép felé
rajta.  A KDAT ezzel szemben kétirányú.

A  bilentyűzet  nyolc adatbitet küld a számítógépnek egymás után.  Az adat-
átvitel  elôtt  a KCLK és a KDAT vonalak magas szintűek.  A billentyűzet az
elsô  adatot  ráteszi  a KDAT vonalra, és egy impulzust küld a KCLK vonalon
(-alacsony-magas-).   Ezután jön a második adat és így tovább mind a nyolc.
Az  utolsó  adat  elküldése  után  a  KDAT  ismét  magas szintre jut.  Ha a
számítógép  fogadta az adatokat, akkor a KDAT vonalat alacsony szintre kell
állítania  legalább  75  mikroszekundumig,  kézfogás  gyanánt.  Minden adat
elküldése  elôtt  eltolódik.   A  küldés  sorrendje  így  a  következô:
6-5-4-2-2-1-7.   A  KDAT  vonal  alacsony aktív szintű, a magas szint (+5V)
0-nak felel meg, az alacsony szint (0V) 1-nek.

      ______ ____ ____ ____ ____ ____ ____ ____ ______
KCLK:       -    -    -    -    -    -    -    -
KDAT: ----<###><###><###><###><###><###><###><###>----

A billentyűzet processzor a KDAT vonalat kb.  20 ms-al korábban állítja be,
minthogy  a KCLK-t alacsonyra húzná.  A KCLK kb 20 ms-ig alacsony, ezután a
billentyű processzor ismét magasra állítja, vár 20 ms-ot és csak utána írja
át a KDAT-ot.

Minden  billentyűnek  van  egy  7  bites  kódja.  A nyolcadik elküldött bit
jelzi,  hogy  a  billentyűt  éppen  lenyomták,  vagy felengedték.  Ha a bit
értéke  0  (magas),  akkor lenyomták, ha 1 (alacsony) akkor felengedték.  A
CAPSLOCK  kivétel  ez  alól.   Ez  a billentyű mindig csak lenyomáskor küld
jelet.   Ha  elôször  nyomjuk  le,  a  rajta  lévô  led  kigyullad,  és egy
lenyomásról  küld  adatot.   Ha  mégegyszer  megnyomjuk, a led kialszik, és
felengedésrôl érkezik adat.

Elôfordulhat,  hogy a külsô zavaró hatások miatt megszűnik a szinkronizáció
a billentyűzet és a számítógép között.  Ez azt jelenti, hogy a billentyűzet
már elküldte az összes bitet, de a számítógép még csak a bitek felét fogad-
ta.   Ha  ez így van, akkor a billentyűzet nem kap kézfogás jelet az adatok
elküldése  után.  Ha ez a kézfogás nem érkezik meg 143 ms-on belül, akkor a
billentyűzet  feltételezheti,  hogy  a számítógép még adatbitet vár, vagyis
közöttük  a  szinkron  felborult.  Ekkor a billentyűzet újraszinkronizálási
üzemmódba lép.  Ez azt jelenti, hogy kiküld egy 1-es bitet, és megint vár a
kézfogásra.   Ha  143  ms-on belül nem érkezik meg, akkor megint kiküld egy
1-est,  és  újra vár.  Ezt addig csinálja, amíg a kézfogás impulzus meg nem
érkezik.   Ha  ezt  megkapta,  akkor  is biztos lehet abban, hogy egy hibás
adatot  küldött  el.   Itt  derül ki, hogy miért van az, hogy az utolsó bit
jelzi  a  lenyomást  és  a  felengedést.   Az  újraszinkronizálás  alatt  a
billentyűzet  1-eseket küld, és egy felengedett billentyű kevesebb veszélyt
jelent,  mint egy lenyomott.  Mint láttuk, a számítógép nem veszi észre, ha
hibás  adatot  kap,  ezért  a  billentyűzet feladata, hogy errôl értesítse.
Ilyenkor  egy  'lost  sync'  karaktert  ($F9)  küld, és ezután megismétli a
hibásan küldött kódot.


A bekapcsolás folyamata
-----------------------

Két  oka  lehet a billentyűzetnek, hogy végrehajtsa ezt a folyamatot normál
esetben:   ez  egyik,  hogy  a  számítógépet  bekapcsoltuk  úgy,  hogy  a
bliientyűzet  rá  van kötve, a másik, hogy egy bekapcsolt gépre kötjük rá a
billentyűzetet.   A  billentyűzetnek és a számítógépnek azonosan kell a két
esetet  kezelnie.   Az elsô dolog amit tennie kell, hogy egy teljes tesztet
kell  végrehajtania.  Ez  egy  ROM ellenörzôösszeg készítését, egy egyszerű
RAM  tesztet, és az óra tesztjét foglalja magába.  Ezután 1-es biteket kell
küldeni,  amíg  a  kézfogás  jel  meg  nem  érkezik.   Ha  a billentyűzetet
bekapcsolás után csatlakoztatjuk, akkor maximum 8 db 1-es bit után meg kell
érkeznie a visszajelzésnek.  Ezután nem kell 'lost sync' jelet küldeni.  Ha
a  szinkron  létrejött,  a billentyűzetnek értesítenie kell a számítógépet,
hogy tesztelése milyen eredménnyel járt.  Ha valami hiba történt, akkor egy
hibakódot  ($FC)  kell  küldeni.  Ezután nem kell várni a kézfogásra, hanem
ilyenkor  a  billentyűzet  egy  ciklusba  lép,  és  a CAPSLOCK LED-et kezdi
villogtatni.   Egy  villanás  ROM  hibát,  két  villanás  RAM  hibát, három
villanás  az  óra  hibáját jelzi.  Négy villanás azt jelenti, hogy rövidzár
van két sor, vagy két speciális billentyű között.

Ha  a  teszt hibátlanul futott le, akkor a billentyűzet egy ($FD) karaktert
küld,  ezután  pedig  a már nyomva tartott billentyűk kódját küldi el, amit
egy  ($FE)-vel  zár le.  Ezután lekapcsolja a CAPS LOCK LED-et.  Ez jelzi a
folyamat végét.


Reset funkció
-------------

Ha  a  felhasználó  a  CTRL  és  a két AMIGA gombot egyszerre lenyomja, egy
reset-et  vált ki.  A billentyűzet ekkor, miután a KCLK-t alacsonyra húzta,
egy  500  ms-os  órát  indít.   Amikor  az  óra  lejárt,  ellenôrzi, hogy a
billentyűk  még  mindig  le  vannak-e  nyomva.  Ha igen, újraindítja az 500
ms-os órát.  Ha valamennyi billentyűt felengedtük, a processzor megvárja az
500ms-os  ciklus  végét, és ráugrik a reset programjára, ami visszaengedi a
KCLK-t és újraindítja a billentyűzetet.


A speciális billentyűkódok
--------------------------

$F9: az utolsó kód rossz volt, a következô ennek ismétlése lesz
$FA: a billentyűzet buffer megtelt
$FB: használaton kívül
$FC: a bekapcsolási teszt hibát talált
$FD: a bekapcsolási bevezetô kód
$FE: lezáró kód
$FF: használaton kívül


A billentyűzet processzora
--------------------------

A  processzor egy Rockwell/NCR/MOS technológiájú 6500/1.  Ehhez kapcsolódik
2 Kbyte ROM, 64 byte RAM, és 4 db 8 bites I/O port.  Ezenkívül van mellette
egy  16  bites  óra  és egy kristály oszcillátor, ami 3 MHz-en fut, ami 1.5
Mhz-re osztva hajtja meg az órát.

Van  egy  reset áramkör is beépítve.  A reset jel kb 1 mp-ig tart, miután a
berendezés  áram  alá  kerül.   Amikor  a  processzor  elkezdi  a  mátrixot
vizsgálni,  az  óra  is  elindul,  és ha a művelet nem ér véget 50 millisec
alatt, akkor az óra reset-et vált ki.

91  billentyű van a billentyűzeten, ebbôl 84 van mátrixban, hat üres helyet
hagyva.   A  mátrix  6 sort és 15 oszlopot tartalmaz.  Minden sor input, és
tartalmaz  egy  felhúzó  ellenállást (3.3K-11K).  Minden oszlop egy nyitott
kollektoros  output  felhúzás  nélkül.   A  program egyenként hajtja meg az
oszlopokat,  és  olvassa a sorokat.  A maradék 7 billentyű speciális, ezek:
CTRL,  a  két  SHIFT,  a  két  ALT és a két Amiga.  Ezeket a billentyűket a
processzor  egy-egy  elkülönített  portbiten  kezeli.   A  portok leírása a
következô:


A port (címe: $80)

PA.0  KDAT output/pozitív élre érzékeny input
PA.1  KCLK output
PA.2  0-ás sor input (alacsony=a kapcsoló zárva)
PA.3  1-es sor input
PA.4  2-es sor input
PA.5  3-as sor input
PA.6  4-es sor input
PA.7  5-ös sor input


B port (címe: $81)

PB.0  jobb SHIFT input (alacsony=a kapcsoló zárva)
PB.1  jobb ALT
PB.2  jobb Amiga
PB.3  CTRL
PB.4  bal SHIFT
PB.5  bal ALT
PB.6  bal Amiga
PB.7  CAPSLOCK LED output (magas=világít)


C port (címe: $82)

PC.0  0-ás oszlop output (alacsony aktív szinttel)
PC.1  1-es oszlop
PC.2  2-es oszlop
PC.3  3-as oszlop
PC.4  4-es oszlop
PC.5  5-ös oszlop
PC.6  6-os oszlop
PC.7  7-es oszlop


D port (címe: $83)

PD.0  8-s oszlop
PD.1  9-es oszlop
PD.2  10-es oszlop
PD.3  11-es oszlop
PD.4  12-es oszlop
PD.5  13-as oszlop
PD.6  14-es oszlop
PD.7  15-ös oszlop


A  billentyűzet  15  oszlopot  tartalmaz  (0-14),  a szoftver azonban 16-ot
kezel.  Ezzel a bôvítés egyszerűen megoldható.

Az  óra  számlálója a 15-ös oszlop kimenetére van kötve.  A régi verzióknál
ez  a  láb  nincs  bekötve,  így a processzor el tudja dönteni, hogy milyen
billentyűzetet  kell  kezelnie.  Az NMI láb VCC-re van kötve, így nem képes
aktivizálódni.  A billentyűzet mátrix a következô elrendezésű:


        5-ös sor  4-es sor  3-as sor  2-es sor  1-es sor  0-ás sor
        7-es bit  6-os bit  5-ös bit  4-es bit  3-as bit  2-es bit
oszlop ------------------------------------------------------------
  15    tartalék  tartalék  tartalék  tartalék  tartalék  tartalék
 PD.7     (0E)      (1C)      (2C)      (47)      (48)      (49)
       ------------------------------------------------------------
  14    tartalék  b.SHIFT   CAPSLOCK    TAB         ~        ESC
 PD.6     (5D)      (30)      (62)      (42)      (00)      (45)
       ------------------------------------------------------------
  13    tartalék     Z         A         Q         1      tartalék
 PD.5     (5E)      (31)      (20)      (10)      (01)      (5A)
       ------------------------------------------------------------
  12    9 (N.P)      X         S         W         2         F1
 PD.4     (3F)      (32)      (21)      (11)      (02)      (50)
       ------------------------------------------------------------
  11    6 (N.P)      C         D         E         3         F2
 PD.3     (2F)      (33)      (22)      (12)      (03)      (51)
       ------------------------------------------------------------
  10    3 (N.P)      V         F         R         4         F3
 PD.2     (1F)      (34)      (23)      (13)      (04)      (52)
       ------------------------------------------------------------
   9    . (N.P)      B         G         T         5         F4
 PD.1     (3C)      (35)      (24)      (14)      (05)      (53)
       ------------------------------------------------------------
   8    8 (N.P)      N         H         Y         6         F5
 PD.0     (3E)      (36)      (25)      (15)      (06)      (54)
       ------------------------------------------------------------
   7    5 (N.P)      M         J         U         7      tartalék
 PC.7     (2E)      (37)      (26)      (16)      (07)      (5B)
       ------------------------------------------------------------
   6    2 (N.P)      <         K         I         *         F6
 PC.6     (1E)      (38)      (27)      (17)      (08)      (55)
       ------------------------------------------------------------
   5    E (N.P)      >         L         O         9      tartalék
 PC.5     (43)      (39)      (28)      (18)      (09)      (5C)
       ------------------------------------------------------------
   4    7 (N.P)      ?         :         P         0         F7
 PC.4     (3D)      (3A)      (29)      (19)      (0A)      (56)
       ------------------------------------------------------------
   3    4 (N.P)   tartalék     '         [         -         F8
 PC.3     (2D)      (3B)      (2A)      (1A)      (0B)      (57)
       ------------------------------------------------------------
   2    1 (N.P)    SPACE     RETURN      ]         +         F9
 PC.2     (1D)      (49)      (2B)      (1B)      (0C)      (58)
       ------------------------------------------------------------
   1    0 (N.P)   BACKSPC     DEL       RET        \         F10
 PC.1     (0F)      (41)      (46)      (44)      (0D)      (59)
       ------------------------------------------------------------
   0    - (N.P)   CRSR LE   CRSR ->    CRSR <-   CRSR FEL   HELP
 PC.0     (4A)      (4D)      (4E)      (4F)      (4C)      (5F)
       ------------------------------------------------------------

N.P: elkülönített numerikus billentyűzet.
