Einsteigertutorial 1: Das erste GBA Programm und allgemeine Grundlagen:

[Vorwort][ Einleitung ][ Compilerinstallation ][ Emulator ][ Das erste Programm ][ Das erste Programm compilieren][ Code verstehen][ Bildmodus & screenmode.h][ Ende]

Vorwort

Hallo, ich heiße euch Willkommen in meinem ersten größeren Tutorial. Da ich noch ziemlich neu bin im Tutorialschreiben, müsst ihr mir helfen. Wenn irgendwas ungenau ist oder was besser erklärt werden sollte, dann mailt mir (webmaster@hurik.de) oder stellt eure Fragen im Forum. Vielleicht gibt es schon auf PlanetGameBoy ein weiteres Tutorial (von Nasreddin oder mir) in dem eure Fragen beantwortet werden. Neuere Versionen dieses Tutorials findet auf der Site (siehe oben). Ach so checkt auch mal meine Private Homepage, (warte ich schreib dir im chat) (www.hurik.de)!

Einleitung

Ich hoffe, dass euch dieses Tutorial einen leichten Einsteig in die GBA Programmierung bietet. Da es ja im Moment keine bzw. sehr wenig Deutsche Ressource gibt. Die GBA Programmierung ist relativ einfach. Wer einmal was für DOS programmiert hat wird sich hier sehr heimisch fühlen. Da beim GBA auch sehr viel mit Adressen gearbeitet wird. Einen Anfänger mag das erschrecken aber eigentlich ist es ganz einfach! Wenn ihr kein C/C++ könnt dann lest euch erstmal das Tutorial von Nasreddin durch falls er es mal fertig stellt :-) Also ich wünsch euch viel Spaß und hoffe es kann euch weiterhelfen! Und gibt mir Feedback!!! Sagt einfach alles, damit ich es besser machen kann!!!

Compilerinstallation

Bevor wir irgendwas machen können, müssen wir uns einen Compiler besorgen! Hier eine Anleitung zur Installation: Um ein GBA Programm zu compilieren, braucht man einen extra Compiler der extra für den Prozessor vom GBA ist. Als erstes muß man die ganzen Pakete von der Seite des Compilers runterladen. Wir benutzen das "Unofficial GameBoy Advance Software Development Kit". Hier der Link zu der Seite: http://www.io.com/~fenix/devkitadv/ Da das trozdem ziemlich umständlich ist rauszufinden was man braucht und was nicht, sind hier die Links zu den Files die ihr braucht also müst ihr die Seite nicht aufrufen. Einfach das hier downloaden: http://www.quickflix.com/devkitadv/agb-win-core-r5.zip (481k) http://www.quickflix.com/devkitadv/agb-win-binutils-r4.zip (2.3M) http://www.quickflix.com/devkitadv/agb-win-gcc-r4.zip (2.4M) http://www.quickflix.com/devkitadv/agb-win-newlib-r4.zip (3.8M) http://www.quickflix.com/devkitadv/agb-win-libstdcpp-r4.zip (3.9M) Wenn ihr WinMe oder abwärts besitzt dann braucht ihr dieses File: http://www.quickflix.com/devkitadv/agb-win-patch-r4.zip (2.0M) Insgesamt hat das ganze 12.9 M bzw. 14.9 M. Nachdem ihr das runtergeladen habt müst ihr es entpacken, alles in einen Ordner der sollte bevorzugt auf "C" sein und "devkitadv" heisen, also C:\devkitadv. Wenn ihr WinMe oder Abwärts besitzt müst ihr als LETZTES das agb-win-patch-r4.zip File entpacken und die ein paar davor entpackten Files überschreiben.

Emulator

Einen Emulator brauchen wir auch weil man ja seine Programme testen will! Man kann sie zwar auch auf dem GBA testen aber ich habe leider noch keinen Flashlinker. Trozdem würd ich für die ersten Test einen Emulator benutzen. Ich bevorzuge den VisualBoyAdvance, hier der Link zur Hauptseite, hollt euch da die neuste Version: VisualBoyAdvance.

Das erste Programm

Jetzt kommen wir schon zu unserem ersten Programm. Es ist ganz simple. Damit ihr mal seht wie so ein Quellcode Aussicht! Ist zwar miniklein aber jedenfalls etwas! Als erstes zeig ich euch den Code. Dann sag ich euch wie ihr in compiliert und dann erkläre ich alles Schritt für Schritt! Also hier erstmal der Code:
0 | #include "gba.h"
1 | #include "screenmode.h"
2 |
3 | int main(void)
4 | {
5 | SetMode(MODE_3 | BG2_ENABLE);
6 | for(int c = 0; c < 38400; c++)
7 | VideoBuffer[c] = (31 << 10);
8 | while(1);
9 | }
Wenig, oder? Aber jetzt muss ich euch noch sagen wie man das hier compiliert. Wenn ihr C/C++ schon könnt seht ihr das ihr die Header Dateien braucht. Für alle Schreibfaulen oder nicht Schreibfaulen hier ein Link zu den Code und zu den Headern: t1.zip Wenn ihr es runtergeladen habt müst ihr es entpacken, in irgend einen Ordner. Übrigens, die gba.h ist von eloist und die screenmode.h ist von dovoto! Also Dank geht an sie, den sie haben uns einiges an Arbeit abgenommen und machen es uns einiges leichter!

Das erste Programm compilieren

So jetzt haben wir einen installierten Compiler und das Programm aber wie compilieren wir das jetzt? Das ist aber auch ganz easy! Hier ne kurze Anleitung: Erstellt ihr in dem Ordner wo euer Quellcode ist eine Batchdatei (Rechtsklick -> Neu -> Textdatei -> Name sollte bevorzugt: make.bat sein.). Jetzt müst ihr dir Datei (Rechtsklick auf die Date i-> Bearbeiten) bearbeiten. In sie schreibt ihr: path=C:\devkitadv\bin gcc -o spiel.elf spiel.cpp -lm objcopy -O binary spiel.elf spiel.bin del *.elf Ich erkäre jetzt was die einzelnen Zeilen machen: path=C:\devkitadv\bin Setzt den Path auf den bin Ordner des Compilers. Wenn ihr den Compiler wo anders hineintpackt habt müst ihr es entsprechend ändern! gcc -o spiel.elf spiel.cpp -lm Compiliert die Datei spiel.cpp wenn eure Quell-Datei nicht spiel.cpp heist dann müst ihr das natürlich ändern! objcopy -O binary spiel.elf spiel.bin Das krustelt alles zusammen was der Compiler so zusammen getragen hat und macht daraus eine Rom! del *.elf Das löscht die Temporäre elf Datei die der Compiler erstellt! Ok das ganze Speichert ihr ab! Damit könnt ihr einfach und Kofortable mit einem Doppelklick euren Code compilieren! Das ist zwar nicht das A&O aber für den Anfang reicht es allemal! Demnächst Erweitere ich das Tutorial und Erkläre alles genauer. Ich habe die make datei extra nicht meinem Tut-Zip beigelegt da sonst die nicht jeder raffen würde wie sie funktioniert und ein paar dumme fragen vielleicht aufkommen würden! Ok, jetzt doppelklick auf die Datei und nach kurzen laden und rechnen, habt ihr in eurem Ordner die spiel.bin Datei. Startet sie mit eurem Emulator und bewundert euer erstes Programm! Aber es ist doch ein schönes Blau oder? Aber eigentlich habt ihr noch nix großes gemacht dafür dürft ihr euch jetzt die Erklärung anschauen. Hier ein Bild vom ersten Prog:

Code verstehen

Jetzt erkläre ich mal jede Zeile einzeln das sie auch wirklich jeder versteht! Also dann gehts mal los: #include "gba.h" Gba.h ist eine Header Datei mit vielen Typdefenierungen und Adressen. Die sind sehr wichtig und praktisch. Sie ist von eloist, muss mal gesagt sein! Genaueres dazu erkläre ich weiter unten! #include "screenmode.h" In der screenmode.h ist ein Macro drinnen das ganz einfach zulässt den Bildmodus zu setzten! Mehr zu Bildmodus im nächsten Kapitel da das schon einiges umfasst! int main(void) { Die Hauptschleife wie bei jedem C/C++ Programm. SetMode(MODE_3 | BG2_ENABLE); Hier das Macro aus der screenmode.h in action! Diese Macro setzt den Bildmodus auf mode 3 und macht den Hintergrund an. Was da genau passiert das erkläre ich im nächsten Kapitel, da das net so einfach ist! Dieser Modus hat 240 x 160 Pixel. for(int c = 0; c < 38400; c++) VideoBuffer[c] = (31 << 10); Hier ist eine Schleife die 38.400 mal (Damit jeder Pixel mal angesprochen wird 240 * 160 = 38.400) durch gelaufen wird. Sie füllt den VideoBuffer (Das ist eine eine Speicher Adresse aus der gba.h sie zeigt auf den Speicher der auf dem Bildschirm gemalt wird! Wer genau mal wissen will, wie die Adresse genau lautet sollte sich mal die gba.h anschauen! Wobei alle sollten sich mal die gba.h anschauen.) mit dem Wert Blau (BGR Farben B=11111 G=00000 R=00000). Der Wert 31 ist binär 11111 und das "<< 10" bewirkt das aus den 11111 so was wir 111110000000000. Also das << schiebt einfach die einsen um 10 stellen nach rechts und füllt alles mit 0 auf! Mit den << bzw >> kann man auch super schnell und rechen unaufwendig eine Zahl mal 2 nehmen oder durch 2 teilen den jede stelle wo es nach link verschoben wird verdoppelt sich der inhalt. Wenn ihr es um 2 stellen nach links verschiebt vervierfacht sich der Wert. Ist ganz praktisch zu wissen, aber genug C/C++ Tips! while(1); Eine schöne Endlosschleife! Die unser Programm laufen läst! Die Dinger sind ja eigentlich gefürchtet aber hier brauchen wir eine! } Ende der main Schleife!

Bildmodus & screenmode.h

Jetzt kommt eine kleine und kurze Beschreibung wie wir den Bildmodus setzten, was genau passiert und was der Modus 3 so kann. SetMode(MODE_3 | BG2_ENABLE); Dieser Befehl besteht aus mehren teilen hier die einzelnen Teile und ihr Bedeutung ich hab die definitionen einfach aus der screenmode.h rausgeschrieben, ich werd auch noch versuchen zu erklären was ein Macro ist falls das net alle wissen: #define MODE_3 0x3 Diese Mode_3 steht einfach für den Wert 3. Diese 0x3 ist ein Hex Wert. Aber ihr müst jetzt umbeding in binär Zahlen denken da es wir hier einen 16 bit Zahl haben (Warum erkläre ich später!) also steht dann in dem Wert 0000000000000011. #define BG2_ENABLE 0x400 Diese BG2_ENABLE steht auch einfach für den Wert 1024. Ja 1024 stimmt da es eine hexadezimal Zahl ist und binär steht das ganze in unsere 16 bit Wert als 000010000000000. #define SetMode(mode) REG_DISPCNT = (mode) Und hier sieht man was genau passiert! SetMode steht stellvertrettend für REG_DISPCNT. Aber was ist das? Das ist mal wieder eine Adresse und die zeigt auf den Speicher im GBA der deinem GBA sagt in welchen Modus er gehn soll! Wir schreiben in die Adresse das 000010000000011. Da diese Zeichen | die beiden Werte zusammen fügt. Für alle dies genau wissen wollen das ist der Bitwise-Inclusive-OR Operator. Eer fügt einfach die zwei Werte zusammen auf binärer Basis zusammen. Kleines Beispiel mit anderen Zahlen: 1001 | 0011 = 1011 so und eine kleine Grafik die das selbsterklärend darstellt: 1001 0011 ------- 1011 Ist fast wie beim addieren aber auch nur fast! Wenn bei der 1. oder 2. Zahl eine 1 steht dann kommt unten eine 1 raus. Wenn bei beiden eine 1 steht kommt auch eine 1 raus und nur wenn bei keinem eine 1 steht kommt eine 0 raus! Ok jetzt wieder zurück zum Bildmodus diese Macro setz also unsere Wert an die Adresse. Jetzt zeig ich euch auch mal wie diese Adresse aufgebaut ist:
Bit | 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0
Name | OW | W1 | W2 | OBJ | BG3 | BG2 | BG1 | BG0 | B | OM | HB | DB | GB | Mode Bits
unsere Wert | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 011
Jetzt kann man sich schon das Was im Speicher ist besser Vorstellen! Ach so wo eine Bit steht also eine 1 dann ist dieser Wert bzw. Funktion angeschalten! Was die ganzen anderen Werte Bedeuten werde ich in den nächsten Tutorials erklären wenn wir die anderen Funktionen benutzten. Nur noch kurz warum wir hier Modus 3 genommen haben und BG2 enable: Modus 3 ist der einfachste Bild Modus. Er hat 240 x 160 Pixel die je eine 16 bit Wert haben für die Farbe! Und wir schreiben die einfach voll mit dem Wert für Blau. Der BG2 ist enable damit wir den Videospeicher einfach vollschreiben können. Dumme Erklärung! Ich weis aber Besser gehts einfach noch nicht!

Ende

Das wäre es schon für erstes Tutorial. War vielleicht viel für den Anfang aber ich hoffe ihr habt alles kapiert wenn nicht dann mailt mir und sagt was ich noch verbessern soll! Also checkt mein 2. Tutorial (Bin noch am schreiben!) da lernt ihr noch mehr! Also dann viel Erfolg und ich bin für alle Fragen offen also wenn ihr Probleme habt dann mailt mir oder stellt sie im Forum. Tschau!
(c) by hurik (Andreas Giemza)

DevGBA
www.robsite.de