Assembler Programmierer, die die Strobe-Register des Amiga benutzen, sollten darauf achten, diese auch richtig anzusprechen. Man sollte ein solches Register stets mit
move.w #$00, register
aktivieren und nicht durch
clr.w register
Beim 68000 braucht die clr Anweisung einen Lese- und einen Löschzugriff, hingegen beim 68020 und seinen Nachfolgern nur einen Zugriff, was dann je nach Prozessor zu unterschiedlichen Ergebnissen führt.
Ruft man eine selbst geschriebene Assembler-Routine aus der "Startup- Sequence" auf, kann es beim Rücksprung (rts) zu einer Fehlermeldung kommen, obwohl das Programm einwandfrei arbeitet. Die Ursache ist das Prozessor-Register d0. Enthält es nach Ablauf eines Programms einen Wert ungleich null, nimmt das CLI an, dass ein Fehler aufgetreten ist. Das Programm sollte daher vor dem Rücksprung den Inhalt des Registers d0 löschen:
ende:
clr.l d0 ; Register d0 löschen
rts ; und Ende
Die durch einen Rückgabewert ungleich null erzeugten Fehlermeldungen, Returncode genannt, spielen beim Ablauf von Stapeldateien wie der Startup- Sequence eine Rolle: Mit dem CLI Befehl FAILAT legt man fest, ab welchem Rückgabewert die Bearbeitung einer Stapeldatei abgebrochen wird.
Rekursion ist, wenn eine Routine sich selbst aufruft. Dies geschieht solange, bis eine bestimmte Bedingung erfüllt ist. Diese Technik der Programmierung erfordert viel Umsicht. Leicht verstrickt sich der Computer in einer endlosen Schleife. Rekursive Programmierung trifft man häufig in Hochsprachen wie C oder PROLOG an. Eine sinnvolle Anwendung rekursiver Programmierung in Assembler zeigt das folgende Beispiel; ein Sprite soll um 180 Grad gedreht werden:
invers:
cmp.l #0,(a0) ; letztes Kontroll-Wort erreicht ?
beq inv_ende ; ja = Abbruch der Rekursion
move.l (a0)+,(sp) ; zwei Datenworte auf den Stack
jsr invers ; und noch eine runde
move.l (sp)+,(a1)+ ; sprite umgekehrt in Datenfeld schreiben
inv_ende:
rts
Bevor die Routine aufgerufen werden kann, muss sich in den Adressregistern a0 und a1 ein Zeiger auf den Anfang der Sprite-Daten befinden. Dies wäre folgendermaßen realisierbar:
lea.l spr_data+4,a0 ; anfangadresse des 2. Wortes
move.l a0,a1 ; Merker auf Anfang nach a1
jsr invers
Bei Rekursion wird, wie an dem Beispiel gezeigt, laufend eine Routine mit JSR aufgerufen. Der Stack muss also groß genug sein, um die Rücksprungadressen aufzunehmen.
Mit diesem Programm kann man durch Drücken der * Taste auf dem Zahlenblock den Amiga einfrieren. Durch drücken der rechten Maustaste arbeitet der Amiga dann normal weiter und das Programm lauert wieder im Hintergrund auf die * Taste. softstop.s
$77 + $30 = $07 --> X-Flag = 1
Dieses Programm prüft, ob die eingelegte Diskette schreibgeschützt ist. Eine Anmerkung von mir: Das Programm scheint alles andere als optimiert zu sein, wenn ich mal Zeit habe ... checkprot.s
Dieses kurze Programmsegment gehört zum Kurs der LowLevel Programmierung.
Ich werde das irgendwann mal unter eine eigene Rubrik stellen, es liegt erst mal
hier damit es nicht in den Tiefen des Systems verloren geht ;-)
ciab.s
Erkennen Sie den neuen Mauszeiger bereits im Listing ? Das wesentliche Merkmal des Programms ist die Verwendung der Routinen "SetPointer" und "ClearPointer" aus der "intuition.library". Das Programm ist für den Seka-Assembler geschrieben. Besitzer eines anderen Assemblers können es jedoch im wesentlichen unverändert übernehmen. Nach Verändern des Zeigers wartet MouseChange, bis Sie die linke MausTaste betätigen, danach sieht die Maus wieder wie vorher aus.