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

  1.           A S S E M B L E R - K U R S       (c)  Jeff Kandle 1991
  2.  
  3.                                 32.Teil...
  4.  
  5. Mahlzeit, Leuts...
  6. Wollen wir mal die in den letzten paar Teilen vorgekommenen
  7. Programmierkniffe anwenden, und eine in einem fruehere Kursteil vorgekommene
  8. Routine ansehen, und verstehen.
  9. Es handelt sich um eine Punkt Setz/Loesch-routine, die den Punkt anhand der
  10. X und Y Koordinate, und der Playfieldbase setzt.
  11. Ich habe die Routine damals einfach so reingesetzt, ohne ihr besonders viel
  12. beachtung zu schenken. Das hat sich aber jetzt etwas geaendert. Ich habe
  13. die letzten paar Tage an einem Dots(Punkte) Demo gearbeitet und da ist mir
  14. diese Routine wieder eingefallen die ich damals mal irgendwo abgetippt
  15. hatte.
  16. Frueher war sehr viel noetig um ein Bit zu setzen, ich meine frueher auf
  17. dem 64er. Naja, viel auch nicht, aber mit dem 68000 ist halt alles
  18. einfacher, und der Bset oder Bclr-befehl nimmt uns mehrere Logische
  19. Operationen ab.
  20. Also, ueberlegen wir uns mal was alles fuer das setzen eines Punktes mit
  21. uebergabe der X und Y Koordinate noetig ist.
  22.  
  23. Als erstes kommt da erstmal die X-Koordinate. Wir muessen dort erstmal die
  24. Anzahl der Bytes errechnen die wir ueberbruecken koennen. Mit Words waere
  25. das natuerlich einfacher, aber der Bset/clr Befehl kann im normalen
  26. Speicher nur Bytemaessig setzen und loeschen, also rechnen wir das aus.
  27. Normalerweise, wuerde man jetzt den Divs oder Divu-Befehl benutzen, weil er
  28. halt einfach teilt. Die letzten Teile des Kurses haben aber genau davon
  29. abgeraten, weil er ja so langsam ist. Also, shiften wir das Wort in D0
  30. dreimal nach rechts, was ja /8 entspricht. So, jetzt haben wir ja die
  31. Anzahl der Bytes, vom Linken Rand des Ausgabe Fensters, die wir einfach zur
  32. Byteanzahl die sich aus
  33. Y-Koordinate * (Bytes pro Zeile) + Playfieldbase
  34. errechnet.
  35. Dann haben wir das genaue Byte in den die Aktion stattfinden soll.
  36. Aber, wie kommen wir an das zu setzende Bit in dem Byte.
  37. Wieder durch 8 Teilen ?. Solange 8 abziehen bis ein wert >8 rauskommt. Das
  38. dauert viel zu lange. Man benutzt einfach am anfang den Divu befehl, denn
  39. er teilt und gibt das ergebnis und den Rest aus. Der rest steht dann im
  40. oberen Wort des Ergebnisses. Da der Rest aber die anzahl der Bits vom
  41. linken Byterand angeben wuerde, und der Bset/Bclr Befehl aber die anzahl
  42. der Bytes von rechten Byterand braucht, muessen wir das ergebnis noch von
  43. -1 abziehen, und wir haben das zusetzende Bit ausgerechnet.
  44. Damit haben wir dann auch die Nummer des Bits errechnet. Zusammen mit der
  45. Playfield_Base und den zu addierenden Werte aus X und Y Koordinate koennen
  46. wir den Punkt setzen/loeschen.
  47.  
  48. Die fertige Routine hat allerdings noch ein kleines Schmankerl, wie es nur
  49. von sehr wenigen Programmierern genutzt wird, naemlich selbstmodifikation
  50. des Programms. Was nichts anderes heisst als wie das sich das Programm
  51. selber umschreiben kann. Im Programm wird das so genutzt, das wenn es von
  52. Anfang an ab dem Label `Clear` gestartet wird, es nur den Bset Befehl am
  53. ende des Programmes in eine Bclr Befehl umwandelt, die berechnung bleibt
  54. dieselbe. Am Ende des Programms wir der Bclr-befehl dann wieder in Bset
  55. umgewandelt. Beim Aufruf ab `Set` wird einfach alles beim alten gelassen.
  56.  
  57. Hier mal die Routine, aber Dokumentiert...
  58.  
  59. Clear:  Move.b  #$B5,Label+1    ; Aendert Bset in Bclr
  60. Set:    Divu    #8,D0           ; Teilt durch 8, um Byteanzanzahl zu
  61.                                 ; erhalten - Rest im oberen Word
  62.         Mulu    #40,D1          ; Y-Koordinate * Bytes pro zeile
  63.         Add.w   D0,D1           ; Bytes fuer X plus Y Bytes
  64.         Swap    D0              ; holt oberes Wort nach vorne,
  65.         Moveq   #-1,D2          ; um es von -1 in D2 abzuziehen
  66.         Sub.b   D0,D2
  67. Label:  Bset    D2,(A5,D1)      ; Zu setzendes Bit in D2 vermerkt, setzt
  68.                                 ; Bit in Adresse die sich aus Playfieldbase
  69.                                 ; in A5 und +(Bytes) in D1 zusammensetzt
  70.         Move.b  #$F5,Label+1    ; setzt eventl. veraenderung durch die
  71.                                 ; selbstmodifikation zurueck
  72.         Rts
  73.  
  74. Natuerlich sollte, wenn die Routine fuer einen Dots-Effekt benutzt wird,
  75. der Teil fuer die Selbstmodifaktion geloescht werden, da man den Bildschirm
  76. ja sowieso mit dem Blitter loescht. Desweiteren, sollte man die Mulu
  77. Funktion durch eine Tabelle ersetzen, aus der man die Werte die fuer eine
  78. bestimmt Y-Position uebernehmen kann, ersetzt werden. Den Divu befehl
  79. sollte man lassen, da das ersetzen durch schnellere Befehle nichts bringt,
  80. im gegentum, es ist die schnellste loesung die mir im moment einfaellt.
  81.  
  82. Ich schaetze das es sehr viel schneller nicht mehr geht so etwas zu
  83. berechnen. Schneller kann man nur noch werden, wenn man den Gedanken mit
  84. der X und Y Koordinate fallen laesst, und fuer den Y Wert schon die
  85. Komplette Byteanzahl in der tabelle hat, und somit das ausrechnen durch
  86. Mulu, oder das auslesen der Tabelle von der ich sprach wegfaellt.
  87.  
  88. Mit dieser Routine, wie sie dort steht schafft man ohne Double-Buffering
  89. (dazu Spaeter mehr) knapp 400 Punkte mit Bewegung und Loeschen durch den
  90. Blitter. Dabei sollte das Rotieren der Koordinaten und das loeschen des
  91. Bildschirmausschnitts im VBI gestartet werden. Die Punktsetz-Routine sollte
  92. dann sofort unter dem VBI beginnen, wobei man daran denken muss, das sich
  93. darstellung und bearbeitung nicht ueberschneiden, sonst bekomt man nicht so
  94. gute ergebnisse.
  95. Die 400 Punkte koennen natuerlich auch nicht auf dem ganzen Bildschirm
  96. verteilt sein, mit einem 64 * 64 Feld kann man auch schon ganz schoene
  97. Effekte erzielen. Alles was groesser wird geht auf kosten der Dots anzahl
  98. pro Zentimeter auf dem Bildschirm. Natuerlich sieht ein 64*64 Sinus mit 3
  99. Punkten pro Zentimeter besser aus als einen mit nur 1. Grosse Sinuskurven,
  100. sind mit 3 Dots/cm gar nicht realisierbar, jedenfalls nicht mit unseren
  101. mitteln, aber sind sehen auch bei 1Dot/cm, noch sehr gut aus.
  102.  
  103. Also, macht euch ein kleine Sinustabelle, und lasst die Routine drueber
  104. laufen, und durch veraenderung einige Parameter im auslesen lassen sich
  105. schoene Effekte erzielen.
  106.  
  107. Allerdings ist die Zeit die man fuer die Punkte braucht bei der selben
  108. anzahl Punkte immer dieselbe, so das man auch groessere Sinen ablaufen
  109. lassen kann. Tja, da gibt es aber ein Problem, naemlich die Zeit.
  110. Wenn ich einen 64*64 Sinus als Kreis auf den Bildschirm bringe, und durch
  111. Rotation der Tabelle einen Effekt zaubere, dann darf ich in dem Bereich wo
  112. die Punkte sind nichts machen. Ich darf den Blitter nicht loeschen lassen,
  113. ich darf die Punktesetzroutine nicht laufen lassen und das Rotieren der
  114. Tabelle geht auch nicht, da alles sichtbar waere, weil die veraenderungen
  115. ja sofort auf dem Bildschirm zu sehen waeren.
  116. Also kommen wir zum oben erwaehnten Doublebuffering.
  117. Die Technik ist folgende: Das erste Bild wird vor dem Start der
  118. Endlosroutine ausgerechnet. Es liegt z.B. bei $30000 Der Rasterstrahl baut
  119. dieses Bild auf. Gleichzeitig arbeitet der Prozessor und der Blitter an dem
  120. zweiten Bild, welches bei z.B $40000 liegt. Sobald der Amiga mit der
  121. darstellung des ersten Bildes fertig ist, setzt man die Bitplanepointer
  122. fuer den naechsten durchlauf auf die Plane bei $40000. Wenn diese
  123. dargestellt wir koennen wir die alte bei $30000 loeschen, und die neuen
  124. Punkte setzen. Dann geht wieder alles von vorne los. Somit haben wir den
  125. Kompletten Bildschirm zeit fuer den Aufbau des Bildschirm, und muessen
  126. nicht auf ueberschneidungen mit dem Rasterstrahl achten. Das laeuft ganz
  127. gut, solange man nicht den ganzen Bildschirm fuer Dots benutzt. Sobald das
  128. aber gemacht wird, muessen wir diese Technik noch eine Stufe weitertreiben.
  129. Treblebuffering - Waehrend Bild A angezeigt wird, instruiert der Prozessor
  130. den Blitter Bild B zu loeschen und baut Bild C, waehrend der Blitter
  131. arbeitet, auf.
  132. Ich schaetze ihr koennt das selber realisieren, und werde deshalb dazu kein
  133. Programm liefern. Allerdings ein kleine Dots Routine werde ich mal
  134. dabeipacken. An ihr koennt ihr dann schon mal sehen, wie ich die Routine
  135. eingebaut habe, und wie man Zeit spart. Ich habe die einzelen Aktionen
  136. farblich auf dem Bildschirm gekennzeichnet.
  137.  
  138. Rot  -  Blitter loescht altes Bild
  139. Gruen-  Prozessor baut neues Bild auf
  140. Gelb -  Tabelle wird rotiert
  141.  
  142. Baut mal die von mir angeprochenen verbesserungen ein, und versucht die
  143. Zeit auf ein Minimun zu reduzieren.
  144.  
  145. Start:
  146. Execbase=       4
  147. Openlibrary=    -408
  148. Vhposr=         $dff006
  149. Forbid=         -30-102
  150. Permit=         -30-108
  151. Dmacon=         $dff096
  152. Intena=         $dff09a
  153. Dmaconr=        $dff002
  154. Bltdmod=        $dff066
  155. Bltafwm=        $dff044
  156. Bltcon0=        $dff040
  157. Bltcon1=        $dff042
  158. Bltdpt=         $dff054
  159. Bltapt=         $dff050
  160. Bltsize=        $dff058
  161.  
  162.  
  163.         Move.w  #$0020,dmacon
  164.         Move.w  #$4000,intena
  165.         Move.l  execbase,a6
  166.         Jsr     forbid(a6)
  167.         Bsr.l   makecl
  168.         Bsr.l   clearscreen
  169.         Bsr.l   kreis
  170. Wait:   Cmpi.b  #$72,$dff006
  171.         Bne.s   wait
  172.         Move.w  #$0400,$dff180
  173.         Bsr.l   blitclear
  174.         Move.w  #$0040,$dff180
  175.         Bsr.l   kreis
  176.         Move.w  #$0440,$dff180
  177.         Bsr.l   rotate
  178.         Move.w  #$0000,$dff180
  179. Maus:   Btst    #6,$bfe001
  180.         Bne     wait
  181.         Move.l  execbase,a6
  182.         Jsr     permit(a6)
  183.         Lea     gfxname(pc),a1
  184.         Jsr     openlibrary(a6)
  185.         Move.l  d0,a6
  186.         Move.w  #$83e0,dmacon
  187.         Move.w  #$c000,intena
  188.         Move.l  38(a6),$dff080
  189.         Moveq   #0,d0
  190.         Rts
  191. Makecl:
  192.         Lea     $07f000,a0
  193.         Move.l  a0,$dff080
  194.         Move.l  #$008e3081,(a0)+
  195.         Move.l  #$009030c1,(a0)+
  196.         Move.l  #$00920038,(a0)+
  197.         Move.l  #$009400d0,(a0)+
  198.         Move.l  #$01001200,(a0)+
  199.         Move.l  #$00e00003,(a0)+
  200.         Move.l  #$00e20000,(a0)+
  201.         Move.l  #$01080000,(a0)+
  202.         Move.l  #$01800000,(a0)+
  203.         Move.l  #$01820fb0,(a0)+
  204.         Move.l  #$fffffffe,(a0)+
  205.         Rts
  206. Set:
  207.         Divu    #8,d0
  208.         Mulu    #40,d1
  209.         Add.w   d0,d1
  210.         Swap    d0
  211.         Move.b  #-1,d2
  212.         Sub.b   d0,d2
  213.         Bset    d2,(a5,d1)
  214.         Rts
  215. Kreis:
  216.         Move.w  #238,d3
  217.         Lea     sinus,a0
  218.         Lea     sinus+120,a1
  219.         Lea     $3000e,a5
  220.         Move.w  (a0)+,d0
  221.         Addq    #6,a0
  222.         Move.w  (a1)+,d1
  223.         Addq    #4,a1
  224.         Bsr.s   set
  225.         Moveq   #0,d0
  226.         Moveq   #0,d1
  227.         Dbf     d3,loop
  228.         Rts
  229. Rotate:
  230.         Lea     Sinus,a0
  231.         Move.l  a0,a1
  232.         Add.l   #8,a1
  233.         Move.w  #476,d0
  234.         Move.l  (a0),a2
  235.         Move.l  4(a0),a3
  236. Roloop:
  237.         Move.l  (a1)+,(a0)+
  238.         Dbf     d0,roloop
  239.         Move.l  a2,(a0)
  240.         Move.l  a3,4(a0)
  241.         Rts
  242. Sinus:
  243.         Dc.w    $0020,$0020,$0021,$0022,$0023,$0023,$0024,$0025
  244.         Dc.w    $0026,$0027,$0027,$0028,$0029,$002A,$002A,$002B
  245.         Dc.w    $002C,$002C,$002D,$002E,$002F,$002F,$0030,$0031
  246.         Dc.w    $0031,$0032,$0033,$0033,$0034,$0034,$0035,$0036
  247.         Dc.w    $0036,$0037,$0037,$0038,$0038,$0039,$0039,$003A
  248.         Dc.w    $003A,$003B,$003B,$003B,$003C,$003C,$003C,$003D
  249.         Dc.w    $003D,$003D,$003E,$003E,$003E,$003E,$003F,$003F
  250.         Dc.w    $003F,$003F,$003F,$003F,$003F,$003F,$003F,$003F
  251.         Dc.w    $003F,$003F,$003F,$003E,$003E,$003E,$003E,$003D
  252.         Dc.w    $003D,$003D,$003C,$003C,$003C,$003B,$003B,$003A
  253.         Dc.w    $003A,$003A,$0039,$0039,$0038,$0038,$0037,$0037
  254.         Dc.w    $0036,$0035,$0035,$0034,$0034,$0033,$0032,$0032
  255.         Dc.w    $0031,$0030,$0030,$002F,$002E,$002E,$002D,$002C
  256.         Dc.w    $002C,$002B,$002A,$0029,$0029,$0028,$0027,$0026
  257.         Dc.w    $0026,$0025,$0024,$0023,$0022,$0022,$0021,$0020
  258.         Dc.w    $0020,$0020,$001F,$001E,$001D,$001C,$001C,$001B
  259.         Dc.w    $001A,$0019,$0019,$0018,$0017,$0016,$0016,$0015
  260.         Dc.w    $0014,$0013,$0013,$0012,$0011,$0011,$0010,$000F
  261.         Dc.w    $000F,$000E,$000D,$000D,$000C,$000B,$000B,$000A
  262.         Dc.w    $000A,$0009,$0009,$0008,$0008,$0007,$0007,$0006
  263.         Dc.w    $0006,$0005,$0005,$0005,$0004,$0004,$0003,$0003
  264.         Dc.w    $0003,$0003,$0002,$0002,$0002,$0002,$0001,$0001
  265.         Dc.w    $0001,$0001,$0001,$0001,$0001,$0001,$0001,$0001
  266.         Dc.w    $0001,$0001,$0002,$0002,$0002,$0002,$0002,$0003
  267.         Dc.w    $0003,$0003,$0004,$0004,$0004,$0005,$0005,$0006
  268.         Dc.w    $0006,$0007,$0007,$0007,$0008,$0008,$0009,$000A
  269.         Dc.w    $000A,$000B,$000B,$000C,$000C,$000D,$000E,$000E
  270.         Dc.w    $000F,$0010,$0010,$0011,$0012,$0012,$0013,$0014
  271.         Dc.w    $0015,$0015,$0016,$0017,$0018,$0018,$0019,$001A
  272.         Dc.w    $001B,$001B,$001C,$001D,$001E,$001F,$001F,$0020
  273.         Dc.w    $0020,$0021,$0021,$0022,$0023,$0024,$0025,$0025
  274.         Dc.w    $0026,$0027,$0028,$0028,$0029,$002A,$002B,$002B
  275.         Dc.w    $002C,$002D,$002E,$002E,$002F,$0030,$0030,$0031
  276.         Dc.w    $0032,$0032,$0033,$0034,$0034,$0035,$0035,$0036
  277.         Dc.w    $0036,$0037,$0038,$0038,$0039,$0039,$0039,$003A
  278.         Dc.w    $003A,$003B,$003B,$003C,$003C,$003C,$003D,$003D
  279.         Dc.w    $003D,$003E,$003E,$003E,$003E,$003E,$003F,$003F
  280.         Dc.w    $003F,$003F,$003F,$003F,$003F,$003F,$003F,$003F
  281.         Dc.w    $003F,$003F,$003E,$003E,$003E,$003E,$003D,$003D
  282.         Dc.w    $003D,$003D,$003C,$003C,$003B,$003B,$003B,$003A
  283.         Dc.w    $003A,$0039,$0039,$0038,$0038,$0037,$0037,$0036
  284.         Dc.w    $0036,$0035,$0035,$0034,$0033,$0033,$0032,$0031
  285.         Dc.w    $0031,$0030,$002F,$002F,$002E,$002D,$002D,$002C
  286.         Dc.w    $002B,$002A,$002A,$0029,$0028,$0027,$0027,$0026
  287.         Dc.w    $0025,$0024,$0024,$0023,$0022,$0021,$0020,$0020
  288.         Dc.w    $0020,$001F,$001E,$001E,$001D,$001C,$001B,$001A
  289.         Dc.w    $001A,$0019,$0018,$0017,$0017,$0016,$0015,$0014
  290.         Dc.w    $0014,$0013,$0012,$0012,$0011,$0010,$0010,$000F
  291.         Dc.w    $000E,$000E,$000D,$000C,$000C,$000B,$000B,$000A
  292.         Dc.w    $0009,$0009,$0008,$0008,$0007,$0007,$0006,$0006
  293.         Dc.w    $0006,$0005,$0005,$0004,$0004,$0004,$0003,$0003
  294.         Dc.w    $0003,$0002,$0002,$0002,$0002,$0001,$0001,$0001
  295.         Dc.w    $0001,$0001,$0001,$0001,$0001,$0001,$0001,$0001
  296.         Dc.w    $0001,$0001,$0002,$0002,$0002,$0002,$0003,$0003
  297.         Dc.w    $0003,$0004,$0004,$0004,$0005,$0005,$0005,$0006
  298.         Dc.w    $0006,$0007,$0007,$0008,$0008,$0009,$0009,$000A
  299.         Dc.w    $000A,$000B,$000C,$000C,$000D,$000D,$000E,$000F
  300.         Dc.w    $000F,$0010,$0011,$0011,$0012,$0013,$0014,$0014
  301.         Dc.w    $0015,$0016,$0016,$0017,$0018,$0019,$0019,$001A
  302.         Dc.w    $001B,$001C,$001D,$001D,$001E,$001F,$0020,$0020
  303.         Dc.w    $0020,$0020,$0021,$0022,$0023,$0023,$0024,$0025
  304.         Dc.w    $0026,$0027,$0027,$0028,$0029,$002A,$002A,$002B
  305.         Dc.w    $002C,$002C,$002D,$002E,$002F,$002F,$0030,$0031
  306.         Dc.w    $0031,$0032,$0033,$0033,$0034,$0034,$0035,$0036
  307.         Dc.w    $0036,$0037,$0037,$0038,$0038,$0039,$0039,$003A
  308.         Dc.w    $003A,$003B,$003B,$003B,$003C,$003C,$003C,$003D
  309.         Dc.w    $003D,$003D,$003E,$003E,$003E,$003E,$003F,$003F
  310.         Dc.w    $003F,$003F,$003F,$003F,$003F,$003F,$003F,$003F
  311.         Dc.w    $003F,$003F,$003F,$003E,$003E,$003E,$003E,$003D
  312.         Dc.w    $003D,$003D,$003C,$003C,$003C,$003B,$003B,$003A
  313.         Dc.w    $003A,$003A,$0039,$0039,$0038,$0038,$0037,$0037
  314.         Dc.w    $0036,$0035,$0035,$0034,$0034,$0033,$0032,$0032
  315.         Dc.w    $0031,$0030,$0030,$002F,$002E,$002E,$002D,$002C
  316.         Dc.w    $002C,$002B,$002A,$0029,$0029,$0028,$0027,$0026
  317.         Dc.w    $0026,$0025,$0024,$0023,$0022,$0022,$0021,$0020
  318.         Dc.w    $0020,$0020,$001F,$001E,$001D,$001C,$001C,$001B
  319.         Dc.w    $001A,$0019,$0019,$0018,$0017,$0016,$0016,$0015
  320.         Dc.w    $0014,$0013,$0013,$0012,$0011,$0011,$0010,$000F
  321.         Dc.w    $000F,$000E,$000D,$000D,$000C,$000B,$000B,$000A
  322.         Dc.w    $000A,$0009,$0009,$0008,$0008,$0007,$0007,$0006
  323.         Dc.w    $0006,$0005,$0005,$0005,$0004,$0004,$0003,$0003
  324.         Dc.w    $0003,$0003,$0002,$0002,$0002,$0002,$0001,$0001
  325.         Dc.w    $0001,$0001,$0001,$0001,$0001,$0001,$0001,$0001
  326.         Dc.w    $0001,$0001,$0002,$0002,$0002,$0002,$0002,$0003
  327.         Dc.w    $0003,$0003,$0004,$0004,$0004,$0005,$0005,$0006
  328.         Dc.w    $0006,$0007,$0007,$0007,$0008,$0008,$0009,$000A
  329.         Dc.w    $000A,$000B,$000B,$000C,$000C,$000D,$000E,$000E
  330.         Dc.w    $000F,$0010,$0010,$0011,$0012,$0012,$0013,$0014
  331.         Dc.w    $0015,$0015,$0016,$0017,$0018,$0018,$0019,$001A
  332.         Dc.w    $001B,$001B,$001C,$001D,$001E,$001F,$001F,$0020
  333.         Dc.w    $0020,$0021,$0021,$0022,$0023,$0024,$0025,$0025
  334.         Dc.w    $0026,$0027,$0028,$0028,$0029,$002A,$002B,$002B
  335.         Dc.w    $002C,$002D,$002E,$002E,$002F,$0030,$0030,$0031
  336.         Dc.w    $0032,$0032,$0033,$0034,$0034,$0035,$0035,$0036
  337.         Dc.w    $0036,$0037,$0038,$0038,$0039,$0039,$0039,$003A
  338.         Dc.w    $003A,$003B,$003B,$003C,$003C,$003C,$003D,$003D
  339.         Dc.w    $003D,$003E,$003E,$003E,$003E,$003E,$003F,$003F
  340.         Dc.w    $003F,$003F,$003F,$003F,$003F,$003F,$003F,$003F
  341.         Dc.w    $003F,$003F,$003E,$003E,$003E,$003E,$003D,$003D
  342.         Dc.w    $003D,$003D,$003C,$003C,$003B,$003B,$003B,$003A
  343.         Dc.w    $003A,$0039,$0039,$0038,$0038,$0037,$0037,$0036
  344.         Dc.w    $0036,$0035,$0035,$0034,$0033,$0033,$0032,$0031
  345.         Dc.w    $0031,$0030,$002F,$002F,$002E,$002D,$002D,$002C
  346.         Dc.w    $002B,$002A,$002A,$0029,$0028,$0027,$0027,$0026
  347.         Dc.w    $0025,$0024,$0024,$0023,$0022,$0021,$0020,$0020
  348.         Dc.w    $0020,$001F,$001E,$001E,$001D,$001C,$001B,$001A
  349.         Dc.w    $001A,$0019,$0018,$0017,$0017,$0016,$0015,$0014
  350.         Dc.w    $0014,$0013,$0012,$0012,$0011,$0010,$0010,$000F
  351.         Dc.w    $000E,$000E,$000D,$000C,$000C,$000B,$000B,$000A
  352.         Dc.w    $0009,$0009,$0008,$0008,$0007,$0007,$0006,$0006
  353.         Dc.w    $0006,$0005,$0005,$0004,$0004,$0004,$0003,$0003
  354.         Dc.w    $0003,$0002,$0002,$0002,$0002,$0001,$0001,$0001
  355.         Dc.w    $0001,$0001,$0001,$0001,$0001,$0001,$0001,$0001
  356.         Dc.w    $0001,$0001,$0002,$0002,$0002,$0002,$0003,$0003
  357.         Dc.w    $0003,$0004,$0004,$0004,$0005,$0005,$0005,$0006
  358.         Dc.w    $0006,$0007,$0007,$0008,$0008,$0009,$0009,$000A
  359.         Dc.w    $000A,$000B,$000C,$000C,$000D,$000D,$000E,$000F
  360.         Dc.w    $000F,$0010,$0011,$0011,$0012,$0013,$0014,$0014
  361.         Dc.w    $0015,$0016,$0016,$0017,$0018,$0019,$0019,$001A
  362.         Dc.w    $001B,$001C,$001D,$001D,$001E,$001F,$0020,$0020
  363.         Dc.w    $20,$20,$20,$20,$20,$20,$20,$20
  364.  
  365. Clearscreen:
  366.         Move.w  #10239/2,d0
  367.         Lea $30000,a0
  368. Clloop:
  369.         Clr.w   (a0)+
  370.         Dbf     d0,clloop
  371.         Rts
  372. Blitclear:
  373.         Move.w  #%0000000100000000,bltcon0
  374.         Move.w  #32,bltdmod
  375.         Move.l  #$3000e,bltdpt
  376.         Move.w  #$40*64+4,bltsize
  377. Blwait:
  378.         Btst    #14,Dmaconr
  379.         Bne.s   blwait
  380.         Rts
  381.  
  382. Gfxname:        dc.b "graphics.library",0
  383.  
  384. So, das war mal wieder genug fuer Heute...Wieder viel zu viel Source drin,
  385. aber das ist halt etwas handfestes..
  386.  
  387.                 Jeff Kandle
  388.