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

  1.           A S S E M B L E R - K U R S       (c)  Jeff Kandle 1990
  2.  
  3.                                 28.Teil...
  4.  
  5. Wie ich versprochen habe, kommen wir jetzt an etwas schwierigere
  6. Blitterthemen.
  7. Also ran an die logischen Verknuepfungen.
  8.  
  9. Wer von euch ein bisschen mit dem letzten Bob-Listing gearbeitet hat, der
  10. hat bestimmt einige unangenehme eigenschaften des Programm`s kennengelernt.
  11. Zum Beispiel das wenn mehrere Bob`s sich ueberschneiden, immer nur der
  12. oberste ganz dargestellt wird, und von den anderen immer mehr oder weniger
  13. fehlt.
  14.  
  15. Die Erklaerung ist einfach. Wir Kopieren ja bloss von A nach D. Alles was
  16. ich A steht geht auch nach D.
  17. Das ist keine Verknupfung. Schalten wir mal eben auf eine Plane, da kann
  18. man die Funktion besser erkennen.
  19.  
  20. Es soll ja am Ende so Funktionieren das in der Bitplane alles gesetzt wird
  21. was auch im Bob gesetzt ist. Sobald aber mal das aktuelle Bit im Bob nicht
  22. gesetzt ist, soll das gesetzt werden was dort vorher stand.
  23. Da wir aber nicht Logisch mit D arbeiten koennen, sondern in D immer nur
  24. das Ergebnis steht, muessen wir eine weitere Quelle dazu schalten.
  25. Dazu nehmen wir die Quelle B.
  26.  
  27. Der Blitteraufruf sieht dann so aus das A auf den einplaneBob zeigt, B auf
  28. den bereich zeigt der von dem Bob ueberschrieben wird, und D auf den
  29. gleichen Bereich, allerdings als Ziel....
  30.  
  31. Im BLTCON0-Register muss man dann nur noch die Verknuepfung
  32.  
  33.         D =  A  or  B
  34.  
  35. Das heisst auf Deutsch - D ist immer dann 1, wenn A oder B 1 ist. Wichtig
  36. ist dabei das Oder.
  37.  
  38. Manche werden sich jetzt fragen ob ich noch ganz echt bin. Aber trotzdem
  39. werde ich jetzt wieder mal die Bobs kurz verlassen, da ich ja immer zu dem
  40. jeweiligen Stand des Koennens in Assembler ein paar andere Sachen mache.
  41. Das finde ich naemlich sehr viel besser.
  42.  
  43. Kommen wir nun zu einer Sache die vor einem Jahr das Markenzeichen fuer
  44. gute Intro/Demo-Programmierer war. Mittlerweile ist es allerdings Standart
  45. geworden. Das ist zwar etwas traurig aber es ist nach wie vor eine tolle
  46. Sache, an der man seine Programmtechnischen Faehigkeiten sehr gut messen
  47. kann.
  48.  
  49. 22.Realisierung eines einfachen Sinusscrollers mit dem Blitter
  50.  
  51. Als Grundprogramm nehmen wir einfach das Laufschriftprogramm was wir im
  52. Kapitel Laufschrift geschrieben haben.
  53. Es muss auch nicht soviel daran geaendert werden, deshalb bietet es sich
  54. an.
  55.  
  56. Schauen wir uns mal an was der Prozessor dem Blitter zu tun gibt.
  57. Der Prozessor laesst den Blitter jede 1/50 Sekunde den Laufschrift Bereich
  58. um eins nach Links schieben. Gleichzeitig zaehlt er jedoch ob der Aktuelle
  59. Buchstabe schon aus dem Puffer herausgeschoben ist. Sobald das passiert ist
  60. laesst er den Blitter einen neue Buchstaben in den Puffer kopieren.
  61.  
  62. Diese Kopierroutine ist einfach Mathematisch darzustellen.
  63.  
  64.         D  =  A
  65.  
  66. Also...Ist A = 1 dann ist auch D = 1, ist A = 0 dann....
  67. Somit wird auch der Muell der beim Linksrotieren des Puffer hinten
  68. reingeschoben wird, ueberschrieben. Schoen und gut.
  69.  
  70. Jetzt wollen wir uns mal ueberlegen wie man die Wellen, oder einfacher,
  71. ueberhaupt einen Vertikalen versatz hinkriegen koennen.
  72. Wenn wir immer mit einem Wort arbeiten, ist das ja nicht schwer. Das
  73. naechste Ziel des Blitters liegt dann eben 3 oder 4 zeilen unter dem
  74. vorherigen. Was ist aber wenn wir die abstufungen Steiler machen wollen ?
  75.  
  76. Wir muessten dann mehrmals pro Wort um eine Zeile runtergehen. Sagen wir
  77. mal immer 4 Bits, und dann eine Zeile runter.
  78. Aber wie kriegt man nur 4 Bits kopiert, und wie weiss der Blitter welche 4
  79. Bits ich will ?
  80.  
  81. Dazu gibt es Bltafwm und Bltalwm, die beiden Masken die man ueber das erste
  82. und letzte Word der zu kopierenden Zeilen legen kann. Damit markieren wir
  83. einfach die Bits die wir kopieren wollen. Nachdem das passiert ist schieben
  84. wir die Maske auf die naechsten 4 Bits, und starten die Aktion fuer das
  85. Wort nochmal. Solange bis das Wort kopiert ist. Ihr koennt euch sicherlich
  86. vorstellen was das fuer eine arbeit fuer den Blitter ist. Wiegesagt -
  87. erstes und letztes Wort der Zeile. Falls die Zeile nur ein Wort, wie in
  88. unserem Fall, breit ist, dann werden die Masken uebereinander gelegt. Um
  89. dann sinnvolle angaben zu erhalten, muessen die beiden Masken jeweils
  90. denselben Inhalt haben. Wenn ich also aus dem Wort nur Bit 1,2,3 und 4
  91. kopieren will, dann muessen die Masken fuer die Register ungefaehr so !
  92. aussehen.
  93.  
  94.         BltaFwm =  %1111000000000000
  95.         BltaLwm =  %1111000000000000
  96.  
  97. So, und was geschieht mit dem Rest ? Der Blitter schreibt an ihre Stelle im
  98. Ziel, egal was in der Quelle steht, immer eine Null. Somit haetten wir dann
  99. nur die 4 Bits die wir gewuenscht haben, kopiert.
  100.  
  101. Was passiert aber wenn ich die ersten 4 Bits kopiert habe, die Maske
  102. verschoben habe, und nun die Bits 5 - 8 um eine zeile verschoben, Kopieren
  103. will. Da Nullen ja auch Kopiert werden, und die ausmaskierten Bits, als 0
  104. Interpretiert werden, wird der groesste Teil der ersten 4 Bits geloescht.
  105.  
  106. Das ist dann ehrlichgesagt - Scheisse !, und ganz bestimmt nicht das was
  107. wir wollen.
  108. Deshalb muessen wir es so einrichten, das der Blitter die gesetzten Bits im
  109. Ziel, die durch nullen ueberschrieben werden wuerden, zu beruecksichtigen.
  110.  
  111. Die Logische verknuepfung die wir dafuer einstellen muessen, ist
  112.  
  113.         D  =  A ^ B
  114.  
  115. Was auf Deutsch heisst. D ist auf jedenfall 1 wenn A oder B 1 ist. Wenn
  116. beide 1 sind, was aber in unserem Fall nicht vorkommen wird, ist es
  117. natuerlich auch 1.
  118.  
  119. Auf diese Art und Weise, werden die davor kopierten Bitspalten, in Ruhe
  120. gelassen, und halten ihr aussehen.
  121.  
  122. Ich will das ebenbesprochene mal Source-Code-Maessig unterstuetzen.
  123. Es kopiert einen im Source enthaltenen Bob, jeweils um eine Zeile versatz
  124. pro Bit auf den Screen.
  125.  
  126.  
  127. Start:
  128. Execbase=       4
  129. Openlibrary=    -408
  130. Vhposr=         $dff006
  131. Forbid=         -30-102
  132. Permit=         -30-108
  133. Bltafwm=        $dff044
  134. Bltalwm=        $dff046
  135. Bltcon0=        $dff040
  136. Bltcon1=        $dff042
  137. Bltamod=        $dff064
  138. Bltbmod=        $dff062
  139. Bltdmod=        $dff066
  140. Bltapt=         $dff050
  141. Bltbpt=         $dff04c
  142. Bltdpt=         $dff054
  143. Dmacon=         $dff096
  144. Intena=         $dff09a
  145. Dmaconr=        $dff002
  146. Bltsize=        $dff058
  147.  
  148.  
  149.         Move.w  #$0020,Dmacon
  150.         Move.w  #$4000,Intena
  151.         Move.l  Execbase.w,a6
  152.         Jsr     Forbid(a6)
  153.  
  154.  
  155.         Move.l  #$60000,a0
  156.         Move.l  #$9588/4,d0
  157. Clearloop:
  158.         Move.l  #$0,(a0)+
  159.         Dbf     d0,Clearloop
  160.  
  161.  
  162.         Bsr.l   Makecl
  163.         Bsr.l   Bobmaker                ; Aufruf der Bobroutine
  164.  
  165. Wait:
  166.         Btst    #6,$bfe001
  167.         Bne     Wait
  168.  
  169.         Move.l  Execbase.w,a6
  170.         Jsr     Permit(a6)
  171.         Lea     Gfxname(pc),a1
  172.         Jsr     Openlibrary(a6)
  173.         Move.l  d0,a6
  174.         Move.w  #$83e0,Dmacon
  175.         Move.w  #$c000,Intena
  176.         Move.l  38(a6),$dff080
  177.         Moveq   #0,d0
  178.         Rts
  179. Makecl:
  180.         Lea     $05f000,a0
  181.         Move.l  a0,$dff080
  182.  
  183.         Move.l  #$00e00006,(a0)+
  184.         Move.l  #$00e20000,(a0)+
  185.         Move.l  #$008e1a64,(a0)+
  186.         Move.l  #$009039d1,(a0)+
  187.         Move.l  #$00920030,(a0)+
  188.         Move.l  #$009400d8,(a0)+
  189.         Move.l  #$01001200,(a0)+
  190. ;----------------------------------------------
  191.         Move.l  #$01800000,(a0)+
  192.         Move.l  #$01820fff,(a0)+
  193. ;----------------------------------------------
  194.         Move.l  #$fffffffe,(a0)+
  195.         Rts
  196. Waitblit:
  197.         Btst    #6,Dmaconr                      ; Wartet bis Blitter fertig
  198.         Bne.s   Waitblit
  199.         Rts
  200. Bobmaker:
  201.         Move.w  #$0f,d7                         ; Counter fuer die Spalten-
  202.                                                 ; Anzahl
  203.         Move.w  #%1000000000000000,d0           ; Erste Maske
  204.         Move.l  #$61088,d1                      ; Erste Adressen
  205. Loop:   Bsr.l   Set_bob                         ; Bob setzen
  206.         Add.l   #$2c,d1                         ; Eine Zeile runter
  207.         Ror.l   #1,d0                           ; Maske 1 Bit verschieben
  208.         Dbf     d7,Loop                         ; Schleife ob schon ganzer
  209.                                                 ; Bob ?
  210.         Rts
  211.  
  212.  
  213. Set_bob:
  214.         Bsr.s   Waitblit
  215.         Move.w  d0,Bltafwm
  216.         Move.w  d0,Bltalwm
  217.         Move.w  #%0000110100111100,Bltcon0
  218.         Move.w  #0,Bltamod              ; Quellmodulo = 0 (rawblit)
  219.         Move.w  #42,Bltdmod             ; Zielmodulo = 42 (planes = $2c)
  220.         Move.w  #42,Bltbmod
  221.         Move.l  #Bob,Bltapt             ; Quelladr.
  222.         Move.l  d1,Bltbpt
  223.         Move.l  d1,Bltdpt               ; Zieladr.
  224.         Move.w  #16*64+1,Bltsize        ; Bltsize und Start
  225.         Rts
  226.  
  227. Gfxname:        dc.b "graphics.library",0
  228.  
  229. even
  230.  
  231. Bob:
  232. Dc.w %1111111111111111
  233. Dc.w %0000000000110000
  234. Dc.w %0000000001100000
  235. Dc.w %0000000011000000
  236. Dc.w %0000000110000000
  237. Dc.w %0000001100000000
  238. Dc.w %0000111111000000
  239. Dc.w %0001111111100000
  240. Dc.w %0001111111100000
  241. Dc.w %0010000000000000
  242. Dc.w %0001000000000000
  243. Dc.w %0000100011110000
  244. Dc.w %0000010000000000
  245. Dc.w %0000001000000000
  246. Dc.w %0000000100000000
  247. Dc.w %1111111111111111
  248.  
  249.  
  250. Das Listing ist ja ein Bisschen Dokumentiert. Ihr duerftet aber keine
  251. Probleme mehr damit haben.
  252. Mir hat ein bekannter gesagt, das es eine Sache gibt die ihn an diesem Kurs
  253. stoert. Das ich viel zu viel zeige, und die Leute nicht selber denken
  254. lasse.
  255. Ich habe aber sonst keine Klagen gehoert, deshalb schaetze ich mal das euch
  256. der Kurs ganz gut gefaellt. Naja, aber trotzdem, ich werde jetzt in den
  257. letzten Teile die Kritik hinnehmen und befolgen.
  258.  
  259. Um daraus jetzt eine Sinusschrift zu machen muesst ihr folgendes machen.
  260.  
  261. Diese Kopierroutine in das Laufschrift Programm einsetzen. Auf eine ganze
  262. Zeile erweitern, und die Zeilen in die Kopiert wird aus einer Tabelle lesen
  263. lassen. Die alte Laufschrift muesst ihr dann in einen Puffer ablaufen
  264. lassen, sodas erst diese Kopierroutine die Schrift auf den Screen bringt.
  265.  
  266. Mehr nicht...
  267.  
  268. Eigentlich war es das zu der Sinuslaufschrift..Wenn ihr das Prinzip
  269. geschnallt habt, dann ist ja alles O.K...Verschiedene Variationen werdet
  270. ihr ja sicher selber machen. Nur halt soviel. Ueberlegt euch immer vorher
  271. ob es in einem Demo immer eine Sinusschrift sein muss. Denn diese ganzen
  272. Blitteraktionen nehmen auf dem Prozessor viel Zeit weg, und deshalb kann
  273. fuer das restliche Intro nicht mehr soviel Zeit aufgebracht werden. Wenn
  274. ihr das mal durchrechnet was der Blitter da schon an Zeit braucht, dann
  275. wisst ihr warum die eigentlich garnicht so schwierigen Sinusscroller nicht
  276. so oft eingesetzt werden.
  277. Es gibt ja genug andere schoene Effekte die sich fuer Intro`s eignen. Und
  278. nicht der, der am besten andere Ideen nachprogrammiert macht von sich
  279. reden, sondern der, der die schoensten eigenen Ideen hat. Wobei Egal ist
  280. wie einfach sie zu programmieren sind. Hauptsache schon...
  281.  
  282. Mit diesen Worten moechte ich mich von euch verabschieden...wuensche euch
  283. viel Spass beim Sinussen...
  284.  
  285. Haste Luego
  286.  
  287.                 Jeff Kandle
  288.