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

  1.           A S S E M B L E R - K U R S       (c)  Jeff Kandle 1990
  2.  
  3.                                 26.Teil...
  4.  
  5. So, das war ein etwas laengerer Einschub einer vollkommen anderen Sache.
  6. Machen wir aber jetzt weiter mit dem Blitter, denn wir sind ja noch lange
  7. nicht fertig mit ihm.
  8.  
  9. 21.Logische Verknuepfungen bei Kopieraktionen mit dem Blitter
  10.  
  11. Wie der Titel schon sagt kann man beim Kopieren zwei oder drei Quellen
  12. logisch miteinander Verknuepfen.
  13. Den Sinn erfahren wir im Laufe der Zeit...
  14.  
  15. Machen wir erstmal mit den Bobs weiter, wo wir aufgehoert haben.
  16.  
  17. Nun, im Grunde genommen habt ihr die einfachste Art und Weise der Bobs
  18. schon praktiziert. Naemlich als wir bei dem einfachen Laufschrift Programm
  19. die neuen Buchstaben in den Puffer kopiert haben.
  20. Genausogut koennten wir auch einen Konvertierten Dpaint-Brush dafuer an
  21. irgendeine Stelle auf dem Playfield schreiben.
  22.  
  23. Nun verstehen manche von euch unter dem begriff Bobs, kleine oder grosse
  24. Grafiken die Munter auf dem Bildschirm rumflitzen.
  25. Das ist aber falsch, denn fuer das rumflitzen sind ausgekluegelte Bob_Move
  26. routinen zustaendig, die sich Positionen holen und alles selber ausrechnen.
  27.  
  28. Um einen Bob an eine durch X und Y Koordinate fesgelegte Position muss
  29. diese Routine naemlich drei werte aus diesen Koordinaten errechnen.
  30.  
  31. 1. Hardscrollwert X
  32. 2. Softscrollwert X
  33. 3. Softscrollwert Y
  34.  
  35. Sobald sie die errechnet hat muessen die Werte in eine Universale
  36. Kopierroutine eingesetzt werden, damit der Blitter diese Aktion auch
  37. ausfuehrt.
  38.  
  39. Wir arbeiten, wenn wir mit BOBS (Blitter OBjectS) arbeiten, grundsaetzlich
  40. mit den verschachtelten Planes. Das reduziert die Kopieraktion auf eine Pro
  41. Bob, egal wieviel Farben er hat.
  42. Zeitlich ist die Handhabung von Bobs naemlich schon schwer genug. Wenn man
  43. da noch fuer jeden Bobs 2,3 oder sogar 4 Aufrufe machen muesste, das waere
  44. ja zum Heulen.
  45.  
  46. Manche werden sich jetzt fragen: `Wieso Zeit-Probleme, ich denk der Blitter
  47. arbeitet mit einer Geschwindigkeit von 16 Millionen Punkte in der Sekunde.`
  48.  
  49. Das stimmt auch im groben und ganzen....aber !!
  50.  
  51. Rechnen wir mal aus wieviel Zeit wir pro Bildschirmaufbau haben, und ziehen
  52. daraus schluesse, wieviel Punkte dann noch Kopiert werden.
  53.  
  54. Also bleiben wir erstmal bei der Sekunde.
  55.  
  56.  16 Millionen Punkte = 2 Millionen Byte
  57.  
  58. Wir haben eine Bildschirmaufbau Frequenz von 50 Hertz. Das heisst alle
  59. 50 stel Sekunde wir ein Neuer Bildschirm aufgebaut. Um Ruckelfrei und ohne
  60. Stoerungen arbeiten zu koennen, muessen die Bobs alle 50 stel Sekunde neu
  61. gesetzt werden.
  62. Dieses neusetzen bedeutet aber ->  Alten Screen loeschen
  63.                                    Neue Bobkoordinaten holen
  64.                                    Hard und Soft Adressen errechnen
  65.                                    Bobs setzen
  66.  
  67. Naja, soviel dazu...Aus den 2 Millionen Byte pro Sekunde sind nun
  68. 40000 Byte pro Bildschirm aufbau geworden. Da aber ungefaehr die haelfte
  69. der Zeit fuer das loeschen des Bildschirms und die errechnung der noetigen
  70. Werte drauf gehen, kann der Blitter nur noch eine 100 stel Sekunde genutzt
  71. werden. Und das sind nur 20000 Byte.
  72.  
  73. Treiben wirs mal weiter..
  74. Gehen wir mal von einem Bobs aus der ungefaehr so gross ist..
  75.  
  76.  
  77.                 ---------
  78.                 [       ]
  79.                 [       ]
  80.                 [       ]
  81.                 [       ]
  82.                 ---------
  83.  
  84. Und in 5 Farben.
  85.  
  86. Er ist 48 * 50 von den massen, und das ganze mal 5
  87.  
  88. (48/8 (fuer die Byteanzahll)) * 50 *3 = 1500 Byte
  89.  
  90. Nun ist das noch ein sehr kleiner Bob. Wenn man aber bedenkt das diese
  91. niedlichen kleinen Geschoepfe immer in Scharen auftreten, dann kann man
  92. sich vorstellen das man echt in schwierig keiten kommt. Wenn man 10 Stueck
  93. Kopiert hat, dann ist die Zeit Floeten gegangen. Und es ist noch nichts
  94. anderes in unserem Schein-Intro gelaufen. Denn da ist noch eine Musik und
  95. mindestens noch die noetige Laufschrift, an der leider die meisten Demos
  96. gemessen werden. Dann weiss man was da getrickst werden muss damit doch
  97. manchmal bis zu 20 oder mehr Bobs auf den Bildschirm kommen.
  98.  
  99. Dieser Teil des Assemblerkurses ist etwas anders als wie die anderen.
  100. Bisher habe ich bis auf ein paar Werte alles aus der Hand geschrieben, und
  101. auch die Source Codes zusammen mit dem Text geschrieben und hinterher nur
  102. auf Funktion und Fehler ueberprueft. Jetzt wird es anders, denn ich habe
  103. mich bisjetzt nicht an dem Bob-Rekordversuchen mancher Demo/Intro-Schreiber
  104. beteiligt. Jetzt moechte ich das aber gleichzeitigt mit diesem Kurs tun.
  105. Wie ihr seht hab auch ich noch eine ganze Menge noch nicht gemacht. Aber was
  106. soll es, je mehr man kann desto mehr Routine ist dabei. Und ob ihr es glaubt
  107. oder nicht, Copperlisten und Playfields erroeffnen, Blitter Operationen und
  108. Bootbloecke schreiben wird auf die Dauer so laestig das man sich die Sachen
  109. die man braucht einfach aus eigenen alten Source Codes herausschneidet, und
  110. gegebenenfalls noch ein bisschen Editiert.
  111.  
  112. Das ist nicht besonders gut fuer das Intro oder Demo, da man sich so sehr
  113. wenig mit der Arbeit an dem eigenen Programmierstil beschaeftigt, und das
  114. ist Mist. Aber so laeuft das...
  115.  
  116. Wir werden also langsam mit den Einfachen Bobs beginnen, und das ist schon
  117. schwer genug, und dann langsam die Anzahl hochschrauben, O.K !
  118.  
  119. Also fangen wir erstmal mit dem ganz einfachen Bob an.
  120.  
  121. Erstmal muessen wir ihn Zeichnen..
  122.  
  123. Um etwas Zeit vornerein zu sparen malen wir nur mit 8 Farben, stellt das
  124. also ein. Und wir malen diesmal auf einem NTSC-Schirm. Das koennt ihr ja
  125. wenn ihr die 3.21 Version von Dpaint benutzt die ich euch empfohlen habe,
  126. einstellen. Ansonsten muesst ihr das mit Dpaint 1 malen.
  127. Wir brauchen einen 32*32 Bob. Stell euch bei Dpaint die Coords ein und
  128. zeichnet ein Rechteck mit dem massen 31*31. Da es bei 0 anfaengt zu
  129. Zaehlen, ist das genau das richtige.
  130. Dieses Rechteck setzt ihr dann in die Linke obere Ecke. Malt nun mit 8
  131. Farben, irgendwas dort rein. Evtl. einen Buchstaben, oder ein kleines Logo.
  132.  
  133. Sobald das passiert ist, speichert ihr das GANZE Bild ab und verlasst
  134. Dpaint.
  135. Nun beearbeitet ihr das Bild mit dem Kefrens-Converter.
  136. Laden is klar...Ihr stellt danach das Format auf RAW-Blit..
  137. Jetzt fahrt ihr mit der Maus in den Bereich wo das Bild dargestellt wird.
  138. Ihr seht jetzt ein Fadenkreuz. Nun Fahrt ihr auf die Obere linke Ecke des
  139. Bildes und drueckt den Mausknopf (nich wieder loslassen) Jetzt fahrt ihr in
  140. die Mitte des Screens. Wir ihr seht erscheint ein Netz auf dem Bildschirm.
  141. Es stellt die Wortgrenzen des Blitters dar. Fahrt jetzt auf die unterste
  142. Zeile des Bobs. Wenn ihr bis an die rechte untere grenze fahrt, dann muesst
  143. genau in der Mitte des Bobs ein Strich sein. Gut, jetzt fahrt mit der Maus
  144. weiter nch Rechts, bitte nicht die unterste Linie verlassen. Ihr fahrt
  145. solange bis ein neuer Teilstrich erscheint. Sobald ihr ihn seht, fahrt ihr
  146. soweit zurueck bis der Strich unter dem Y-Achsen Strich der Maus
  147. verschwindet. Jetzt koennt ihr loslassen, endlich !
  148.  
  149. Ihr habt jetzt aus dem Bild den Bob mit Sicherheitsrand ausgeschnitten.
  150. Jetzt koennt ihr dem Ding den Namen `Bob.Raw` geben, und auf Save gehen.
  151. Das mit dem Sicherheitsrand kommt spaeter. Als Grundlage fuer die
  152. Bobbearbeitung soll uns folgendes Listing dienen.
  153. Mit ihm kann man den Eben erstellten Bob auf einem Overscan Bildschirm
  154. Darstellen.
  155.  
  156. Start:
  157. Execbase=       4
  158. Openlibrary=    -408
  159. Vhposr=         $dff006
  160. Forbid=         -30-102
  161. Permit=         -30-108
  162. Bltafwm=        $dff044
  163. Bltalwm=        $dff046
  164. Bltcon0=        $dff040
  165. Bltcon1=        $dff042
  166. Bltamod=        $dff064
  167. Bltdmod=        $dff066
  168. Bltapt=         $dff050
  169. Bltdpt=         $dff054
  170. Dmacon=         $dff096
  171. Intena=         $dff09a
  172. Dmaconr=        $dff002
  173. Bltsize=        $dff058
  174. Cop1lc=         $dff080
  175.  
  176.         Move.w  #$0020,Dmacon
  177.         Move.w  #$4000,Intena
  178.         Move.l  Execbase.w,a6
  179.         Jsr     Forbid(a6)
  180.  
  181.  
  182.         Move.l  #$60000,a0              ; Clearloop -> Fuellt bereich mit
  183.         Move.l  #$9588/4,d0             ; $ff auf.
  184. Clearloop:
  185.         Move.l  #-1,(a0)+
  186.         Dbf     d0,Clearloop
  187.  
  188.  
  189.         Bsr.l   Makecl                  ; Copperliste erstellen
  190.         Bsr.l   Set_bob                 ; Bos setzen
  191.  
  192. Wait:
  193.         Btst    #6,$bfe001
  194.         Bne.s   Wait
  195.  
  196.         Move.l  Execbase.w,a6
  197.         Jsr     Permit(a6)
  198.         Lea     Gfxname(pc),a1
  199.         Jsr     Openlibrary(a6)
  200.         Move.l  d0,a6
  201.         Move.w  #$83e0,Dmacon
  202.         Move.w  #$c000,Intena
  203.         Move.l  38(a6),Cop1lc
  204.         Moveq   #0,d0
  205.         Rts
  206. Makecl:
  207.         Lea     $05f000,a0
  208.         Move.l  a0,$dff080
  209.  
  210.         Move.l  #$00e00006,(a0)+
  211.         Move.l  #$00e20000,(a0)+
  212.         Move.l  #$00e40006,(a0)+
  213.         Move.l  #$00e6002c,(a0)+
  214.         Move.l  #$00e80006,(a0)+
  215.         Move.l  #$00ea0058,(a0)+
  216.         Move.l  #$008e1a64,(a0)+
  217.         Move.l  #$009039d1,(a0)+
  218.         Move.l  #$00920030,(a0)+
  219.         Move.l  #$009400d8,(a0)+
  220.         Move.l  #$01003200,(a0)+
  221.         Move.l  #$01080058,(a0)+
  222.         Move.l  #$010a0058,(a0)+
  223. ;----------------------------------------------
  224.         Move.l  #$01800000,(a0)+
  225.         Move.l  #$0182071d,(a0)+
  226.         Move.l  #$0184088e,(a0)+
  227.         Move.l  #$0186044f,(a0)+
  228.         Move.l  #$0188000f,(a0)+
  229.         Move.l  #$018a000c,(a0)+
  230.         Move.l  #$018c0008,(a0)+
  231.         Move.l  #$018e0004,(a0)+
  232. ;----------------------------------------------
  233.         Move.l  #$fffffffe,(a0)+
  234.         Rts
  235. Waitblit:
  236.         Btst    #6,Dmaconr              ; Auf Blitter warten
  237.         Bne.s   Waitblit
  238.         Rts
  239. Set_bob:
  240.         Bsr.s   Waitblit
  241.         Move.w  #$ffff,Bltafwm
  242.         Move.w  #$ffff,Bltalwm
  243.         Move.w  #%0000100111110000,Bltcon0
  244.         Move.w  #0,Bltamod              ; Quellmodulo = 0 (rawblit)
  245.         Move.w  #38,Bltdmod             ; Zielmodulo = 38 (planes = $2c)
  246.         Move.l  #$5e000,Bltapt          ; Quelladr.
  247.         Move.l  #$61088,Bltdpt          ; Zieladr.
  248.         Move.w  #96*64+3,Bltsize        ; Bltsize und Start
  249.         Rts
  250.  
  251. Gfxname:        dc.b "graphics.library",0
  252.  
  253. >Extern         "bob.raw",$5e000
  254.  
  255.  
  256. Das Programm ist sehr einfach gehalten. Schaut euch aber die Set_Bob
  257. Routine gut an. Mit ihr wird im Laufe des Bobabschnitts eine Ganze Menge
  258. passieren.
  259. Ihr koennt die Farben aendern, damit euer Bobs die Orginal Farben. Ihr
  260. koennt das ausprobieren, oder ihr schreibt euch einfach die Farbwerte aus
  261. den Dpaint ab.
  262. Ich habe zwar eine Clear-Routine drin, sie Cleart aber nicht sondern fuellt
  263. den ganzen Bereich mit $ff, somit erhaelt alles eine Farbe, und man kann
  264. den Sicherheitsabstand sehr gut erkennen, denn er ist auch von grosser
  265. Wichtigkeit.
  266.  
  267. Ueberlegt euch schonmal was der naechste Schritt waere, wenn wir anhand
  268. zwei fester Koordinaten, die Adresse ausrechnen wollen an der der Bob
  269. dargestellt werden soll, und wie man so etwas mit einfachen Befehlen
  270. ermitteln kann.
  271.  
  272. Ari Viderci
  273.  
  274.                 Jeff Kandle
  275.