Tipps zu Assembler

CLR mit Nebeneffekten

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.

Falscher Fehler

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 in Assembler

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.

Der Softstopper

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

Dezimal - optimal

$77 + $30 = $07 --> X-Flag = 1

CheckProt

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

Low Level Programming - CIAB

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

Low Level Programming - CIAint

Dieses kurze Programmsegment gehört zum Kurs der LowLevel Programmierung ciaint.s

Die Maus sieht so anders aus

Sie suchen einen Weg, um das Aussehen des Mauszeigers zu verändern? MouseChange ist die Lösung für alle Assembler-Programmierer: mousechange.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.