home *** CD-ROM | disk | FTP | other *** search
- A S S E M B L E R - K U R S (c) Jeff Kandle 1991
-
- 33.Teil...
-
- Wollen wir das Listing aus dem Letzten Kursteil doch mal ueberarbeiten und
- versuchen es schneller zu machen.
- Suchen wir erstmal logisch ab, und versuchen eine Loesung zu finden.
-
- 1. Die hin und her springerei im Programm tut der Geschwindigkeit bestimmt
- nicht so gut. Also setzen wir anstelle des
-
- Bsr.s Set
-
- in der Kreisroutine, direkt die Routine `Set` in die Kreisroutine.
- Das anspringen von Programme dauert zwar nicht solange, ebensowenig das
- Rts`en, aber bei 239 anspruengen macht sich das schon bemerkbar.
-
- 2. Das rotieren der Sinustabelle, koennte ja auch der Blitter machen. Man
- muss sich nur mit dem Prozessor das oberste Wort merken, damit man es
- hinterher wieder hintendran Pflanzen kann.
-
- Das Rotieren mit dem Blitter saehe dann etwas so aus.
-
- Blitrotate:
- Move.w Sinus,Sinbuffer ; Erstes Wort retten
- Move.w #%0000100111110000,Bltcon0
- Move.l #-1,Bltafwm
- Move.l #Sinus+2,Bltapt
- Move.l #Sinus,Bltdpt
- Move.w #Anzahl der Zeile der Sintab * 64+8,Bltsize
- Rts
-
- Gleichzeitig koennten wir noch die groesse der Elemente aendern. Wir
- koennten Bytes nehmen. Da der Blitter aber nur mit Worten arbeitet, wird
- immer eine Koordinate uebersprungen, was aber nicht so schlimm ist, da die
- bewegung eh noch etwas langsam ist. Die grosse Vorteil ist dann, das die
- Zeit die der Blitter braucht halbiert wird.
- Achtet allerdings auf die veraenderungen im Listing, da es der 68000 sehr
- krumm nimmt wenn man etwas an eine ungerade stelle schreiben, oder von eben
- eine solchen lesen, will wenn der Befehl nicht durch `.b` dafuer ausgelegt
- ist. Also, vorsicht!
-
- Wir warten allerdings nicht auf den Blitter, sondern starten die Aktion vor
- der Kreisroutine. Da sich die Punkte dann nur Max. um eine Koordinate
- verschieben, macht das nichts aus. Aber wir haben wieder ne menge Zeit
- gespart.
-
- 3. Machen wir uns mal an die beiden Zeitkiller Nummer eins, in der
- Set-routine ran.
-
- Divu und Mulu.
-
- 3.1 Mulu ist schnell ersetzt, indem wir einfach eine Tabelle erschaffen, in
- der die zu den verschiedene Koordinaten gehoerenden Werte fuer die Additon
- zur Playfieldbase stehen. die noetigen aenderungen waeren -
-
- 3.1.1 Tabelle mit 64 ($3f) Elemente, die immer um 40 ($28) hochgezaehlt
- wird.
-
- 3.1.2 Den Mulu #40,d1 befehl durch
-
- Add.w d1,d1 ; Um auf Worte zu kommen
- Move.w (a4,d1.w),d1 ; Indirekt aus der Tabelle lesen.
-
- ersetzen. Die Addertabelle fuer d1, muss ihn A4 stehen. Wagt es nicht das
- jedesmal in der Schleife mit Lea zu erledigen, sondern stellt es vor dem
- Aufruf der Kreisroutine, oder vor der Schleife ein.
-
- 3.2 Bei Divu kriegen wir da schon mehr schwierigkeiten. Obwohl ich gesagt
- habe das ich keine schnellere loesung kenne, habe ich mich doch mal auf die
- suche gemacht, und habe selbst etwas rumprobiert. Allerdings suchte ich
- immer nach dem Kompletten Divu-ersatz. Den werde ich wohl auch noch laenger
- suchen. Aber ich habe mir ueberlegt, das uns ja ein Divu #8 ersatz genuegt.
-
- Setzt also anstelle des Divu`s, bitte folgende Zeilen ein -
-
- Ror.l #3,D0
- Swap D0
- Rol.w #3,D0
- Swap D0
-
- Dauert im gegensatz zum echten Divu #8 mit 140 Taktzyklen, nur um die 30
- Tz, und das ist doch schon eine ganze Menge.
-
- Es gibt noch mehrere kleine Extra die man einbauen koennte, aber das sind
- die Groebsten Zeitfresser in dem Listing, ohne sie wird der Dots Effekt
- langsam Konkurrenzfaehig.
-
- Kommen wir jetzt mal zu den Manipulationsmoeglichkeiten fuer die
- Sinus-Kurve selbst.
- Dort koennen wir durch einfaches weiterstellen der Zeiger auf die
- Sintabelle, sehr schoenen effekte erzeugen.
- Die erste Form ist im Listing schon enthalten.
-
- Move.w (a0)+,d0 ; X-Koordinate nach D0 mit gleichzeitigem
- ; weiterstellen auf das naechste Element
- Addq #6,a0 ; Den Zeiger auf das naechste Element, fuer
- ; den naechsten durchlauf weiter nach
- ; hinten setzen
- Move.w (a1)+,d1
- Addq #4,a1
-
- Dadurch wird ereicht das mehrere Element einfach uebersprungen werden, und
- somit die X-Kurve schneller durchlauf wird, was eine Elipsen-Form des Sinus
- hervorruft.
-
- Desweiteren waere noch ein Addieren eines Beliebigen Wertes aus der Sintab
- moeglich. Er musste dann vor der bearbeitung der X-Koordinate erfolgen. Man
- kann diese Werte auf dieselbe Art und Weise aus der Tabelle holen.
- Probiert ruhig ein bisschen mit den Add-Werten rum, die Muster die manchmal
- dabei entstehen, sind ein wahrer genuss. Wenn man jetzt noch ueberlegt, wie
- begrenzt die moeglichkeiten bei so einen kleine Sinus bzw. bei so einer
- kleinen Tabelle sind, da kann man sich nur dasselbe mit einem 200*200 Sinus
- freuen.
-
- Bleiben wir mal bei dem Thema `Manipulationsmoeglichkeiten`. Wir koennen
- allerdings auch von aussen in das geschehen eingreifen, indem wir die Werte
- waehrend das Programm laeuft veraendern. Es staenden dafuer die beiden
- Add-werte die die Zeiger auf die naechste X- oder Y-Koordinate veraendern,
- der Wert der zur ermittelten X-Koordinate zugezogen wird, und die Anzahl
- der Punkte zur auswahl.
- Davon sucht sich am besten jeder selbst das aus was er am schoensten
- findet, oder erweitert die Abfrage nach seinem Geschmack.
-
- Dann waere da noch die Frage wie wir in das geschehen eingreifen. Da
- staenden wieder drei moeglichkeiten offen. Als da waeren Joystick2, Maus
- oder die Tastatur.
- Nun, die Maus laesst sich zwar einfach abfragen, ist aber sehr schwer zu
- dosieren. Der Joystick waere da schon besser, allerdings artet das so
- langsam in Arbeit aus. Die Tastatur zum assemblieren, dann schnell den
- Joystick hinter dem Bildschirm her kramen, um das ganze zu veraendern und
- zum schluss wieder die Maus betatscht, damit der ganze Spuk ein Ende hat.
- Also bleiben wir doch einfach mal bei der Tastatur.
- Suchen wir uns noch ein paar schoene Tasten aus..O.K nehmen wir die
- Cursortasten, den mehr als Vier brauchen wir ja sowieso nicht. Damit
- koennen wir 2 Parameter im laufenden Programm veraendern..Das reicht
- erstmal zum kennenlernen.
-
- Tasten koennen wir ueber die Seriellen Datenregister der Cia (Computer
- Interface Adapter) erhalten. Die Cia im Amiga, und auch in allen anderen
- Computer sind zur Kommunikation mit anderen Geraten da, erledigen aber
- auch andere Sachen.
- Jedenfalls liegt das Register das wir suchen bei $Bfec01 und heisst Ciaaspr
- (Cia-A-Seriell Port Register) und ist ein Byte lang, und wie meistens bei
- den Cia`s ist es Lowaktiv, daran muessen wir denken bei der Arbeit. Den
- Wert den wir dort lesen koennen muessen wir vor der abfrage noch
- bearbeiten damit die Orginal-Tasten Codes verwendet werden koennen,
- ansonsten kann man die Werte natuerlich auch so uebernehmen, allerdings
- muesste man dann immer bevor man einen Buchstaben abfragen will, von hand
- nachschauen, welchen Wert er im Ciaaspr hinterlaesst.
- Sobald wir diese aufbereitung des Codes haben, koennen wir mit der
- Auswertung beginnen. Das folgende Prograemmchen veraendert bei Tastendruck
- die Bildschirmfarbe, und ist mit Mausbutton zu verlassen. Das Programm ist
- sehr einfach gehalten, und es duerfte nicht schwer sein, es in die
- Endlos-Wait schleife des Programm einzusetzen. Ihr koenntet es sofort nach
- dem Start der Blitclear-Routine aufrufen, dann waere es auch noch Optimal
- in das Listing eingefuegt, und belastet die Gesamtzeit der Routinen nicht.
-
- Color00= $DFF180
- Ciaapra= $BFE001
- Ciaaspr= $BFEC01
-
- Holdkey:Move.b Ciaaspr,D0 ; Wert vom Cia abholen
- Move.b #$ff,D1 ; Maske fuer Lowaktiv
- Sub.b D0,D1 ; Lowaktiv umdrehen
- Ror.b #1,D1 ; Eins nach Rechts
- Cmp.b #$4c,D1 ; Vergleich `Oben`
- Beq.s Hoch ; Ja? Nein-> Weiter
- Cmp.b #$4d,D1 ; Vergleich `Runter`
- Beq.s Runter ; Ja? Nein-> Weiter
- Cmp.b #$4f,D1 ; Vergleich `Links`
- Beq.s Links ; Ja? Nein-> Weiter
- Cmp.b #$4e,D1 ; Vergleich `Rechts`
- Beq.s Rechts ; Ja? Nein-> Weiter
- Btst #6,Ciaapra ; Maustest
- Beq.s Raus ; Ja?-> Raus, Nein-> Weiter
- Bra.s Holdkey ; Zurueck zum Anfang
- Raus: Rts ; Raus!
- Hoch: Move.w #$f00,Color00
- Bra.s holdkey
- Runter:
- Move.w #$0f0,Color00
- Bra.s Holdkey
- Links:
- Move.w #$00f,Color00
- Bra.s Holdkey
- Rechts:
- Move.w #$fff,Color00
- Bra.s Holdkey
-
-
- Denkt dran das dieses ein eigenstaendig laufaehiges Proggy ist..Ihr muesst
- es umschreiben, um es einbauen zu koennen.
-
- Fuer die Farbveraenderung muesst ihr dann eben nur Parameter ihm Listing
- aendern. Ihr koennt dazu die letztens kennengelernte `Selbstmodifikation`
- benutzen, oder mit Dc.w oder so, abgelegte Parameter aendern. Denkt daran
- das ihr je nach dem wie ihr euch entschieden habt, das listing nochmals
- durchzugehen, da man beim einbauen von Routinen oft schlampt, und
- manchmal viel vom neuen weglassen kann.
-
- Auf diesem Weg der Tastatur abfrage, geht man ja nicht ueber irgendwelche
- Betriebssystemroutine (Hatte ich ja versprochen, das wir diese umgehen)
- Sondern fragen direkt an der Tastatur nach welche Taste gedrueckt ist.
- Da die Tasten durchnummeriert sind, kriegen wir die Werte nicht nach dem
- Alphabet geordnet wieder, sondern so wie sie auf der Tastatur geordnet
- sind. Deswegen sind die Werte die ich mal hier zusammen gestellt habe, auch
- ziemlich chaotisch.
-
- F1 - $50 F2 - $51 F3 - $52 F4 - $53 F5 - $54
- F6 - $55 F7 - $56 F8 - $57 F9 - $58 F10 - $59
- ESC $45 DEL $46 HELP $5f Space $40 ` - $00
-
- Alt Links $64 Alt Rechts $65
-
- Amiga Links $66 Amiga Rechts $67
-
- Shift Links $60 Shift Rechts $61
-
-
- Cursor Oben $4c
- Unten $4d
- Rechts $4e
- Links $4f
-
- Return $44
-
- Backspace $41
-
- TAB $42
-
- CTRL $63
-
- 1.Tastenreihe
-
- 1 - $01 2 - $02 3 - $03 4 - $04 5 - $05
- 6 - $06 7 - $07 8 - $08 9 - $09 0 - $0a
- á - $0b , - $0c \ - $0d
-
- 2.Tastenreihe
-
- q - $10 w - $11 e - $12 r - $13 t - $14
- z - $15 u - $16 i - $17 o - $18 p - $19
- - $1a + - $1b
-
- 3.Tastenreihe
-
- a - $20 s - $21 d - $22 f - $23 g - $24
- h - $25 j - $26 k - $27 l - $28 - $29
- - $2a # - $2b
-
- 4.Tastenreihe
-
- < - $30 y - $31 x - $32 c - $33 v - $34
- b - $35 n - $36 m - $37 , - $38 . - $39
- - - $3a
-
- Zehnerblock
-
- [ - $5a ] - $5b / - $5c * - $5d
- 7 - $3d 8 - $3e 9 - $3f - - $4a
- 4 - $2d 5 - $2e 6 - $2f + - $5e
- 1 - $1d 2 - $1e 3 - $1f
- 0 - $f . - $3c
-
- Enter $43
-
-
- Das das nur Tastennummern sind koennt ihr daran sehen, das Shift links und
- rechts, obwohl dieselbe wirkung einen unterschiedlichen Tastencode haben.
-
- Wenn ihr diese Werte selber mal nachpruefen wollt, koennt ihr folgendes
- kleine Prograemmchen benutzen. Mit dem habe ich die ganzen Code auch
- geholt.
- Die benutzung ist relativ einfach. Einfach starten und dann die Taste
- druecken, dessen Code man habe will. Taste festhalten, und gleichzeitig die
- Maus zum verlassen druecken. Der Gueltige Code steht dann in D1 bei der
- Seka-Register ausgabe. Fuer Tasten die den Seka veranlassen den Bildschirm
- zu loeschen, habe ich das Ergebnis nochmal im Buffer abgelegt, den man mit
- `QBuffer` abfragen kann.
-
- Ciaapra= $bfe001
- Ciaaspr= $bfec01
-
- Holdkey:Move.b Ciaaspr,D0
- Move.b #$ff,D1
- Sub.b D0,D1
- Ror.b #1,D1
- Move.w d1,Buffer
- Btst #6,ciaapra
- Bne.s holdkey
- Rts
- Buffer: Dc.w 0
-
-
- Viel Spass
-
- Jeff Kandle
-
-