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

  1.           A S S E M B L E R - K U R S       (c)  Jeff Kandle 1991
  2.  
  3.                                 33.Teil...
  4.  
  5. Wollen wir das Listing aus dem Letzten Kursteil doch mal ueberarbeiten und
  6. versuchen es schneller zu machen.
  7. Suchen wir erstmal logisch ab, und versuchen eine Loesung zu finden.
  8.  
  9. 1. Die hin und her springerei im Programm tut der Geschwindigkeit bestimmt
  10. nicht so gut. Also setzen wir anstelle des
  11.  
  12. Bsr.s   Set
  13.  
  14. in der Kreisroutine, direkt die Routine `Set` in die Kreisroutine.
  15. Das anspringen von Programme dauert zwar nicht solange, ebensowenig das
  16. Rts`en, aber bei 239 anspruengen macht sich das schon bemerkbar.
  17.  
  18. 2. Das rotieren der Sinustabelle, koennte ja auch der Blitter machen. Man
  19. muss sich nur mit dem Prozessor das oberste Wort merken, damit man es
  20. hinterher wieder hintendran Pflanzen kann.
  21.  
  22. Das Rotieren mit dem Blitter saehe dann etwas so aus.
  23.  
  24. Blitrotate:
  25.         Move.w  Sinus,Sinbuffer ; Erstes Wort retten
  26.         Move.w  #%0000100111110000,Bltcon0
  27.         Move.l  #-1,Bltafwm
  28.         Move.l  #Sinus+2,Bltapt
  29.         Move.l  #Sinus,Bltdpt
  30.         Move.w  #Anzahl der Zeile der Sintab * 64+8,Bltsize
  31.         Rts
  32.  
  33. Gleichzeitig koennten wir noch die groesse der Elemente aendern. Wir
  34. koennten Bytes nehmen. Da der Blitter aber nur mit Worten arbeitet, wird
  35. immer eine Koordinate uebersprungen, was aber nicht so schlimm ist, da die
  36. bewegung eh noch etwas langsam ist. Die grosse Vorteil ist dann, das die
  37. Zeit die der Blitter braucht halbiert wird.
  38. Achtet allerdings auf die veraenderungen im Listing, da es der 68000 sehr
  39. krumm nimmt wenn man etwas an eine ungerade stelle schreiben, oder von eben
  40. eine solchen lesen, will wenn der Befehl nicht durch `.b` dafuer ausgelegt
  41. ist. Also, vorsicht!
  42.  
  43. Wir warten allerdings nicht auf den Blitter, sondern starten die Aktion vor
  44. der Kreisroutine. Da sich die Punkte dann nur Max. um eine Koordinate
  45. verschieben, macht das nichts aus. Aber wir haben wieder ne menge Zeit
  46. gespart.
  47.  
  48. 3. Machen wir uns mal an die beiden Zeitkiller Nummer eins, in der
  49. Set-routine ran.
  50.  
  51. Divu und Mulu.
  52.  
  53. 3.1 Mulu ist schnell ersetzt, indem wir einfach eine Tabelle erschaffen, in
  54. der die zu den verschiedene Koordinaten gehoerenden Werte fuer die Additon
  55. zur Playfieldbase stehen. die noetigen aenderungen waeren -
  56.  
  57. 3.1.1 Tabelle mit 64 ($3f) Elemente, die immer um 40 ($28) hochgezaehlt
  58.       wird.
  59.  
  60. 3.1.2 Den Mulu #40,d1 befehl durch
  61.  
  62.       Add.w   d1,d1         ; Um auf Worte zu kommen
  63.       Move.w  (a4,d1.w),d1  ; Indirekt aus der Tabelle lesen.
  64.  
  65. ersetzen. Die Addertabelle fuer d1, muss ihn A4 stehen. Wagt es nicht das
  66. jedesmal in der Schleife mit Lea zu erledigen, sondern stellt es vor dem
  67. Aufruf der Kreisroutine, oder vor der Schleife ein.
  68.  
  69. 3.2 Bei Divu kriegen wir da schon mehr schwierigkeiten. Obwohl ich gesagt
  70. habe das ich keine schnellere loesung kenne, habe ich mich doch mal auf die
  71. suche gemacht, und habe selbst etwas rumprobiert. Allerdings suchte ich
  72. immer nach dem Kompletten Divu-ersatz. Den werde ich wohl auch noch laenger
  73. suchen. Aber ich habe mir ueberlegt, das uns ja ein Divu #8 ersatz genuegt.
  74.  
  75. Setzt also anstelle des Divu`s, bitte folgende Zeilen ein -
  76.  
  77.         Ror.l   #3,D0
  78.         Swap    D0
  79.         Rol.w   #3,D0
  80.         Swap    D0
  81.  
  82. Dauert im gegensatz zum echten Divu #8 mit 140 Taktzyklen, nur um die 30
  83. Tz, und das ist doch schon eine ganze Menge.
  84.  
  85. Es gibt noch mehrere kleine Extra die man einbauen koennte, aber das sind
  86. die Groebsten Zeitfresser in dem Listing, ohne sie wird der Dots Effekt
  87. langsam Konkurrenzfaehig.
  88.  
  89. Kommen wir jetzt mal zu den Manipulationsmoeglichkeiten fuer die
  90. Sinus-Kurve selbst.
  91. Dort koennen wir durch einfaches weiterstellen der Zeiger auf die
  92. Sintabelle, sehr schoenen effekte erzeugen.
  93. Die erste Form ist im Listing schon enthalten.
  94.  
  95.         Move.w  (a0)+,d0        ; X-Koordinate nach D0 mit gleichzeitigem
  96.                                 ; weiterstellen auf das naechste Element
  97.         Addq    #6,a0           ; Den Zeiger auf das naechste Element, fuer
  98.                                 ; den naechsten durchlauf weiter nach
  99.                                 ; hinten setzen
  100.         Move.w  (a1)+,d1
  101.         Addq    #4,a1
  102.  
  103. Dadurch wird ereicht das mehrere Element einfach uebersprungen werden, und
  104. somit die X-Kurve schneller durchlauf wird, was eine Elipsen-Form des Sinus
  105. hervorruft.
  106.  
  107. Desweiteren waere noch ein Addieren eines Beliebigen Wertes aus der Sintab
  108. moeglich. Er musste dann vor der bearbeitung der X-Koordinate erfolgen. Man
  109. kann diese Werte auf dieselbe Art und Weise aus der Tabelle holen.
  110. Probiert ruhig ein bisschen mit den Add-Werten rum, die Muster die manchmal
  111. dabei entstehen, sind ein wahrer genuss. Wenn man jetzt noch ueberlegt, wie
  112. begrenzt die moeglichkeiten bei so einen kleine Sinus bzw. bei so einer
  113. kleinen Tabelle sind, da kann man sich nur dasselbe mit einem 200*200 Sinus
  114. freuen.
  115.  
  116. Bleiben wir mal bei dem Thema `Manipulationsmoeglichkeiten`. Wir koennen
  117. allerdings auch von aussen in das geschehen eingreifen, indem wir die Werte
  118. waehrend das Programm laeuft veraendern. Es staenden dafuer die beiden
  119. Add-werte die die Zeiger auf die naechste X- oder Y-Koordinate veraendern,
  120. der Wert der zur ermittelten X-Koordinate zugezogen wird, und die Anzahl
  121. der Punkte zur auswahl.
  122. Davon sucht sich am besten jeder selbst das aus was er am schoensten
  123. findet, oder erweitert die Abfrage nach seinem Geschmack.
  124.  
  125. Dann waere da noch die Frage wie wir in das geschehen eingreifen. Da
  126. staenden wieder drei moeglichkeiten offen. Als da waeren Joystick2, Maus
  127. oder die Tastatur.
  128. Nun, die Maus laesst sich zwar einfach abfragen, ist aber sehr schwer zu
  129. dosieren. Der Joystick waere da schon besser, allerdings artet das so
  130. langsam in Arbeit aus. Die Tastatur zum assemblieren, dann schnell den
  131. Joystick hinter dem Bildschirm her kramen, um das ganze zu veraendern und
  132. zum schluss wieder die Maus betatscht, damit der ganze Spuk ein Ende hat.
  133. Also bleiben wir doch einfach mal bei der Tastatur.
  134. Suchen wir uns noch ein paar schoene Tasten aus..O.K nehmen wir die
  135. Cursortasten, den mehr als Vier brauchen wir ja sowieso nicht. Damit
  136. koennen wir 2 Parameter im laufenden Programm veraendern..Das reicht
  137. erstmal zum kennenlernen.
  138.  
  139. Tasten koennen wir ueber die Seriellen Datenregister der Cia (Computer
  140. Interface Adapter) erhalten. Die Cia im Amiga, und auch in allen anderen
  141. Computer sind zur Kommunikation mit anderen Geraten da, erledigen aber
  142. auch andere Sachen.
  143. Jedenfalls liegt das Register das wir suchen bei $Bfec01 und heisst Ciaaspr
  144. (Cia-A-Seriell Port Register) und ist ein Byte lang, und wie meistens bei
  145. den Cia`s ist es Lowaktiv, daran muessen wir denken bei der Arbeit. Den
  146. Wert den wir dort lesen koennen muessen wir vor der abfrage noch
  147. bearbeiten damit die Orginal-Tasten Codes verwendet werden koennen,
  148. ansonsten kann man die Werte natuerlich auch so uebernehmen, allerdings
  149. muesste man dann immer bevor man einen Buchstaben abfragen will, von hand
  150. nachschauen, welchen Wert er im Ciaaspr hinterlaesst.
  151. Sobald wir diese aufbereitung des Codes haben, koennen wir mit der
  152. Auswertung beginnen. Das folgende Prograemmchen veraendert bei Tastendruck
  153. die Bildschirmfarbe, und ist mit Mausbutton zu verlassen. Das Programm ist
  154. sehr einfach gehalten, und es duerfte nicht schwer sein, es in die
  155. Endlos-Wait schleife des Programm einzusetzen. Ihr koenntet es sofort nach
  156. dem Start der Blitclear-Routine aufrufen, dann waere es auch noch Optimal
  157. in das Listing eingefuegt, und belastet die Gesamtzeit der Routinen nicht.
  158.  
  159. Color00=        $DFF180
  160. Ciaapra=        $BFE001
  161. Ciaaspr=        $BFEC01
  162.  
  163. Holdkey:Move.b  Ciaaspr,D0      ; Wert vom Cia abholen
  164.         Move.b  #$ff,D1         ; Maske fuer Lowaktiv
  165.         Sub.b   D0,D1           ; Lowaktiv umdrehen
  166.         Ror.b   #1,D1           ; Eins nach Rechts
  167.         Cmp.b   #$4c,D1         ; Vergleich `Oben`
  168.         Beq.s   Hoch            ; Ja? Nein-> Weiter
  169.         Cmp.b   #$4d,D1         ; Vergleich `Runter`
  170.         Beq.s   Runter          ; Ja? Nein-> Weiter
  171.         Cmp.b   #$4f,D1         ; Vergleich `Links`
  172.         Beq.s   Links           ; Ja? Nein-> Weiter
  173.         Cmp.b   #$4e,D1         ; Vergleich `Rechts`
  174.         Beq.s   Rechts          ; Ja? Nein-> Weiter
  175.         Btst    #6,Ciaapra      ; Maustest
  176.         Beq.s   Raus            ; Ja?-> Raus, Nein-> Weiter
  177.         Bra.s   Holdkey         ; Zurueck zum Anfang
  178. Raus:   Rts                     ; Raus!
  179. Hoch:   Move.w  #$f00,Color00
  180.         Bra.s   holdkey
  181. Runter:
  182.         Move.w  #$0f0,Color00
  183.         Bra.s   Holdkey
  184. Links:
  185.         Move.w  #$00f,Color00
  186.         Bra.s   Holdkey
  187. Rechts:
  188.         Move.w  #$fff,Color00
  189.         Bra.s   Holdkey
  190.  
  191.  
  192. Denkt dran das dieses ein eigenstaendig laufaehiges Proggy ist..Ihr muesst
  193. es umschreiben, um es einbauen zu koennen.
  194.  
  195. Fuer die Farbveraenderung muesst ihr dann eben nur Parameter ihm Listing
  196. aendern. Ihr koennt dazu die letztens kennengelernte `Selbstmodifikation`
  197. benutzen, oder mit Dc.w oder so, abgelegte Parameter aendern. Denkt daran
  198. das ihr je nach dem wie ihr euch entschieden habt, das listing nochmals
  199. durchzugehen, da man beim einbauen von Routinen oft schlampt, und
  200. manchmal viel vom neuen weglassen kann.
  201.  
  202. Auf diesem Weg der Tastatur abfrage, geht man ja nicht ueber irgendwelche
  203. Betriebssystemroutine (Hatte ich ja versprochen, das wir diese umgehen)
  204. Sondern fragen direkt an der Tastatur nach welche Taste gedrueckt ist.
  205. Da die Tasten durchnummeriert sind, kriegen wir die Werte nicht nach dem
  206. Alphabet geordnet wieder, sondern so wie sie auf der Tastatur geordnet
  207. sind. Deswegen sind die Werte die ich mal hier zusammen gestellt habe, auch
  208. ziemlich chaotisch.
  209.  
  210. F1 - $50        F2 - $51        F3 - $52        F4 - $53        F5 - $54
  211. F6 - $55        F7 - $56        F8 - $57        F9 - $58       F10 - $59
  212. ESC  $45        DEL  $46        HELP $5f        Space $40       `  - $00
  213.  
  214. Alt Links  $64          Alt Rechts  $65
  215.  
  216. Amiga Links $66         Amiga Rechts $67
  217.  
  218. Shift Links $60         Shift Rechts $61
  219.  
  220.  
  221. Cursor  Oben $4c
  222.         Unten $4d
  223.         Rechts $4e
  224.         Links $4f
  225.  
  226. Return $44
  227.  
  228. Backspace $41
  229.  
  230. TAB $42
  231.  
  232. CTRL $63
  233.  
  234. 1.Tastenreihe
  235.  
  236. 1 - $01         2 - $02         3 - $03         4 - $04         5 - $05
  237. 6 - $06         7 - $07         8 - $08         9 - $09         0 - $0a
  238. á - $0b         , - $0c         \ - $0d
  239.  
  240. 2.Tastenreihe
  241.  
  242. q - $10         w - $11         e - $12         r - $13         t - $14
  243. z - $15         u - $16         i - $17         o - $18         p - $19
  244.  - $1a         + - $1b
  245.  
  246. 3.Tastenreihe
  247.  
  248. a - $20         s - $21         d - $22         f - $23         g - $24
  249. h - $25         j - $26         k - $27         l - $28         ” - $29
  250. „ - $2a         # - $2b
  251.  
  252. 4.Tastenreihe
  253.  
  254. < - $30         y - $31         x - $32         c - $33         v - $34
  255. b - $35         n - $36         m - $37         , - $38         . - $39
  256. - - $3a
  257.  
  258. Zehnerblock
  259.  
  260. [ - $5a         ] - $5b         / - $5c         * - $5d
  261. 7 - $3d         8 - $3e         9 - $3f         - - $4a
  262. 4 - $2d         5 - $2e         6 - $2f         + - $5e
  263. 1 - $1d         2 - $1e         3 - $1f
  264. 0 - $f          . - $3c
  265.  
  266. Enter $43
  267.  
  268.  
  269. Das das nur Tastennummern sind koennt ihr daran sehen, das Shift links und
  270. rechts, obwohl dieselbe wirkung einen unterschiedlichen Tastencode haben.
  271.  
  272. Wenn ihr diese Werte selber mal nachpruefen wollt, koennt ihr folgendes
  273. kleine Prograemmchen benutzen. Mit dem habe ich die ganzen Code auch
  274. geholt.
  275. Die benutzung ist relativ einfach. Einfach starten und dann die Taste
  276. druecken, dessen Code man habe will. Taste festhalten, und gleichzeitig die
  277. Maus zum verlassen druecken. Der Gueltige Code steht dann in D1 bei der
  278. Seka-Register ausgabe. Fuer Tasten die den Seka veranlassen den Bildschirm
  279. zu loeschen, habe ich das Ergebnis nochmal im Buffer abgelegt, den man mit
  280. `QBuffer` abfragen kann.
  281.  
  282. Ciaapra=        $bfe001
  283. Ciaaspr=        $bfec01
  284.  
  285. Holdkey:Move.b  Ciaaspr,D0
  286.         Move.b  #$ff,D1
  287.         Sub.b   D0,D1
  288.         Ror.b   #1,D1
  289.         Move.w  d1,Buffer
  290.         Btst    #6,ciaapra
  291.         Bne.s   holdkey
  292.         Rts
  293. Buffer: Dc.w 0
  294.  
  295.  
  296. Viel Spass
  297.  
  298.                 Jeff Kandle
  299.  
  300.