home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga MA Magazine 1998 #6
/
amigamamagazinepolishissue1998.iso
/
coders
/
assembler-kurs
/
listings
/
listing2e.s
< prev
next >
Wrap
Text File
|
1977-12-31
|
4KB
|
94 lines
; Listing2e.s
Anfang:
lea $dff006,a0 ; Gib $dff006 (VHPOSR) in a0
lea $dff180,a1 ; Gib $dff180 (COLOR0) in a1
lea $bfe001,a2 ; Gib $bfe001 (CIAAPRA) in a2
Waitmouse:
move.w (a0),(a1) ; Gib den Wert von $dff006 in COLOR0
btst #6,(a2) ; linke Maustaste gedrückt?
bne.s Waitmouse ; Wenn nicht, zurück zu waitmouse
rts ; Ende
END
Wie man sieht, ist der Waitmouse-Zyklus aus indirekten an Stelle der
direkten Adressierungen aufgebaut, es wird also nicht direkt mit den
Adressen gearbeitet, diese werden in Register geschrieben und mit denen
wird hantiert. Die - unter Klammern gesetzten - Register werden für
Schreib- oder Leseoperationen verwendet -> Indirekt. Das erhöht die
Geschwindigkeit der Schleife, da die Register bekanntlich schneller sind
als die direkten Adressierungen. Es müßte eine leichte Änderung im
Flimmern des Bildschirmes feststellbar sein, in Vergleich zu Listing1a.s,
da die Abarbeitung schneller ist. Nach der Ausführung kann man überprüfen,
daß die Register a0, a1 und a2 dementsprechend die Adressen $dff006
(VHPOSR), $dff180 (COLOR00) und $bfe001 (CIAAPRA) enthalten. Wenn man
wirklich alle Zahlen aus dem Loop (Schleife) entfernen will, dann kann man
das BTST #6,$bfe001 mit einem BTST d0,$bfe001 ersetzen, wobei in d0 die 6
steht:
Anfang:
lea $dff006,a0 ; Gib $dff006 (VHPOSR) in a0
lea $dff180,a1 ; Gib $dff180 (COLOR0) in a1
lea $bfe001,a2 ; Gib $bfe001 (CIAAPRA) in a2
moveq #6,d0 ; Gib den Wert 6 in d0
Waitmouse:
move.w (a0),(a1) ; Gib den Wert von $dff006 in COLOR0
btst d0,(a2) ; linke Maustaste gedrückt?
bne.s Waitmouse ; Wenn nicht, zurück zu waitmouse
rts ; Ende
END
(Verwendet Amiga+b,c um dieses Listing mit dem oberen zu vertauschen)
Anmerkung: Um die 6 in d0 zu schreiben, habe ich statt dem üblichen MOVE.L
#6,d0 ein MOVEQ #6,d0 verwendet, weil die Zahlen unter $7f (also 127),
seine sie negativ oder positiv, mit diesem speziellen Befehl in die
Datenregister gegeben werden können. MOVEQ ist immer ein MOVE.L, es gibt
also kein .b, .w oder .l, es ist wie das LEA. Beispiele:
MOVEQ #100,d0 ; weinger als 127
MOVE.L #130,d0 ; mehr als 127, ich verwende das normale move.l
MOVEQ #-3,d0 ; bis -128 kann das MOVEQ eingesetzt werden.
Bemerkung2: Es ist üblich, alle Register zu verwenden, indem man Adressen
und Daten darin speichert, die für die Routinen (Unterprogramme) nötig
sind, da sie sehr schnell sind. Aber es leuchtet ein, daß die Programme so
ihre Klarheit verlieren und nicht mehr recht "leserlich" sind, stellt euch
vor, ihr bekommt ein Programm vorgesetzt, bei dem, irgendwo mitten drin,
so was steht:
Routin:
move.w (a0),(a1)
btst d0,(a2)
bne.s Routin
Hier sehen wir nur (a0),(a1), d0,(a2) usw. WENN WIR NICHT WISSEN, WAS IN
DEN REGISRTERN DRINSTEHT, WIRD UNS DAS ALLES OHNE SINN ERSCHEINEN,
deswegen versichere ich euch, lernt euch die Adressierungsarten gut und
erinnert euch, an welchen Punkten im Programm ihr Daten oder Adressen in
Register gegeben habt, um zu verstehen, was man auch nur vor ´ner Woche
getan hat. Eine Stärke des 68000 liegt darin, INDIREKT mit dem Speicher
umgehen zu können, darin liegen aber auch die Schwierigkeiten. Um zu üben,
schreibt einige unsinnige, aber total verquirlte Listings mit indirekten
Adressierungen etc. um zu verstehen, was am Ende rauskommt. Am Ende könnt
ihr es testen und überprüfen, ob eure Vermutungen stimmen. Ich gebe euch
einen Anfang, ihr fahrt mit dem Durcheinander fort, fast so, als würdet
ihr ein Rätsel lösen:
lea SCHLUMPF,a0
move.l (a0),a1
move.l a1,a2
move.l (a2),d0
moveq #0,d1
move.l d1,a0
.....
rts
SCHLUMPF:
dc.l $66551