home *** CD-ROM | disk | FTP | other *** search
/ Amiga MA Magazine 1998 #6 / amigamamagazinepolishissue1998.iso / coders / assembler-kurs / lektionen / lektion7.txt < prev    next >
Text File  |  1977-12-31  |  92KB  |  2,007 lines

  1.  
  2.  ASSEMBLERKURS - LISTING 7
  3.  
  4. In  dieser  Lektion  werden  wir  über  die  Sprites, den Joystick und den
  5. logischen Operationen des  68000ers  wie  AND,  OR,  EOR,NOT,LSR,ROL,  etc
  6. sprechen.
  7.  
  8. Erinnert  euch,  "V LISTINGS3" zu tippen, um die .raw - Files, die sich in
  9. dieser Directory befinden, laden zu können. Dort befinden  sich  auch  die
  10. Listings aus dieser Lektion.
  11.  
  12. Die  Sprites  sind  grafische Objekte mit einer präzisen Größe, maximal 16
  13. Pixel breit, die sich unabhängig von den  Bitplanes  bewegen  lassen.  Der
  14. Mauspointer  z.B.  ist  ein  solcher  Sprite,  er  wird vom Betriebssystem
  15. verwaltet. Er kann sich überall  bewegen,  ohne  sich  um  die  "darunter"
  16. liegenden Bitplanes Gedanken machen zu müssen.
  17. Die Sprites könnte man als "Geister"-Bilder auffassen, die sich "über" den
  18. Bitplanes  bewegen,  aber  achtung:  nicht  alles,  was  sich bewegt, sind
  19. Sprites! Denn es können maximal 8 davon dargestellt werden, da  es  nur  8
  20. Pointer in der Copperlist für sie gibt:
  21.  
  22. COPPERLIST:
  23. SpritePointers:
  24.     dc.w    $120,0,$122,0    ; Pointer für Sprite 0
  25.     dc.w    $124,0,$126,0    ; Pointer für Sprite 1
  26.     dc.w    $128,0,$12a,0    ; ""    ""    ""   2
  27.     dc.w    $12c,0,$12e,0    ; ""    ""    ""   3
  28.     dc.w    $130,0,$132,0    ; ""    ""    ""   4
  29.     dc.w    $134,0,$136,0    ; ""    ""    ""   5
  30.     dc.w    $138,0,$13a,0    ; ""    ""    ""   6
  31.     dc.w    $13c,0,$13e,0    ; ""    ""    ""   7
  32.  
  33. Die Pointer auf die  Sprites  heißen  SPRxPT  (an  Stelle  der  "x"  kommt
  34. natürlich  die  Nummer  des  Sprites:  wir haben also SPR0PT, SPR1PT, ...,
  35. SPR7PT, und wenn wir von SPRxPT  sprechen,  meinen  wir  generell  alle  8
  36. Pointer).  Bis  jetzt  haben  wir  sie  in  der  Copperlist immer auf NULL
  37. gesetzt, damit sie uns nicht stören, denn wenn sie "frei rumlaufen"  haben
  38. wir sie immer auf unseren Bildern sitzen.
  39. Die Sprites sind vom Rest des Screens isoliert, fast so, als wären sie  in
  40. einem  durchsichtigen  Couvert  über  dem  Bildschirm,  sie  sind immer in
  41. Lowres, auch wenn der Screen in HiRes oder Interlace arbeitet. Ein  Beweis
  42. dafür,  daß  sie  mit  den Bitplanes nichts zu tun haben ist, daß man sie,
  43. wenn wir sie bewegen wollen, nicht löschen und weiter  hinten  neuzeichnen
  44. müssen,  wie es der Fall wäre, wenn wir ein Stück Grafik in einem Bitplane
  45. bewegen möchten.
  46. Um einen Sprite zu bewegen, brauchen wir  nur  seine  Koordinaten  ändern,
  47. indem  wir  mit wenigen und schnellen Befehlen auf einige dafür bestimmten
  48. Bytes am Anfang der Spritestruktur  selbst  zugreifen.  Wenn  die  Sprites
  49. nicht  ausreichen, um Raumschiffe und Figuren in einem Spiel darzustellen,
  50. dann verwenden wir den Blitter, um Grafikblöcke  (Bob)  zu  kopieren.  Wir
  51. werden  später  darauf  zurückkommen.  Wie schon erwähnt, ist die maximale
  52. Breite eines Sprite 16 Pixel, während die Höhe beliebig  sein  kann,  auch
  53. den  ganzen  Bildschirm, 256 Zeilen. Um z.B. das Monster am Ende des Level
  54. darzustellen, könnten wir z.B. alle 8  Sprites  zusammenkleben  und  somit
  55. 16*8=128  Pixel  erreichen. Dieses Monster wäre aber recht farblos, da zur
  56. Zeit die Sprites nur 3 Farben haben. Die vierte  ist  der  "durchsichtige"
  57. Teil,   wo   also  der  Hintergrund  durchscheint,  die  darunterliegenden
  58. Bitplanes.
  59.  
  60. Die Charakteristik der Sprites ist, daß sie einfach  herzustellen  und  zu
  61. animieren  sind.  Denn  man  kann sie einfach mit einem Malprogramm malen,
  62. Hauptsache, sie sind nicht breiter als 16 Pixel und sind  in  drei  Farben
  63. plus  Hintergrund  gehalten.  Danach einfach durch den IFF-Konverter jagen
  64. und in SPRITE konvertieren.
  65. Oder sie können direkt in Binär gezeichnet werden, wie wir schon  bei  den
  66. 8x8 Fonts gesehen haben:
  67.   
  68. - Plane 1 - - Plane 2 - ; Die Überlagerung dieser
  69.                             ; zwei "Planes" aus Bits
  70.     dc.w    %0111110000000000,%0111110000000000 ; bestimmt die Farbe. Das
  71.     dc.w    %1000001000000000,%1111111000000000 ; ist der Default - Maus-
  72.     dc.w    %1111010000000000,%1000110000000000 ; pointer des Kickstart 1.3
  73.     dc.w    %1111101000000000,%1000011000000000 ; Erkennt ihr ihn wieder??
  74.     dc.w    %1111110100000000,%1001001100000000
  75.     dc.w    %1110111010000000,%1010100110000000
  76.     dc.w    %0100011101000000,%0100010011000000
  77.     dc.w    %0000001110100000,%0000001001100000
  78.     dc.w    %0000000111100000,%0000000100100000
  79.     dc.w    %0000000011000000,%0000000011000000
  80.     dc.w    %0000000000000000,%0000000000000000
  81.  
  82.     dc.w    0,0    ; Zwei auf NULL gesetzte Word signalisierne das
  83.             ; Ende des Sprite.
  84.  
  85. In diesem Fall ist die Breite 16 Pixel, und nicht 8  wie  bei  den  Fonts,
  86. weil  wir  ihn  in  einem  Word  (dc.w)  und nicht in einem Byte zeichnen.
  87. Weiters hat er 3 Farben plus die Durchsichtige, also insgesamt 4, wie  ein
  88. Bild mit 2 Bitplanes, es braucht also ein Paar von "Planes", genau wie bei
  89. den Bitplanes. Ihre Überlagerung bestimmt die Farbe eines  jeden  Punktes.
  90. Sie kann wie folgt sein:
  91.  
  92.     Plane 1 -      Plane 2
  93.  
  94. Binär:     0    -    0    = COLOR 0 (Durchsichtig)
  95. Binär:     1    -    0    = COLOR 1
  96. Binär:     0    -    1    = COLOR 2
  97. Binär:     1    -    1    = COLOR 3
  98.  
  99. Denn mit 2 Planes ergeben sich vier Überlagerungsmuster:  %00,  %01,  %10,
  100. %11.
  101.  
  102. Um die Position des Sprite zu bestimmen, müssen wir nichts anderes tun als
  103. die X und Y-Koordinate in den ersten Bytes des Sprite  selbst  einzufügen.
  104. Der  Sprite  besteht nämlich vor den Daten des Bildes aus vier Bytes, oder
  105. zwei Words, den  sogenannten  KONTROLLWORDS,  und  da  hinein  kommen  die
  106. Positionskoordinaten auf dem Bildschirm. Um genauer  zu  sein,  das  erste
  107. Byte, VSTART genannt, beinhaltet die vertikale Position des Spriteanfangs;
  108. das zweite Byte hingegen die horizontale  Position  (HSTART).  Das  Dritte
  109. bekommt  das Ende des Sprites, vertikal gesehen: um diesen Wert zu finden,
  110. ganz einfach die Höhe des Sprites mit  der  Anfangskoordinate  des  selben
  111. addieren  und  rein  damit.  Das Resultat ist nach Adam Riese das Ende des
  112. Sprites.
  113. Im vierten Byte kommen die Spezialfunktionen, wie immer verweise  ich  auf
  114. später.
  115. VSTART und HSTART (Vertical Start und  Horizontal  Start)  sind  also  die
  116. Koordinaten der linken, oberen Ecke des Sprites:
  117.  
  118.     #....
  119.     .....
  120.     .....
  121.     .....
  122.     .....
  123.  
  124.  
  125. VSTOP hingegen ist die vertikale Position des Endes des Sprite:
  126.  
  127.  
  128.     .....
  129.     .....
  130.     .....
  131.     .....
  132.     #####    -> Zeile, in der der Sprite aufhört.
  133.  
  134.  
  135. Um z.B. einen Sprite an Position XX=$90  und  YY=$50  anzuzeigen,  der  20
  136. Pixel lang ist, werden wir so vorgehen:
  137.  
  138.  
  139.         ;AYAX  EY - AY=Anfang Y, AX=Anfang X, EY=Ende Y
  140. SPRITE:
  141.     dc.w    $5090,$6400    ;Y=$50, X=$90, Höhe= $50+20, alos $64
  142. ; hier beginnen die Daten der 2 Plaenes des Sprite:
  143.  
  144.     dc.w    %0000000000000000,%0000110000110000
  145.     dc.w    %0000000000000000,%0000011001100000
  146.     ...
  147.     dc.w    0,0    ; Ende des Sprite
  148.  
  149. Das erste Byte, VSTART, ist auf $50, das Zweite, HSTART, auf $90, und  das
  150. Dritte,  die  vertikale  Position des Spriteendes, auf $64, also $50 + 20.
  151. Also die Anfangsposition + Länge des Sprite. Das vierte  Byte  lassen  wir
  152. vorerst  auf 0. Ich sage euch gleich schon, daß das HSTART einen Sprite um
  153. jeweils 2 Pixel verstellt, wenn wir also $51 eingeben, werden wir auf  $52
  154. gelangen.  Es  sind nur Zweierschritte möglich. Wir werden aber sehen, wie
  155. unter Verwendung des SpeizialBytes Nr. 4 diese Situation in den  Griff  zu
  156. bekommen  ist,  und  das  ein  Scroll von einem Pixel möglich ist. Was den
  157. vertikalen Scroll angeht,  VSTART  und  VSTOP  besorgen  uns  schon  einen
  158. schönen 1-Pixel-Schritt. Das einzige Limit ist die Videozeile $FF, darüber
  159. hinaus kommen wir nur, wenn wir ein Bit  im  vierten  Byte  verwenden.  Am
  160. Anfang  werden wir aus Gründen der Einfachheit nur die Bytes VSTART, VSTOP
  161. und HSTART verwenden, und die Zeierschritte in der Horizontalen hinnehmen.
  162. Erst  später  werden  wir  sehen, wie wir "flüssigere" Scrolls hinkriegen.
  163. Erinnert euch also an die Eigenschaft, das z.B. mit einem:
  164.  
  165.     ADDQ.B    #1,HSTART
  166.  
  167. der Sprite um 2 Pixel, und nicht um einen, verstellt wird.
  168.  
  169. Um auf die 3 Bytes VSTART/HSTART/VSTOP zuzugreifen,  könnte  man  etwa  so
  170. tun:
  171.  
  172.     MOVE.B    #$50,SPRITE    ; VSTART = $50
  173.     MOVE.B    #$90,SPRITE+1    ; HSTART = $90
  174.     MOVE.B    #$64,SPRITE+2    ; VSTOP  = $64 ($50+20)
  175.  
  176. Oder man kann ein Label für jedes Byte definieren, und somit alles  klarer
  177. gestalten:
  178.  
  179.  
  180. SPRITE:
  181. VSTART:         ; Beginn Anfangsposition VERTIKAL
  182.     dc.b $50
  183. HSTART:         ; Beginn Anfangsposition HORIZONTAL
  184.     dc.b $90
  185. VSTOP:
  186.     dc.b    $64    ; Endposition VERTIKAL
  187.     dc.b    $00    ; Byte für Spezialanwendungen, im Moment auf 0
  188.  
  189. ; hier beginnen die Daten für die Planes des Sprite:
  190.  
  191.     dc.w    %0000000000000000,%0000110000110000
  192.     dc.w    %0000000000000000,%0000011001100000
  193.     ...
  194.     dc.w    0,0    ; Ende des Sprite
  195.  
  196. In diesem Fall würden wir auf die Label VSTART, VSTOP und HSTART agieren:
  197.  
  198.     ADDQ.B  #1,HSTART    ; bewegt den Sprite um 2 Pixel nach rechts
  199.                 ; (2 Pixel und nicht 1, wie oben erklärt)
  200.  
  201.     SUBQ.B  #1,HSTART    ; bewegt den Sprite um 2 Pixel nach links
  202.  
  203. Um den Sprite nach  Oben  oder  Unten  zu  bewegen  müssen  wir  uns  aber
  204. erinnern, beide Bytes VSTART und VSTOP zu verändern, denn es ist klar, daß
  205. in diesem Fall das erste Pixel wie auch das Letzte seine Position ändert:
  206.  
  207.     ADDQ.B  #1,VSTART    ; \ Bewegt den Sprite um 1 Pixel nach Unten
  208.     ADDQ.B  #1,VSTOP    ; /
  209.  
  210.     SUBQ.B  #1,VSTART    ; \ Bewegt den Sprite um 1 Pixel nach Oben
  211.     SUBQ.B  #1,VSTOP    ; /
  212.  
  213.  
  214. Zur Wiederholung, das ist die Struktur des Sprite:
  215.  
  216.  
  217.     Erstes Kontrollword,        zweites Kontrollword
  218.     erste   Zeile (.w) des Plane 1,  erste   Zeile (.w) des Plane 2
  219.     zweite  Zeile (.w) des Plane 1,  zweite  Zeile (.w) des Plane 2
  220.     dritte  Zeile (.w) des Plane 1,  dritte  Zeile (.w) des Plane 2
  221.     vierte  Zeile (.w) des Plane 1,  vierte  Zeile (.w) des Plane 2
  222.     fünfte  Zeile (.w) des Plane 1,  fünfte  Zeile (.w) des Plane 2
  223.     ...
  224.     DC.W    0,0  ; die letzte Zeile muß zwei Nullen enthalten
  225.  
  226. Die Daten des Sprite sind in Plane 1 und Plane 2  unterteilt,  einzig  und
  227. alleine,  um  anzuzeigen,  daß  bei  deren  Überlagerung die 3 Farben plus
  228. Transparent zu Stande kommen, analog wie bei den Bitplanes,  es  ist  aber
  229. nicht damit zu verwechseln!
  230.  
  231.  
  232. DIE FARBEN DER SPRITE
  233.  
  234. Um die Farben der Sprites  zu  definieren  müssen  die  gleichen  Register
  235. verwendet  werden  wie bei den Bitplanes, da der Amiga nur 32 Farbregister
  236. besitzt. Die Ingeneure haben gedacht, den Sprites die Farben  vom  16  bis
  237. zum  31  zuzuteilen, somit können die Sprites, wenn das Bild nicht in in 5
  238. Bitplanes -oder 32 Farben - ist, andere  benutzen  als  das  Bild  selbst.
  239. Ansonsten  haben  sie  16 Farben gemeinsam mit dem darunterliegenden Bild.
  240. Schauen wir uns mal an, wie wir die Farben des ersten Sprite hinbekommen:
  241.  
  242.  
  243. (Die Sprites sind von ß bis 7 durchnumeriert)
  244.  
  245.     COLOR 0 des Sprite 0 = TRANSPARENZ, wird nicht definiert
  246.     COLOR 1 des Sprite 0 = COLOR17 ($dff1a2)
  247.     COLOR 2 des Sprite 0 = COLOR18 ($dff1a4)
  248.     COLOR 3 des Sprite 0 = COLOR19 ($dff1a6)
  249.  
  250. Color 0, oder die vierte, ist die Transparenz, sie wird nicht definiert.
  251.  
  252. Sehen wir vor dem weitermachen, das erste  Beispiel  einer  Anzeige  eines
  253. Sprite   in   Listing7a.s   In  diesem  Beispiel  wird  der  erste  Sprite
  254. angepointet,  die  anderen  sieben  beliben  auf  NULL.  Um  einen  Sprite
  255. anzupointen  wird  gleich  vorgegangen  wie  bei den Bitplanes, da sie die
  256. Pointer gleich funktionieren wie bei den Bitplanes:
  257.  
  258.     MOVE.L    #MEINSPRITE,d0        ; Adresse des Sprite in d0
  259.     LEA    SpritePointers,a1    ; Pointer in der Copperlist
  260.     move.w    d0,6(a1)
  261.     swap    d0
  262.     move.w    d0,2(a1)
  263.  
  264. Ich erinnere daran, daß um ein Sprite anzuzeigen, mindestens ein  Bitplane
  265. "eingeschaltet"  sein  muß, ohne Bitplane keine Sprites. Des Weiteren wird
  266. ein Sprite "abgeschnitten", wenn er außerhalb des  Videofensters  gelangt,
  267. das  zuvor mit DIWSTART und DIWSTOP definiert wurde, er kann nur innerhalb
  268. angezeigt  werden.  Um  ihn  z.B.  in  der  Mitte  eines  320x256  Screens
  269. anzuzeigen,  auf  Position 160x128, ist weiters zu beachten, daß die erste
  270. Koordinate links oben nicht 0,0 ist, sondern $40, $2c,  deswegen  muß  $40
  271. zur  X-Koordinate und $2c zur YKoordinate addiert werden. $40+160, $2c+128
  272. entprechen also den Koordinaten 160, 128  in  einem  Screen  320x200  ohne
  273. Overscan.
  274. Da wir noch nicht die 1-Pixel-Kontrolle über die  Sprites  haben  was  die
  275. horiziontale Positionierung angeht, müssen wir nicht 160 addieren, sondern
  276. 160/2, wenn wir die Mitte anpeilen wollen:
  277.  
  278.  
  279. HSTART:
  280.     dc.b $40+(160/2)    ; Positionierung in der Mitte des Screen
  281.     ...
  282.  
  283.  
  284. Hier  ein  Schema  des  Screens,  in  dem  der  sichtbare  Teil,  also das
  285. Videofenster, hell dargestellt ist, und des  gesamten  Schirms,  außerhalb
  286. des  Randes,  der  bei 0,0 beginnt, mit ###. Beachtet daß das Videofenster
  287. bei $40 XX und $2c YY beginnt.
  288.  
  289.       (0,0) __
  290.           \
  291.            \
  292.         +---------------------------+
  293.         |###########################|
  294.     /\    |###########################|
  295.     ||    |###+-------------------+###|
  296.     ||    |###| $40,$2c        |###|  __ Rand des sichtbaren
  297.     ||    |###|     ______        |###| /   Teil (Videofenster)
  298.     ||    |###|    /Sprite\    |###|/
  299.     ||    |###|    |++XX++|    |###/
  300.     ||    |###|    \/\/\/\/    |##/|
  301.         |###|            |#/#|
  302.       Y-Achse    |###|             |/##|
  303.         |###|            |###|
  304.     ||    |###|            |###|
  305.     ||    |###|            |###|
  306.     ||    |###|            |###|
  307.     ||    |###|            |###|
  308.     ||    |###+-------------------+###|
  309.     \/    |###########################|
  310.         |###########################|
  311.         +--------------------------+
  312.             <----- Y-Achse ----->
  313.  
  314.  
  315. Die horizontale Position des Sprites kann von 0 bis 447 gehen, es ist aber
  316. logisch, daß sie bei einem Screen zu 320 Pixel Breite von 64 bis 383 geht.
  317. Die vertikale hingegen kann von  0  bis  262  gehen,  aber  um  auf  einem
  318. PAL-Screen  sichtbar  zu  sein  (256 Zeilen), muß sie von 44 ($2c) bis zum
  319. Ende des Screens reichen, also bis 44+256=300 (12c). Bis jetzt  haben  wir
  320. nur  die  Zone bis $FF erreicht, wir werden später sehen, wie wir bis $12c
  321. kommen.
  322.  
  323. In Listing7b.s wird ein Sprite am Bildschirm rauf und runter  gejagt,  das
  324. geschieht mit ADD´s und SUB´s auf die zwei Kontrollword.
  325.  
  326. In  Listing7c.s  wird der Sprite horizontal bewegt, indem er die Werte aus
  327. einer vordefinierten Tabelle liest anstatt  ADD  und  SUB  anzuwenden.  In
  328. Listing7d.s  wird  er  in  Vertikal  zum Springen gebracht. In Listing7e.s
  329. werden die zwei Koordinaten (XX und YY) von  zwei  verschiedenen  Tabellen
  330. kontrolliert,  um eine Kreisbewegung, Ellipse, etc. zu erzeugen. In diesem
  331. Beispiel wird auch erklärt, wie man sich eigene Tabellen erstellt!
  332.  
  333. Bevor ihr weitermacht, ladet die Beispiele in  einen  anderen  Buffer  und
  334. führt sie aus, VERSTEHT sie und lest die Kommentare.
  335.  
  336. Bis  jetzt  haben  wir  nur einen Sprite angezeigt, sehen wir nun, was wir
  337. wissen müssen, um alle 8 auf den Monitor zu bringen.
  338. Zum Anfang mal festgehalten: jeder Sprite hat eine individuelle  Position,
  339. er  ist  in  keiner  Weise  an  die anderen gebunden, da jeder ein eigenes
  340. VSTART, VSTOP und HSTART in seinen zwei  AnfangsWord  hat.  Was  aber  die
  341. Farben  angeht  (und  andere  Eigenschaften, wie etwa Kollisionen, die wir
  342. später sehen werden), da sind die Sprites nicht ganz unabhängig, sie  sind
  343. zu  Zweierpaaren  zusammengehängt.  Es  gibt  also  4 Paare von 2 Sprites:
  344. Sprite0+Sprite1,  Sprite2+Sprite3,  Sprite4+Sprite5,   und   schlußendlich
  345. Sprite6+Sprite7.  Wenn  ich  von  nun  an von "Spritepaar" sprechen werde,
  346. meine ich nicht ein x-beliebiges Paar, aber genau eines von diesen vieren.
  347. Bei  den Farben hängen sie zusammen, d.h. jeweils ein Paar hat die gleiche
  348. Palette, die Paare untereinander können  verschiedene  Farben  haben.  Wir
  349. wissen,  daß  die  3 Farben des Sprite0 mit den Registern COLOR17, COLOR18
  350. und COLOR19 definiert werden. Diese 3 Farben gelten also auch  für  seinen
  351. "Bruder", dem Sprite1.
  352. Jedes Paar hat eine andere Palette, da  es  insgesamt  16  Register  dafür
  353. gibt,  vom  16  bis  zum  31.  Wenn wir davon ausgehen, daß jeder Sprite 4
  354. Farben hat ( 1 davon Transparent), dann bräuchten wir 8*4=32 Register. Wir
  355. haben aber nur 16. Da wir nun aber 8 Sprites mit 4 Farben haben, hier eine
  356. Tabelle, die angibt, welcher Sprite welche Farbe bekommt:
  357.  
  358.         Sprite     Binärwert    Farbregister:
  359.         ------  --------------  ------------------
  360. Paar 1:        0 o 1          00    Nicht verwendet da  Transparent
  361.                 01    Color17 - $dff1a2
  362.                 10    Color18 - $dff1a4
  363.                 11    Color19 - $dff1a6
  364.  
  365. Paar 2:        2 o 3         00    Nicht verwendet da  Transparent
  366.                 01    Color21 - $dff1aa
  367.                 10    Color22 - $dff1ac
  368.                 11    Color23 - $dff1ae
  369.  
  370. Paar 3:        4 o 5        00    Nicht verwendet da  Transparent
  371.                 01    Color25 - $dff1b2
  372.                 10    Color26 - $dff1b4
  373.                 11    Color27 - $dff1b6
  374.  
  375. Paar 4:        6 o 7        00    Nicht verwendet da  Transparent
  376.                 01    Color29 - $dff1ba
  377.                 10    Color30 - $dff1bc
  378.                 11    Color31 - $dff1be
  379.  
  380. Machen wir ein praktisches Beispiel: um in der Copperlist die Farben der 8
  381. Sprites zu definieren ist folgendes notwendig:
  382.  
  383.  
  384.     dc.w    $1A2,$F00    ; color17, - COLOR1 der sprite0/1 -ROT
  385.     dc.w    $1A4,$0F0    ; color18, - COLOR2 der sprite0/1 -GRÜN
  386.     dc.w    $1A6,$FF0    ; color19, - COLOR3 der sprite0/1 -GELB
  387.  
  388.     dc.w    $1AA,$FFF    ; color21, - COLOR1 der sprite2/3 -WIEß
  389.     dc.w    $1AC,$0BD    ; color22, - COLOR2 der sprite2/3 -WASSER
  390.     dc.w    $1AE,$D50    ; color23, - COLOR3 der Sprite2/3 -ORANGE
  391.  
  392.     dc.w    $1B2,$00F    ; color25, - COLOR1 der Sprite4/5 -BLAU
  393.     dc.w    $1B4,$F0F    ; color26, - COLOR2 der Sprite4/5 -VIOLETT
  394.     dc.w    $1B6,$BBB    ; color27, - COLOR3 der Sprite4/5 -GRAU
  395.  
  396.     dc.w    $1BA,$8E0    ; color29, - COLOR1 der Sprite6/7 -HELLGRÜN
  397.     dc.w    $1BC,$a70    ; color30, - COLOR2 der Sprite6/7 -BRAUN
  398.     dc.w    $1BE,$d00    ; color31, - COLOR3 der Sprite6/7 -DUNKELROT
  399.  
  400. BEMERKUNG: Wenn ihr als Hintergrund ein Bild in 2,4,8 oder 16 Farben habt,
  401. dann  gibt´s  keine Probleme, aber wenn ihr einen Bildschirm in 32 Farben,
  402. also 5 Bitplanes, aktiviert, dann müßt ihr bedenken, daß  die  letzten  16
  403. Farben  von Bild und Sprites geteilt werden. Die Farbe muß also für´s Bild
  404. stimmen, genauso wie für die Sprites, die Farben müssen "Multifunktionell"
  405. sein.
  406.  
  407. DIE VIDEOPRIORITÄT ZWISCHEN DEN SPRITES
  408.  
  409. Wenn zwei oder mehr Sprites am Bildschirm angezeigt werden, dann  kann  es
  410. leicht  vorkommen, daß sie sich überlappen. In diesem Fall wird der Sprite
  411. mit der niedrigeren Priorität überdeckt. Die Prioritäten  sind  immer  die
  412. gleichen,  der Sprite mit der kleineren Nummer hat Vorrang gegenüber einem
  413. mit Höhere. Daraus folgt, daß  Sprite0  alle  anderen  Sprites  überdecken
  414. kann,  und  Sprite7  von  allen  anderen  überdeckt  werden kann. Hier ein
  415. kleines Schema:
  416.                        _______
  417.                       |      |
  418.                        ___|___7   |
  419.                       |          |___|
  420.                     __|___6   |
  421.                    |       |__|
  422.                  __|___5   |
  423.                 |       |__|
  424.                  ___|___4   |
  425.                 |        |___|
  426.                  ___|___3   |
  427.                 |       |___|
  428.              ___|___2   |
  429.             |        |___|
  430.          ___|___1   |
  431.         |    |___|
  432.         |   0   |
  433.         |_______|
  434.  
  435. Überprüft das, indem ihr Listing7f.s in einen  anderen  Buffer  ladet  und
  436. ausführt.  Er  zeigt  8  Sprites  an,  und  nach  dem  Druck auf die linke
  437. Maustaste werden sie übereinandergelegt, um die Prioritäten hervorzuheben.
  438. Rechte Taste um auszusteigen.
  439.  
  440. "ATTACHED"-SPRITES
  441.  
  442. Es  existiert  auch  eine  Methode,  um  die   Sprites   in   Zweierpaaren
  443. zusammenzuschweißen,  einen  über  dem  anderen.  Damit  halbiert sich die
  444. Anzahl der verfügbaren Sprites, aber es sind als Trost 16  Farben  möglich
  445. (na ja, 15 + Transparent). Sie können folgendermaßen kombiniert werden:
  446.  
  447.     SPRITE0+SPRITE1    - Sprite ATTACCHED Nummer 1
  448.     SPRITE2+SPRITE3    - Sprite ATTACCHED Nummer 2
  449.     SPRITE4+SPRITE5    - Sprite ATTACCHED Nummer 3
  450.     SPRITE6+SPRITE7    - Sprite ATTACCHED Nummer 4
  451.  
  452. In  der  Praxis  werden  die  selben Sprites verbündet, die im Normalmodus
  453. schon eine Verbindung eingegangen sind, die der selben Palette.  Die  vier
  454. "Attached"-Sprites  besitzen  alle  die gleiche Palette, da ja nur mehr 16
  455. Farben übrig sind, von COLOR16 bis COLOR31.
  456. Die  ATTACHED-Sprites  funktionieren   auf   folgende   Art   und   Weise:
  457. normalerweise hat ein Sprite maximal 4 Überlappungsmöglichkeiten, also %00
  458. für die Transparenz, %01, %10, %11 für die drei Farben. Im  Attached-Modus
  459. werden  die  Planes  des  Sprite  übereinandergelegt  und ergeben somit 16
  460. mögliche Situationen, denn 2 Planes vom ersten Sprite plus 2 Planes vom  2
  461. Sprite   ergeben  4  Planes,  oder  %0000  bis  %1111,  also  16  statt  4
  462. Möglichkeiten.  In  der  folgenden  Tabelle  werden   die   16   möglichen
  463. Überlappungsmuster aufgelistet, daneben die dazugehörige Farbe.
  464.  
  465.           Sprite    Binär    Nummer des
  466.            Farbe     wert     Farbregisters
  467.           -------    ------    --------------
  468.         0    0000    Color16 - NICHT VERWENDET, TRANSPARENT
  469.         1    0001    Color17 - $dff1a2
  470.         2    0010    Color18 - $dff1a4
  471.         3    0011    Color19 - $dff1a6
  472.         4    0100    Color20 - $dff1a8
  473.         5    0101    Color21 - $dff1aa
  474.         6    0110    Color22 - $dff1ac
  475.         7    0111    Color23 - $dff1ae
  476.         8    1000    Color24 - $dff1b0
  477.         9    1001    Color25 - $dff1b2
  478.         10    1010    Color26 - $dff1b4
  479.         11    1011    Color27 - $dff1b6
  480.         12    1100    Color28 - $dff1b8
  481.         13    1101    Color29 - $dff1ba
  482.         14    1110    Color30 - $dff1bc
  483.         15    1111    Color31 - $dff1be
  484.  
  485. In der COPPERLIST müssen sie also so definiert werden:
  486.  
  487.     dc.w    $1A2,$F00    ; color17, FARBE  1 für die Attached-Sprites
  488.     dc.w    $1A4,$0F0    ; color18, FARBE  2 für die Attached-Sprites
  489.     dc.w    $1A6,$FF0    ; color19, FARBE  3 für die Attached-Sprites
  490.     dc.w    $1A8,$FF0    ; color20, FARBE  4 für die Attached-Sprites
  491.     dc.w    $1AA,$FFF    ; color21, FARBE  5 für die Attached-Sprites
  492.     dc.w    $1AC,$0BD    ; color22, FARBE  6 für die Attached-Sprites
  493.     dc.w    $1AE,$D50    ; color23, FARBE  7 für die Attached-Sprites
  494.     dc.w    $1B0,$D50    ; color24, FARBE  7 für die Attached-Sprites
  495.     dc.w    $1B2,$00F    ; color25, FARBE  9 für die Attached-Sprites
  496.     dc.w    $1B4,$F0F    ; color26, FARBE 10 für die Attached-Sprites
  497.     dc.w    $1B6,$BBB    ; color27, FARBE 11 für die Attached-Sprites
  498.     dc.w    $1B8,$BBB    ; color28, FARBE 12 für die Attached-Sprites
  499.     dc.w    $1BA,$8E0    ; color29, FARBE 13 für die Attached-Sprites
  500.     dc.w    $1BC,$a70    ; color30, FARBE 14 für die Attached-Sprites
  501.     dc.w    $1BE,$d00    ; color31, FARBE 15 für die Attached-Sprites
  502.  
  503. Um zwei Sprites zu vermählen muß nur das Bit 7  des  zweiten  Kontrollword
  504. des  ungeraden  Sprite  im  Paar  auf  1  gesetzt  werden  (also  Bit 7 im
  505. berühmt-berüchtigten vierten Byte  der  Spezialfunktionen).  Um  z.B.  die
  506. Sprites 0 und 1 zusammenzuschließen, einfach dieses Bit im Sprite1 setzen,
  507. um Sprite 4 und 5 zu koppeln Bit 7 im Byte 4 des Sprite  5.  Es  ist  wohl
  508. einleuchtend, daß die Sprites die gleichen Koordinaten haben müssen, damit
  509. die vier Planes genau übereinanderliegen, sonst wird wohl  kein  richtiges
  510. Überlagerungsmuster  entstehen!  Machen wir ein Beispiel: um die Sprites 0
  511. und 1 zusammenzubringen, müssen wir das Bit 7 des vierten Words im Sprite1
  512. auf High (1) setzen:
  513.  
  514.  
  515. SPRITE0:
  516. VSTART0:        ; Anfangsposition VERTIKAL
  517.     dc.b $50
  518. HSTART0:        ; Anfangsposition HORIZONTAL
  519.     dc.b $90
  520. VSTOP0:
  521.     dc.b    $64    ; Endposition VERTIKAL
  522.     dc.b    $00    ; Bei geraden Sprites muß Bit 7 nicht gesetzt werden.
  523. ; ab hier beginnen die Daten für die zwei Planes des Sprite
  524.     dc.w    %0000000000000000,%0000110000110000
  525.     dc.w    %0000000000000000,%0000011001100000
  526.     ...
  527.     dc.w    0,0    ; Ende Sprite0
  528.  
  529.  
  530. SPRITE1:
  531. VSTART1:        ; Anfangsposition VERTIKAL
  532.     dc.b $50
  533. HSTART:             ; Anfangsposition HORIZONTAL
  534.     dc.b $90
  535. VSTOP:
  536.     dc.b    $64        ; Endposition Vertikal
  537.  
  538.         ;76543210
  539.     dc.b    %10000000    ; BIT 7 GESETZT! ATTACCHED MODE 
  540.                 ; für Sprite 0/1
  541.  
  542. ; ab hier beginnen die Daten für die 2 Planes des Sprite
  543.     dc.w    %0000000000000000,%0000110000110000
  544.     dc.w    %0000000000000000,%0000011001100000
  545.     ...
  546.     dc.w    0,0    ; Ende Sprite1
  547.  
  548.  
  549. Um also die Sprites "Attached" zu gestalten, einfach  das  siebte  Bit  im
  550. vierten Byte der ungeraden Sprites auf 1 setzen, also in den sprites 1,3,5
  551. und 7.
  552.  
  553. Um sich einen Sprite in 16 Farben zu schaffen muß man ihn zuerst mit einem
  554. Malprogramm  zeichnen  und dann mit dem IFF-Konverter KefCon konvertieren,
  555. denn es wäre recht schwierig, so über dem Daumen  gepeilt  die  16  Farben
  556. richtig zu kalkulieren, da es 4 Planes sind, die zusammen 16 Möglichkeiten
  557. ergeben!
  558.  
  559. Ladet und führt dann Listing7g.s aus. Es zeigt einen Sprite in  16  Farben
  560. an,  im  Attached-Modus.  Darin ist auch beschrieben, wie man einen Sprite
  561. mit dem KefCon herstell, sei er nun zu 4 oder 16 Farben.
  562.  
  563. Es ist möglich, gleichzeitig Sprites in 4 und in 16  Farben  darzustellen.
  564. Z.B. könnten Sprite 0 und 1 Attached sein und die anderen nicht, oder jede
  565. beliebige Kombination.
  566.  
  567. Im Beispiellisting Listing7h.s werden 4 Attached-Sprites angezeigt,  jeder
  568. von ihnen in einer unabhängigen Bewegung.
  569.  
  570. Hier  angekommen werdet ihr euch sicher fragen, wieso immer noch nicht das
  571. Problem der zwei Pixel pro Schritt nicht eliminiert wurde, und  wir  immer
  572. noch  nicht Pixel für Pixel uber den Schirm gleiten können. Gut, es ist an
  573. der Zeit, das in den Griff zu bekommen. Aber dazu müssen wir  vorher  noch
  574. einen  neuen Befehl des 68000 lernen, welcher auf den einzelnen Bits einer
  575. Zahl operiert: --- LSR ---
  576. Dieses Kürzel steht für "LOGIC SHIFT RIGHT", oder  "LOGISCHER  SCROLL  DER
  577. BITS  NACH  RECHTS".  Anders ausgedrückt, wenn eine Binärzahl in d0 %00111
  578. ist, dann wird sie nach einem LSR #1,d0 folgendermaßen  aussehen:  %00011,
  579. nach einem LSR #2,d0 so: %00001.
  580. Auf die gleiche Art wird ein %00110010 nach einem LSR #1,d0 zu  %00011001,
  581. und  nahc  einem  LSR#5,d0  wäre nur mehr ein %00000001 erhalten. Die Zahl
  582. wird also binär betrachtet, es ist so, als wären sie auf einem  Tischtuch,
  583. an  dem  wir ziehen: wenn wir um #1 ziehen, dann bewegen wir das Tischtuch
  584. mitsamt seinen BitTellern darauf, und das erste in der Reihe wird zu Boden
  585. fallen...  Wenn  man  zuviel  zieht,  dann  kommen alle BitTeller über den
  586. Tischrand und man hat den Tisch abgeräumt (auf NULL gesetzt). Aber was hat
  587. dieser Befehl mit dem Byte HSTART zu tun ???
  588. Das Probelm ist folgendes: wie ihr wißt, gibt es weitaus mehr  horizontale
  589. Positionen  als  nur $FF (255), man denke nur daran, daß ein LowRes-Screen
  590. 320 Pixel breit ist. Wenn wir eine Zahl erreichen wollen, die über dem 255
  591. ist  (8  Bit,  vom  0 bis zum 7) dann müssen wir ein Bit mehr zu Verfügung
  592. haben: somit kommen wir  nicht  mehr  nur  bis  maximal  %11111111  ($ff),
  593. sondern  bis  %111111111, oder 511. Das wäre ja super für das HSTART! Aber
  594. wohin geben wir dieses zusätzliche Bit?? Die  Scherzkekse  von  Ingeneuren
  595. haben  gedacht, es wäre im famosen vierten KontrollByte gut aufgehoben, in
  596. dem wir auch die Sprites zusammenpappen. Nun gut, das siebte Bit  ist  für
  597. den  Attached-Modus  reserviert,  dann haben wir ja noch die sechs unteren
  598. frei. Also nehmen wir Bit 0 für diese Aufgabe, und machen dieses  Bit  zum
  599. NIEDERWERTIGSTEN  Bit  der horizontalen Koordinate, oder anders, zum Bit 9
  600. der Koordinate. Damit wird das Kontrollbyte wie folgt aufgeteilt:
  601.  
  602.     ;876543210    ; Zahl mit 9 bit, für die HSTART - Koordinate
  603.     %111111111
  604.      \_____/ \/
  605.         |      |
  606.       8 hochwert. |
  607.       Bits im      |
  608.       Byte HSTART |
  609.           |
  610.           |
  611.           |
  612.           |
  613.           |
  614.         Bit 0 der
  615.         Zahl zu 9 Bit,
  616.         steht im Bit 0
  617.         des vierten
  618.         Kontrollbyte
  619.  
  620. Wenn ihr das niederwertige Bit einer 9 Bit  breiten  Zahl  entfernt,  dann
  621. werdet ihr immer eine gerade Zahl erhalten, da dieses Bit immer auf 0 ist.
  622. Denn eine Zahl ist immer dann ungerade, wenn dieses lezte Bit auf 1 steht,
  623. testet  mal  mit  "?100"  und  "?101".  Ihr werdet feststellen, daß gerade
  624. Zahlen immer eine NULL hinten stehen haben, ungerade eine Eins. Bis  jetzt
  625. konntne  wir  also in Schritten zu zwei Pixel scrollen, und wir mußten aus
  626. diesem Grund auch immer  nur  die  Hälfte  des  Effektivwertes  in  HSTART
  627. einsetzen.  Um  auch  die ungeraden Adressen zu erreichen und um die reale
  628. Adresse als Input zu geben müssen wir die Koordinate in niederwertiges Bit
  629. und  hochwertiges Byte aufteilen. Danach dieses Bit in die richtige Stelle
  630. und das Byte hineinschreiben. Um dies zu tun, stellt euch  vor,  ihr  habt
  631. die ungerade Adresse 35: (%00100011). Als erstes müssen wir kontrollieren,
  632. ob das Bit 0 des vierten Kontrollbytes  gesetzt  werden  muß  oder  nicht.
  633. Dafür  müssen  wir  nur mit einem BTST kontrollieren, ab unsere Koordinate
  634. das Bit 0 auf 1 hat oder nicht, und dann dementsprechend reagieren: nehmen
  635. wir an, wir haben die Koordinate in d0:
  636.  
  637.     btst    #0,D0        ; niederwertiges Bit der X-Koordinate =0?
  638.     beq.s    BitNiederNULL
  639.     bset    #0,MeinSprite+3    ; Setzen das niederw. Bit von HSTART
  640.     bra.s    PlaceCoords
  641.  
  642. BitNiederNull:
  643.     bclr    #0,MeinSprite+3    ; Löschen das niederw. Bit von HSTART
  644. PlaceCoords:
  645.     ....
  646.  
  647. Nun haben wir das niederwertige Bit von HSTART  gesetzt  (oder  gelöscht),
  648. nun kommt der Rest der Zahl an die Reihe, die höherwertigen 8 Bit. Aber es
  649. gibt ein Problem: die Zahl hat 9 Bit, und wir brauchen  nur  8!  Und  hier
  650. kommt  die Anweisung LSR ins Spiel!!! Denn sie läßt die Bits der Zahl alle
  651. um eins nach rechts rutschen, somit verschwindet das 9. Bit und wir  haben
  652. die  anderen  8 schon an der richtigen Stelle. Schauen wir uns an, wie die
  653. Routine PlaceCoords weitergeht:
  654.  
  655.     lsr.w    #1,D0        ; SHIFTEN 1 Bit nach rechts, oder "verschieben"
  656.                 ; den Wert von HSTART, um ihn in den in das
  657.                 ; Byte von HSTART geben zu können, ohne dem
  658.                 ; niederwertigen, 9. Bit.
  659.     move.b  D0,HSTART    ; Setzen diesen Wert XX ins Byte HSTART
  660.     rts
  661.  
  662. In diesem Fall hatten wir die Koordinate %00100011 (35), so sieht sie nach
  663. dem  LSR #1,d0 aus: %00010001!!!! Das Byte ist so, wie es in HSTART kommen
  664. muß.
  665.  
  666. In Listing7i.s wird diese Routine angewandt, um endlich einen Sprite schön
  667. flüssig und  gleichmäßig  über  den Bildschirm zu schicken, wie es nur der
  668. Amiga kann.
  669.  
  670. Jetzt ist es an der Zeit, auch noch das letzte Limit zu  eliminieren,  das
  671. in  vertikaler  Richtung:  in  dieser  Richtung  konnten wir zwar schon in
  672. Einerschritten gehen, aber nur bis Zeile $FF.  Um  dieses  zu  beseitigen,
  673. haben  die  Erfinder  des  Amiga  bei  VSTART/VSTOP  eine  andere  Technik
  674. angewandt, als bei HSTART: eigentlich braucht auch VSTART/VSTOP eine  Zahl
  675. mit  neun  Bit,  aber  anstatt  das  niederwertigste  haben  sie  hier das
  676. hochwertigste "herausgeführt". Somit ist in VSTART/VSTOP jede Zahl bis $FF
  677. gültig, also bis 256, danach muß das neunte Bit gesetzt werden, um darüber
  678. hinaus zu  kommen,  und  wo  wird  das  wohl  liegen?  Genau,  im  vierten
  679. Kontrollbyte.  Nach  $FF  kommt  $100,  $101 usw., der Zählvorgang beginnt
  680. wieder von vorne, nur mit dem neunten Bit auf High. Sehen wir nun, wie wir
  681. eine  Routine  machen können, die im Grunde genommen gleich ist wie die im
  682. horizontalen Sinn, die also mit der realen Koordinate startet (es ist  ein
  683. Word  notwendig)  und sie dann in hochwertiges Bit und niederwertiges Byte
  684. zerteilt. Achtung, hier haben wir auch  VSTOP  zu  modifizieren,  nur  mit
  685. VSTART  ist  nix  getan!! Ach ja, habe fast vergessen: das hochwertige Bit
  686. von VSTOP ist in Bit 1 des vierten Kontrollbytes zu finden, VSTART in  Bit 2:
  687.  
  688.     MOVE.w    (A0),d0        ; kopiert das Word aus der Tabelle in d0
  689.     ADD.W    #$2c,d0        ; addiert den Offset vom Anfang des Screens
  690.     MOVE.b    d0,VSTART    ; kopiert das Byte in VSTART
  691.     btst.l    #8,d0        ; Zahl größer als $FF?
  692.     beq.s    NichtVSTARTSET
  693.     bset.b    #2,MeinSprite+3    ; Setzt das Bit 8 von VSTART (Zahl > $FF)
  694.     bra.s    ToVSTOP
  695. NichtVSTARTSET:
  696.     bclr.b    #2,MeinSprite+3    ; Löscht das Bit 8 von VSTART (Zahl < $FF)
  697. ToVSTOP:
  698.     ADD.w    #13,D0        ; Addiere die Länge des Sprite um die
  699.                 ; Endposition festzulegen (VSTOP)
  700.     move.b    d0,VSTOP    ; Setze den richtigen Wert in VSTOP
  701.     btst.l    #8,d0
  702.     beq.s    NichtVSTOPSET
  703.     bset.b    #1,MeinSprite+3 ; Setzt das Bit 8 von VSTOP (Zahl > $FF)
  704.     bra.w    VstopFIN
  705. NichtVSTOPSET:
  706.     bclr.b    #1,MeinSprite+3 ; Löscht das Bit 8 von VSTOP (Zahl < $FF)
  707. VstopFIN:
  708.     rts
  709.  
  710. Diese Routine funktioniert auf die gleiche Weise wie  die  vorherige,  was
  711. das  Setzen des "zusätzlichen" Bits angeht, unterscheidet sich aber darin,
  712. daß sie auf VSTART wie auf VSTOP zugreifen muß, und daß das LSR fehlt (ist
  713. hier überflüssig).
  714.  
  715. Ihr könnt sie testen, ladet dazu Listing7l.s.
  716.  
  717. Da  wir  nun  die volständige Kontrolle über die Sprites haben, werden wir
  718. deren Kontrollroutinen etwas optimisieren:  als  erstes  werden  wir  eine
  719. universelle  Kontrollroutine  für Sprites erstellen, so, daß wir nicht für
  720. jeden der 8 Sprites  jedesmal  alles  neuschreiben  müssen.  Es  ist  eine
  721. Routine  mit  Parametern  notwendig,  die  als  Eingang  die  Adresse  des
  722. gewünschten Sprites und dessen X-Y-Koordinaten erhält. Damit brauchen  wir
  723. für  jeden  Sprite nur mehr ein "BSR ROUTINE" machen, und nicht mehr alles
  724. neuschreiben. Wir können dann diese Routine jedesmal  recyclen,  wenn  wir
  725. Sprites  bewegen  wollen,  eventuell  nur kleine Änderungen anbringen. Ein
  726. Beispiel  einer  solchen   Routine   findet   ihr   in   Listing7m.s   Die
  727. Universalroutine heißt UniBewSprite, und damit sie funktioniert müssen wir
  728. ihr, außer  der  Adresse  des  zu  bewegenden  Sprites  und  dessen  neuen
  729. Koordinaten,  auch  die  Höhe des Sprites übermitteln. Damit errechnet die
  730. Routine den Wert für VSTOP.
  731. Diese Werte werden ihr mittels  einiger  Register  übermittelt:  Werte  in
  732. Register  schreiben, Routine aufrufen, fertig. Um genau zu sein, kommt die
  733. Adresse des Sprite in a1, seine Höhe ins Register d2, die Y-Koordinate  in
  734. d0 und die X-Koordinate in d1. Die der Routine "übermittelten" Koordinaten
  735. sind die Werte für einen Screen  in  320x256.  Die  Routine  kümmert  sich
  736. selbst  um  das  "zentrieren"  des  Sprites  am Monitor, indem sie $40 zur
  737. X-Koordinate und $2c zur Y-Koordinate dazuzählt. Weiters kümmert sie  sich
  738. darum,  das  niederwertige  Bit  von  HSTART  und  das hochwertige Bit von
  739. VSTART/VSTOP zu setzen.
  740.  
  741. Kurzum:
  742.  
  743. ;
  744. ;    Eingangsparameter von UniBewSprite:
  745. ;
  746. ;    a1 = Adresse des Sprite
  747. ;    d0 = Vertikale Y-Position des Sprites auf dem Screen (0-255)
  748. ;    d1 = Horizontale X-Position des Sprites auf dem Screen (0-320)
  749. ;    d2 = Höhe des Sprite
  750.  
  751. Da  wir  nun diese Routine haben, die sich ein für alle Mal aller Probleme
  752. annimmt, können wir uns daran machen,  sie  für  einige  Applikationen  zu
  753. verwenden,  die  uns  mit  den  Sprites  vertrauter  macht. Bevor ihr aber
  754. weitermacht,  ladet  Listing7m.s  und  wehe  dem,  wer   in   LEKTION7.TXT
  755. weiterliest  oder  andere  Listings  ladet,  bevor er es nicht VOLLSTÄNDIG
  756. verstanden hat. Da die Routine in  allen  folgenden  Beispielen  auftreten
  757. wird,  wäre  es  sehr unwirtschaftlich, weiterzumachen, bevor eine Routine
  758. verstanden wurde, die wir dauernd antreffen werden.
  759.  
  760. In Listing7n.s sehen wir einen Sprite auf dem Bildschirm, der  geradlinige
  761. "Schußlinien" einschlägt. Die Koordinaten stammen nicht aus einer Tabelle,
  762. sondern werden nach und nach berechnet. Dadurch bewegt sich der Sprite mit
  763. einer  konstanten  Geschwindigkeit.  Ladet es und führt es aus, wir werden
  764. sehen, wie man einen Sprite an den Ecken des Bildschirmes abprallen lassen
  765. kann.
  766.  
  767. In  Listing7o.s  sehen  wir  hingegen  zwei  Sprites,  die  beide  von der
  768. Universalroutine bewegt werden. Es ist ein ausgezeichnetes  Beispiel,  wie
  769. unsere  Routine  verschieden Sprites, auch verschiedener Größe, problemlos
  770. bewegen kann. Wenn wir keine Parameter verwenden würden, dann  müßten  wir
  771. für   jeden   Sprite   alles   neu   schreiben,  eine  unnütze  Zeit-  und
  772. Speichervergeudung.
  773.  
  774. In  Listing7p.s sehen wir, immer mit der Universalroutine, wie wir Objekte
  775. kreiren  können,  die  größer  sind  als  16  Pixel,  indem  wir   Sprites
  776. zusammenflicken. Achtung! Das ist was anderes als die "ATTACHED"- Sprites!
  777. Bei denen werden zwei Sprites  genau  übereinandergelegt,  sie  haben  die
  778. exakt  gleichen  Koordinaten,  und  das  Bit "attach" ist in den ungeraden
  779. Sprites gesetzt. Bei "aneinandergereihten"  Sprites  hingegen  ahndelt  es
  780. sich  um  einen  "Zusammenschluß"  von  zwei  oder  mehreren  Sprites, die
  781. nebeneinander  oder  untereinander  auf  den  Screen  gezeichnet   werden.
  782. Zusammen ergeben sie dann ein Gesamtbild. Sie müssen genau mit den Rändern
  783. aneinandergereiht werden, wenn wir nicht wollen, daß es aussieht, daß  sie
  784. "zerfallen".  Es  muß  kein spezielles Bit gesetzt werden, es handelt sich
  785. nur um normale Sprites,  die  nebeneinander  aufgestellt  sind.  Hier  ein
  786. Beispiel mit einem Raumschiff, das aus zwei Sprites besteht:
  787.     
  788.      (128,65)             (128,65)        (144,65)
  789.      |_ _ _ __ _ _ _    |_ _ _ _ _ _ __|__ _ _ _ _ _ _
  790.      |     /  \    |    |        /  |  \          |
  791.         __/____\__               /       \
  792.      | |          |    |    |      /    |    \          |
  793.        |          |             ____/___________\____
  794.      | |__________| |    |   |           |      |   |
  795.           \       /            |              |
  796.      |_ _ _\__/_ _ _|    |   |           |      |   |
  797.                     |              |
  798.                 |   |__________|__________|   |
  799.                      \         /
  800.                 |      \    |    /          |
  801.                        \       /
  802.                 |_ _ _ _ _ _\__|__/_ _ _ _ _ _|
  803.  
  804.                    Sprite 0      Sprite 1
  805.  
  806. Mit dieser Technik lassen sich Ende-Level-Monster schaffen, die bis zu 128
  807. Pixel  breit sind (16*8), wenn ihr die Sprites zu 3 Farben verwendet, oder
  808. 64 Pixel breit (16*4), wenn ihr Attached-Sprites mit 15  Farben  einsetzt.
  809. Wenn  das  Monster  länger als breit ist, z.B. "Humanoid", dann könnt auch
  810. die ganze Länge des Screens verwenden, denn dort gibt´s bekanntlich  keine
  811. Limits. In der vertikalen Richtung können wir dann auch die Farben mit dem
  812. Copper vertauschen, und ihm somit die Schuhe anders färben als die Jeans.
  813.  
  814.  
  815. MOUSE UND JOYSTICK
  816.  
  817. Jetzt haben wir gesehen, wie wir den  Amiga  die  Spites  bewegen  lassen,
  818. wieso  bewegen  nicht  wir sie? Natürlich unter Verwendung einer Maus oder
  819. eines Joysticks. Bevor wir aber lernen, mit  diesen  Apparaten  umzugehen,
  820. müssen  wir  einige  weitere  Befehle lernen, die uns Bitmanipulationen in
  821. Registern erlauben: NOT, AND, OR, EOR.
  822.  
  823. Diese Befehle operieren auf den einzelnen Bits eines Registers (oder einer
  824. Speicherzelle),  sei es für das Quellregister wir für das Zielregister. So
  825. z.B. behandeln diese Anweisungen ein Byte nicht als eine Zahl, die  aus  8
  826. Bit  besteht, sondern wie 8 Bits, die unabhängig voneinander in der Gegend
  827. rumstehen. Das bedeutet, daß die Auswirkung, die ein Befehl  auf  ein  Bit
  828. hat, unabhängig von den weiteren Bits im Register ist.
  829.  
  830. Als  erstes  sehen  wir  uns  das  NOT  an.  Es funktioniert nur auf einen
  831. Operanden, dessen Effekt ist das vertauschen der  Bits  des  Operanden.  1
  832. wird durch 0 ersetzt, und 0 durch 1. Wenn wir z.B. im Register d0 die Zahl
  833. %01001100 haben, dann wird ein
  834.  
  835.     NOT.B    d0
  836.  
  837. folgendes Resultat bringen: %10110011.
  838.  
  839. Die 3 weiteren Instruktionen hingegen  arbeiten  mit  2  Operanden,  einem
  840. Quelloperand  und einem Zieloperand. Sie führen die Operation zwischen den
  841. beiden Operanden aus und schreiben das Ergebnis in  den  Zieloperand.  Die
  842. Operationen   (die   sich   von   Befehl  zu  Befehl  unterscheiden)  sind
  843. Bit-für-Bit, d.h., sie werden  zwischen  einem  Bit  im  QuellOP  und  dem
  844. entsprechenden  ZielOP  durchgeführt.  Ein D0 AND D1 entspricht in etwa so
  845. was:
  846.  
  847. (Bit 0 von D0) AND (Bit 0 von D1)
  848. (Bit 1 von D0) AND (Bit 1 von D1)
  849. (Bit 2 von D0) AND (Bit 2 von D1) und so weiter für alle Bit in D0 und D1
  850.  
  851. Schauen  wir, was das AND auf sich hat. Wir untersuchen seine Arbeitsweise
  852. auf zwei einzelnen Bits. Da ein Bit entweder 0 oder 1  ist,  ergeben  sich
  853. daraus 4 Fälle:
  854.  
  855.  0 AND 0 = 0
  856.  0 AND 1 = 0
  857.  1 AND 0 = 0
  858.  1 AND 1 = 1
  859.  
  860. AND gibt als Resultat dann und nur dann 1, wenn das Bit des ersten UND des
  861. zweiten  Operanden  1  ist. In allen anderen Fällen werden wir 0 erhalten.
  862. Dreimal dürft ihr raten, was AND auf deutsch heißt: UND.  Man  könnte  die
  863. Funktionsweise  auch so übersetzen: "SIND DAS ERSTE UND DAS ZWEITE BIT AUF
  864. 1? WENN JA, ANTWORTE MIT 1, ANSONSTEN MIT 0". Ein AND kann nützlich  sein,
  865. um gewisse Bits in einer Zahl auf NULL zu setzen:
  866.  
  867.  AND.W #%1111111111111011,LABEL
  868.  
  869. Es wird das Bit 2 der Zahl in LABEL löschen, da es das  einzige  auf  NULL
  870. gesetzte  Bit  im  Operand  ist,  und  somit das einzige sein wird, das im
  871. Zieloperand geändert wird. Denn die anderen sind auf 1, und  werden  somit
  872. nichts  am  Resultat ändern: Wenn das Zielbit 0 war, dann wird ein 0 AND 1
  873. nichts ändern, es ergibt immer 0. Genauso wird eine 1 nichts ändern: 1 AND
  874. 1  =  1.  Dort,  wo  aber  0 steht, wird immer auf 0 gesetzt, egal, ob das
  875. Zielbit 1 oder 0 war. Einige Beispiele:
  876.  
  877.    1111001111 AND 0011001100 = 0011001100 - Keine Änderung
  878.    1101011011 AND 0001110001 = 0001010001 - 1 Bit gelöscht(auf 0 gesetzt)
  879.    1111101101 AND 0011111111 = 0011101101 - 2 Bit gelöscht
  880.  
  881. Diese Operation des Löschens heißt MASKIERUNG:
  882.  
  883.  AND #%11110000,LABEL    (%11110000 ist die MASKE, denn es ist so, als
  884.             würde man eine Schablone aus NULLEN über die Zahl
  885.             in Label geben. In diesem Fall werden die ersten
  886.             vier Bits rechts "verhüllt" wie bei einem Mädchen,
  887.             das ein Muttermal mit Schminke "verhüllt". Dieses
  888.             Mal ist wie eine 1, die vom Nuller wie von der
  889.             Schminke überdeckt wird, also gelöscht wird.
  890.  
  891. Das OR hingegen verhält sich so:
  892.  
  893.  0 OR 0 = 0
  894.  0 OR 1 = 1
  895.  1 OR 0 = 1
  896.  1 OR 1 = 1
  897.  
  898. In  diesem  Fall  reicht  es,  daß  eines  der zwei Bits auf 1 ist, um als
  899. Resultat eine 1 zu geben. Das Resultat ist also immer 1, außer wenn  beide
  900. Bits  auf  0 sind. Auch hier kann es helfen zu wissen, daß die Übersetzung
  901. von OR aus dem englischen "ODER"  heißt.  "ENTWERDER  DAS  EINE  ODER  DAS
  902. ANDERE  BIT  MUß  1 SEIN, UM ALS RESULTAT EINE 1 ZU LIEFERN. ANSONSTEN 0".
  903. Dieses ist nützlich, im Gegensatz zum AND, um einige Bits in einem Byte zu
  904. SETZEN, sie also auf 1 (High) setzen. Einige Beispiele:
  905.  
  906.     0000000001 OR 1101011101 = 1101010001 - Keine Änderung
  907.     1000000000 OR 0010011000 = 1010011000 - 1 Bit gesetzt
  908.     0001111000 OR 1111100000 = 1111111000 - 2 Bit gesetzt
  909.  
  910. In  diesem Fall ist es so, als würde sich das Mädchen von vorhin statt der
  911. rosa Pinselei (den Nullen) über den schwarzen  Malen  (den  Einsen)  jetzt
  912. einen schwarzen Punkt setzen, um ein falsches Mal zu bekommen, wie es z.B.
  913. Marilyn Monroe über der Lippe hatte. Oder  als  würde  sich  ein  farbiges
  914. Mädchen  (vollstandig  auf  1)  rosa  schminken,  um  weiß auszusehen (wie
  915. Michael Jackson), also vollständig auf NULL zu sein,  und  nur  dort  eine
  916. Stelle  freizulassen, wo die Zahl im OR auf 1 ist, und die schwarze Stelle
  917. hervortreten lassen.
  918.  
  919. Das EOR, oder Exklusives OR, setzt nur dann auf 1, wenn entweder das erste
  920. oder  das  zweite  Bit auf 1 sind, niemals aber wenn es beide sind, wie es
  921. beim OR der Fall ist:
  922.  
  923.  0 EOR 0 = 0
  924.  0 EOR 1 = 1
  925.  1 EOR 0 = 1
  926.  1 EOR 1 = 0     ; Hier ist der Unterschied zum OR: denn 1 OR 1 = 1!
  927.  
  928. Einige Beispiele:
  929.  
  930.     0000000001 EOR 1101011101 = 1101010000 - 1 Bit gelöscht
  931.     1000000000 EOR 0010011000 = 1010011000 - 1 Bit gesetzt
  932.  
  933. Dieser  letzte  Befefl  wird  uns  guten  Dienst  beim Lesen des Joysticks
  934. erweisen. Wie ihr wißt besitzt der Amiga 2 Ports, an denen  Joystick  oder
  935. Mouse  angeschlossen  werden  können.  An jeden der zwei können unabhängig
  936. entweder  Mouse  oder  Joystick  angeschlossen  werden.  Für  jeden   Port
  937. existiert  ein  Hardwareregister,  das gelesen werden kann, um den Zustand
  938. der Mouse/Joystick zu erfähren. Port 0 (an  dem  normalerweise  die  Mouse
  939. hängt)  wird  durch  Register JOY0DAT ausgelesen ($dff00a), Port 1 mittels
  940. JOY1DAT ($dff00c). Als erstes sehen wir, wie wir  den  Joystick  abfragen.
  941. Wir  beziehen  uns dabei auf das Register JOY1DAT, denn daran ist meistens
  942. der Joystick angeschlossen. Es funktioniert  auf  JOY0DAT  auf  genau  die
  943. gleiche Weise.
  944. Wir können uns  einen  Joystick  wie  einen  Apparat  mit  vier  Schaltern
  945. vorstellen  (einen  pro  Richtung), von denen jeder zwei Zustände annehmen
  946. kann: geschlossen (1) oder offen (0),  jenachdem,  ob  der  Hebel  in  die
  947. jeweilige  Richtung  gedrückt wird oder nicht. Um also zu wissen, wohin er
  948. zeigt, müssen wir den Zustand  der  Schalter  abfragen.  Für  zwei  dieser
  949. Schalter  ist die Abfrage sehr simpel, es wird einfach ein Bit im Register
  950. JOY1DAT gesetzt:
  951.  
  952. - Das Bit 1 von JOY1DAT ist der Status des Schalters "Rechts"
  953. - Das Bit 9 von JOY1DAT ist der Status des Schalters "Links"
  954.  
  955. Wenn das Bit auf 1 ist, dann ist  der  betroffenen  Schalter  geschlossen,
  956. ansonsten ist er offen. Was die beiden anderen Richtungen angeht, sie sind
  957. nicht direkt als einzelnes Bit eingetragen. Um sie zu erfahren, müssen wir
  958. eine kleine Rechenoperation mit einem EOR durchführen:
  959.  
  960. -  Der Status des Schalters "Oben" ist das Resultat aus einem EOR zwischen
  961. dem Bit 8 und Bit 9 des Registers
  962.  
  963. - Der Status des Schalters "Unten" ist das Resultat aus einem EOR zwischen
  964. dem Bit 0 und Bit 1 des Registers.
  965.  
  966. Auch hier gilt, daß ein Bit 1 bedeutet, daß der Schalter geschlossen  ist,
  967. ein  Bit  auf  0  daß  er  offen  ist. Da wir nun den Status des Joysticks
  968. abfragen können, können wir auch Sprites auf dem Bildschirm bewegen.
  969. Ladet Listing7q.s in einen anderen Textbuffer und führt es aus.
  970.  
  971. Nun kommen wir zur Maus.
  972. Wenn wir an einen der zwei Ports eine  Maus  anschließen,  dann  verhalten
  973. sich die Register anders als bei einem Joystick. Wenn wir nun das Register
  974. JOY1DAT ansehen (genauso auch das Register JOY0DAT...), dann bemerken wir,
  975. daß  das  hochwertige Byte dazu verwendet wird, um vertikale Bewegungen zu
  976. registrieren, und das niederwertige Byte für horizontale Bewegungen. Jedes
  977. Byte  stellt  eine Zahl dar (von 0 bis 255), die sich je nach Bewegung der
  978. Mouse verändert.
  979.  
  980. - Das hochwertige Byte verringert die Zahl, wenn die Maus nach oben bewegt
  981. wird und erhöht den Inhalt, wenn die Maus nach unten bewegt wird.
  982.  
  983. -  Das  niederwertige Byte verringert die dargestellte Zahl, wenn die Maus
  984. nach links bewegt wird, und erhöht sie, wenn sie nach rechts bewegt wird.
  985.  
  986. Nun schauen wir, wie wir diese Informationen so ausnutzen können, um einen
  987. Sprite  zu  bewegen.  Die  erste Methode, die einen in den Sinn kommt, ist
  988. jene, einfach die Werte der zwei Bytes JOYxDAT  als  Koordinaten  für  den
  989. Sprite  zu  verwenden.  Es  ist  eigentlich  sehr praktisch, denn auch die
  990. Koordinaten der Sprites verringern sich nach Oben und nach Links hin,  und
  991. erhöhen sich nach Rechts und nach Unten.
  992. Diese  Methode  hat  aber den Nachteil, daß wir mit einem Byte bekanntlich
  993. maximal bis 255 kommen, der Bildschirm aber 320  Pixel  breit  ist.  Ladet
  994. Listing7r1.s und testet diese Methode. Eine ein bißchen komplexere Methode
  995. wird in Listing7r2.s präsentiert. Sie eliminiert das Limit der 255  Pixel.
  996. Die  Beschreibung  der  Methode  befindet sich im Listing selbst. Lest den
  997. angehängten Kommentar.
  998.  
  999. Da wir nun wissen, wie wir einen Pfeil am Bildschirm bewegen  können,  ist
  1000. es nur mehr einfach, ein Intuition-System zu simulieren, man kann also ein
  1001. Kontrollpanel mit Knöpfen  und  Schaltern  machen,  die  mit  einem  Pfeil
  1002. (Sprite) an-und ausgeschalten werden können, wenn damit über einem solchen
  1003. ist. Durch Auslesen der Koordinaten des  Sprites  und  Vergleich  mit  den
  1004. Kooridinaten  der Buttons ist das ein Kinderspiel. Versucht es mal selbst.
  1005. In fortgeschritteren Lektionen werden wir ein Listing dieser Art sehen.
  1006.  
  1007. WIEDERVERWENDUNG DER SPRITES
  1008.  
  1009. Die Technik der Wiederverwendung der Sprites erlaubt uns, mehr als  die  8
  1010. erlaubten Sprites gleichzeitig am Bildschirm anzuzeigen. Praktisch gesehen
  1011. wird ein Sprite dazu verwendet,  verschiedene  Objekte  auf  verschiedenen
  1012. Höhen  anzuzeigen. Wenn wir z.B. einen Sprite verwenden, um einen Alien im
  1013. oberen  Teil  des  Monitors  anzuzeigen,  dann  können  wir   den   selben
  1014. wiederverwenden,  um weiter unten das Raumschiff des Spielers zu zeichnen.
  1015. Das einzige Limit bei der Wiederwerwertung eines Sprites liegt darin,  daß
  1016. die  beiden  Objekte  auf  verschiedenen Höhen liegen müssen. Es ist nicht
  1017. möglich, auf der selben Zeile zwei Objekte anzuzeigen, die mit dem  selben
  1018. Sprite   gezeichnet   werden.   Des  Weiteren  muß  die  erste  Zeile  des
  1019. nachfolgenden Sprites mindestens eine Zeile Abstand von der letzten  Zeile
  1020. des vorigen Sprites haben. Horizontal gibt keine Einschränkungen. Das Bild
  1021. ilustriert die Situation vielleicht etwas besser:
  1022.  
  1023.  
  1024.       Ausschnitt des Screens
  1025.      ________________________
  1026.     |             |      Jedes Bild in diesem Ausschnitt
  1027.     |          _     |      des Bildschirmes ist mit dem
  1028.     |        _|_|_     |      selben Sprite gezeichnet.
  1029.     |        \___/ _ _|_ _      Jedes kann horizontal frei
  1030.     |     _ _ _ _ _ _ _ _ _ _|_ _ <-- positioniert werden, aber es muß
  1031.     |   _/_\_         |      mindestens eine Bildschirmzeile
  1032.     |  |_____|         |      zwischen der letzten Zeile eines
  1033.     |    \_/_ _ _ _ _ _ _ _ _|_ _      Sprites und der ersten Zeile
  1034.     |        _ _ _ _ _ _ _|_ _ <-- des wiederverwendeten liegen.
  1035.     |      /\         |
  1036.     |      \/         |      Die Pfeile zeigen die freie
  1037.     |             |      Zeilen zwischen den Objekten an.
  1038.     |             |
  1039.     |________________________|
  1040.  
  1041.  
  1042. Wie schon gesagt, gibt es kein Limit was die horizontale Position  angeht,
  1043. weger  die  Anzahl,  wie oft man einen Sprite wiederverwendet. Hauptsache,
  1044. man hält sich  an  die  oben  genannte  Regel.  Ein  Sprite  kann  so  oft
  1045. wiederverwendet  werden, wie man will. Diese Technik kann bei jedem Sprite
  1046. angewandt werden, und unabhängig unter den verschiedenen Sprites: so  kann
  1047. Sprite  0,3 und 4 nur einmal verwendet werden, Sprite 1 drei mal, Sprite 2
  1048. vier mal, und die Sprites 56 und 7 überhaupt  nicht.  Spielt  alles  keine
  1049. Rolle.
  1050.  
  1051. Diese  Technik  anzuwenden ist recht einfach, es bedarf nur einer Änderung
  1052. in der Struktur des Sprites.
  1053.  
  1054. Normalerweise kommen am Ende eines Sprites, nach den Daten, aus  denen  er
  1055. besteht,  zwei Words mit Inhalt 0. Sie markieren das Ende der Struktur. Um
  1056. ihn wiederzuverwenden setzen wir statt dieser zwei Word eine neue Struktur
  1057. ein,  die  ein  weiteres Bild beschreibt, nur weiter unten im Screen. Wenn
  1058. man dann noch ein drittes Mal das Spiel wiederholen will, dann  noch  eine
  1059. Struktur angehängt, usw., bis dann am Ende die zwei Word mit 0 kommen. Sie
  1060. markieren dann das Ende der letzten Wiederverwendung:
  1061.  
  1062.         SPRITE-STRUKTUR
  1063.       ___________________________ - -
  1064.       |  |     VSTART_1, HSTART_1    |   |
  1065.      |___________________________|
  1066.       |  |     VSTOP_1 und bits         |   |
  1067.      |___________________________|
  1068.       |                       |
  1069.       ___________________________
  1070.       |  |     plane 1, Zeile 1      |   |
  1071.      |___________________________|
  1072.       |  |     plane 2, Zeile 1      |   |
  1073.      |___________________________|         Daten der ersten
  1074.       |                       |- - - Verwendung des
  1075.         ------                sprite
  1076.       |        ------             |
  1077.         ------
  1078.       |   ___________________________    |
  1079.      |  plane 1, letzte Zeile    |
  1080.       |  |___________________________|   |
  1081.      |  plane 2, letzte Zeile    |
  1082.       |  |___________________________|   |
  1083.                       - -
  1084.       ___________________________ - -
  1085.       |  |    VSTART_2, HSTART_2     |   |    Daten der zweiten
  1086.      |___________________________|        Wiederverwendung des Sprite.
  1087.       |  |    VSTOP_2 e bit         |   |- - - Die vertikale Anfangs-
  1088.      |___________________________|        position muß mindestens
  1089.       |                     |    eine Zeile Abstand von
  1090.       ___________________________        der letzten Zeile der
  1091.       |  |                 |     |    vorherigen Verwendung haben.
  1092.      |___________________________|
  1093.       |  |                 |     |
  1094.      |___________________________|
  1095.       |                     |
  1096.         ------
  1097.       |        ------             |
  1098.         ------
  1099.       |   ___________________________     |
  1100.      |                 |
  1101.       |  |___________________________|     |
  1102.      |                 |
  1103.      \|/ |___________________________|     |
  1104.                       - -
  1105.                       _ _
  1106.         _____             |
  1107.         _____             |- - - Weitere Verwendungen
  1108.         _____              _ _|
  1109.  
  1110.       ___________________________ _ _
  1111.      |         0             |     |    Zwei auf 0 gesetzte
  1112.            |___________________________|     |_ _ _ Word, sie markieren
  1113.      |         0             |     |    das Ende der letzten
  1114.           |___________________________|_ _|    Wiederverwertung
  1115.  
  1116.  
  1117. Zu  bemerken,  daß  die  einzelnen  Wiederverwertungen  des   Sprites   in
  1118. Reihenfolge   eingesetzt   werden   müssen,  angefangen  vom  am  höchsten
  1119. positionierten Sprite bis hin zum  niedersten  am  Bildschirm.  Somit  muß
  1120. jedes VSTART größer sein als das VSTOP des Vorgängers.
  1121.  
  1122. Sehen  wir z.B. eine solche Struktur in der Praxis. Hier wird der Sprite 2
  1123. mal wiederverwertet.
  1124.  
  1125.  
  1126. MEINSPRITE:
  1127. VSTART_1:
  1128.     dc.b $50                ; Position erste Verwendung
  1129. HSTART_1:
  1130.     dc.b $40+12
  1131. VSTOP_1:
  1132.     dc.b $58
  1133.     dc.b $00
  1134.  dc.w   %0000001111000000,%0111110000111110    ; "Form"-Daten der ersten
  1135.  dc.w   %0000111111110000,%1111001110001111    ; Verwendung
  1136.  dc.w   %0011111111111100,%1100010001000011
  1137.  dc.w   %0111111111111110,%1000010001000001
  1138.  dc.w   %0111111111111110,%1000010001000001
  1139.  dc.w   %0011111111111100,%1100010001000011
  1140.  dc.w   %0000111111110000,%1111001110001111
  1141.  dc.w   %0000001111000000,%0111110000111110
  1142. VSTART_2:                    ; Position zweite Verwendung
  1143.     dc.b $70                ; BEMERKT, daß VSTART_2 > VSTOP_1
  1144. HSTART_2:
  1145.     dc.b $40+20
  1146. VSTOP_2:
  1147.     dc.b $78
  1148.     dc.b $00
  1149.  dc.w   %0000001111000000,%0111110000111110    ; "Form"-Daten der zweiten
  1150.  dc.w   %0000111111110000,%1111001110001111    ; Verwendung
  1151.  dc.w   %0011111111111100,%1100010001000011
  1152.  dc.w   %0111111111111110,%1000001110000001
  1153.  dc.w   %0111111111111110,%1000010001000001
  1154.  dc.w   %0011111111111100,%1100010001000011
  1155.  dc.w   %0000111111110000,%1111001110001111
  1156.  dc.w   %0000001111000000,%0111110000111110
  1157.  dc.w   0,0                    ; Ende der letzten Verwendung
  1158.  
  1159.  
  1160. Die  Technik  der  Wiederverwendung,  wenn  richtig  angewandt,  kann  zur
  1161. Vervielfachung  der bewegten Objekte in einem Shoot´em´up führen. In einem
  1162. Spiel, in dem sich die Feinde z.B. horizontal bewegen:
  1163.  
  1164.  
  1165.             /--___
  1166.             \--
  1167.     
  1168.                 /--___
  1169.                 \--
  1170.     
  1171.                     /--___
  1172.        ()-                \--
  1173.        /\___o - - - - - -
  1174.       ||||--o - - - - - -            /--___
  1175.       ||||                    \--
  1176.       //\\
  1177.      //  \\
  1178. ------------------------------------------------------------
  1179.  
  1180. Da  dieses  feindliche Geschwader aus Objekten besteht, die eines über dem
  1181. anderen stehen, die sich nie überkreuzen,  haben  wir  noch  ganze  sieben
  1182. Sprites für Player 1 und eventuelle Bomben zur Verfügung.
  1183.  
  1184. Ein  Beispiel  davon  bekommt  ihr  in  Listing7s.s,  wo  wir "16" Sprites
  1185. gleichzeitig anzeigen. Ladet und studiert es euch.
  1186.  
  1187. In unserem Kurs konnte dann  auch  einer  der  klassischen  Effekte  nicht
  1188. fehlen,  der  vor  einigen  Jahren  sehr in Mode war: das "Starfield", die
  1189. Sterne, die sich horizontal bewegen.
  1190. Diese Sterne werden durch recycelte Sprites dargestellt. Wir stellen  euch
  1191. mit  Listing7t1.s, Listing7t2.s und Listing7t3.s drei Versionen davon vor.
  1192. Die Wiederverwendung  von  Sprites  kann  auch  auf  "Attached"  angewandt
  1193. werden,  genauso  wie  auf "normalen". In Listing7t4.s sehen wir zirca das
  1194. gleiche wie in den Starfields, nur  mit  farbigen  Bällen  an  Stelle  der
  1195. Sterne.
  1196.  
  1197.     -        -        -        -
  1198.  
  1199. DAS DUAL PLAYFIELD MODE
  1200.  
  1201. Bevor wir weitere Charakteristiken der Sprites aufzählen machen  wir  kurz
  1202. einen  Abstecher  und vertiefen das Kapitel des Dual Playfields. Wir haben
  1203. schon in Lektion 4 angedeutet, daß es sich dabei um einen Spezialmodus  in
  1204. der  Grafik  handelt,  der  es  uns  erlaubt,  zwei  Screens  übereinander
  1205. anzuzeigen.  Sie  heißen  jeweils  PLAYFIELD1  und  PLAYFIELD2.  Aber  was
  1206. bedeutet,  daß  zwei  Screens "übereinander" liegen? Praktisch gesehen hat
  1207. jedes Playfield eine "durchsichtige" Farbe,  durch  die  wir  durchschauen
  1208. können,  was  drunter  vor  sich  geht.  Es ist mit dem COLOR0 der Sprites
  1209. durchaus vergleichbar. Eigentlich ist das "durchsichtige" gar keine Farbe,
  1210. es  ist  eher wie ein "Loch" im Playfield zu verstehen. Die anderen Farben
  1211. des Playfields  hingegen  verhalten  sich  normal.  Eines  der  Playfields
  1212. erscheint  über  dem  anderen  (ist  nur auszuwählen, welches), und dessen
  1213. NICHT durchsichtigen Farben überdecken das darunterliegende Playfield. Das
  1214. Durchsichtige  hingegen  verhält sich wie gesagt wie ein Loch und läßt das
  1215. drunterliegende durchscheinen.
  1216. Die maximale Anzahl von Bitplanes, die ein Playfield haben kann, ist  drei
  1217. in  Lowres und 2 in Highres. Praktisch werden die 6 Bitplanes des Amiga in
  1218. zwei Gruppen zu 3 aufgeteilt, jede dieser Gruppen ist ein  Playfield.  Das
  1219. Playfield  1 besteht aus den ungeraden Bitplanes, also aus den Planes 1, 3
  1220. und 5, das Playfield 2 aus den geraden, also 2, 4 und 6.
  1221. Natürlich ist es nicht immer notwendig, alle Bitplanes zu  verwenden.  Wir
  1222. können  unabhängig voneinander den zwei Playfields die Bitplanes zuteilen,
  1223. die wir wollen. Die Anzahl der zu verwendenden Bitplanes geben wir auf die
  1224. gleiche  Art  und Weise an, wie bei den "normalen" Grafikmodi. In die Bits
  1225. 14-12 des BPLCON0 ($dff100), BPU2, BPU1 und BPU0 genannt, kommt die Anzahl
  1226. der insgesamt verwendeten Bitplanes für die Playfields. Je nachdem, welche
  1227. Zahl wir hier eintragen, teilt die Hardware die  Bitplanes  folgendermaßen
  1228. auf:
  1229.  
  1230.  
  1231. Anzahl der verwendeten BPL. |   Bitplanes für      |    Bitplanes für
  1232.  (bit BPU di BPLCON0)        |   Playfield 1      |    Playfield 2
  1233. ----------------------------|---------------------|-------------------
  1234.                 |              |
  1235.     0            |    keines          |    keines
  1236.                 |              |
  1237.     1            |    Plane 1          |    keines
  1238.                 |              |
  1239.     2            |    Plane 1          |    Plane 2
  1240.                 |              |
  1241.     3            |    Plane 1,3      |    Plane 2
  1242.                 |              |
  1243.     4            |    Plane 1,3      |    Plane 2,4
  1244.                 |              |
  1245.     5            |    Plane 1,3,5      |    Plane 2,4
  1246.                 |              |
  1247.     6            |    Plane 1,3,5      |    Plane 2,4,6
  1248.  
  1249. Wie ihr seht, hat Playfield 1 immer gleichviel oder mehr  Planes  als  das
  1250. Field  2,  und Playfield 2 maximal eines weniger als Field 1. Es ist nicht
  1251. möglich,  3  Planes  dem  Playfield1  und  ein  einziges  dem   Playfield2
  1252. zuzuordnen.
  1253.  
  1254. Analog  wie  bei  den  Standart-Grafikmodi  bestimmt  die Überlagerung der
  1255. Bitplane  die  Farbe  eines  jeden  Pixel.  Die  Übereinstimmung  zwischen
  1256. Bitplane-Kombination  und  Farbregistern  ist  aber etwas verschieden, die
  1257. Tabelle gibt genaueren Aufschluß darüber:
  1258.  
  1259. PLAYFIELD 1
  1260.     Wert    |   Wert    |   Wert    |  ausgewählte
  1261.     Plane 5 |    Plane 3 |    Plane 1 |  Farbe
  1262. ----------------------------------------------------
  1263.         |        |        |
  1264.     0    |    0    |    0    |  durchsichtig
  1265.         |        |        |
  1266.     0    |    0    |    1    |  COLOR01
  1267.         |        |        |
  1268.     0    |    1    |    0    |  COLOR02
  1269.         |        |        |
  1270.     0    |    1    |    1    |  COLOR03
  1271.         |        |        |
  1272.     1    |    0    |    0    |  COLOR04
  1273.         |        |        |
  1274.     1    |    0    |    1    |  COLOR05
  1275.         |        |        |
  1276.     1    |    1    |    0    |  COLOR06
  1277.         |        |        |
  1278.     1    |    1    |    1    |  COLOR07
  1279.  
  1280.  
  1281. PLAYFIELD 2
  1282.     Wert    |   Wert    |   Wert    |  ausgewählte
  1283.     Plane 6 |    Plane 4 |    Plane 2 |  Farbe
  1284. ----------------------------------------------------
  1285.         |        |        |
  1286.     0    |    0    |    0    |  durchsichtig
  1287.         |        |        |
  1288.     0    |    0    |    1    |  COLOR09
  1289.         |        |        |
  1290.     0    |    1    |    0    |  COLOR10
  1291.         |        |        |
  1292.     0    |    1    |    1    |  COLOR11
  1293.         |        |        |
  1294.     1    |    0    |    0    |  COLOR12
  1295.         |        |        |
  1296.     1    |    0    |    1    |  COLOR13
  1297.         |        |        |
  1298.     1    |    1    |    0    |  COLOR14
  1299.         |        |        |
  1300.     1    |    1    |    1    |  COLOR15
  1301.  
  1302. Nun wißt ihr, wie das Dual Playfield Mode funktioniert. Nur etwas wißt ihr
  1303. noch nicht... wie man dieses aktiviert!!
  1304. Ganz einfach, Bit 10 im Register BPLCON0  auf  1  setzen.  Wie  wir  schon
  1305. gesagt  haben,  ist  es  möglich,  auszuwählen, welches Playfield über dem
  1306. anderen erscheinen soll. Man sagt,  daß  ein  Playfield,  das  über  einem
  1307. anderen  erscheint,  höhere  Priorität  hat.  Es  gibt  ein Bit, das diese
  1308. Priorität bestimmt, es ist das Bit 6 des Registers BPLCON2 ($dff104): wenn
  1309. es auf 0 ist, dann erscheint Playfield 1 über dem 2, ansonsten Playfield 2
  1310. über dem ersten.
  1311.  
  1312. Ein Beispiel dafür gibt es in Listing7u.s
  1313.  
  1314.  
  1315. PRIOTITÄT ZWISCHEN SPRITES UND PLAYFIELDS
  1316.  
  1317. Wir  haben  schon   die   Priorität   zwischen   den   einzelnen   Sprites
  1318. kennengelernt.  Wenn  sich zwei Sprites also überlappen, dann wird der mit
  1319. der kleineren Zahl über dem anderen erscheinen.  Des  weiteren  haben  wir
  1320. gerade  gesehen,  wie  man  die Priorität der Playfields im Dual Playfield
  1321. Mode untereinander  bestimmt.  Nun  bleibt  uns  nur  noch  die  Priorität
  1322. zwischen Playfield und Sprites zu besprechen. Als erstes vermerke ich, daß
  1323. die Sprites immer über der Farbe 0 erscheinen. Für die anderen Farben wird
  1324. die  Priorität  im  Register  BPLCON2  kontrolliert. Es ist möglich, diese
  1325. unabhängig für die geraden und ungeraden Planes  zu  setzen.  Das  ist  im
  1326. Dual-Playfield-Modus  sehr  nützlich,  da  es  uns damit ermöglicht, jedem
  1327. Playfield eine verschiedene Priorität gegenüber den Sprites zu  geben.  Im
  1328. Standartmodus  hingegen  ist  es  vorteilhafter, den geraden und ungeraden
  1329. Planes die gleiche Priorität gegenüber den Sprites zu geben. Das  Register
  1330. BPLCON2  enthält einige Bits, in denen der Prioritätslevel der geraden und
  1331. ungeraden Planes gesetzt werden kann. Die Bits 0 bis  zwei  enthalten  den
  1332. Prioritätslevel   für   die  ungeraden  Bitplanes  (Playfield  1  im  Dual
  1333. Playfieldmode), die Bits 3 bis  5  hingegen  den  Level  für  die  geraden
  1334. Bitplanes (Playfield2). Und so werden die Prioritäten verteilt:
  1335. Wir beziehen uns dabei auf ein beliebiges Playfield, da sie  untereinander
  1336. gleich  funktionieren.  Was  die  Priorität  Sprites-Playfield  angeht, da
  1337. werden die Sprites als Paare betrachtet (0-1,2-3,4-5  und  6-7).  Wie  wir
  1338. wissen,  ist  die Priorität unter den Sprites (und deswegen auch unter den
  1339. Paaren) fix:
  1340.  
  1341.  
  1342. MAXIMALE PRIORITÄT    PAAR 1 (SPRITES 0 UND 1)
  1343.             PAAR 2 (SPRITES 2 UND 3)
  1344.             PAAR 3 (SPRITES 4 UND 5)
  1345. MINIMALE PRIORITÄT    PAAR 4 (SPRITES 6 UND 7)
  1346.  
  1347. Wir können nun unseren Prioritätslevel für die Playfields innerhalb diesen
  1348. Grenzen  einfügen:  entweder  über  der  maximalen  Priorität der Sprites,
  1349. unterhalb der minimalen oder zwischen zwei Paaren. Es ist somit aber nicht
  1350. möglich, ein Playfield unter dem Paar 4 und über dem Paar 2 anzuzeigen, da
  1351. das zweite Paar über dem vierten ist. Das Gegenteil ist aber möglich. Hier
  1352. eine  Tabelle  mit  allen  Möglichkeiten, die uns in der Prioritätsvergabe
  1353. gebotren sind: (Durch die Einstellungen in BPLCON2 )
  1354.  
  1355. CODE      |  000      |     001      |  010      |     011      |  100      |
  1356. ----------------------------------------------------------------------------
  1357. PRI. MAX  | PLAYFIELD | PAAR 1      | PAAR 1    | PAAR 1      | PAAR 1    |
  1358.       | PAAR 1    | PLAYFIELD | PAAR 2    | PAAR 2      | PAAR 2    |
  1359.       | PAAR 2    | PAAR 2      | PLAYFIELD | PAAR 3      | PAAR 3    |
  1360.       | PAAR 3    | PAAR 3      | PAAR 3    | PLAYFIELD | PAAR 4    |
  1361. PRI. MIN  | PAAR 4    | PAAR 4      | PAAR 4    | PAAR 4      | PLAYFIELD |
  1362.  
  1363. Wie aus der Tabelle ersichtlich, wenn wir z.B. die  Sprites  0,1,2  und  3
  1364. (also  Paar  1  und  2)  übder  dem  Playfield  anzeigen  wollen,  und die
  1365. restlichen Paare unterhalb, dann werden  wir  in  BPLCON2  den  Code  %010
  1366. setzen.  Dieser  Code kommt dann im BPLCON2 entweder in die Bits 0-2, wenn
  1367. wir uns auf das Playfield1 im Dual-Playfield-Mode beziehen,  oder  in  die
  1368. Bits  3  bis 5 für Playfield2. Wenn wir einen "normalen" Screen verwenden,
  1369. ohne Dual Playfield, dann müssen wir diesen Code zweimal schreiben, einmal
  1370. in Bit 0-2 und einmal in 3-5.
  1371.  
  1372. In  Listing7v1.s  sehen  wir,  wie  wir  die Priorität in einem "normalen"
  1373. Screen setzen.
  1374.  
  1375. In Listing7v2.s hingegen wird ein Dual Playfield verwendet.
  1376.  
  1377.  
  1378. KOLLISIONEN
  1379.  
  1380. Die Hardware des Amiga stellt dem Programmierer ein System zur  Verfügung,
  1381. das  es  erlaubt,  Kollisionen (Zusammenstöße) zwischen Sprite und Sprite,
  1382. Sprite und Playfield  und  zwei  Playfields  zu  registrieren.  All  diese
  1383. Kollisionstypen werden mit nur zwei Registern verwaltet: CLXDAT ($dff00e),
  1384. das ein Nur-Lese-Register ist, in dem die Kollisionen signalisiert werden,
  1385. und  CLXCON  ($dff098),  das ein Kontrollregister ist, mit dem die Art der
  1386. Registrierung der Kollisionen verändert werden kann. Beginnen  wir  damit,
  1387. die Struktur dieser Register zu beschreiben.
  1388. Die Bit von CLXDAR verhalten sich  wie  Kollisionsmelder.  Jedes  Bit  ist
  1389. einer  ganz  bestimmten  Kollision  zugeteilt.  Wenn  sich nun eine solche
  1390. bestimmte Kollision zuträgt, dann nimmt dieses jeweilige Bit  den  Wert  1
  1391. an.  Wenn  die Kollision nicht mehr besteht, dann springt es auf 0 zurück.
  1392. In der folgenden Tabelle werden die einzelnen Bit von CLXDAT genauer unter
  1393. die Lupe genommen:
  1394.  
  1395. VERWENDUNG DER BIT VON CLXDAT
  1396.  
  1397. Bit 15  nicht verwendet
  1398. Bit 14  Kollision zwischen PAAR 3 und PAAR 4
  1399. Bit 13  Kollision zwischen PAAR 2 und PAAR 4
  1400. Bit 12  Kollision zwischen PAAR 2 und PAAR 3
  1401. Bit 11  Kollision zwischen PAAR 1 und PAAR 4
  1402. Bit 10  Kollision zwischen PAAR 1 und PAAR 3
  1403. Bit 9   Kollision zwischen PAAR 1 und PAAR 2
  1404. Bit 8   Kollision zwischen Playfield 2 und PAAR 4
  1405. Bit 7   Kollision zwischen Playfield 2 und PAAR 3
  1406. Bit 6   Kollision zwischen Playfield 2 und PAAR 2
  1407. Bit 5   Kollision zwischen Playfield 2 und PAAR 1
  1408. Bit 4   Kollision zwischen Playfield 1 und PAAR 4
  1409. Bit 3   Kollision zwischen Playfield 1 und PAAR 3
  1410. Bit 2   Kollision zwischen Playfield 1 und PAAR 2
  1411. Bit 1   Kollision zwischen Playfield 1 und PAAR 1
  1412. Bit 0   Kollision zwischen Playfield 1 und Playfield 2
  1413.  
  1414. Das Register CLXCON hat folgende Struktur:
  1415.  
  1416. VERWENDUNG DER BIT VON CLXCON
  1417.  
  1418. Bit 15  aktiviert Sprite 7
  1419. Bit 14  aktiviert Sprite 5
  1420. Bit 13  aktiviert Sprite 3
  1421. Bit 12  aktiviert Sprite 1
  1422. Bit 11  aktiviert Bit-plane 6
  1423. Bit 10  aktiviert Bit-plane 5
  1424. Bit 9   aktiviert Bit-plane 4
  1425. Bit 8   aktiviert Bit-plane 3
  1426. Bit 7   aktiviert Bit-plane 2
  1427. Bit 6   aktiviert Bit-plane 1
  1428. Bit 5   Kollisionswert Bit-plane 6
  1429. Bit 4   Kollisionswert Bit-plane 5
  1430. Bit 3   Kollisionswert Bit-plane 4
  1431. Bit 2   Kollisionswert Bit-plane 3
  1432. Bit 1   Kollisionswert Bit-plane 2
  1433. Bit 0   Kollisionswert Bit-plane 1
  1434.  
  1435. (Bemerkung: wo "aktiviert" steht ist gemeint, daß  die  REGISTRIERUNG  DER
  1436. KOLLISIONEN  aktiviert  wurde:  wenn z.B. das Bit 15 von CLXCON den Wert 0
  1437. hat, dann heißt es nicht, daß Sprite  7  nicht  am  Bildschirm  erscheinen
  1438. kann,  sondern  nur,  daß  die Kollisionen, die mit Sprite 7 zu tun haben,
  1439. nicht registriert, vermerkt werden)
  1440.  
  1441.  
  1442. Wir werden die Bedeutung dieser Bits nach und nach erklären. Beginnen  wir
  1443. mit  den  Kollisionen  zwischen  Sprite und Sprite. Sofort vorweggenommen,
  1444. auch bei den Sprite-kollisionen werden die Sprites in Paaren behandelt. Es
  1445. ist  nur  möglich,  einen  Zusammenstoß zwischen Sprites aus verschiedenen
  1446. Paaren zu registrieren, und nicht zwischen zwei aus dem  selben  Paar.  Es
  1447. ist  z.B.  unmöglich,  eine Kollision zwischen Sprite 0 und 1 zu erkennen.
  1448. Wenn die Sprites aber verschiedenen Paaren  angehören,  dann  ändert  sich
  1449. alles:  bei einem Überlappen der Sprites 0 und 2 wird Bit 9 von CLXDAT auf
  1450. High (1) gesetzt (Kollision zwischen Paar 1 und 2). Auch  wenn  sich  eine
  1451. Kollision  zwischen Sprite 1 und 2 ereignet, wird Bit 9 auf 1 springen, da
  1452. Sprite 1 ja auch zum selben Paar wie Sprite 0 gehört, dem Paar 1. Das  muß
  1453. aber nicht immer so sein.
  1454. Denn die Zusammenstöße zwischen Sprites mit geradem Index (Sprite 0,2,4,6)
  1455. werden  immer  registriert,  bei  ungeraden  Sprites  hingegen  können wir
  1456. entscheiden ob ja oder nein. Um auch die ungeraden zu signalisieren müssen
  1457. wir das dementsprechende Bit in CLXCON aktivieren. Ihr könnt in der obigen
  1458. Tabelle sehen, welche es sind. Die  ungeraden  Sprites  können  unabhängig
  1459. voneinander  aktiviert werden. Einen oder mehrere ungerade Sprites einzeln
  1460. aktivieren zu können bringt Vor- und Nachteile mit  sich.  Betrachten  wir
  1461. z.B. nur das Paar 1 und 2 und nehmen wir an, wir haben weder Sprite 1 noch
  1462. Sprite 3 aktiviert. Wenn sich nun eine Kollision zwischen Sprite 0  und  2
  1463. ergibt,  wird  Bit  9  in  CLXDAT  auf  1 gehen. Wenn diese Kollision aber
  1464. zwischen Sprite 1 und 2, zwischen 0 und 3 oder zwischen 1 und 3  ereignet,
  1465. dann  passiert  nichts,  und  wir  können  nicht  sagen, ob eine Kollision
  1466. stattgefunden hat.
  1467. Nehmen wir hingegen an, einen der ungeraden Sprites  aktiviert  zu  haben,
  1468. den Sprite 1 zum Beispiel. In diesem Fall ergeben die Kollisionen zwischen
  1469. Sprite 0 und 2 und zwischen 1 und 2 einen High-Pegel im Bit 9 von  CLXDAT.
  1470. Eine  Kollision  zwischen  Sprite  0  und  3  oder  2  und 3 bleibt weiter
  1471. ergebnislos. In diesem Fall ergibt sich ein Nachteil gegenüber der vorigen
  1472. Situation,  in  der  Sprite  1 nicht aktiviert war. Denn wenn vorhin Bit 9
  1473. gesetzt war, waren wir sicher, daß es einen Zusammenstoß zwischen Sprite 0
  1474. und  2  gegeben  hat. Im derzeitigen Fall hingegen kann es der 0 und der 2
  1475. oder der 1 und der 2 sein. Es gibt keine  Möglichkeit,  das  Rätsel  durch
  1476. lesen  des  Registers  CLXDAT  zu  lüften.  Wenn Sprite 1 deaktiviert ist,
  1477. Sprite 3 aber aktiviert, dann haben wir eine analoge Situation zur  gerade
  1478. besprochenen,  nur  anstatt  auf  Sprite  1  bezieht  sich  das  Bit 9 nun
  1479. zusätzlich auf das Sprite 3: Kollisionen zwischen  Sprite  0  und  2  bzw.
  1480. zwischen  0  und  3  werden  registriert,  aber  wir  haben  wieder  keine
  1481. Möglichkeit, sie zu unterscheiden.
  1482. Zum Schluß gibt es noch die letzte Kombination, in  sowohl  Sprite  1  wie
  1483. auch Sprite 3 aktiviert sind. Nun werden die Kollisionen 0-2, 0-3, 1-2 und
  1484. 1-3 signalisiert, und wir haben wieder keine Unterscheidungsmöglichkeit.
  1485.  
  1486. Ein Beispiel  von  Spritekollisionen,  mit  den  ungeraden  ausgeschaltet,
  1487. gindet    ihr    in    Listing7w1.s.    Ladet    und    verifiziert    die
  1488. Funktionstüchtigkeit.
  1489.  
  1490. Ein Beispiel zwischen Sprites mit einem  ungeraden,  deaktiviertem  Sprite
  1491. gibt´s  in Listing7w2.s. Ihr werdet bemerken, daß das Beispiel, so wie ich
  1492. es vorsetze, nicht  funktioniert;  um  es  auszuführen  müßt  ihr  die  im
  1493. Kommentar    beschriebenen   Modifizierungen   anbringen.   Um   hier   zu
  1494. unterscheiden, ob es sich bei der Kollision um die  mit  dem  aktivierten,
  1495. ungeraden  Sprite  oder  dem geraden handelt, wird eine Technik angewandt,
  1496. die die Positionen der jeweiligen Sprites vergleicht.
  1497.  
  1498. Nun kommen wir  zur  Kollision  zwischen  Sprite  und  Playfield.  Es  ist
  1499. möglich,  einen  Zusammenstoß  zwischen  einem  Spritepaar  und einer oder
  1500. mehreren Farben des Playfields zu registrieren. Auch hier wird  wieder  in
  1501. Paaren  gearbeitet,  und  nicht mit den einzelnen Sprites. Die Aktivierung
  1502. der ungeraden Sprites mit den Bits im Register CLXCON hat auch hier  seine
  1503. Gültigkeit.
  1504. Die Registrierung der Kollisionen läuft aber jeweils anders ab, ob wir wir
  1505. nun  einen  normalen  Screen  oder ein Dual-Playfield verwenden. Bei einem
  1506. normalen Screen zeigen die Bits von 1  bis  4  von  CLXDAT  die  Kollision
  1507. zwischen einem Spritepaar und der Farbe (oder den Farben) an, die wir dazu
  1508. ausgewählt haben. Das Bit 1 zeigt die Kollision zwischen dem Playfield und
  1509. dem  Paar  1  an,  das Bit 2 zwischen Playfield und Paar 2, Bit 3 zwischen
  1510. Playfield und Paar 3 und Bit 4 zwischen Playfield und Paar 4. Die Bit  von
  1511. 5 bis 8 werden nicht verwendet.
  1512. Im Dual-Playfield-Mode ist es möglich, einen Zusammenstoß  zwischen  einem
  1513. der  2  Playfields  und einem Spritepaar zu registrieren, und die Bits von
  1514. CLXDAT  werden  verwendet,  wie  in  der  Tabelle  des  Registers   CLXDAT
  1515. angeführt:  die Bit 1 bis 4 zeigen eine Kollision zwischen Playfield 1 und
  1516. einem Spritepaar an, während die Bits von 5 bis 8 für das Playfield 2  und
  1517. den  Spritepaaren  verantwortlich sind. Um die Farben auszuwählen, die ein
  1518. "Klingeln" in CLXDAT auslösen sollen, brauchen wir  das  Register  CLXCON.
  1519. Beginnen wir mit einer einzigen Farbe.
  1520. Die Bits von 6 bis 11 von CLXCON  zeigen  an,  welche  Bitplanes  für  die
  1521. Kollisionen  aktiviert  sind.  Im Falle, daß wir Kollisionen eines Sprites
  1522. mit einer einzigen Farbe registrieren wollen  müssen  wir  alle  Bitplanes
  1523. aktivieren,  die  angezeigt werden. Die Wahl der Farbe, die eine Kollision
  1524. auslösen soll, wird durch einsetzen der Zahl des Registers in die Bits von
  1525. 0 bis 5 in CLXCON erziehlt, das die dementsprechende Farbe beinhaltet.
  1526. Nehmen wir z.B. an, wir haben einen  normalen  Screen  mit  16  Farben  (4
  1527. Bitplanes),   und   wir   dir  Kollisionen  der  ungeraden  Sprites  nicht
  1528. berücksichtigen. Wenn wir nun die Kollision zwischen einen Sprite und  der
  1529. Farbe 13 registrieren wollen, dann kommt in das Register CLXCON der Wert
  1530.  
  1531.     111111
  1532.     5432109876543210
  1533.  $03cb=%0000001111001101
  1534.  
  1535. Schauen wir und die Bedeutung der Bits etwas genauer an. Die  Bit  von  12
  1536. bis  15 deaktivieren die ungeraden Sprites. Von den Bits von 6 bis 11 sind
  1537. nur Bit 6,7,8 und 9 auf eins. Das deutet an, daß nur die Bitplanes  von  1
  1538. bis  vier  aktiviert  sind.  Die  Bits  von  0  bis  5  enthalten die Zahl
  1539. %001101=13, also die Farbe 13 ist auserwählt. Im Dual-Playfield-Modus  ist
  1540. die  Situation  die  selbe,  nur  werden  dort  alle verwendeten Bitplanes
  1541. aktiviert und es werden Kollisionen mit 2 Farben  gleichzeitig  aktiviert:
  1542. Wenn  wir  z.B.  zwei  Playfileds  zu  jeweils  8  Farben  haben,  und die
  1543. Registrierung der Kollisionen mit Farbe 7 des Playfield 1 und Farbe 2  des
  1544. Playfield 2 wollen, dann werden wir in CLXCON folgende Zahl schreiben:
  1545.  
  1546.     111111
  1547.     5432109876543210
  1548.  $0fbb=%0000111111011101
  1549.  
  1550. Diese Kombination zeigt an,  daß  alle  Bitplanes  zum  kollisionsanzeigen
  1551. aktiviert  sind (alle Bit von 6 bis 11 sind auf 1). Weiters ist die "Zahl"
  1552. der Farbe für Playfield 1 aus den Bits 0, 2  und  4  zusammengesetzt,  die
  1553. zusammengeschoben  die  Zahl  %111=7  ergeben. Die Bits, die die Farbe für
  1554. Playfield 2 ergeben, sind 1,  3  und  5,  die  wiederum  zusammengeschoben
  1555. %010=2 ergeben.
  1556. Zu Bemerken ist, daß die Kollision  eines  Sprites  mit  einer  Farbe  des
  1557. Playfield 1 das Setzen eines anderne Bits in CLXDAT zur Folge hat als eine
  1558. eines Sprites mit einer Farbe von Playfield 2. Zum Beispiel, wie  ihr  aus
  1559. der  Tabelle  des  Registers  CLXDAT  lesen  könnt,  ergibt eine Kollision
  1560. Sprite0Playfield1 Bit 1 in CLXDAT einen High-Zustand auf Bit 1 in  CLXDAT,
  1561. eine Kollision Sprite0-Playfield2 hingegen einen High-Zustand auf Bit5 von
  1562. CLXDAT. Es ist auch möglich, die Kollision  eines  Sprites  mit  mehr  als
  1563. einer  Farbe zu registrieren, auch wenn nur in einigen Sonderfällen. Um zu
  1564. verstehen, wie das geht, muß man sich die Binärdarstellung der Zahlen  der
  1565. Farbregister vor Augen halten.
  1566. Es gibt, wie ihr wißt, 32 Farbregister, die die Numerierung von 0  bis  31
  1567. haben.  Die Möglichkeit, Kollisionen mit 2 Farben gleichzeitig erkennen zu
  1568. können, beruht darauf, daß die  Darstellung  einiger  Binärzahlen  ähnlich
  1569. ist.  Nehmen  wir  zum  Beispiel  die  Zahlen  2 und 21. Binär gesehen ist
  1570. 2=%00010, 21 hingegen %10101 (wir betrachten  5  Bit,  um  Zahlen  bis  31
  1571. schreiben zu können). Wie ihr seht, sind sie total verschieden. Es besteht
  1572. also keine Möglichkeit, diese Farben gleichzeitig zu erkennen.
  1573. Betrachten wir nun 22 und 23. Wir erkennen, daß sie  in  binärer  Form  so
  1574. aussehen:  22=%010110  und 23=%010111. Sie unterscheiden sich nur in einem
  1575. Bit, dem niederwertigsten (ganz links). In diesem  Fall  ist  es  möglich,
  1576. Kollisionen   mit  beiden  Farben  zu  registrieren.  Denn  der  Wert  des
  1577. niederwertigsten Bit (das in diesem Fall die Farben unterscheidet) ist vom
  1578. Bitplane1  gegeben.  Wenn  wir  Bitplane  1  NICHT zur Kollisionserkennung
  1579. aktivieren, dann werden nur die Werte  der  Bitplanes  2,3,4  und  5  (wir
  1580. befinden  uns auf einem Screen zu 32 Farben, also 5 Bitplanes) betrachtet,
  1581. und der Wert, der durch Bitplane 1 angenommen wird,  hat  keinen  Einfluß.
  1582. Wir werden in CLXCON also folgenden Wert schreiben:
  1583.  
  1584.      111111
  1585.      5432109876543210
  1586. CLXCON= %0000011110010110
  1587.  
  1588. Das bedeutet, daß die Kollision basierend auf  den  aktivierten  Bitplanes
  1589. erkannt  wird  (also  den  Planes  2,3,4 und 5), genauer gesagt wenn unser
  1590. Sprite über einem Pixel mit
  1591.  
  1592. Bitplane 1=(0 oder 1), weil nicht aktiviert
  1593. Bitplane 2=1
  1594. Bitplane 3=1
  1595. Bitplane 4=0
  1596. Bitplane 5=1
  1597.  
  1598. steht.
  1599. Wie wir  gesehen  haben,  erfüllen  die  Darstellung  von  22=%010110  und
  1600. 23=%010111  diese  bestimmte Forderung. Es werden also beide Farben in der
  1601. Kollisionsregistrierung einbezogen. Beachtet, daß das  Bitplane,  das  wir
  1602. NICHT  aktiviert haben (das erste) genau diesem ersten Bit entspricht, das
  1603. die Unterscheidung zwischen 22 und 23 ausmacht.
  1604.  
  1605. Diese Technik ist auf bei allen Farbpaaren anwendbar, bei denen  sich  die
  1606. Binärdarstellung  nur  in einem Bit unterscheiden. So z.B. auch die Zahlen
  1607. 8=%001000 und 9=%001001, die sich im  niederwerigsten  Bit  unterscheiden.
  1608. Also  werden  wir  auch  hier  das Bitplane 1 deaktivieren, wenn wir diese
  1609. beiden Farben zur Erkennung verwenden wollen. Wenn wir hingegen die Farben
  1610. 10=%001010  und  14=%001110  verwenden wollen, dann bemerken wir, daß sich
  1611. die beiden Zahlen im Bit 2 (wir notieren die Zahlen von rechts nach links,
  1612. bei  0  beginnend)  unterscheiden,  das  dem Bitplane 3 entspricht. Um nun
  1613. Kollisionen zwischen einem Sprite und diesen zwei Farben zu  registrieren,
  1614. müssen wir das Bitplane 3 deaktivieren, und dem CLXCON also folgenden Wert
  1615. zuspielen:
  1616.  
  1617.      111111
  1618.      5432109876543210
  1619. CLXCON= %0000011011001010   ; Bit 8=0 Bitplane 3 NICHT aktiviert
  1620.  
  1621. Wenn wir 2 Bitplanes ausschalten können wir 4 Farben  in  die  Kollisionen
  1622. einbeziehen.  Im Prinzip ist es immer das Gleiche. Nehmen wir zum Beispiel
  1623. die Farben:
  1624.  
  1625. 1=%00001
  1626. 3=%00011
  1627. 5=%00101
  1628. 7=%00111
  1629.  
  1630. Sie haben alle die Bit 0, 3 und 4 gleich, unterscheiden sich aber  in  der
  1631. Kombination  der  Bits  1  und  2.  Wollen wir nun eine Kollision zwischen
  1632. Sprites und diesen vier Farben wahrnehmen, dann werden wir Bitplane 2  und
  1633. 3 deaktivieren.
  1634.  
  1635. Wenn  wir  3  Bitplanes  ausschalten,  können wir 8 Farben erkennen, bei 4
  1636. abgeschaltenen Bitplanes 16.
  1637.  
  1638. Auch im Dual-Playfield-Mode ist es möglich,  für  jedes  Playfield  einige
  1639. Bitplanes  zu  deaktivieren,  um somit die Kollision zwischen einem Sprite
  1640. und mehr als einer Farbe eines Playfields zu signalisieren.  Erinnern  wir
  1641. uns aber, daß wenn wir die Kollision zwischen einem Sprite und zwei Farben
  1642. erkennen müssen, bei der jedoch eine dem Playfield 1 gehört und die andere
  1643. dem  Playfield2, es nicht notwendig ist, dieses Spiel zu machen, da wir in
  1644. CLXDAT für jedes Playfield ein Bit haben, das  und  erlaubt,  gleichzeitig
  1645. eine Kollision mit beiden Playfields zu erkennen.
  1646.  
  1647. In  Listing7x1.s  sehen wir ein Beispiel von Kollision zwischen Sprite und
  1648. Playfield im "Standard-Modus".
  1649.  
  1650. In Listing7x2.s hingegen haben wir ein Beispiel  im  Dual-Playfield-Modus.
  1651. In  beiden  Lisitngs  sind im Kommentar Beispiele aufgezeigt, wie man mehr
  1652. als eine Farbe für die Kollisionen verwenden kann.
  1653.  
  1654. Der letzte Typ von Kollision ist der zwischen Playfield 1 und  Playfield2,
  1655. klarerweise  in  Dual-Playfield-Mode. Es ist möglich, Kollisionen zwischen
  1656. einer oder mehrerer Farben des Playfield1 und einer oder  mehrerer  Farben
  1657. des   Playfield  2  zu  erkennen,  indem  wir  nur  einige  der  Bitplanes
  1658. aktivieren, genauso wie wir es mit den Sprite-Playfield-Kollisionen  getan
  1659. haben.  Wenn  eine  Kollision  zwischen zwei Playfields stattgefunden hat,
  1660. dann wird Bit 0 in CLXDAT auf 1 gesetzt.
  1661.  
  1662. Ein Beispiel von dem Typ sehen wir in Listing7x3.s.
  1663.  
  1664.  
  1665. DIREKTE VERWENDUNG DER SPRITEREGISTER
  1666.  
  1667.  
  1668. Sehen  wir  nun eine andere Methode, mit der wir Sprites verwenden können.
  1669. Bis jetzt haben wir die Sprites generiert, indem wir die  Register  SPRxPT
  1670. verwendet haben, also Pointer auf unsere Datenstrukturen (Spritestruktur),
  1671. die alle  nötigen  Informationen  zum  Erstellen  des  gewünschten  Sprite
  1672. enthalten.  Es gibt aber eine alternative Methode, wir werden sie "Direkte
  1673. Verwendung der Sprite" nennen. Diese Art ist in den meisten  Fällen  nicht
  1674. von Vorteil, aber manchmal kann sie nützlich sein.
  1675. Um  zu  verstehen,  um  was  es  hier  geht  müssen  wir  das  Thema   der
  1676. Spritedarstellung  etwas  vertiefen.  Wenn  wir in ein SPRxPT-Register die
  1677. Adresse  einer  Spritestruktur  schreiben  setzen  wir  eine  automatische
  1678. Prozedur in Gang, die es uns erlaubt, diese Sprites effektiv zu sehen. Die
  1679. Daten, die Position und Form des Sprites  angeben,  werden  automatisch  -
  1680. mittels  eines  Hardwaremechanismus´ Namens DMAin eigene Register gegeben,
  1681. anderen als dir SPRxPT. Es ist genau dieses Schreiben der Daten  in  diese
  1682. Register,  die  es  ermöglichen,  die  Sprites WIRKLICH zu sehen. Vom DMA,
  1683. einem sehr wichtigen Instrument des Amiga, werden wir  in  einer  nächsten
  1684. Lektion  sprechen.  Im  Moment reicht uns zu wissen, was für eine Rolle er
  1685. bei den Sprites spielt. Er  verhält  sich  ähnlich  wir  ein  Briefträger.
  1686. Stellt  euch  vor,  die  Datenstruktur  eures Sprites, die ihr im Speicher
  1687. erstellt habt, ist wie ein Haufen Briefe, die  an  verschiedene  Empfänger
  1688. (Register)  kommen.  Der  DMA  übernimmt  nun  die  Aufgabe,  diese Briefe
  1689. zuzustellen, er sortiert sie  auch.  Die  direkte  Verwendung  der  Sprite
  1690. besteht  nun  genau  darin,  die Daten direkt in die richtigen Register zu
  1691. schreiben, oder anders ausgedrückt,  indem  wir  die  Briefe  selbst  beim
  1692. Empfänger abgeben, und so dem Briefträger DMA die Arbeit wegnehmen. Da der
  1693. DMA aber gratis arbeitet, werdet ihr euch nun fragen, für was das gut sein
  1694. soll. Wie schon gesagt, normalerweise
  1695. bringt es keine Vorteile. Aber manchmal schon.
  1696. Schauen wir uns an, wie diese Technik funktioniert. Wie schon gesagt,  die
  1697. Daten  werden direkt in einige Register geschrieben. Es gibt vier Register
  1698. pro Sprite, SPRxPOS, SPRxCTL, SPRxDATA und SPRxBATB genannt. Statt  dem  x
  1699. kommt  wie  immer  die  Nummer  des gewünschen Sprite. Die Adressen dieser
  1700. Register hängen vom Sprite ab, auf den wir uns beziehen.  Wir  können  sie
  1701. mit  einer  einfachen  Formel berechnen. Mit "x" geben wir eine Nummer des
  1702. Sprites an, sie liegt zwischen 0 und 7.
  1703.  
  1704.  
  1705. Adresse SPRxPOS  = $dff140+(x*8)
  1706. Adresse SPRxCTL  = $dff142+(x*8)
  1707. Adresse SPRxDATA = $dff144+(x*8)
  1708. Adresse SPRxDATB = $dff146+(x*8)
  1709.  
  1710. Ihr könnt sie aber auch mit dem Help des ASMONE ("=C") herausfinden.
  1711.  
  1712. Nun beschreiben wir die  Verwendung  dieser  Register.  Die  "Form"  eines
  1713. Sprites  kommt in die Register SPRxDATA und SPRxDATB, die die zwei kleinen
  1714. "Bitplanes" des Sprites darstellen.  SPRxDATB  ist  das  Plane  2).  Diese
  1715. Register haben die gleiche Aufgabe wie die Wordpaare, die eine Zeile eines
  1716. Sprites definieren. Bemerkt aber, daß für jeden Sprite  nur  Register  für
  1717. EINE  Zeile  zur  Verfügung stehen. Die horizontale Position eines Sprites
  1718. ist, wie ihr wißt, aus 9 Bit zusammengesetzt, H0,  H1,...  ,  H8  genannt.
  1719. Diese  9  Bit  sind  in  zwei  Register  unterteilt:  das Bit H0, also das
  1720. niederwertige, befindet sich im Bit 0 des Registers SPRxCTL. Die anderen 8
  1721. hingegen  im  niederwertigen  Byte  des Registers SPRxPOS. Kurzum, was die
  1722. horizontale Position angeht, so verhalten die  Register  prakitsch  gleich
  1723. wie  die  zwei  Kontrollword in der Spritestruktur. Die vertikale Position
  1724. wird mit dieser Technik aber nicht bestimmt, denn  die  Sprites  verhalten
  1725. sich recht eigenartig.
  1726. Um einen Sprite anzuzeigen muß er vorher aktiviert werden.  Das  passiert,
  1727. wenn man in das Register SPRxDATA schreibt.
  1728. Einmal aktivert wird der Sprite auf jeder Zeile angezeigt,  immer  in  der
  1729. von uns zugeteilten horizontalen Position. Die Form ist immer die gleiche,
  1730. also jene, die in SPRxDATA und SPRxDATB steht.
  1731. Wenn diese zwei Register also nicht ständig verändert werden, dann hat der
  1732. Sprite  in  jeder  Zeile  immer  das  gleiche  Aussehen.  Der  Sprite wird
  1733. angezeigt bis  er  nicht  deaktivert  wird,  indem  ins  Register  SPRxCTL
  1734. geschrieben wird.
  1735. Um einen Sprite anzuzeigen, der in jeder Zeile anders ist, müssen wir also
  1736. eine  Copperlist  schreiben, die ungefähr so aussieht: (Wir nehmen an, den
  1737. Sprite 0 bei VSTART=$40, VSTOP=$60 und HSTART=$160 anzeigen zu wollen)
  1738.  
  1739.  
  1740.     dc.w    $4007,$fffe    ; WAIT - Warte auf Zeile VSTART
  1741.     dc.w    $140,$0080    ; SPR0POS - horizontale Position
  1742.     dc.w    $142,$0000    ; SPR0CTL
  1743.     dc.w    $146,$0e70    ; SPR0DATB - Spriteform Zeile 1, Plane 2
  1744.     dc.w    $144,$03c0    ; SPR0DATA - Spriteform Zeile 1, Plane 1
  1745.                 ; des Weiteren aktiviert es den Sprite,
  1746.                 ; deswegen wird es als letztes geschrieben
  1747.  
  1748.     dc.w    $4107,$fffe    ; WAIT - Warte auf Zeile VSTART+1
  1749.     dc.w    $146,$0a70    ; SPR0DATB - Spriteform Zeile 2, Plane 2
  1750.     dc.w    $144,$0300    ; SPR0DATA - Spriteform Zeile 2, Plane 1
  1751.  
  1752.     dc.w    $4107,$fffe    ; WAIT - Warte auf Zeile VSTART+2
  1753.     dc.w    $146,$0a7f    ; SPR0DATB - Spriteform Zeile 3, Plane 2
  1754.     dc.w    $144,$030f    ; SPR0DATA - Spriteform Zeile 3, Plane 1
  1755.  
  1756. ; wiederhole für jede Zeile Y
  1757. ;    dc.w    $40+Y07,$fffe   ; WAIT - Warte auf Zeile VSTART+Y
  1758. ;    dc.w    $146,DATENY2    ; SPR0DATB - Spriteform Zeile Y, Plane 2
  1759. ;    dc.w    $144,DATENY1    ; SPR0DATA - Spriteform Zeile Y, Plane 1
  1760. ; an Stelle Von DATENY1 und DATENY2 kommen die Formdaten der Sprite.
  1761.  
  1762.     dc.w    $6007,$fffe    ; WAIT - Warte auf Zeile VSTOP
  1763.     dc.w    $142,$0000    ; SPR0CTL - deaktiviere Sprite
  1764.  
  1765. Wie ihr gesehen  habt,  ist  bei  längeren  Sprite  eine  sehr  lange  und
  1766. komplizierte  Copperlist  notwendig. Hier empfielt es sich auf jeden Fall,
  1767. den DMA zu verwenden.  Nehmen  wir  aber  an,  wir  möchten  einen  Sprite
  1768. anzeigen,  der  in  jeder  Zeile  gleich  ist.  Z.B. eine Säule. In dieser
  1769. Situation würde unsere Copperlist kurz und einfach:
  1770. (Wir nehmen an, den Sprite 0 bei  VSTART=$40,  VSTOP=$60  und  HSTART=$160
  1771. anzeigen zu wollen)
  1772.  
  1773.  
  1774.     dc.w    $4007,$fffe    ; WAIT - Warte auf Zeile VSTART
  1775.     dc.w    $140,$0080    ; SPR0POS - horizontale Position
  1776.     dc.w    $142,$0000    ; SPR0CTL
  1777.     dc.w    $146,$0e70    ; SPR0DATB - Spriteform Zeile 1, Plane 2
  1778.     dc.w    $144,$03c0    ; SPR0DATA - Spriteform Zeile 1, Plane 1
  1779.                 ; des Weiteren aktiviert es den Sprite,
  1780.                 ; deswegen wird es als letztes geschrieben
  1781.  
  1782.     dc.w    $6007,$fffe    ; WAIT - Warte auf Zeile VSTOP
  1783.     dc.w    $142,$0000    ; SPR0CTL - deaktiviert Sprite
  1784.  
  1785. Ihr  bemerkt,  daß unsere Copperlist, außer daß sie kurz ist, mit der Höhe
  1786. des Sprite nicht verändert wird.
  1787. Wenn wir aber den DMA verwendet hätten, dann  hätten  wir  für  die  ganze
  1788. Länge  des  Sprite  die  gleichen Zeilen schreiben müssen. Das hätte unter
  1789. anderem auch mehr Speucher gekostet. Denkt zum Beispiel an den Fall,  eine
  1790. 100  Zeilen  hohe  Säule  anzeigen  zu  müssen. Wenn wir den DMA verwenden
  1791. würden, dann sähe es so aus:
  1792.  
  1793. Spritestruktur:
  1794.         dc.b    VSTART,HSTART,VSTOP,0
  1795.         dc.w    $ffff,$0ff0    ; Zeile 1
  1796.         dc.w    $ffff,$0ff0    ; Zeile 2
  1797.         dc.w    $ffff,$0ff0    ; Zeile 3
  1798.         dc.w    $ffff,$0ff0    ; Zeile 4
  1799.         dc.w    $ffff,$0ff0    ; Zeile 5
  1800.         dc.w    $ffff,$0ff0    ; Zeile 6
  1801.         dc.w    $ffff,$0ff0    ; Zeile 7
  1802.         dc.w    $ffff,$0ff0    ; Zeile 8
  1803.  
  1804. .... und so weiter bis:
  1805.  
  1806.         dc.w    $ffff,$0ff0    ; Zeile 99
  1807.         dc.w    $ffff,$0ff0    ; Zeile 100
  1808.         dc.w    0,0        ; Ende Sprite
  1809.  
  1810.  
  1811. Mit  der  direkten  Verwendung  der  Sprite  hingegen reicht eine einfache
  1812. Coperlist:
  1813.  
  1814.     dc.b    VSTART,7,$ff,$fe    ; WAIT - Warte auf Zeile VSTART
  1815.     dc.w    $140
  1816.     dc.b    $00,HSTART    ; SPR0POS - horizontale Position
  1817.     dc.w    $142,$0000    ; SPR0CTL
  1818.     dc.w    $146,$ffff    ; SPR0DATB - Spriteform Zeile 1, Plane 2
  1819.     dc.w    $144,$0ff0    ; SPR0DATA - Spriteform Zeile 1, Plane 1
  1820.                 ; des Weiteren aktiviert es den Sprite,
  1821.                 ; deswegen wird es als letztes geschrieben
  1822.  
  1823.     dc.b    VSTOP,7,$ff,$fe ; Warte auf Zeile VSTOP
  1824.     dc.w    $142,$0000    ; SPR0CTL - deaktivert Sprite
  1825.  
  1826.  
  1827. Ein einfaches Beispiel der direkten Verwendung der Sprites findet  ihr  in
  1828. Listing7y1.s.
  1829.  
  1830. Im  Programm  Listing7y2.s  hingegen  werden  durch die direkte Verwendung
  1831. Balken erzeugt, die gleich denen sind, die mit dem Copper gemacht wurden.
  1832.  
  1833. Mit der Technik der direkten Verwendung der Sprites ist es  auch  möglich,
  1834. den  selben  Sprite  mehrmals  auf  der  gleichen  Zeile zu verwenden. Die
  1835. Methode wird in Listing7y3.s besser erklärt und  angewandt.  Die  Sprites,
  1836. die   mehrmals   auf  der  selben  Zeile  angezeigt  werden,  heißen  auch
  1837. MULTIPLEXED, also "gemultiplext". Wie wir  also  gesehen  haben,  hat  der
  1838. Amiga  zwar  nur  8  Sprites,  aber  der  Assembler erlaubt es und, sie zu
  1839. vervielfachen und ihnen auch mehr Farben als standartmäßig  vorgesehen  zu
  1840. geben,  indem  wir die Palette mehrmals horizontal ändern. Es ergeben sich
  1841. damit zwar ziemlich lange Copperlisten, aber es rentiert sich sicherlich.
  1842.  
  1843. Eine  Entwicklung  dieser  Idee  bringt  und  dann  dazu,   einen   Screen
  1844. vollständig mit Sprites zu gestalten, ein Beispiel in Listing7y4.s.
  1845.  
  1846. Um  so  etwas  zu  gestalten  müssen  extrem  lange Copperlist geschrieben
  1847. werden, und um sie verständlicher zu machen werden  SYMBOLE  oder  EQUATES
  1848. verwendet,  es  ist eine Direktive des Assembler, die es uns gestattet, zu
  1849. einer  bestimmten  Zahl  einen   x-beliebigen   Namen   zuzuteilen.   Beim
  1850. Assemblieren  wird der Name dann durch die dementsprechenden Zahl ersetzt.
  1851. Machen wir ein Beispiel: wir wollen auf  das  Register  COLOR0  zugreifen,
  1852. das,  wie  wir  wissen, die Adresse $dff180 hat. Wir können es entweder so
  1853. schreiben:
  1854.  
  1855.     move.w    #$123,$dff180
  1856.  
  1857. Aber wenn wir möchten, dann auch auf diese Art:
  1858.  
  1859. COLOR0    EQU    $dff180     ; Definition eines Symboles
  1860.  
  1861.     move.w    #$123,COLOR0
  1862.  
  1863. Wir haben praktisch definiert, daß  wenn  der  ASMONE  das  Symbol  COLOR0
  1864. findet,  er  es  mit $dff180 ersetzen soll. Es ist fast wie ein Label, wir
  1865. müssen  uns  einen  Namen  erfinden,  ihn  ganz  links   schreiben,   ohne
  1866. Leerzeichen,  aber es braucht keinen Doppelpunkt. Im Wahrheit kann man sie
  1867. auch setzen, genauso wie die Labels sie haben können oder nicht; es  hängt
  1868. vom  Assembler  ab.  EQU  bedeutet  ÄQUIVALENT  ZU.  Die meisten Assembler
  1869. akzeptieren auch das = an Stelle der EQU für die  Definition.  Machen  wir
  1870. ein weiteres Beispiel:
  1871.  
  1872. NUMERLOOP    =    10
  1873.  
  1874.     MOVEQ   #NUMERLOOP-1,d0
  1875. Loop:
  1876.     clr.l   (a0)+
  1877.     dbra    d0,NUMERLOOP
  1878.     rts
  1879.  
  1880. Mit diesem Mini-Listing haben wir 10 Longwords auf 0 gesetzt. Der  Vorteil
  1881. der  EQUATES  besteht  darin,  daß  wir  sie alle am Anfang des Programmes
  1882. setzen können, und somit einfaches Spiel haben,  wenn  wir  gewisse  Werte
  1883. verändern  wollen.  Es ist auch Möglich, mathematische Operationen mit den
  1884. Symbolen durchzuführen:
  1885.  
  1886.  
  1887. BytesProZeile    =    40
  1888. AnzahlZeilen    =    256
  1889. BitplanePlatz    =    BytesProZeile*AnzahlZeilen
  1890.  
  1891.     ...
  1892.  
  1893.     section plane,bss_C
  1894.  
  1895. Bitplane:
  1896.     ds.b    BitplanePlatz
  1897.  
  1898. Im  Listing  gilt BitplanePlatz 10240, oder 40*256. In Listing7y4.s werden
  1899. Symbole für die Copperlist definiert.
  1900.  
  1901. Zum Schluß werden wir noch den Screen mit den Sprites scrollen lassen. Wir
  1902. nützen  das aus, um noch zwei weitere Befehle des 68000ers kennenzulernen:
  1903. ROR und ROL. Listing7y5.s
  1904.  
  1905.  
  1906. ANIMATION DER SPRITES
  1907.  
  1908.  
  1909. Wir  beenden  diese  Lektion  mit  der Beschreibung über die Animation der
  1910. Sprites. Wir betrachten nun wieder "normale" Sprites, also jene,  die  mit
  1911. den SPRxPT und dem DMA erzeugt werden. Um einen Sprite zu animieren müssen
  1912. wir ihn jedesmal neuzeichnen, wenn er angezeigt wird. Jede Form,  die  der
  1913. Sprite   annimmt,   wird   auch   "Fotogramm   der   Animation"   genannt.
  1914. Normalterweise wird eine Animation so gemacht, daß eine  Sequenz  abläuft,
  1915. die  immer  wiederholt wird. Denkt z.B. an ein Männchen, das am Bildschirm
  1916. läuft; ihr werdet bemerken, daß alle Schritte gleich sind.
  1917. Um ein  Männchen  zu  animieren  müssen  wir  eine  bestimmte  Anzahl  von
  1918. Fotogrammen  zeichnen,  die  in  Sequenz  (hintereinander)  gesehen  einen
  1919. kompletten Schritt ergeben. Wenn das Männchen einen Schritt  gemacht  hat,
  1920. beginnt  es  mit  einem neuen: jetzt werden wieder die gleichen Fotogramme
  1921. angezeigt wie vorhin. Durch wiederholen dieses Schrittes kann das Männchen
  1922. laufen, wie lange wir wollen, wir brauchen aber nur eine limitierte Anzahl
  1923. von Bildern (Es ist klar, daß Fotogramme ja im Endeffekt Bilder sind,  und
  1924. somit  Speicher  brauchen,  und  wir somit versuchen sollten, so wenig wie
  1925. möglich davon zu  brauchen).  Bis  hierher  gilt  des  Gesagte  für  jedes
  1926. animierte  Objekt,  es  ist  also  gut,  wenn  ihr es euch merkt, auch für
  1927. später, wenn wir Animationen mit dem Blitter erzeugen  werden.  Im  Moment
  1928. behandeln  wir  nur  Animationen  mittels  Sprite. Das bedeutet, wir haben
  1929. einen Sprite, der sich am Bildschirm  bewegt  und  jedesmal  neugezeichnet
  1930. wird,  wenn  er  Form wechselt. Man geht dabei so vor: für jedes Fotogramm
  1931. erzeugt  man  einen  Spritestruktur,  und   jedesmal   wenn   der   Sprite
  1932. neugezeichnet  wird,  pointen  wir mit dem Register SPRxPT auf ein anderes
  1933. Fotogramm (also auf eine andere Datenstruktur). Die Position  des  Sprites
  1934. wird  jedesmal in die Struktur des Fotogrammes geschrieben, auf das SPRxPT
  1935. dann zeigt.
  1936.  
  1937. Ein Beispiel davon gibt´s in Listing7z.s
  1938.  
  1939. Dieses Beispiel ist auch das Ende von Lektion7 und  somit  von  DISK1  des
  1940. Kurses.
  1941.  
  1942. *****************************************************************************
  1943.  
  1944. Die  Disketten  2  und  3  (in  Italienisch)  wurden  im Moment der
  1945. "Drucklegung"  (November  95)  fertiggestellt.  Sie  behandeln  die
  1946. folgenden Argumente:
  1947.  
  1948. - BLITTER (Copymode, Linemode und Fill)
  1949. - Interrupt, CIAA/CIAB, laden von Disk, Tastatur
  1950. - Audio
  1951. - Kompatibilität und Optimierung des 68000
  1952.  
  1953. Weiters  ist auch Disk 4 fast fertig, sie behandelt das AGA-Chipset
  1954. und den 68020.
  1955. Es  sind  auch  Lektionen  im  Bereich  3D  und   Demo   Style   in
  1956. Vorbereitung,  weiters  auch  die  Programmierung von Videospielen.
  1957. Aber wenn mir niemand hilft, werden sie  nie  das  Licht  der  Welt
  1958. erblicken.  Wenn  ihr  wollt,  daß  die  Disks  2/3/4  ins Deutsche
  1959. mutieren, dann kann  ich  euch  nur  sagen,  daß  desto  mehr  Mark
  1960. anschwirren,  desto  schneller sie übersetzt werden, hehehe :) Also
  1961. schickt mindestens 10 Märkli entweder  als  Postanweisung  oder  in
  1962. einem  verschlossenem  Brief  an  den  vertrauten  Übersetzer,  der
  1963. Halbe-Halbe mit dem Autor teilt:
  1964.  
  1965.         Martin De Tomaso
  1966.         Nicolodistr. 24/3
  1967.         39100 BOZEN
  1968.         ITALY                   ; internet: mdetomas@inf.unitn.it
  1969.  
  1970. Das  bedeutet  aber  nicht,  daß die Disks 2/3 automatisch bei euch
  1971. zuhause landen wenn sie fertig sind, es würde  uns  nur  ermutigen,
  1972. weiterzumachen.  Wenn  ihr euch registrieren wollt, dann schickt 25
  1973. Mark (wie immer mit einer Postanweisung  oder  flüssig),  und  fügt
  1974. auch noch folgende Infos hinzu:
  1975.  
  1976. Name, Nachname, Adresse, Amiga-Modell, das zuhause am Werk ist
  1977.  
  1978. Optional:  Alter, e-mail, Handle (Wenn ihr aus der Demo-Scene kommt).
  1979.  
  1980. Wie    schon    erwähnt,    wird    Hilfe    für    die     Kapitel
  1981. 3D-Effekte/Fraktale/Warp/ Voxel/Zoom/etc, wie auch Games, benötigt.
  1982. Es betrifft sowohl Texte  wie  auch  Listings.  Es  braucht  nichts
  1983. Wundervolles, es reichen simple Dinge, die einfach zu kapieren sind
  1984. und gut kommentiert sein sollten. Egal wenn  sie  langsam  und  nix
  1985. Besonders  sind.  Ihr  könnt  sofort  loslegen, Kommentare bitte in
  1986. Deutsch oder Englisch!
  1987. Ein anderes Motiv, weswegen ihr uns  unserer  Ruhe  berauben  dürft
  1988. (nicht  so  ernst  nehmen..!), ist die Fähigkeit, GUT ins Englische
  1989. oder sonst irgend eine Sprache übersetzen zu können. In diesem Fall
  1990. habt  ihr Anrecht auf einen guten Prozentsatz des Profits (30%-50%,
  1991. das handeln wir uns dann aus) des Ertrages der von euch übersetzten
  1992. Version.  Unter GUT verstehe ich die Übersetzung des GANZEN Kurses,
  1993. auch der LABEL und der dummen Sprüche, und ohne Fehler. Weiter ohne
  1994. die  TABS  in  Spaces  zu  verwandeln  und  ohne die 79 Kolonnen zu
  1995. überschreiten.
  1996.  
  1997.     Fabio Ciucci (Randy/Ram Jam)   &   Martin De Tomaso
  1998.  
  1999. Hello's to all the German Amiga Scene groups!!! I hope to see much demos
  2000. out from EX-SWAPPERs, EX-GFX ARTISTs, EX-MUSICIANs!!!
  2001. Just read this tutorial between one swap and another, or between painting &
  2002. composing!!!!
  2003.  
  2004. A special hello to the R.O.M. editors (Touchstone, please write an article
  2005. about this tutorial!!!!)
  2006.  
  2007.