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

  1.           A S S E M B L E R - K U R S       (c)  Jeff Kandle 1990
  2.  
  3.                                 10.Teil...
  4.  
  5. So, was wollten wir machen...achja das Schwingende Logo...mmmh, da habt ihr
  6. euch aber was vorgenommen. Es ist ganz im gegentum zu den anderen sache
  7. superleicht zu verstehen, allerdings mit der realisation ist es so eine
  8. sache, wir werden dazu Mininum 5 - 6 voellig neue Befehle, mit bisher
  9. noch nie dagewesener Funktion. Naemlich die Logischen Verknuepfungen, mit
  10. And und Oder, Not und Eor. Alles boemische Doerfer fuer euch, ich will ich
  11. allerdings jetzt noch nichts davon erzaehlen, denn ich will es so wie
  12. bisjetzt halten das ich den Neuen Befehl erst Benutze und dann erklaere was
  13. ich mit ihm gemacht habe. So versteht man sehr schnell. Oder versteht ihr
  14. jetzt schon was `Ausmaskieren des Oberen Kontrollwortes` heisst, seht ihr !
  15.  
  16. Also, los gehts !!!
  17.  
  18. Ein teil des Problems koennen wir schon anhand des Kinoscrollers erklaeren.
  19. Man verstellt die Pointer beim Kinoteil immer um eine Zeile. Beim
  20. Titschenden Logo stellen wir die Pointer immer um die kleinste einheit die
  21. ein Wort betraegt, nach links oder rechts.
  22. Das in feinen abstaenden wird sogenanntes Hardscrolling ergeben.
  23. Das aller ding saehe mit verlaub `ein bisschen Scheisse` aus, deshalb
  24. benutzen wir ein wahrhaft fantastisches register..naemlich
  25. BPLCON1 = $DFF102.
  26.  
  27. Ihr erinnert euch..mit BPLCON0 konnte man schon eine menge machen.
  28. Dieses register beherbergt neben anderen tollen sachen auch noch die
  29. Scrollwerte fuer die geraden und die ungerade planes, und mit
  30. diesen scrollwerten koennen wir die Planes 0 bis 15 Pixel
  31. nach rechts schieben, ist doch toll. So koennen wir durch geschicktes
  32. Kombinieren von Hard- und Softscrolling jede Position auf dem Bildschirm
  33. vom logo einnehmen lassen.
  34.  
  35. Vergegenwaertigen wir uns mal wie das errechnen der hard- und
  36. softscrollwerte von statten gehen muesste.
  37.  
  38. ...Wir schauen uns erstmal die Position an, an der das Teil Stehen soll.
  39. Dann versuchen wir mit hardscrolling so nah wie moeglich ranzukommen.
  40. So nah wie moeglich heisst, innerhalb der naechsten 15 Pixel. Dann stellen
  41. wir den rest noch mit den Scrollwerten fuer das Softscrolling ein. So
  42. einfach ist das.
  43.  
  44. Mal konkret...Wir haben ein Normales Playfield wie wir es dauernd benutzen,
  45. mit den Massen 320*256. Die 256 wollen wir mal jetzt weglassen, wir gehen
  46. mal von einem Einzeilenlogo aus, welches genau ein Wort breit ist.
  47. Der Bildschirm hat 320 position, das entspricht 20 woertern a 16 Pixel.
  48.  
  49. Wir wollen unser `Logo` an der position 78 darstellen. Jetzt kommt der
  50. Vorzug der hexdezimalen schriebweise. Bei dezimal muss man jetzt erst
  51. grossartig durch divideren herausfinden wieviel mal die 16 darin ist,
  52. dammit man die Hardscrollposition heraus findet, dann muesste mann das
  53. nochmal machen damit man den Genauen rest, zum einstellen des
  54. Softscrollings ermitteln.
  55.  
  56. In Hexadezimaler darstellung heisst 78 aber $4e, und da haben wir alle
  57. beide positionen schon fertig. Man muss nur noch die 4 nehmen muss und als
  58. Hardscrollzeiger nehmen. Die softscrollpositioen habe wir automatisch in
  59. dem rest stehen, diese E bytes koennen wir direkt in das BPLCON1 register
  60. schreiben wo wir ja die Soften werte einstellen.
  61.  
  62. So koennen wir relativ einfach eine bewegung erzeugen. Schrieben wir nun
  63. eine Routine, die Anhand dieses `Steuerwertes` die Position fuer das Logo
  64. errechnet. Der plane begin ist $40000, die Breite wie gehabt 320, das logo
  65. ist ein wort breit. Damit wir ohne groessere Multiplikationen auskommen
  66. muessen, benutzen wir einige neue Befehle. Fangen wir mal an ich erklaeren
  67. jetzt mal jeden einzelnen schritt.
  68.  
  69. Der kontroll wert ist am anfang der Routine schon in D0....und es ist eben
  70. diese $4e von eben, so kann ich beschreiben was nach jedem Schritt passiert
  71. mit dem Kontrollwort.
  72.  
  73.  
  74.         Move.w d0,d7            ; Erstmal sichern da zwei aktionen mit
  75.                                 ; mit dem Kontrollwert gemacht werden.
  76.  
  77.         Divs #16,d0             ; Dividiert durch 16 ergibt 4, somit habe
  78.                                 ; ich den wert fuer das Hardscrollregister.
  79.                                 ; Da Hexadezimal alles abgerundet wird,
  80.                                 ; weil es keine kommastellen gibt.
  81.  
  82.         Add.w d0,d0             ; Wert verdoppeln, da eine Position also
  83.                                 ; ein wort ja Zwei Bytes in der Plane
  84.                                 ; bedeuten.
  85.  
  86.         Move.l #$00040000,d1    ; Grundadresse der Bitplane setzen.
  87.  
  88.         Add.w d0,d1             ; Errechnete Position in der Bitplane
  89.                                 ; zu der Grundadresse dazu addieren. So
  90.                                 ; erhaelt man die endgueltige Position !
  91.  
  92.         Move.l d1,Bpl1pt        ; Und ab in den Bitplanepointer.
  93.  
  94.  
  95. So jetzt kommt der Teil mit dem Softscrolling...
  96.  
  97.  
  98.         Move.w d7,d0            ; Wert neu nach D0 schreiben.
  99.  
  100.  
  101. Da wir die $4 vor dem E nicht brauchen koennen, muessen wir sie irgendwie
  102. loswerden. In unserem ganz speziellen fall koennten wir natuerlich -$40
  103. schreiben, aber wenn andere wert auf kreuzen kommen wir nich an das
  104. gewuenschte Ziel oder wir schiessen in den Minus Bereich. Das wollen wir ja
  105. nicht. Also setzen wir dem Prozessor eine Augenklappe auf. Das ist
  106. natuerlich nur sinnbildlich zuverstehen. Aber es ist in der tat so das wir
  107. dem Prozessor die Bits Markieren die er sehen kann. Nach dem Prinzip
  108. koennten wir einfach dieses Kontroll wort nehmen, und dem Prozessor sagen
  109. das er nur die letzten 4 bits sehen kann. Denn die sind ja im endeffekt nur
  110. noch interresant fuer uns. Also wollen wir sehen wie man das macht.
  111.  
  112.         And.w #%0000000000001111,d0
  113.  
  114. Merke: Dieses And hat nichts mit der Addition von Zahlen zu tun, sondern es
  115. ist wie ein Filter. Das funktioniert so...
  116.  
  117. Der Prozessor nimmt beide werte, und verknuepft sie miteinander. Das
  118. ergebnis haengt von der Funktion ab..Bei And ist das Ergebnis-Bit gesetzt
  119. wenn auch das Quell-Bit `UND` das Ziel Bit gesetzt sind. Bei unserem
  120. Beispiel koennen das nur die ersten 4 Bits sein. Jetzt mal Bildlich
  121.  
  122.         Quelle    %0000000001001110     = $4e
  123.         And       %0000000000001111     = $0f
  124.         -------------------------------------
  125.         Ziel      %0000000000001110     = $0e
  126.  
  127. Tolle sache ne..
  128.  
  129.  
  130. Man koennte das And wort auch so sehen...
  131.  
  132.         And       %------------````
  133.  
  134. Wobei - sperrt, und ` durchlaesst.
  135.  
  136.  
  137. Jetzt haben wir in D0 nur noch die SoftPosition stehen, und die koennen wir
  138. direkt ind das BPLCON1 register setzen..
  139.  
  140.         Move.l d0,BPLCON1
  141.  
  142.         Rts
  143.  
  144. So, das war die Routine, sehr ausfuehrlich beschrieben oder ?
  145.  
  146.  
  147. Diese Routine koennte die Steuerung fuer dieses Einwort Logo uebernehmen.
  148. Allerdings nimmt man fuer Logo halt immer groessere Objekte. Und damit man
  149. die nicht jedesmal soo ein riesiges Paket Daten kopieren muss. Setzen wir
  150. einfach das Logo schon auf das Bild, Und verschieben nur noch das ganze
  151. bild.
  152.  
  153.  
  154. Ich will jetzt aber nicht wieder ein Listing hiereinpumpen sondern wir
  155. werden Horizontal und VertikalScrolling erstmal ruhen lassen um uns etwas
  156. anderem Widmen, naemlich...
  157.  
  158. 13.Der Vertikal Blanking Interrupt
  159.  
  160. Bevor ich mit den Groesseren Demoreifen sachen Anfangen solltet ihr diesen
  161. doch sehr Wichtigen teil des Amigas kennenlernen.
  162.  
  163. Ich habe euch doch schon von dem Vertikal Blanking bereich erzaehlt. Das
  164. war doch der bereich der so gut fuer manipulationen an dem Bildschirm und
  165. an der Copperliste ist weil dort vom Amiga noch nichts gemacht wird und
  166. noch keine Copperliste Aktiv ist. Dieser VB bereich liegt zwischen 0 und
  167. $3f. Wir haben ihn bisjetzt ja immer mit unserer einfachen Warteschleife
  168.  
  169. Wait:   Cmpi.b #$00,VHposr
  170.         Bne.s Wait
  171.  
  172. abgefragt.
  173. Das ist Theoretisch richtig, aber der Computer macht dann alles Zweimal pro
  174. bildschirm aufbau. Denn die 0 tritt zweimal auf einmal bei $00 und einmal
  175. bei $100, denn die $1 vor den Nullen testen wir ja nicht, also passiert
  176. alles zweimal pro durchlauf. Verhindern koennten wir dies indem wir diese 1
  177. auch noch abfragen. Die Routine dafuer lautet...
  178.  
  179.  
  180. Wait:   move.l  $dff004,d0              ; Rasterpos holen
  181.         and.l   #$1ff00,d0              ; alles unwichtige ausmaskieren
  182.         cmp.l   #$1000,d0               ; Zeile 16 ($10) erreicht ?
  183.         bne.s   Wait                    ; noe...
  184.  
  185. Das waere die Abfrage fuer die Wirkliche Position $10.
  186. Allerdings ist das mit den Abfragen so eine Sache. Man kann ohne ihren
  187. Rythmus zu beeinflussen nicht allzuviel dazwischen setzen, und das ist bei
  188. manchen sache ja noetig. Stellen wir uns nur mal vor ihr bastelt ein Musik
  189. demo zusammen. Ihr habt 10 musikstuecke a 30 KB, und ihr habt eine normale
  190. Soundtrackerroutine. Diese muss in regelmaessigen Abstaenden, und zwar alle
  191. 50 stel Sekunde, aufgerufen werden. Der Bildschirm wird alle 50 stel
  192. sekunde aufgebaut, und den Anfang fragen wir ja ab. Wenn wir dann aber noch
  193. einbauen das er, damit es schnell geht, immer wenn die gewuenschte position
  194. noch nicht erreicht ist, mal schnell die tasten F1 bis F10 fuer die
  195. einzelnen musikstuecke abfragen, und falls eine gedrueckt war wird das Flag
  196. fuer die neue Musik gesetzt. So falls der Prozessor ganz knapp vor der
  197. Gewueschten Zeile abfragt kriegt er ja nur gesagt das sie es noch nicht
  198. ist. Er fragt dann wieder alles ab...Und solche sachen Koennen mitunter
  199. sehr lange dauern. Und dann faengt es an zu Flackern, dieses Flackern sieht
  200. man bei schlecht programmierten Intros und Demos. Und weil wir das nicht
  201. wollen, muessen wir uns etwas ausdenken oder etwas benutzen was ganz
  202. bestimmt diese Sachen die Flackern koennten zu einem ganz bestimmten
  203. Zeitpunkt durchfuehrt egal was passiert.
  204.  
  205. Dazu muessen wir aber nichts neues programmieren sondern etwas vom Amiga
  206. benutzen, denn er hat die selben schwierigkeiten wie wir. Er behilft sich
  207. mit einem Interrupt, naemlich dem VBI, Vertikal Blanking Interrupt.
  208.  
  209. Erst muss ich erklaeren was ueberhaupt ein Interrupt ist. Interrupt heisst
  210. abbrechen, wie bei Coitus Interruptus, was viele ja schon kennen duerften.
  211.  
  212. Beim Computer ist es aber mehr eine Unterbrechung da die arbeit nach der
  213. unterbrechung wieder aufgenommen wird.
  214. Es ist ungefaehr wie wenn ihr jetzt diese Saetze lest und das Teflon
  215. bimmelt, ihr nehmt ab, Quatscht kurz oder lang, legt wieder auf, denkt nach
  216. wo ihr dran wart, und lest weiter.
  217.  
  218. Nicht anderes macht ein Computer, sobald er das Signal `IRQ` kriegt macht
  219. er einen Generalinterrupt. Zuerst rettet er alle Arbeitsregisterinhalte
  220. D0-D7 und A0-A7, auf den Stack. Dann analysiert er was fuer ein Interrupt
  221. das war, das steht in einem ganz bestimmten register, dann springt er
  222. indirekt je nach Interruptart ueber einen ganz bestimmten Zeiger zum
  223. Programm das im Falle eines Interrupts ausgefuehrt werden soll.
  224.  
  225. Es gibt alle moeglichen Interrupts, uns interresiert aber im Moment nur
  226. einer, halt der VBI, der Vertikal Blanking Interrupt.
  227.  
  228. Er wird ausgeloest wenn der Computer beim Bildschirm aufbau auf diesen
  229. Bereich trifft. Nachdem der Prozessor weiss das es der VBI war, springt er
  230. in die Adresse die in $0000006c steht, und fuehrt das Programm aus was dort
  231. steht. Da liegt unsere Chance auf einen wirklich regelmaessigen Zeitpunkt
  232. zum ausfuehren unserer Routinen zu kommen. Wir muessen nur die alte adresse
  233. nehmen und irgend wo sichern, und dann unsere eigene hinschreiben. So
  234. einfach ist das. Natuerlich muessen wir vor verlassen des Intros oder der
  235. Routine den Alten VBI wieder aktivieren. Und ganz wichtig ist halt das wir
  236. den VBI nicht mit all dem anderen Interrupts ausschalten, dazu kommen wir
  237. noch.
  238. Wenn ich eine Ganz bestimmte Tabelle hier finde werde ich euch ein paar
  239. befehle geben die man nur waehrend eines Interrupts benutzen kann, warum ?
  240.  
  241. ...Es gibt zwei modi in denen der Prozessor betrieben werden kann
  242.  
  243. 1.User Modus
  244. 2.Supervisor Modus
  245.  
  246. Wir arbeiteten jetzt immer nur im User modus, das wird auch im grossen und
  247. ganzen so bleiben, aber erstmal die erklaerung.
  248.  
  249. Im Supervisor modus ist es als wenn ein Zweiter Prozessor arbeiten koennte,
  250. das ist noetig damit z.b Fehler noch fuer die Guru meldung analysiert
  251. werden kann. Sobald eine Exception (ausnahmesituation) auftritt, der
  252. Interupt gehoert auch dazu, wechselt der Prozessor in den Supervisor Modus.
  253.  
  254. Dies ist auch gleichzeitig die Einzige moeglichkeit in diesen Zustand zu
  255. gelangen. Wir wollen aber nur wissen was das ist und deshalb werden wir
  256. auch nur indirekt in diesem Modus arbeiten. Wiegesagt es kommen ein paar
  257. befehle dazu, aber alle alten sind noch vorhanden.
  258.  
  259. Sobald der Prozessor dann auf den Rueckkehr-befehl trifft, holt er die
  260. alten Daten vom Stapel und macht weiter als waere nichts geschehen.
  261.  
  262. Dieser Rueckkehr Befehl heisst `RTE` Return from Exception.
  263.  
  264. Der Vorteil liegt klar auf der Hand..wir initialisieren einmal diesen
  265. Interrupt, und koennen ein Endlosschleife gemuetlich auf alle moeglichen
  266. sachen warten lassen. Wir koennen Tausende Tasten abfragen, neue Flags fuer
  267. die Musiken setzen, der Prozessor unterbricht uns dann zwar immer, aber das
  268. ist ja das was wir wollen, das die Routine die Zeitkritisch sind immer zu
  269. einem Ganz bestimmten Zeitpunkt abgearbeitet wird. Verloren geht uns auch
  270. nichts, weil ja alle sachen die wichtig sind vor der eigentlichen Routine
  271. gerettet werden.
  272. ein kleines Beispiel fuer die Noetigen sachen fuer den VBI....Die
  273. ernsthafte anwendung folgt spaeter.
  274.  
  275. Zuerst alle Interrupts loeschen.
  276.  
  277.         Move.w #$7fff,intena
  278.  
  279. Dann alten interupt wert an einer bestimmten stelle im Source retten...
  280.  
  281.         Move.l #$006c.w,Oldirq
  282.  
  283. Und nun den neuen wert schrieben..
  284.  
  285.         Move.l #Newirq,$006c.w
  286.  
  287. Nun koennen wir den VBI anschalten..
  288.  
  289.         Move.w #$c020,Intena
  290.  
  291. und unser programm irgendwas machen lassen...Wichtig ist nur das das
  292. Programm mit dem Label `Newirq` steht, es wird direkt beim naechsten VBI
  293. abgearbeitet.
  294.  
  295. Newirq: blabla #55,97
  296.         Blablabla soundso
  297.  
  298. und am enden der Routine muss dann dieses
  299.  
  300.         Rte
  301.  
  302. stehen damit der Prozessor wieder an unserem normalen programm arbeiten
  303. kann.
  304.  
  305. So einfach ist das. Arbeiten werden wir allerdings erst ein bisschen
  306. spaeter damit. Da ich jetzt erstmal ein paar Effekte Programmieren muss,
  307. damit ich die euch praesentieren kann, es koennte also drei vier Tage
  308. dauern bis ich mich wieder melden.
  309.  
  310. Vergesst mich nicht
  311.  
  312.                 Jeff Kandle
  313.