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

  1.           A S S E M B L E R - K U R S       (c)  Jeff Kandle 1990
  2.  
  3.                                 18.Teil...
  4.  
  5. So jetzt erstmal wieder was zum Bueffeln, ein etwas schwieriges
  6. unterfangen. Wenn wir es aber beherrschen dann ist die grosse Lernphase der
  7. Kunst des Introprogrammirens leider schon vorbei.
  8. Kommen wir zu einem Chip des Amigas dem er einen grossen teil seiner
  9. Grafischen moeglichkeiten verdankt.
  10.  
  11. 17.Der Blitter
  12.  
  13. Vielleicht habt ihr schon irgendwelche Schauermaerchen ueber den Blitter
  14. gehoert, und ich gebt auch zu das es ziemlich Haarig ist in erstmal zu
  15. verstehen. Aber wenn man das gefressen hat dann ist er relativ einfach. Und
  16. die wirklich schweren Sachen machen wir ja jetzt noch nicht. Ich meine
  17. jetzt VectorenGrafik und solche Tollen sachen Wie Filled Bobs, oder Sogar
  18. Stencil Bobs. Auch werden wir nicht versuchen neue rekorde zu brechen,
  19. obwohl das jeder der ihn beherscht versucht, wir wollen einfach nur ein
  20. bisschen Kopieren und so...
  21.  
  22. Erstmal: Wofuer ist der Blitter eigentlich da ?
  23.  
  24. Nun im Amiga ist er fuer die Textausgabe da, er zeichnet die Fenster und
  25. schaufelt beim laden von Programmen die Daten aus den puffern in den
  26. Arbeitsspeicher, und decodiert sie gleichzeitig. Ganz schoen wichtig das
  27. Ding, oder ?
  28.  
  29. Ja wichtig ist er, und schnell - Er kopiert mit einer Geschwindigkeit von
  30.  
  31.         16 Millionen Punkten in der Sekunde
  32.  
  33. Das ist verdammt schnell, ich glaube der Prozessor liegt knapp unter einer
  34. Millionen. Also liegt es doch auf der Hand das wir den fuer uns Arbeiten
  35. lassen.
  36.  
  37. Wie sprechen ich den Blitter an ?
  38. Ganz einfach ueber die Hardwareregister, von denen wir schon soviele kennen
  39. und schaetzen gelernt haben. Fuer alles moegliche gibt es Register. Die
  40. Aufgabe von uns ist nur diese register richtig zu initialisieren, den rest
  41. macht der Blitter ganz alleine.
  42.  
  43. Was uns am Blitter interressiert, ist das kopieren mit ihm.
  44.  
  45. Nun dafuer stellt und der Blitter 3 Quellbereiche und 1 Zielbereich zur
  46. verfuegung.
  47. Man kann immer nur von Quellbereich in Zielbereich Schreiben, deswegen
  48. heissen sie auch so.
  49. Das Heisst von A,B,C, so heissen die Quellen, nach D, so heisst das Ziel.
  50.  
  51. Allerding kann man auch die Quellen miteinander verknuepfen, aber das
  52. Spaeter. Uns Interresiert einfaches kopieren.
  53.  
  54. Der Blitter braucht zum Kopieren einige Angaben, die Operation und das
  55. Ausmass betreffend.
  56.  
  57. Erstmal muss er wissen, welche seiner Kanaele daran beteiligt ist. D ist
  58. meistens dabei, und A wenn es ums einfaches kopieren geht auch. Sagen wir
  59. also A und D.
  60. Dann muss man eingeben ob irgendwelche verknuepfungen waehrend der Aktion
  61. durchgefuehrt werden sollen. Das ist in unserem Fall ja nicht der Fall.
  62.  
  63. Dann muessen wir dem Blitter sagen wo der bereich ist von dem wir die
  64. Daten abholen, das ist der Quellbereich. Da setzen wir mal $50000 ein.
  65.  
  66. Nun kommt der Zielbereich, D genannt, dort setzen wir mal $60000 ein.
  67.  
  68. Als letztes muss der Blitter noch wissen wieviel er von dort nach da
  69. kopieren soll. Sobald wir das eingegeben haben startet er auch die Aktion,
  70. denn das register indem die Angabe ueber die Groesse liegt ist ein
  71. Stroberegister (Sprich: Strohp) Das heisst, bei Schreibzugriff wird
  72. gleichzeitig eine Aktion gestartet. In dem Fall ist es der Blitter.
  73.  
  74. Mit diesem Register fuer die laenge ist es aber etwas schwerer da man nicht
  75. einfach eingibt `So 100000 Bytes`, sondern man muss in gedanken aus der
  76. Anzahl der Bytes ein Rechteck bauen, und dem Register die Seitenlaenge A
  77. und B uebergeben. In manchen Faellen reicht es wenn wir die Quadratwurzel
  78. ziehen, und eine Grade zahl rauskommt. Bei 100 oder 10000 waere das zum
  79. Beispiel der fall. Aber das sind halt die Ausnahmen, also schauen wir mal
  80. wie wir das machen koennen.
  81.  
  82. Bis auf eine Ausnahme arbeitet der Blitter nur mir Woertern, also muessen
  83. wir den bereich den wir kopieren wollen in Woertern angeben.
  84. Also, wenn wir z.b 30000 Bytes von $50000 nach $60000 kopieren wollen dann
  85. muessen wir den Bereich ungefaehr so definieren
  86.  
  87.         300 Zeilen zu 100 Bytes bzw. 50 Woertern
  88.  
  89. das heisst 300*50, sind 30000, so einfach ist das.
  90. Der Bereich ist aber Beschraenkt, die maximale Zeilenzahl betraegt 1024
  91. Zeilen, wobei man da 0 als Zeilen zahl angeben muss, die nimmt er dann als
  92. 1024, da 0 ja eine Unsinnige angabe waere. Die maximale Breite betraegt 64
  93. Woerter, wobei wieder das mit der 0 ist. Wir koennen also mit einem Schlag
  94. 128 KB durch den Speicher Schleudern, anders kann man es nicht mehr
  95. ausdruecken. Diese laengen und breiten angaben muessen wir aber auch
  96. irgendwie unterbringen in dem Registers unterbringen. Die ersten 6 Bits
  97. sind die Breite, und die restlichen 10 sind fuer die laenge.
  98.  
  99. Wichtig ist aber wie wir die Masse da rein kriegen, einfach 300 * 50 kann
  100. man ja nicht schreiben, dann waere das System mit dem rechteckigen bereich
  101. wieder hin. Also muessen wir die LaengenBits auch noch oben schieben.
  102. Stellen wir uns das Leere BLTSIZE register , so heisst es naemlich, mal
  103. bildlich vor.
  104.  
  105.         I Zeilen  I Breite
  106.         0000000000000000
  107.         I         I
  108.  
  109. Schreiben wir einfach mal die Zeilen zahl 9 rein. Mit Move.w #$9,Bltsize
  110.  
  111.         I Zeilen  I Breite
  112.         0000000000001001
  113.         I         I
  114.  
  115. So jetzt steht die laenge aber in den Registern fuer die Breite, wie
  116. kriegen wir die rueber. Ganz einfach, mal 64, dann wird naehmlich alles nur
  117. um 6 Bit nach oben gesetzt. Also es sieht dann so aus
  118.  
  119.         I Zeilen  I Breite
  120.         0000001001000000
  121.         I Zeilen  I
  122.  
  123. Naja, und weiter...Hmmm ich will euch nicht damit Qualen, es waeren
  124. ziemlich aufwendige rechnungen um die Sachen vom Programm da reinzusetzen.
  125. Erstmal reicht es wenn wir das vom Seka machen lassen. Bei unserem Beispiel
  126. saehe die Initialisierung des BLTSIZE registers ungefaehr so aus.
  127.  
  128.         Move.w #300*64+50,BLTSIZE
  129.  
  130. So einfach ist das....
  131.  
  132. Damit haetten wir schon alle schritte die fuer ein Kopieraktion noetig
  133. waeren beisammen. Schreiben wir sie mal auf, mit SourceCode-beispiel.
  134.  
  135. Quelle A und Ziel D angeben, keine Verknuepfung.
  136.  
  137.         Move.w #%0000100111110000,BLTCON0
  138.  
  139. Adresse der Quelle A angeben
  140.  
  141.         Move.l #$50000,BLTAPT
  142.  
  143. Adresse des Ziels D angeben
  144.  
  145.         Move.l #$60000,BLTDPT
  146.  
  147. Laenge und Breite angeben, und gleichzeitig Aktion starten
  148.  
  149.         Move.w #300*64+50,BLTSIZE
  150.  
  151. Damit waere die Sache dann fertig...Komplett ist der Aufruf allerdings noch
  152. nicht. Es fehlen noch ein paar sachen die sehr viele moeglichkeiten
  153. mitsichbringen, aber beim normalen Kopieren nur hindern.
  154.  
  155. Da waeren erstmal die Modulowerte fuer die Quelle und das Ziel.
  156. Ja, die Modulos mit denen wir bei den Bitplanes schon so toll arbeiten
  157. konnten, hat der Blitter auch. Sie geben an wieviel Bytes, hier ist die
  158. Ausnahme von der ich Sprach, nach jeder zeile uebersprungen werden sollen.
  159. Es gibt sie fuer die Quellbereiche A,B und C sowie fuer den Zielbereich D.
  160. Wir muessen diese Register natuerlich auf 0 setzen, damit es wirklich eine
  161. Kopie gibt.
  162.  
  163. Desweiteren sind da BLTAFWM und BLTALWM. Sie sind fuer das erste und das
  164. letzte worte jeder zeile zustaendig. Mit ihnen kann man eine And Maske
  165. ueber eben diese beiden Woerter legen. Die And funktion kennt ihr ja schon,
  166. deshalb will ich das hier auch niocht nochmal erklaeren.
  167. Also, die muessen wir natuerlich vollschreiben, alles gesetzt brauchen wir.
  168.  
  169. Und dann als letztes muessen wir natuerlich auf den Blitter warten bis das
  170. er fertig ist, denn sonst waere jede weitere Initialisierung sinnlos, denn
  171. wenn er arbeitet nimmt er keine Befehle entgegen.
  172.  
  173. So wie warten wir den auf den Blitter ?
  174. Ganz einfach, im DMACON register gibt ja auch den Blitterkanal, solange der
  175. Blitter arbeitet wird der kanal geschlossen. Wir koennen das zwar nicht im
  176. DMACON register erfahren, da es ja kein Leseregister ist. Aber wofuer gibt
  177. es das DMACONR register. Dort fragen wir einfach das Bit 6 ab. Es gibt noch
  178. eine Zweite moeglichkeit, aber die ich hier vorgestellt habe benutze ich
  179. selbst schon immer und habe da nie Schwierigkeiten mit gehabt. Also eine
  180. Komplette Kopierroutine sieht dann so aus.
  181.  
  182.         Move.w #$ffff,BLTAFWM           ; Maske fuer erstes Wort
  183.         Move.w #$ffff,BLTALWM           ; Maske fuer letztes Wort
  184.         Move.w #$0000,BLTAMOD           ; Modulo Register A auf Null
  185.         Move.w #$0000,BLTDMOD           ; Modulo Register D auf Null
  186.         Move.w #%0000100111110000,BLTCON0
  187.                                         ; Bereiche anschalten, und
  188.                                         ; moegliche Verknuepfungen anmelden
  189.         Move.l #$50000,BLTAPT           ; Quelladresse angeben
  190.         Move.l #$60000,BLTDPT           ; Zieladresse angeben
  191.         Move.w #300*64+50,BLTSIZE       ; Groesse der Operation, und Los
  192. WaitBlitter:
  193.         Btst #6,DMACONR                 ; Bit vom DMA.Kanal testen.
  194.         Bne.s WaitBlitter               ; Nicht gedrueckt -> Zurueck
  195.         Rts                             ; Gedrueckt -> Raus
  196.  
  197. So, das ist ein Kompletter aufruf zu einer Kopieraktion des Blitters.
  198.  
  199. Allerdings im loeschen ist er auch einsame Spitze. Man muss im da nur sagen
  200. wo der zu loeschende liegt, und das er nur mit dem Zielbereich arbeiten
  201. soll. Ein Aufruf der den Blitter veranlasst das ebenkopierte jetzt zu
  202. loeschen saehe dann so aus.
  203.  
  204.         Move.w #%0000000100000000,BLTCON0
  205.         Move.l #$50000,BLTDPT
  206.         Move.w #300*64+50,BLTSIZE
  207. WaitBlitter:
  208.         Btst #6,DMACONR
  209.         Bne.s WaitBlitter
  210.         Rts
  211.  
  212. So, das sind die ersten anwendungsgebiete des Blitter, es gibt aber noch
  213. sehr viele mehr.
  214.  
  215. Bevor ich mich im naechsten Teil so langsam an die Bobs, und an das Thema
  216. Laufschrift heranwage, zeige ich euch gerade noch wie man mit dem Blitter
  217. invertiert.
  218.  
  219.         Move.w #%0000100100001111,BLTCON0
  220.         Move.l #$60000,BLTAPT
  221.         Move.l #$60000,BLTDPT
  222.         move.w #300*64+50,BLTSIZE
  223. WaitBlitter:
  224.         Btst #6,DMACONR
  225.         Bne.s WaitBlitter
  226.         Rts
  227.  
  228. Zu beachten ist das Quelle und Ziel dieselbe Adresse erhalten, da die
  229. Operation sehr kompliziert ist.
  230.  
  231. Was noch wichtig ist das ihr die Interrupts und das Taskswitching
  232. ausschaltet, denn der Blitter wird halt immer benutzt, und dann muesste man
  233. immer warten. Wenn wir allerdings den Rest abschalten macht der Blitter nor
  234. noch seine Aufgabe zuende, und gehoert dann sofort uns. Deshalb muessen wir
  235. bei einen Programm das den Blitter benutzt, immer ganz am anfang auf den
  236. Blitter warten, damit wir dann richtig loslegen koennen.
  237. Allerdings habe ich das jetzt etwas schlecht angefangen, da man die
  238. WaitBlitterschleife immer vor den Aufruf setzt, damit das Programm was den
  239. Blitter braucht schonmal weiter arbeitet, und erst auf den Blitter wartet
  240. wenn es ihn wieder braucht...Alles Klor ?
  241.  
  242. Bis die tage...
  243.  
  244.                 Jeff Kandle
  245.