PlanetSwitch Planet3DS PlanetVita PSP.de PlanetiPhone Classics Forum

PGN-ID:[?] (Nicht eingeloggt)
Login
Registrieren
PlanetDS PlanetGameboy N-Page.de

Einsteigertutorial 1: Das erste GBA Programm und allgemeine Grundlagen.

zurück

Autor: hurik

Kategorie: devtut
Umfang: 1 Seiten

Seite   1  

Kommentare:

Kommentieren (-)

Game Boy Advance Artikel vom 01.03.2002







































































Das erste GBA Programm
und allgemeine Grundlagen. (V1)
Inhaltsverzeichnis:
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:

#include "gba.h"

#include "screenmode.h"


int main(void)

{

        SetMode(MODE_3 | BG2_ENABLE);

        for(int c = 0; c <
38400; c++)

                VideoBuffer[c]
= (31 << 10);

        while(1);

}


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)

< vorige Seite Seite   1   nächste Seite >