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

  1.           A S S E M B L E R - K U R S       (c)  Jeff Kandle 1990
  2.  
  3.                                  5.Teil...
  4.  
  5.  
  6. Ne, Leute ich hab mirs ueberlegt, wir arbeiten erstmal ein bisschen mit dem
  7. Listing was wir schon haben. Wir widmen uns erst einmal einfachen effekten
  8. mit farben und so. Wir lernen dabei auch erstmal ein paar tolle neue
  9. Sachen, die man in Assembler machen kann. Kopierroutinen, einfachere
  10. Zaehlroutinen, und wie man leichte schwingungen (sinusse) von Hand eingibt.
  11.  
  12. So, jetzt verbessern wir erstmal die Zaehlroutine die wir bei der Sache mit
  13. der Powerled benutzt hatten, wir machen sie einfacher, und gestalten sie so
  14. das man sie Wunderbar auch als Zaehlroutine fuer eine Kopieraktion benutzen
  15. kann...erinnern wir uns, wie hatten wir die Erste Routine gemacht.
  16.  
  17.         Move.w #$5000,d0
  18. Loop:   Sub.w #1,d0
  19.         Bne.s Loop
  20.         Rts
  21.  
  22. Ungefaehr so sah das doch aus oder...Jetzt habe ich aber einen befehl der
  23. Das `Sub` und das `Bne` in sich vereinigt
  24.  
  25. Dbra oder Dbf
  26.  
  27. Dasselbe programm saehe so aus...
  28.  
  29.         Move.w #$5000,d0
  30. Loop:   Dbf d0,loop
  31.         Rts
  32.  
  33. So, was macht der Dbf (Dbra)-befehl. Er zaehlt das hinter ihm angegebene
  34. Rgister eins runter, und verzweigt immer wenn -1 noch nicht erreicht ist,
  35. das ist der Unterschied zum `Bne` Befehl, denn der Verzweigt ja bekanntlich
  36. bei 0.
  37.  
  38. So, jetzt zum Kopieren...das A und O der Intro und Demoschreiberei.
  39. Allerdings muessen wir noch eine Adressierungsart des Move-befehl`s
  40. kennenlernen, besser gesagt zwei...aber das seht ihr ja dann.
  41.  
  42. 8.Indirekte Adressierung
  43.  
  44. Also, eine weitere schoene Sache ist die Indirekte Adressierung. Es sieht
  45. so aus, das in der Quell oder Ziel Spalte, nicht die adresse direkt steht,
  46. sondern nur wo die Adresse steht. Erstmal ein Beispiel mit dem Jmp befehl
  47.  
  48. Stellt euch vor bei $20000 sieht es so aus
  49.  
  50. 00 02 a0 00
  51.  
  52. stellt euch weiter vor irgendwo im SourceCode steht eben jenes Mnemonic
  53.  
  54. ...
  55. ...
  56. ...
  57. Jmp ($20000)
  58. ...
  59. ...
  60. ...
  61.  
  62. Was passiert wenn der Prozessor auf diesen Befehl trifft. Er Analysiert den
  63. Jmp Befehl, sieht das er Indirekt ist. Und holt sich den Wert aus der
  64. Adresse die bei dem Jmp befehl steht, und legt das Langwort das an dieser
  65. Adresse zu finden ist in den PC...den rest kennt ihr ja, vonwegen das er da
  66. jetzt weiterarbeitet und so. Er wuerde also nach $2a000 springen.
  67.  
  68. Was das mit Kopieren zutun hat ist ganz einfach. Sehen wir uns mal ein
  69. Routine an die mit unseren Mitteln geschrieben ist, und die 20 Langwoerter
  70. ab $20000 nach $30000 Kopiert
  71.  
  72. Move.l $20000,$30000
  73. Move.l $20004,$30004
  74. Move.l $20008,$30008
  75. Move.l $2000c,$3000c
  76. Move.l $20010,$30010
  77. Move.l $20014,$30014
  78. Move.l $20018,$30018
  79. Move.l $2001c,$3001c
  80. Move.l $20020,$30020
  81. Move.l $20024,$30024
  82. Move.l $20028,$30028
  83. Move.l $2002c,$3002c
  84. Move.l $20030,$30030
  85. Move.l $20034,$30034
  86. Move.l $20038,$30038
  87. Move.l $2003c,$3003c
  88.  
  89.  
  90. Das geht ja an sich noch, und wenn es auf schnelligkeit ankommt, und es
  91. wirklich `Nur` um 20 Langwoerter handelt kann man es so machen.
  92. Aber was ist wenn man 128000 bytes Kopieren will, 32000 Zeilen Sourcecode
  93. ist ein bisschen viel...Also nehmen wir mal die Vorzuege der indirekten
  94. Adressierung, erst das beispiel mit kurzen Saetzen, und dann die ganze
  95. sache peinlich genau erklaert, den jetzt ist es sehr wichtig, da die
  96. indirekte Adressierung sehr wichtig.
  97.  
  98. Folgendes programm Kopiert ebenfalls 20 langwoerter von $20000 nach $30000
  99.  
  100. Start:  Lea $20000,a0           ; Quell Adresse nach A0
  101.         Lea $30000,a1           ; Ziel Adresse nach A1
  102.         Move.w #19,d0           ; Laenge-1 nach d0, da Dbf bis -1 zaehlt
  103. Loop:   Move.l (a0),(a1)        ; Kopiert wert von $20000 nach $30000,
  104.                                 ; allerdings inidirekt, da ja in A0 und A1
  105.                                 ; die Zeiger auf die stellen stehen.
  106.         Add.l #4,a0             ; Zeiger in A0 auf naechstes Langwort
  107.                                 ; stellen.
  108.         Add.l #4,a1             ; A1 ebenfalls
  109.         Dbf d0,loop             ; Schon 20 mal, nein -> zurueck
  110.         Rts
  111.  
  112. So mehr nicht, das prinzip ist klar, oder ?
  113. Der Vorteil liegt in der Kuerze, denn das programm wird nicht laenger egal
  114. wieviel ich damit kopiere. Ob 30 langwoerter oder 64 Kilobyte, es bleibt
  115. dasselbe programm.
  116.  
  117. Es holt sich erst die Zeiger auf Quell und Ziel bereich in die
  118. Adressregister 0 und 1, den mit denen kann man auch indirekt arbeiten...
  119. Dann wird der Counter nach D0 geholt, wie ich gesagt hatte zaehlt der Dbf
  120. befehl bis minus 1, deshalb muss ich das vorher beruecksichtigen, und die
  121. laenge direkt -1 nehmen. Nachdem er dann von der Quelle die in A0 steht zum
  122. Ziel das in A1 steht ein Langwort kopiert erhoeht er die beiden Zeiger so
  123. dass sie jetzt aus $20004 und $30004 zeigen...usw..nach dem 20.sten
  124. Durchlauf schmeisst der dbf befehl uns raus indem er ueberlesen wird, und
  125. dann kommt der Rts befehl......->
  126.  
  127. Schoen das ist ja recht kurz..aber es geht noch kuerzer
  128.  
  129. Und zwar mit der Indirekten Postinkrementalen Adressierung, oder
  130. Rueckwaerts mit der Indirekten Predekrementalen Adressierung.
  131.  
  132. Hoert sich schwer an, is ess aber nicht...Denn dies Adressierungs art
  133. uebernimmt nur dieses Add.l #4 im SourceCode, indem sie die Zeiger
  134. automatisch erhoeht nachdem gelesen und geschrieben wurde. Besser noch, Wir
  135. muessen gucken was wir dazu addieren, falls wir Woerter kopieren koennen
  136. wir ja nich plus 4 nehmen, dann wuerden fehler auftreten is ja klar, und
  137. bei Byte waere es schlimm...Diese Adressierung schaut auch nach was ich
  138. Kopiert habe, und setzt dementsprechend die Zeiger weiter, das heiss
  139. Kopiert man Bytes setzt sie die Zeiger auf um 1 (byte) weiter, Kopiert man
  140. langwoerter wird das entsprechende Register auch um 4 Byte`s (langwort)
  141. weiter gestellt...Das listing von Eben saehe jetzt so aus
  142.  
  143. Start:  Lea $20000,a0
  144.         Lea $30000,a1
  145.         Move.w #19,d0
  146. Loop:   Move.l (a0)+,(a1)+
  147.         Dbf d0,loop
  148.         Rts
  149.  
  150. Wird ja immer kuerzer....
  151.  
  152. So noch schnell die erklaerung der beiden dollen woerter
  153.  
  154. Post bedeutet `Nachher`, und Inkremental bedeutet erhoehen...Also es wird
  155. Nachher erhoeht
  156.  
  157. Pre bedeutet `Vorher`, und Dekremental bedeutet erniedrigen....also es wird
  158. vorher erniedrigt.
  159.  
  160. Sinn hat das Vielleicht nicht, aber es ist nuetzlich, besonders wenn sich
  161. Quell und ziel bereich ueberlappen. Aber hier erstmnal das listing mit den
  162. Aenderungen wenn es Predekremantal arbeiten soll
  163.  
  164. Start:  Lea $20040,a0           ; Natuerlich muessen wir dann auch ganz
  165.                                 ; hinten anfangen.
  166.         Lea $30040,a1
  167.         Move.w #19,d0
  168. Loop:   Move.l -(a0),-(a1)
  169.         Dbf d0,loop
  170.         Rts
  171.  
  172. Alles klor...
  173.  
  174. So noch eine Kleine Spielerei wenn ihr mal Speicher bereiche Spiegeln
  175. muesst, bei bilder geht es zwar nicht, da die aus Bitplanes bestehen, aber
  176. um texte zu spiegeln oder so reicht sie... Man laesst einfach einen zeiger
  177. ab und den anderen auflaufen, schaut her !
  178.  
  179. Start:  Lea $20000,a0
  180.         Lea $30040,a1
  181.         Move.w #19,d0
  182. Loop:   Move.l (a0)+,-(a1)
  183.         Dbf d0,loop
  184.         Rts
  185.  
  186. Mit ein bisschen logischem denken koennt ihr euch die funktion ja erklaeren,
  187. falls nicht muesst ihr euch das kapitel noch mal durchlesen...
  188.  
  189. Natuerlich kann man mit dieser Geilen Adressierungsart auch noch toll
  190. loeschen...
  191.  
  192. Start:  Lea $20000,a0
  193.         Clr.l d0
  194.         Move.l #$20000,d0
  195. Loop:   Move.l d0,(a0)+
  196.         Dbf d0,loop
  197.         Rts
  198.  
  199. ...loescht 128 Kbyte ab $20000.
  200.  
  201. 9.Weiter mit dem Copper
  202.  
  203. So, will ich noch ein bisschen mit sogenannten billig effekte aufhalten,
  204. weil man sie halt immer wieder braucht, zum Beispiel einen balken der von
  205. oden nach unten zieht.
  206. Als Grundlage nehme ich unser Ersten Copperlisten Programm damit ihr nicht
  207. wieder alles neuabtippen muss. Wir werden zwar bald aus diesen SourceCode
  208. rauswachsen aber im Moment reicht er noch eine Zeit.
  209.  
  210. Also, gehen wir das erstmal Theoretisch durch, wenn ihr es versteht einfach
  211. nicken. Dann werden wir das Programm schritt fuer schritt modifiziern..
  212.  
  213. Nun, wir muessten eigentlich nur die Wait befehle bearbeiten, und zwar nur
  214. die positionen worauf sie warten, das koennten wir mit add machen, und zwar
  215. mit add #$100, damit wir die Zeilen Nummer und nicht den Pixel treffen.
  216. Desweiteren muessen wir natuerlich auch eine Warteschleife einbauen damit
  217. das auch klappt, und nicht zu schnell geht. Also jetzt kommt das listing un
  218. alles was Ergaenzt wurde ist gross geschrieben.
  219.  
  220.  
  221. Execbase = 4
  222. Openlibrary = -552
  223. CIAapra = $BFE001
  224. Cop1lc  = $DFF080
  225. Forbid = -132
  226. Permit = -138
  227.  
  228. Start:  move.l Execbase,a6      ; Vorbereitungen fuer Forbid und
  229.                                 ; Openlibrary.
  230.         jsr Forbid(a6)          ; Forbid
  231.         clr.l d0                ; Versionsnummer Egal
  232.         lea gfxname,a1          ; Name der zu oeffnenden Lib nach A1
  233.         jsr Openlibrary(a6)     ; Graphics.library oeffnen
  234.         move.l d0,gfxbase       ; Adresse der Lib merken
  235.  
  236.         move.l #copperliste,Cop1lc ; Adresse der Copperliste nach Cop1lc
  237.  
  238.  
  239.         LEA COPPERLISTE,A0
  240.         MOVE.W #$5000,D0
  241. Wait:   DBF D0,WAIT
  242.         ADD.W #$100,4(a0)
  243.         ADD.W #$100,12(a0)
  244.  
  245.  
  246.         Btst #6,CIAapra         ; Kennt ihr schon
  247.         Bne.s wait
  248.  
  249.         Move.l gfxbase,a0       ; Basisadresse nach a0
  250.         Move.l 38(a0),Cop1lc    ; 38. sten wert einfach nach Cop1lc
  251.                                 ; schreiben
  252.         Jsr Permit(a6)          ; Multitasking erlauben
  253.         Clr.l d0                ; kein returncode
  254.         Rts
  255.  
  256. Gfxname:        dc.b "graphics.library",0
  257. even
  258. Gfxbase:        dc.l 0
  259. Copperliste:
  260.  
  261. dc.w $0180,$0000
  262. dc.w $200f,$fffe
  263. dc.w $0180,$0f00
  264. dc.w $220f,$fffe
  265. dc.w $0180,$0000
  266.  
  267. copperlistenende:
  268. dc.l $-2                ; ende der copperliste , -2 = $fffffffe
  269.  
  270. End:
  271.  
  272. Erstmal die naechste dazugekommene Adressierungsart, es ist die Indirekte
  273. mit Adressdistanz. Das Heisst, es wird der Angegebene Zeiger genommen, und
  274. die Adressdistanz dazu gezaehlt. Beispiel
  275.  
  276.         Lea $40000,a0
  277.         Move.l #$23452345,$28(a0)
  278.         Rts
  279.  
  280. Es wird erst der zeiger $40000 nach a0 geholt, und dann der Wert $234523345
  281. nach A0 + Distanz geschrieben, das waere dann $40028.
  282. Warum ich das gemacht habe ?..Nun ich habe in A0 die adresse meiner
  283. Copperliste gehabt, und dann habe ich nur noch abgezaehlt anwievielter
  284. stelle die Wait befehle stehen, um sie zu Modifizieren, geschickt, ne?
  285.  
  286. Modifizieren geschieht ja durch Add.w #$100 wie ihr gesehen habt.
  287.  
  288. Das mit der Warte schleife ist ansich ja gut so aber wenn man was auf dem
  289. Bildschirm macht sollte man zu einer anderen loesung greifen, aber dazu das
  290. Naechste mal...
  291.  
  292. Have a nice Night
  293.  
  294.                 Jeff Kandle
  295.