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

  1.           A S S E M B L E R - K U R S       (c)  Jeff Kandle 1990
  2.  
  3.                                  4.Teil...
  4.  
  5. So, O.K ich wollte euch ja erklaeren wie das mit dem Openlibrary geht.
  6. Es ist eine Funktion wie Forbid oder Permit, nur unterscheidet man sie,
  7. weil sie noch parameter zum arbeiten braucht, und zwar...
  8.  
  9. In D0 die Versionsnummer der Library. Es koennte im laufe der zeit einer
  10. auf die Idee kommen, mal eine neue graphics.library zu schreiben,
  11. natuerlich kann man dann die alte nicht einfach weglassen, sondern sie muss
  12. weiter bestandteil des Amigas sein. Um sich nicht einen Neuen namen
  13. einfallen lassen zu muessen, gibt man einfach eine hoehere Versionsnummer
  14. an, und bekommt automatisch die Library die man will
  15. gibt man keine versionsnummer an, sucht der Amiga automatisch die erste aus
  16. und oeffnet sie.
  17.  
  18. In A1 die Adresse, des Namens der Library. Man hat die Library`s nicht
  19. durchnummeriert weil ja immer wieder neue dazu kommen, deshalb gibt man ihr
  20. den namen, des gebietes in dem sie Eingesetzt wird. Findet der befehl diese
  21. Library nicht im Speicher dann sucht er im `LIBS` verzeichnis auf der Disk,
  22. erst wenn sie da nicht ist, gibt er einen FehlerCode zurueck. Falls das
  23. Oeffnen der Library erfolgreich war gibt der Befehl in D0 die Adresse
  24. zurueck an der die Library jetzt Betriebsbereit liegt.
  25. Diese Adresse, muessen wir uns merken, denn mit ihr muessen wir die
  26. Funktionen die wir aufrufen, aufrufen.
  27.  
  28. Um z.b die Graphics.library zu oeffnen muesste dieses Programm geschrieben
  29. werden.
  30.  
  31.  
  32. Execbase = 4
  33. Openlibrary = -552
  34.  
  35. Start:  Move.l Execbase,a6      ; Execbase als grundstock der Execlibrary
  36.         Clr.l d0                ; Version Egal
  37.         Move.l #gfxname,a1      ; Adresse wo der name der zu oeffnenden
  38.                                 ; Library steht nach a1, muss mit 0 enden
  39.         Jsr Openlibrary(a6)     ; Oeffnen
  40.         Move.l d0,gfxbase       ; Basis der Graphics-library merken.
  41.         Rts
  42.  
  43. Gfxname:        dc.b "graphics.library",0
  44. even
  45. Gfxbase:        dc.l 0
  46.  
  47. Puuuhh, eine Menge neues, naja, das mit dem Oeffnen der Library muesste
  48. jetzt klar sein.....Also was haben wir neues. Erstmal der neue Assembler
  49. befehl `Clr`, duerfte eigentlich klar sein, Clr heisst Clear. Er loescht
  50. das Byte, Word oder Langword in der/dem angegebenen Adresse/Register, mehr
  51. nicht.
  52.  
  53. So aber was da unter kommt ist Vielleicht etwas Schwieriger, aber sehr
  54. wichtig. Wie ihr in der zeile wo ich a1 die adresse des names gebe, sage
  55. ich #gfxname. Das heisst, die Adresse von dem Wort uebergeben. Der
  56. Unterschied zu einem Label besteht darin, das dieses graphics.library
  57. wirklich im Speicher steht, wollt ihr es sehen. Gut dann tippt das ab und
  58. assembliert es. Dann geht ihr in den kommando modus, und tippt `q start`
  59. und drueckt return, jetzt gibt der Seka einen Speicher auszug aus, und zwar
  60. genau 128 bytes nach dem label start. da unser programm aber nicht so lang
  61. ist koennen wir das wort graphics.library gut sehen. Alles O.K...
  62.  
  63. Was noch neu ist, ist das reservieren, von langwoertern oder so, fuer einen
  64. ganz bestimmten Zweck. Bei meinem Beispiel wurde ein Langword reserviert,
  65. damit ich da die Adresse der graphics.library hineinschreiben. So muss ich
  66. kein kostbares register verschwenden, und da hat es einen sicheren platz.
  67.  
  68. Ihr muesst allerdings zwischen Seka- und Assembler befehlen unterscheiden
  69.  
  70. Dieses Dc.(b,w,l) ist ein Seka befehl, und tritt nicht im fertigen Programm
  71. auf. Genauso verhaelt es sich mit dem `Even` zwischen Gfxname und Gfxbase.
  72.  
  73. Der Amiga kann keine Worter oder Langwoerter in Ungerade Adressen
  74. schreiben. Im normalfall interrssiert uns das auch nicht, da alle
  75. Befehle `Rund` sind. Aber der name `graphics.library` ist gerade, aber die
  76. null hinten dran macht es ungerade. dem Seka waere es Egal, er reserviert
  77. nur den Platz fuer ein langwort, da er aber weiss das der prozessor darauf
  78. allergisch reagieren wird, gibt er die fehlermeldung `word at Odd adress`
  79. aus. Dies verhindern wir indem wir mit dem Even befehl. ein fuellbyte
  80. einschieben, das den PC wieder gerade biegt.
  81.  
  82. So alles verstanden...
  83.  
  84. Nun dann wollenb wir mal dazu kommen was wir eigentlich von der
  85. graphicslibrary wollen.
  86. Funktionen wollen wir keine benutzen, sondern nur einen Wert.
  87. Der Amiga, so hatte ich euch schon erzaehlt merkt sich die Adresse der
  88. Ersten copperliste die er fuer das CLI errechnet hat, in einem Stueck
  89. speicher das vor den funktioen der graphicslibrary liegt, diese Tabelle ist
  90. vor vielen Library`s, und wir koennen sie einfach auslesen, wir muessen nur
  91. wissen was wir wollen, und wo das liegt.
  92. Also, wir wollen uns ja die adresse der ersten Copperliste holen...
  93.  
  94. Und zwar steht dieser wert an der 38.sten stelle in dieser tabelle, da
  95. diese tabelle am anfang der library steht, brauchen wir nur 38 zu dem wert
  96. in d0 dazuzuzaehlen, und schon haben wir die adresse.
  97.  
  98. Also, das war doch nicht schwer, oder ?
  99.  
  100. O.k, jetzt kommt nur nur eins, bis wir Theoretisch schon eine Copperliste
  101. Kreieren koennen....Wie sage ichs dem Copper das er eine andere liste
  102. benutzen soll.
  103. Grossartig sagen muss ich im da nichts, denn der Copper ist so vergesslich
  104. das er sich jedesmal vor einem Bildschirmaufbau, die adresse der
  105. Copperliste die er zu bearbeiten hat aus den Registern Cop1lch und Cop1lcl
  106. holt.
  107. Sie liegen bei $dff080 und $dff082, man kann sie aber gemeinsam
  108. ansprechen, indem man einfach die adresse als langword nach $dff080
  109. schreibt, er verteilt dann die Bits schon richtig.
  110. Sobald er das naechste mal dieses Register ausliesst kriegt er unseren
  111. Wert, und arbeitet Anstandslos unsere Liste ab, dull wa ?
  112.  
  113. Also, jetzt zum verstaendnis der letzen 100 zeilen mal ein kleines
  114. prograemchen, ist zwar noch nicht lauffaehig, ist ja auch nur
  115. anschauungsmodell, also nicht abtippen.
  116.  
  117. Execbase = 4
  118. Openlibrary = -552
  119. CIAapra = $BFE001
  120. Cop1lc  = $DFF080
  121. Forbid = -132
  122. Permit = -138
  123.  
  124. Start:  Move.l Execbase,a6      ; Vorbereitungen fuer Forbid und
  125.                                 ; Openlibrary.
  126.         Jsr Forbid(a6)          ; Forbid
  127.         Clr.l d0                ; Versionsnummer Egal
  128.         Lea gfxname,a1          ; Name der zu oeffnenden Lib nach A1
  129.         Jsr Openlibrary(a6)     ; Graphics.library oeffnen
  130.         Move.l d0,gfxbase       ; Adresse der Lib merken
  131.  
  132.         Move.l #$50000,Cop1lc   ; Adresse der neuen Copperliste nach Cop1lc
  133.  
  134. Wait:   Btst #6,CIAapra         ; Kennt ihr schon
  135.         Bne.s wait
  136.  
  137.         Move.l gfxbase,a0       ; Basisadresse nach a0
  138.         Move.l 38(a0),Cop1lc    ; 38. sten wert einfach nach Cop1lc
  139.                                 ; schreiben
  140.         Jsr Permit(a6)          ; Multitasking erlauben
  141.         Clr.l d0                ; kein returncode
  142.         Rts
  143.  
  144. Gfxname:        dc.b "graphics.library",0
  145. Gfxbase:        dc.l 0
  146.  
  147. Ha, die Programme wachsen so langsam, viel sinn haben sie zwar noch nicht,
  148. aber das kommt doch.
  149.  
  150. Das einzige was jetzt dazu kam war der Lea-befehl, er macht das selbe wie
  151. das was da vorher stand `Move.l #Gfxname,a1` nur halt kuerzer, denn er
  152. weiss das man ein Langwort braucht um eine Adresse zu benutzen, also muss
  153. man es nicht dahinter schreiben.
  154.  
  155. Achja, den Jsr-befehl kennt ihr auch nicht, er ist das gegenstueck zu Rts,
  156. er merkt sich den aktuellen PC bevor er den neuen schreibt. Und da alle
  157. library funktionen mit `Rts` enden, knn ich ihn gut benutzen.
  158.  
  159. So, da wir jetzt wissen wie das drum herum bei einer Coppeliste ist,
  160. koennen wir eigentlich mit der genauen beschreibung der befehle, und ihrer
  161. funktion, und wie man sie dem Copper gibt.
  162.  
  163. 7.Erstellen von Copperliste
  164.  
  165. Eine kompletter befehl des Coppers besteht immer aus zwei woertern.
  166. Beim Move-befehl sieht es so aus das zuerst das register kommt was
  167. angesprochen werden soll, kommt. Und dann der Wert der da rein soll.
  168.  
  169. Da der Copper nur die Register des Amigas ansprechen kann, muss kein
  170. komplettes langword als adresse benutzt werden es reicht der hintere teil.
  171.  
  172. Fuer uns liegt Color00 in $DFF180, fuer den Copper liegt es in $0180.
  173.  
  174. Also, ein Befehl der Copperliste der die farbe in Color00 auf gold setzt
  175. saehe im speicher so aus
  176.  
  177. $01800fb0
  178.  
  179. Die erste vier nibbles geben an welches register, und die zweiten welcher
  180. wert.
  181.  
  182. Etwas anders ist es beim Wait befehl, der hat ein richtiges befehls Wort,
  183. naemlich $fffe. Er hat den wert den er bearbeitet vor sich stehen, wobei
  184. das erste Byte die Zeile, und das Zweite Byte der pixel in der Zeile.
  185.  
  186. Der normale Wait befehl sieht also im Speicher so aus...
  187.  
  188. $8054fffe
  189.  
  190. Dieser Befehl wuerde bis zeile $80, und dem Pixel $54 warten und dann weiter
  191. machen.
  192.  
  193. So, dann koennten wir ja jetzt etwas Copperlistenmaessiges auf die Beine
  194. stellen.
  195. Halt, eines noch...Das ende einer Copperliste markiert man mit $fffffffe.
  196. es stellt einen Wait befehl dar, dessen zeile niemals erreicht werden kann,
  197. weil es sie nicht gibt, also wartet der Copper unendlich. Solange er das
  198. Signal kriegt das ihn veranlasst die liste von neuem zu durchlaufen.
  199.  
  200. Ich werde die Copperliste, auch wieder mit der reservierung funktion des
  201. Seka`s im Listing unterbringen, so das ihr da nach herzenlust dran
  202. rumprobieren koennt.....
  203.  
  204. Doch hier erstmal, das erste vernuenftige Listing..
  205.  
  206.  
  207. Execbase = 4
  208. Openlibrary = -552
  209. CIAapra = $BFE001
  210. Cop1lc  = $DFF080
  211. Forbid = -132
  212. Permit = -138
  213.  
  214. Start:  Move.l Execbase,a6      ; Vorbereitungen fuer Forbid und
  215.                                 ; Openlibrary.
  216.         Jsr Forbid(a6)          ; Forbid
  217.         Clr.l d0                ; Versionsnummer Egal
  218.         Lea gfxname,a1          ; Name der zu oeffnenden Lib nach A1
  219.         Jsr Openlibrary(a6)     ; Graphics.library oeffnen
  220.         Move.l d0,gfxbase       ; Adresse der Lib merken
  221.  
  222.         Move.l #copperliste,Cop1lc ; Adresse der Copperliste nach Cop1lc
  223.  
  224. Wait:   Btst #6,CIAapra         ; Kennt ihr schon
  225.         Bne.s wait
  226.  
  227.         Move.l gfxbase,a0       ; Basisadresse nach a0
  228.         Move.l 38(a0),Cop1lc    ; 38. sten wert einfach nach Cop1lc
  229.                                 ; schreiben
  230.         Jsr Permit(a6)          ; Multitasking erlauben
  231.         Clr.l d0                ; kein returncode
  232.         Rts
  233.  
  234. Gfxname:        dc.b "graphics.library",0
  235. even
  236. Gfxbase:        dc.l 0
  237. Copperliste:
  238.  
  239. dc.w $0180,$0000
  240. dc.w $8001,$fffe
  241. dc.w $0180,$0f00
  242. dc.w $a00f,$fffe
  243. dc.w $0180,$0000
  244.  
  245. copperlistenende:
  246. dc.l $-2                ; ende der copperliste , -2 = $fffffffe
  247.  
  248. End:
  249.  
  250.  
  251. Es waere besser wenn ihr euch das rausschneidet, mit dem Editor und dann
  252. direkt in den Seka einladet, vergesst aber nicht das Suffix (.S)
  253. dranzuhaengen, sonst koennt ihr es nicht mit `R` einladen.
  254.  
  255. So, zum listing...Eure eigenen ideen koennt ihr zwischen Copperliste und
  256. copperlistenende einfuegen.
  257. Dei $8001 bei dem Ersten Wait befehl habe ich gewaehlt damit ihr seht warum
  258. man sie normal nicht nimmt, da diese $8001 schon am rechten rand erscheint,
  259. um wirklich erst am Linken rand auf die neue farbe umzuschalten muesst ihr
  260. als Pixel position immer 0f benutzen, so wie beim Zweiten Wait befehl, da
  261. ist es ja $a00f...
  262.  
  263. Eigentlich muesste das jetzt klar sein, falls nicht kann es nicht viel
  264. sein, also schreibt mir ruhig, ich habe immer ein offenes ohr...
  265.  
  266. Beim Naechsten mal malen wir ein Bild mit Dpaint, und bringen es auf den
  267. Bildschirm, O.K ?
  268.  
  269. bis denne
  270.  
  271.                 Jeff Kandle
  272.