Assemblerkurs - Teil 3

(c) 1998 by Enrico Bauermeister

Thema

Am Anfang werden wir wir uns ein paar grafische Effekte anschauen. Danach kommen wir zum Thema Hardware-Sprites.

Grafische Effekte

Grafiken schrumpfen

Wir haben ja im letzen Kursteil schon die Modulowerte besprochen. Wenn ihr nicht mehr wisst worum es geht, schaut euch nochmal Teil 2 an. Wenn wir die Modulowerte nun ändern, können wir interessante Effekte erzielen. Stellt euch vor wir nehmen bei einer horizontalen Auflösung von 320 Punkten einen Modulowert von 80: der Copper zeichnet also die erste Zeile des Bildes, überspringt die zweite, zeichnet die dritte... und immer so weiter. Das Ergebnis ist ein Bild in der halben Größe. Schaut euch diesen Beispiel-Quelltext einmal an.

Grafiken schmelzen

Die Modulowerte können positiv oder negativ sein. Wenn wir z.B. einen Wert von -40 nehmen, wird der Copper die erste Zeile lesen, sie anzeigen, 40 Byte zurück gehen, und wieder die erste Zeile lesen und anzeigen. Das Ganze wird solange fortgeführt bis der ganze Screen voll ist. Hier seht ihr einen Beispiel-Quelltext für den Schmelzeffekt, wie er in vielen Demos zu sehen ist.

Grafiken spiegeln

Nehmen wir nun einen Modulowert von -80, so liest der Copper eine Zeile, stellt sie dar, geht zwei Zeilen zurück und stellt diese dann dar. Das Ergebis ist ein Bild das auf Kopf angezeit wird. Mit dieser Möglichkeit kann man ganz leicht Grafiken spiegeln. Schaut euch diesen Quelltext an, um zu sehen wie das in der Praxis funktioniert.

Nun könnt ihr ja noch selber ein wenig rumexperimentieren. Probiert einfach solange rum, bis ihr einen interessanten Effekt gefunden habt. Wie gesagt, mit den Modulo läßt sich eine Menge anstellen.

Hardware-Sprites

Kommen wir nun zu etwas völlig Anderen: den Hardware-Sprites. Um es gleich am Anfang loszuwerden, ich werde hier nur Sprites unter OCS/ECS-Chips erklären. Unter AA-Chips haben sich die Sprites zum positiven geändert und sind um einiges leistungsfähiger.

Was sind Sprites

Sprites sind grafische Objekte die sich unabhängig von den Bitplanes bewegen lassen. Ihre Größe ist auf eine Breite von max. 16 Punkten beschränkt, ihre Höhe hingegen ist beliebig und nur durch die Bildschirmgröße begrenzt. Die Auflösung von Sprites ist immer LoRes, auch wenn der Screen in HiRes ist. Für jedes Sprite gibt es zwei Register zur Verwaltung (eins fürs LowWord und eins fürs HiWord). Insgesamt sind es 16, zwei für jedes Sprite ergibt 8. Es können also max. 8 Sprites dargestellt werden (wie man doch mehr darstellen kann, werde ich später erklären). Nutzt man alle 8 Sprites, hat jedes Sprite max. 4 Farben, wobei zwei Sprites ein Paar sind (Sprite 0 und 1, Sprite 2 und 3, ...) und jeweils die selben Farben haben. Verknüpft man Sprites miteinander, so ergeben sich max. 16 Farben bei max. 4 Sprites. Der Mauszeiger der Workbench ist ebenfalls ein Sprite, nämlich Sprite 0.

Definieren von Sprites

Um nun ein Sprite zu erstellen, muß man sein Aussehen definieren, seine Größe, Farben und Position auf dem Bildschirm. Fangen wie mit dem Aussehen an. Der einfachste Weg ist, ihr malt mit einem Malprogramm euer Sprite. Ihr müßt nur darauf achten, daß ihr als Auflösung LoRes wählt und 4 Farben einstellt. Außerdem darf euer Sprite nur max. 16 Punkte breit sein. Wenn ihr mit malen fertig seit, schneidet euer Sprite aus und speichert es als Brush ab (wie das geht steht im Handbuch von eurem Malprogramm). Wer jetzt nicht malen möchte, kann auch das Sprite "sprite.iff" nehmen, was diesem Kurs beiliegt. Startet nun ArtPRO. Wählt UNIVERSAL an, für das Format zum Laden. Als Speicherformat nehmt ihr SPRITE. Nehmt folgende Einstellungen für das Format Sprite (über "Config" einstellbar):

Save Format
Output: Source
Ctrl. Words: None
Colors: 4
Width: 16
Labels: None
Source Format
Language: Asm
Width: Words
Indent Tabs: 2
Line entries: 2
   

Nun könnt ihr euer Sprite konvertieren. Anschließend speichert ihr die Palette des Sprites ab. Wie das nochmal geht steht in Teil 2 dieses Kurses. Nun wollen wir den Rest des Sprites definieren. Schauen wir uns zuerst den Aufbau eines Sprites an:

<------------- 16 Bit ------------>
+---------------------------------+
|          VSTART, HSTART         |
+---------------------------------+
|       VSTOP,control bits        |
+---------------------------------+
                ||
                 /
        Aussehen des Sprites
                 /                ||
+---------------------------------+
| 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 |
+---------------------------------+
| 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 |
+---------------------------------+

Im ersten Byte, VSTART dort kommt die vertikale Position des Sprites rein. Im zweiten Byte HSTART die horizontale Position. In VSTOP wird die vertikale Endposition eingetragen. Sie berechnet sich wie folgt:

VSTOP = VSTART + Spritehöhe

Das nächste Byte dient dazu um einige Spezialeigenschaften des Sprite einzustellen. Vorerst lassen wie dieses aber auf NULL. Als nächstes folgen unsere Spritedaten, die wir mit ArtPRO erstellt haben. Die letzen vier Bytes dieser Spritestruktur sind immer NULL, sie kennzeichnen das Ende eines Sprites. Eine Besonderheit gibt es aber dennoch: HSTART verstellt das Sprite jeweils um 2 Punkte. Geben wir also z.B. $31 ein, gelangt unser Sprite auf $32. Es sind also nur Zweierschritte möglich. Wie wir das ändern können, werden wie später besprechen. Wie wir bei der horizontalen Position über $FF hinaus kommen (also unter Zeile 256) werden wir ebenfalls später sehen.

Anzeigen von Sprites

Um ein Sprite nun auf dem Bildschirm anzuzeigen, müssen wir die Adresse eines Sprites bzw. der Struktur in die Copperliste eintragen. Dazu gibt es wie bei den Bitplanes Register, die in die Copperliste eingetragen werden. Wir müssen anschließend nur noch die richtigen Adressen der Sprites in diese Register eintragen. Hier noch eine Übersicht über die Register:

SPR0PTH ($dff120) und SPR0PTL ($dff122) für Sprite 0
SPR1PTH ($dff124) und SPR1PTL ($dff126) für Sprite 1
SPR2PTH ($dff128) und SPR2PTL ($dff12a) für Sprite 2
SPR3PTH ($dff12c) und SPR3PTL ($dff12e) für Sprite 3
SPR4PTH ($dff130) und SPR4PTL ($dff132) für Sprite 4
SPR5PTH ($dff134) und SPR5PTL ($dff136) für Sprite 5
SPR6PTH ($dff138) und SPR6PTL ($dff13a) für Sprite 6
SPR7PTH ($dff13c) und SPR7PTL ($dff13e) für Sprite 7

Schaut euch dieses Listing an, um zu sehen wie ein Sprite dargestellt wird.

Bewegen von Sprites

So ein Sprite sieht ja ganz lustig aus, bloß in Bewegung sieht sowas noch viel schöner aus. Tja, wie bewegt man nun ein Sprite? Ganz einfach, wir verändern ständig die Position des Sprites, indem wir direkt auf VSTART, HSTART und VSTOP zugreiffen. In diesem Beispiel wird ein Sprite horizontal bewegt, indem HSTART ständig geändert wird.

Hier mal eine Bemerkung am Rande. Es gibt verschiedene Möglichkeiten sein Demo/Intro zeitlich abzustimmen. Entweder über dem VBLANK (vertical blanking interupt), dem CIA oder über direktes Abfragen der Rasterstrahlposition. Wie wir mit dem VBLANK arbeiten, werden wie später noch lernen. Wie das mit dem CIA geht, kann ich leider auch nicht sagen. Für das direkte Abfragen des Rasterstrahls benutze ich zwei verschiedene Möglichkeiten:

1. Möglichkeit

;pruefen ob wir schon an Zeile 255 angekommen sind
;-------------------------------------------------
pruefe:
 cmpi.b  #$ff,$dff006
 bne.s   pruefe

;Hier können nun alle Routinen aufgerufen werden,
;die jede 1/50 Sekunde ausgeführt werden sollen.
;-----------------------------------------------
; || 
; / 

; / ;   || 

;pruefen on wir noch auf Zeile 255 sind, und auf Zeile 0 warten
;--------------------------------------------------------------
warte:
 cmpi.b #$ff,$dff006
 beq.s  warte

;Linke Maustaste gedrueckt ?
;---------------------------
 btst   #6,$bfe001
 bne.s  pruefe

2. Möglichkeit

;Warten auf Rasterstrahl (eine 1/50 Sekunde)
;-------------------------------------------
wait:
 move.l $dff004,d0
 and.l  #$fff00,d0
 cmp.l  #$00003000,d0
 bne.s  wait

;Hier können nun alle Routinen aufgerufen werden,
;die jede 1/50 Sekunde ausgeführt werden sollen.
;-----------------------------------------------
; ||
; / 

; / ; ||

;Linke Maustaste gedrückt ?
;--------------------------
 btst   #6,$bfe001
 bne.s  wait

Die zweite Möglichkeit ist viel schneller. Will man sein Demo/Intro nicht so schnell haben, kann man die erste Möglichkeit benutzen. Ändert doch mal "listing14.asm" so um, daß Möglichkeit 2 genutzt wird. Ihr werdet sehen, daß sich das Sprite viel zu schnell bewegt. Welche Methode ihr nutzt, müßt ihr dann selber entscheiden.


Leider muß ich euch jetzt mitteilen, daß dieser Kursteil schon zu Ende ist. Aus Zeitmangel in den letzen zwei Monaten war es mir leider nicht möglich mehr Zeit für diesen Kurs zu opfern. Ich hoffe ihr seid mit jetzt nich böse. Das nächste Mal werden wir mit den Sprites fortfahren. Also schönes Coden dann, und bis demnächst.

-eb-

Zurück Weiter