====== Framebuffer ======
Um irgendetwas auf dem Bildschirm des Gameboy Advance ausgeben zu können, müssen wir den Framebuffer befüllen. Die Register beim Gameboy Advance sind Memory-Mapped, dh. wir können aus C heraus einfach per Zeiger (also Adresse) auf die Register (und damit auch auf den Framebuffer) zugreifen. Der Framebuffer ist an der Stelle //0x6000000//. Die Pixel sind durch 16 Bit codiert (short), dh. wir haben 16 Bit Farben zur Auswahl.
Das allererste Bit ist ungenutzt. Die nächsten 5 Bits kodieren den Blau-Anteil, die mittleren 5 den Grün- und die letzten 5 Bit codieren den Rot-Anteil. Dh. wir können uns ein Makro definieren, was uns aus je einer Zahl pro Anteil eine einzige short-Zahl macht. Um, sollten wir einmal mit den short-Zahlen rechnen wollen, kein seltsames Verhalten zu haben (zwecks Vorzeichen) wählen wir für den Zeiger auf den Framebuffer den //unsigned short//-Datentyp.
#define RGB(r,g,b) ((r)+(g<<5)+(b<<10))
unsigned short* framebuffer=(unsigned short*)0x6000000;
Nun können wir den Framebuffer wie ein Array benutzen. Wenn wir also einzelne Pixel setzen wollen, dann kann das über eine x und y-Koordinate geschehen. Da wir uns hier auf einem (recht alten) mobilen Gerät befinden, sollten wir darauf achten, nicht zu viel Aufwand zu betreiben und etwas auf die Resourcen achten. x und y-Koordinate sollten hier also char-Werte sein.
Zu Beachten ist, dass der Bildschirm des Gameboy Advance 240x160 Pixel groß ist. Um also die Stelle eines Pixels im Framebuffer auszurechnen, benötigen wir die Breite des Bildschirms:
framebuffer[x+y*240]=RGB(0,0,0);
Zu Beginn des Spiels sollten wir auf jedenfall den Framebuffer mit einer von uns definierten Farbe füllen (zum Beispiel schwarz). Dazu können wir eine Funktion schreiben:
void clrScr()
{
char x=0, y=0;
for (; x<240; x++)
{
for (; y<160; y++)
{
framebuffer[x+y*240]=RGB(0,0,0);
}
}
}