home *** CD-ROM | disk | FTP | other *** search
/ Amiga ISO Collection / AmigaUtilCD2.iso / Programming / Misc / Asm-Course2.lha / Teil13.TXT < prev    next >
Encoding:
Text File  |  1992-09-02  |  14.2 KB  |  364 lines

  1.           A S S E M B L E R - K U R S       (c)  Jeff Kandle 1990
  2.  
  3.                                 13.Teil...
  4.  
  5. So Leute, nachdem wir einige tolle sachen kennengelernt haben die unser
  6. Demo/Intro schmuecken, wollen wir uns mal wieder etwas einfachem widmen.
  7.  
  8. 15.Darstellung von Sprites
  9.  
  10. So, erstmal was sind sprites....Orginaltext Data Becker (treffender koennte
  11. selbst ich es nicht ausdruecken)
  12.  
  13. `Sprites sind kleine Grafik Elemente, die voellig unabhaengig von den
  14. Playfields verwendet werden koennen`
  15.  
  16. Also ganz klar es sind kleine Objekte....Ich weiss zwar nicht wie Data
  17. Becker das gemeint hat, aber die sind wirklich schrecklich klein, naemlich
  18. maximal nur 16 Pixel breit. Dafuer aber so lang wie wir wollen, schwacher
  19. trost.
  20.  
  21. So, wozu braucht man Sprites....Wenn ich da an frueher denke auf dem 64`er,
  22. da hatten die Dinger echt ne` Bedeutung.
  23. Aber jetzt..wenn der Mauszeiger nicht waere wuerde man sie nie benutzen.
  24. Es ist unheimlich kompliziert mit ihnen zu hantieren, das einzige wofuer
  25. ich sie einsetze sind Sternenhintergruende....ja dafuer kann man sie
  26. gebrauchen.
  27.  
  28. Erstmal zum aufbau von Sprites...Wie gesagt maximal 16 Pixel breit, dafuer
  29. so lang wie wir wollen. Es gibt 8 Stueck von ihnen, von denen jeder 4
  30. Farben annehmen kann. Man kann sie aber auch kombinieren, zu insgesamt 4
  31. Stueck, allerdings dann jeder mit 16 Farben..das ist doch schon mal was.
  32.  
  33. Wie kriegt man sie zu sehen ?, und was muss man beachten.
  34.  
  35. Tja, da hat sich der Erfinder wirklich gedanken gemacht, wie man soetwas
  36. gut verstecken kann. Erstmal grob die Punkte und dann die erklaerungen.
  37.  
  38. 1.Sprite DMA Kanaele anschalten (oder nicht ausschalten)
  39. 2.Bitplane DMA an
  40. 3.Playfield erzeugen
  41. 4.Farben geben
  42. 5.Sprite Datenliste erzeugen
  43. 6.Zeiger der unbenutzten Sprites auf leere Listen verbiegen
  44.  
  45. Puuuh, ist ja eine Ganze menge fuer so kleine Dinge. Also fangen wir mal
  46. an.
  47.  
  48. 1. Sprite DMA ist ja Klar..wiegesagt muss fuer solche Sachen erst der
  49. Zustaendige Kanal geoeffnet werden, sonst kommen die Zustaendigen
  50. Spezialchips, in diesen Fall sind es Agnus und Denise, nicht an die Daten
  51. ran.!
  52.  
  53. 2. Tja das ist einer der Haken, man muss ebenfalls die Bitplanes anhaben,
  54. da sonst nichts kommt.
  55.  
  56. 3. Es kommt noch schlimmer, man muss sogar ein Komplettes Playfield
  57. erstellen, mit allen drum und dran. Den an den Diwstrt und Diwstop werten
  58. orientieren sich die sprites, das heisst wir ein Sprites teilweise oder
  59. ganz ausserhalb des playfields gesetzt werden, wird das Stueck einfach ganz
  60. dreist abgeschnitten, frechheit.
  61.  
  62. 4. Naja farben muss man den dingern nicht unbedingt geben, aber es sieht
  63. halt nich besonders gut aus, wenn es Schwarz auf schwarz ist. Und da das
  64. die Default einstellung ist, muessen wir um sie zu sehen auch etwas farbe
  65. ins spiel bringen.
  66.  
  67. 5. Diese Datenliste enthaelt alle sonstigen informationen ueber das Sprite,
  68. naja was heisst alle, nur zwei..aber die wichtigsten...Aussehen und
  69. Position.
  70.  
  71. Wie sieht diese Datenliste aus ?
  72.  
  73. Als erstes kommen zwei kontrollworte..In den Ersten steht die X-und Y
  74. Koordinate des Sprites, in dem Zweiten bis wo er auf dem Bildschirm geht,
  75. danach richtet sich auch die laenge der Daten liste richtet, und die beiden
  76. 9.ten Bits fuer die x und y koordinaten, weil mehr als 256 positionen
  77. vorhanden sind, sind die Zaehler auf 256 angesetzt. Desweiteren steht bei
  78. den ungeraden noch das sogenannte Attach Kontroll Bit. Das sagt aus ob
  79. dieser sprite mit dem Darauffolgenden grade zu einem 16 Farbigen gekoppelt
  80. ist. Wie ihr seht knn man auch nur mal eben zwei verkoppeln, man muss nicht
  81. direkt alle nehmen.
  82.  
  83. 6. Das was dann noch kommt ist nicht notwendig da die Sprites schon stehen,
  84. und ebenfalls nicht wenn man sowieso alle sprites benutzt. Aber falls
  85. einige nicht benutzt werden, dann muss man es machen.
  86.  
  87. Die unangenehme eigenschaft des Sprite DMA Kanals ist das sofort alle
  88. sprites angeschaltet werden. Da wir aber den nichtbenutzten Sprites keine
  89. Datenliste zuweisen, steht in den registern nur 0. Die DMA nimmt das aber
  90. als Adresse..und da im vorderen Teil des Speichers, so bei 0 immer was los
  91. ist, erscheinen mal hier mal da immer wieder Truemmer, sowas wie ihr es
  92. seht wenn ihr vergesst die Sprite-DMA auszuschalten. Also nur eine
  93. Schoenheitskorrektur.
  94.  
  95. Naja, wie gesagt benutze ich nur Sprites wenn ich Sternen hintergruende
  96. mache, denn dafuer eignet sich das Prinzip dieser Datenliste eigentlich
  97. ganz gut. So jetzt wollen wir aber erstmal ueberhaupt etwas darstellen. Das
  98. mit den Sternen bau ich irgendwann spaeter mal in einen laengere Effekt ein
  99. oder so..denn es ist nicht besonders schwierig..oder mal gucken Vielleicht
  100. kommt es noch als eigenstaendiger Effekt...ich weiss es noch nicht..ich
  101. muesste mal gucken wie kurz ich es machen kann, denn diese scheiss langen
  102. Source Codes, zerren doch ganz schoen an eurer Telefon rechnung oder Dem
  103. Kleingeld fuer das Druckerpapier.
  104.  
  105. Naja, bis jetzt war es ja noch leicht, wenn es aber um die Definition der
  106. Form und farbe geht dann wird es Haarig. Obwohl so schlimm ist es wiederrum
  107. nicht..das Grundprinzip kennt ihr schon.
  108.  
  109. Bei der Sprites Form und Fargebung, funktioniert es aehnlich wie bei den
  110. Bitplanes der Bilder. Hier wird auch wieder aus der Kombinatioen von 2 Bits
  111. die Farbe errechnet. Diese Beiden SpritePlanes die so ein 4 Farben sprite
  112. dann braucht, werden aber nicht wie bei den Bitplanes fuer die Raw Bilder,
  113. untereinander, Plane fuer Plane...sondern immer eine Plane zeile nach der
  114. ander. Naja Bildlich gesehen sieht es dann so aus. Stellt euch bitte mal
  115. ein Sprite vor das nur eine Zeile hat, aber mit allen 4 farben drin, da ich
  116. hier nicht die Farben malen kann, muessen wir und leider mit den Nummern
  117. zufriedengeben, obwohl da vielleicht besser ist...also die Farben der Zeile
  118. sind so
  119.  
  120.   0011223333221100
  121.  
  122. Also auf und ab, die Bit Kombination fue die Zahlen muessten eigentlich
  123. klar sein, falls nicht...
  124.  
  125.       Wert     Bit 0       Bit 1
  126.  
  127.         0 =      0           0
  128.         1 =      0           1
  129.         2 =      1           0
  130.         3 =      1           1
  131.  
  132. und so sieht das dann fuer eine Zeile sprite daten liste aus, es werden die
  133. gesetzten Bits 0 und 1, getrennten in zwei worten gehandelt.
  134.  
  135.        gesetzte bits 0   gesetzte bits 1
  136.  
  137. dc.w %0011001111001100,%0000001111000000
  138.  
  139. gehen wir mal die zeile durch, wir lesen immer das erste Bit des ersten
  140. wortes, und das erste bit des zweiten wortes.
  141.  
  142. Zweimal 0 ergibt 0, wir schaun oben, da steht auch null, das naechste Bit
  143. dasselbe.
  144. Doch dann Bit 0 ist gesetzt, und in der zweiten zeile nicht, wir muessen
  145. uns das dann etwas anders vorstellen, denn normaler weise schreibt man
  146. zahlen von rechts nach links, und so liest man sie auch, Binaer geht es
  147. ebenso, die Kleinste einheit steht immer Rechts, wenn wir das hier aber so
  148. machen, kommen wir an falsche ergebnisse, wir muessen also um richtig zu
  149. liegen die Bitkombination die wir aus den Beiden Worten kriegen spiegel
  150. verkehrt sehen. Also sehen wir das erste Bit ist gesetzt, und das zweite
  151. nicht. Das ergibt 01, und das ist 1...also farbe 1.
  152.  
  153. Als naechte kombination erhalten erhalten wir erst eine 0 und dann eine 1,
  154. das ergibt 10, das ist laut Tabelle 2. Also farbe zwei...Die letzte
  155. Kombination ist die fuer die Farbe drei, dort sind beide gesetzt, das
  156. ergibt ja 3.
  157.  
  158. Die Defintionsadressen tragt ihr fuer die Sprites bei den Registern
  159.  
  160. SPR0PTH und SPR0PTL bis SPR7PTH und SPR7PTL ein.
  161. Sie liegen bei $DFF0120 bis $DFF13E...Schaut es euch im Listing an.
  162.  
  163. So eigentlich duerfte das Klar sein..aber ihr muesstet gemerkt haben
  164. wieviel arbeit es ist so kleine Objekte zu erhalten. Also am ergebnis ist
  165. ja zusehen was fuer ein Aufwand das ist..Aber arbeitet ruhig mal ein
  166. bisschen damit, wenigstens so lange bis ihr Bobs beherscht, denn die sind
  167. mit viel weniger aufwand zu machen und die Moeglichkeiten ungleich hoeher.
  168.  
  169. Naja genug der Laberei, nun wollen wir mal meinen wohlklingenden Vornamen
  170. auf den Bildschirm Spriten.
  171.  
  172. Org $3e000
  173. Load $3e000
  174.  
  175. execbase=       4
  176. openlibrary=    -408
  177. vposr=          $dff004
  178. intena=         $dff09a
  179. intenar=        $dff01c
  180. forbid=         -30-102
  181. permit=         -30-108
  182. cop1lc=         $dff080
  183. ciaapra=        $bfe001
  184. dmacon=         $dff096
  185.  
  186. start:
  187.         move.l  execbase,a6             ; Multitasking aus
  188.         jsr     forbid(a6)
  189.         move.w  #$a000,intena           ; Interrupts sperren
  190.  
  191.         bsr.l   initpointers
  192.         move.l  #copperliste,cop1lc     ; copperliste erstellen
  193.  
  194. wait:   move.l  vposr,d0                ; Rasterpos holen
  195.         and.l   #$1ff00,d0              ; alles unwichtige ausmaskieren
  196.         cmp.l   #$1000,d0               ; Zeile 16 ($10) erreicht ?
  197.         bne.s   wait                    ; noe...
  198.  
  199.         btst    #6,ciaapra
  200.         bne.s   wait
  201.  
  202. ende:   move.l  execbase,a6             ; Multitasking an
  203.         jsr     permit(a6)
  204.         lea     gfxname(pc),a1
  205.         jsr     openlibrary(a6)
  206.         move.l  d0,a6
  207.         move.w  #$83e0,dmacon
  208.         move.w  #$C000,intena
  209.         move.l  38(a6),cop1lc
  210.         moveq   #0,d0                   ; Keinen Dos-Returncode
  211.         rts
  212.  
  213. copperliste:
  214.         dc.l    $00e00004
  215.         dc.l    $00e20000
  216.         dc.l    $008e1a64
  217.         dc.l    $009039d1
  218.         dc.l    $00920030
  219.         dc.l    $009400d8
  220. First:
  221.         dc.l    $01200003
  222.         dc.l    $01220000
  223. Second:
  224.         dc.l    $01240003
  225.         dc.l    $01260000
  226. Third:
  227.         dc.l    $01280003
  228.         dc.l    $012a0000
  229. Fourth:
  230.         dc.l    $012c0003
  231.         dc.l    $012e0000
  232. Fifth:
  233.         dc.l    $01300004
  234.         dc.l    $01320000
  235. Sixth:
  236.         dc.l    $01340004
  237.         dc.l    $01360000
  238. Seventh:
  239.         dc.l    $01380004
  240.         dc.l    $013a0000
  241. Last:
  242.         dc.l    $013c0004
  243.         dc.l    $013e0000
  244.  
  245.         dc.l    $01a20fff
  246.         dc.l    $01a40888
  247.         dc.l    $01a60ccc
  248.         dc.l    $01aa0fff
  249.         dc.l    $01ac0888
  250.         dc.l    $01ae0ccc
  251.         dc.l    $01001200
  252.         dc.l    $01800000
  253.         dc.l    $0182000a
  254.         dc.l    $fffffffe
  255.  
  256. gfxname:
  257.         dc.b    "graphics.library",0
  258.  
  259. even
  260.  
  261. sprite1:
  262.         dc.l    $50506000
  263.         dc.w    %1111111111111110,%0000000000000001
  264.         dc.w    %1111111111111110,%0111111111111111
  265.         dc.w    %1111111111111110,%0111111111111111
  266.         dc.w    %1111111111111110,%0111111111111111
  267.         dc.w    %1111111111111110,%0111111111111111
  268.         dc.w    %0000000000111110,%0111111111111111
  269.         dc.w    %0000000000111110,%0000000000011111
  270.         dc.w    %0000000000111110,%0000000000011111
  271.         dc.w    %0000000000111110,%0000000000011111
  272.         dc.w    %1111100000111110,%0000000000011111
  273.         dc.w    %1111111111111110,%0111100000011111
  274.         dc.w    %1111111111111110,%0111111111111111
  275.         dc.w    %1111111111111110,%0111111111111111
  276.         dc.w    %0111111111111100,%0011111111111110
  277.         dc.w    %0011111111111000,%0001111111111100
  278.         dc.w    %0000000000000000,%0001111111111000
  279.         dc.l    0
  280. sprite2:
  281.         dc.l    $50596000
  282.         dc.w    %1111111111111111,%0000000000000000
  283.         dc.w    %1111111111111110,%0111111111111111
  284.         dc.w    %1111111111111110,%0111111111111111
  285.         dc.w    %1111111111111110,%0111111111111111
  286.         dc.w    %1111111111111110,%0111111111111111
  287.         dc.w    %1111100000000000,%0111111111110000
  288.         dc.w    %1111111111100000,%0111111111110000
  289.         dc.w    %1111111111100000,%0111111111110000
  290.         dc.w    %1111111111100000,%0111111111110000
  291.         dc.w    %1111111111100000,%0111111111110000
  292.         dc.w    %1111111111111111,%0111100000000000
  293.         dc.w    %1111111111111110,%0111111111111111
  294.         dc.w    %1111111111111110,%0111111111111111
  295.         dc.w    %1111111111111110,%0111111111111111
  296.         dc.w    %1111111111111110,%0111111111111111
  297.         dc.w    %1000000000000000,%0111111111111111
  298.         dc.l    0
  299. sprite3:
  300.         dc.l    $50626000
  301.         dc.w    %1111111111111111,%0000000000000000
  302.         dc.w    %1111111111111110,%0111111111111111
  303.         dc.w    %1111111111111110,%0111111111111111
  304.         dc.w    %1111111111111110,%0111111111111111
  305.         dc.w    %1111111111111110,%0111111111111111
  306.         dc.w    %1111100000000000,%0111111111110000
  307.         dc.w    %1111111111100000,%0111111111110000
  308.         dc.w    %1111111111100000,%0111111111110000
  309.         dc.w    %1111111111100000,%0111111111110000
  310.         dc.w    %1111111111100000,%0111111111110000
  311.         dc.w    %1111100000000000,%0111111111110000
  312.         dc.w    %1111100000000000,%0111110000000000
  313.         dc.w    %1111100000000000,%0111110000000000
  314.         dc.w    %1111100000000000,%0111110000000000
  315.         dc.w    %1111100000000000,%0111110000000000
  316.         dc.w    %1000000000000000,%0111110000000000
  317.         dc.l    0
  318. sprite4:
  319.         dc.l    $506b6000
  320.         dc.w    %1111111111111111,%0000000000000000
  321.         dc.w    %1111111111111110,%0111111111111111
  322.         dc.w    %1111111111111110,%0111111111111111
  323.         dc.w    %1111111111111110,%0111111111111111
  324.         dc.w    %1111111111111110,%0111111111111111
  325.         dc.w    %1111100000000000,%0111111111110000
  326.         dc.w    %1111111111100000,%0111111111110000
  327.         dc.w    %1111111111100000,%0111111111110000
  328.         dc.w    %1111111111100000,%0111111111110000
  329.         dc.w    %1111111111100000,%0111111111110000
  330.         dc.w    %1111100000000000,%0111111111110000
  331.         dc.w    %1111100000000000,%0111110000000000
  332.         dc.w    %1111100000000000,%0111110000000000
  333.         dc.w    %1111100000000000,%0111110000000000
  334.         dc.w    %1111100000000000,%0111110000000000
  335.         dc.w    %1000000000000000,%0111110000000000
  336.         dc.l    0
  337.  
  338. initpointers:
  339.         move.l  #sprite1,d0
  340.         move.w  d0,first+6
  341.         move.l  #sprite2,d0
  342.         move.w  d0,second+6
  343.         move.l  #sprite3,d0
  344.         move.w  d0,third+6
  345.         move.l  #sprite4,d0
  346.         move.w  d0,fourth+6
  347.         rts
  348.  
  349. Nun, wie ihr am anfang seht, benutze ich auch die Org/Load kombination. Das
  350. mache ich deshalb, weil ich dann die initpointersroutine am ende Kuerzer
  351. halten kann, und sie nur die Low adressen eintragen muss, weil ich die
  352. Highwerte der adressen der Datenliste schon in der Copperliste die im
  353. Source enthalten schon eingetragen habe.
  354.  
  355. Wundert euch nicht ueber die Spritedefinitionen, sie sehen etwas komisch
  356. aus, aber das ergenbnis muesste doch ueberzeugen.
  357. Ich wuerde vorschlagen ihr definiert mal selber ein Logo, damit ihr etwas
  358. Uebung in sachen Spritedatenliste bekommt. Ihr koennt allerdings auch mehr
  359. als 4 sprites benutzten, ihr muesst dann nur, in der copperliste aus der
  360. 4 im High werte in der Copperliste eine Drei machen, und die Initpointer
  361. routine am ende erweitern...alles Klor ?
  362.  
  363.                 Jeff Kandle
  364.