
    Hello Coders !

       A  múltkori  demonk  kicsit unalmasnak tünhet a maga állóképével. Tegyük
kicsit   érdekesebbé  a  dolgot  azzal,  hogy  bizonyos  idöközönként  két  kép
váltogassa egymást, és alul fusson egy egyszerű scroll !

       A  két  kép cseréjét úgy fogjuk megoldani, hogy az új kép alulról rá fog
csúszni  az  előző  képre, majd egy idő után a folyamat megismétlődik.  Ezt úgy
tudjuk  elérni,  hogy a képernyő felső részén bekapcsoljuk az egyik képet, majd
valahol  lejebb  bekapcsoljuk  a  másikat. A felfele csúszást azzal oldjuk meg,
hogy  a  második  kép  bekapcsolásának  pozícióját  változtatjuk (jelen esetben
csökkentjük).    Ez  így  nagyon  egyszerűnek  látszik,  de  mégis  van egy kis
probléma.   Mi van akkor, ha a 258. függőleges pozícióban akarjuk bekapcsolni a
második  képet,  a  Copper  WAIT  utasítása  ugyanis  csak 256 pozíciót ismer ?
Szerencsére  erre  is van megoldás !  Ha a várakozás pozíciója nagyobb 255-nél,
akkor  két  WAIT  utasításra van szükség.  Az elsővel várunk a 255. sor végére,
majd  a  másodikkal  a (tényleges pozíció-256)-ra. Az egészben az a trükk, hogy
mire  a  Copper  elkezdi  értelmezni  a  második  WAIT  utasítást, a vertikális
számláló  értéke  túlcsordul,  vagyis ismét nullától kezd számlálni. Tehát ha a
258. függőleges pozícióra vársz, a Copperbe ezt kell beírni :

  $ffdf,$fffe,$0201,$fffe

Ha ezután várni akarsz a 260. pozícióra, akkor ezt már egyszerűen megteheted :

  $0401,$fffe

Az $ffdf,$fffe tehát csak egyszer kell !

   Ennyi  bevezető  után  tanulmányozd a forráslistát, rövid idő alatt rá fogsz
jönni, hogy hogyan is működik.

       Most  nézzük  meg  a  scroll  rutint  !    Ehhez  ismerni kell a Blitter
processzor  területmozgató  funkcióját.    Természetesen  a 68000-el is lehetne
scroll  rutint  írni,  de  kinek  jutna  ez  eszébe,  ha  hallott már valamit a
Blitterről.  A  Blitter  DMA csatornákat használ a memóriablokkok mozgatásához.
Három    forrás  (A,B,C)  és  egy  cél  (D)  csatornája  van,  mindegyik  külön
címmutatóval  és  modulóval  rendelkezik. A három forrás csatorna adatai között
256-féle  logikai  műveletet  képes  végezni,  majd  az  eredményt  a cél által
kijelölt  memóriaterületre  írja.  Müködését  egy  példán  mutatom  be. Van egy
320*256-os  2  színű,  tehát  egy  bittérképes képed, ami a memóriában a $60000
címen  helyezkedik  el.  A  bal  felső  sarkából  át  akarsz  másolni egy 64*32
pontos  téglalapot a bal alsó sarokba.  A forrás címe (bal felső sarok) $60000.
A  cél  címe  (bal  alsó sarok) $62300=$60000+224*40, mert ez a 224. sor eleje.
Ezeket  mindjárt  be  is  írjuk  a  Blitter  regiszterekbe  (BLTAPT  és  BLTDPT
regiszterek) :

  move.l  #$60000,$dff050
  move.l  #$62300,$dff054

   Be  kell  állítani  a  két  modulót  is,  vagyis  azt  az  értéket,  amit  a
memóriacímhez  minden sor végén hozzáad.  Mivel a képünk 320 pont, azaz 40 byte
széles,  a  mozgatandó  terület  pedig 64 pont, azaz 8 byte széles, így egy sor
átmásolása  után  40-8=32  -t  kell  hozzáadni  a  címhez,  hogy  a téglalapunk
következő  sorára  mutasson.    Mivel  mindkét terület ugyanakkora, ezért a két
moduló egyenlő (BLTAMOD és BLTDMOD regiszterek) :


  move.w  #32,$dff064
  move.w  #32,$dff066

   Meg  kell  még  mondani  a  Blitternek,  hogy  mit  csináljon  ezzel  a  két
területtel,  erre  való  a  BLTCON0  és  BLTCON1  regiszter.    A két regiszter
bitkiosztása :

 BLTCON0 :

    0- 7 : LF0-7
       8 : USED
       9 : USEC
      10 : USEB
      11 : USEA
   12-15 : ASH0-3

 BLTCON1 :
 
       0 : LINE
       1 : DESC
       2 : FCI
       3 : IFE
       4 : EFE
    5-11 : nem használt
   12-15 : BSH0-3

A rövidítések jelentései :

  LF0-7  : 8 logikai funkció bit, a 256 logikai funkció valamelyikét kell ide
           írni.  Kiszámítását a késöbbiekben leírom.
  USEx   : A megfelelő bitet 1-re kell állítani, ha a csatornát használni
           akarod.
  ASH0-3 : A Blitter rendelkezik olyan funkcióval, hogy az A és B csatorna
           adatait el tudja forgatni, ez a négy bit határozza meg az
           elforgatás mértékét (0-15).  A scrollnál ezt ki fogjuk használni !
  LINE   : Vonalhúzásnál 1-re kell állítani. Egyenlöre nem fontos.
  DESC   : A Blitter képes csökkenö és növekvö címzéssel is dolgozni, ez akkor
           nagy elöny, ha a forrás és cél terület fedi egymást, ekkor ugyanis
           nem mindegy, hogy honnan kezdi a másolást !  Az elforgatással is
           kapcsolatban van, mégpedig úgy, hogy csökkenő címzésnél balra,
           növekvőnél pedig jobbra forgat, logikus nem ?  Ez a bit a csökkenő
           címzést kapcsolja be. A scrollban így használjuk majd !
  FCI    :
  IFE    : Mindhárom a területfeltöltéshez (fill) kell, most legyen mind 0.
  EFE    :
  BSH0-3 : Ugyanaz, mint az ASH0-3, de a B csatornára.

A logikai funkció kiszámítása :
   Legegyszerübb,  ha  készítesz  egy  kis  táblázatot, hogy a cél milyen A,B,C
értékekre 1 (bitenként !). Például így :

  A  B  C    D

  0  0  0    0
  0  0  1    0
  0  1  0    0
  0  1  1    0
  1  0  0    1
  1  0  1    1
  1  1  0    1
  1  1  1    1

   Jelen  esetben  a  logikai  müvelet  D=A (ez is müvelet !), tehát D akkor és
csak  akkor  1,  ha  A=1.    Ennek a műveletnek a száma $f0, amit a D oszlopból
lehet  kiolvasni,  mégpedig  úgy,  mintha  az  oszlopot  alulró felfele bináris
számként        értelmeznéd.                A    bináris    11110000    hexában
$f0. Vegyünk egy bonyolultabb példát is !  A müvelet legyen D=(A és B).

  A  B  C    D

  0  0  0    0
  0  0  1    0
  0  1  0    0
  0  1  1    0
  1  0  0    0
  1  0  1    0
  1  1  0    1
  1  1  1    1

   Most  D  akkor  és  csak  akkor  1,  ha  A  és  B  is  1.  A művelet száma :
11000000=$c0  Ezek  után be tudjuk állítani a BLTCON0 és BLTCON1 regisztereket.
ASH0-3  bitek  mind  0,  mert  nincs  eltolás,  ugyanígy  a BSH-0-3 bitek.  Két
csatornát  használunk  A-t és D-t, tehát USEA=1, USED=1.  Az LF0-7 bitek sorban
11110000,  mert  D=A.  DESC=0,  mert növekvő módban másolunk, és a többi bit is
mind        0,        mert        nem      húzunk    vonalat    és    nem    is
fillezünk. Kis számolgatás után BLTCON0=$09f0, BLTCON1=$0000 :

  move.w  #$09f0,$dff040
  move.w  #$0000,$dff042

   Hátra  van  még  három regiszter.  A Blitter wordöket kezel, azonban szükség
lehet  nem  pontosan  word határokra eső területek másolására is, erre találták
ki  a  maszk  regisztereket (BLTAFWM és BLTALWM). Ezekkel az a csatorna első és
utolsó  wordjeit  lehet  maszkolni  minden  sorban.   Példánkban mindkét maszk-
regiszter $ffff-el van feltöltve :

  move.w  #$ffff,$dff044
  move.w  #$ffff,$dff046

   Végül  be  kell állítani a mozgatandó terület méretét, és el kell indítani a
blitter  müveletet.    Ezt  a BLTSIZE regiszterbe való írással tehetjük meg. Az
ide  írandó  értéket  úgy  kaphatjuk  meg,  ha a terület magasságát (pontokban)
megszorozzuk  64-el,  és  hozzáadjuk  a  szélességét  (wordökben). Példánkban a
magasság  32 sor, a szélesség 64 pont, azaz 4 word. Így BLTSIZE= 2052 (32*64+4)
:

  move.w  #2052,$dff058

   Ezzel  el  is  indult  a  másolási müvelet.  Mielött újat kezdenénk meg kell
várnunk  míg  ezt  befejezi,  ezt  a  DMACONR  regiszter ($dff002)  BBUSY (14.)
bitjének figyelésével tehetjük meg.  Amíg ez 1, a blitter dolgozik.

      Ennyi ismeret után már meg tudod írni a scroll rutint.  A scroll annyiban
különbözik  a normál másolástól, hogy itt be kell állítani az ASH0-3 biteket, a
forrás  és  a  cél  címét  pedig  ugyanarra  kell  állítani.  Ha 3 bitet akarsz
forgatni,  akkor  az  ASH0-3  bitek  értéke 3  (0011). Még egy érdekesség van a
scrollban.   A kép 40 byte széles, de 42 byte széles helyet foglaltunk a scroll
terülenek.  A jobb szélső 2 byte nem látszik, ide kerülnek az új karakterek, és
innen  scrollozódnak a látható területre. A blittermüvelet mérete ezért 21 word
széles  és 16 sor magas. Ezen a részen a bittérkép modulóját 2-re kell állítani
!    (A karakterkészlet 16*16-os !) A DD-DATA könyvtárban találsz egy külön kis
scroll  rutint  (Scroll.S), amihez van egy karakterkészlet is (lets0).  Elöször
ezt  tanulmányozd,  majd  ha  már érted a müködését, nézd meg a DEMO scroll-ját
is, az sem sokkal bonyolultabb, ott a karakterek 16*24-esek és 8 színüek.

Végül a Blitter regiszterek címei :

 BLTCON0 : 040  Control regiszterek
 BLTCON1 : 042
 BLTAFWM : 044  Elsö word maszk (A)
 BLTALWM : 046  Utolsó word maszk
 BLTCPTH : 048  C cím felső word
 BLTCPTL : 04a  C cím alsó word
 BLTBPTH : 04c  B cím
 BLTBPTL : 04e
 BLTAPTH : 050  A cím
 BLTAPTL : 052
 BLTDPTH : 054  D cím
 BLTDPTL : 056
 BLTSIZE : 058  méret és start

 BLTCMOD : 060  C modulo
 BLTBMOD : 062
 BLTAMOD : 064
 BLTDMOD : 066

 BLTCDAT : 070  C átmeneti tároló
 BLTBDAT : 072
 BLTADAT : 074


  További sikereket a kisérletezéshez !



    READYSOFT from FI-RE Crew.

