====== 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); } } }