Einsteigertutorial 3: Joypad und DMA
| Joypad und DMA (V1) | |||||||
| Inhaltsverzeichnis: | |||||||
| Einleitung Header Dateien Joypad DMA Ende | |||||||
| Einleitung | |||||||
| Hallo, liebe Leserschaft! Ich freue mich, dass ihr bis zum dritten Teil meines und von LuckyGeorge Tutorials vorgearbeitet habt. In dem Tut lernt ihr, wie ihr euer Programm über das Joypad steuern könnt, und was DMA ist und was es euch bringt und was ihr tolles damit machen könnt. Dieses Tutorial wird ziemlich kurz, aber es ist trotzdem verdammt wichtig! Also viel Spaß und Erfolg! | |||||||
| Header Dateien | |||||||
| Hier ist die Header Datei, die ich euch im vorigen Tutorial versprochen habe! Alle weiteren Tutorials sind auf diese Headerdatei bezogen. Wer den MS VC++ Wizard (Wie im Tutorial davor muss man Dovotos Libs wählen.) benutzt, kann dies tun, da die Libs gleich aufgebaut sind, und alles gleich ist. Und hier könnt ihr das File runterladen: href="http://andreas.abi-2005.org/devgba/gball.zip">gball.h downloaden (Gepackt ist ein Zipfile! | |||||||
| Joypad | |||||||
| Bei einem Spiel ist die
Drückt ihr nach rechts, dann kommt das:
Drückt ihr nach Links, kommt ihr wieder zum ersten, und #include "gball.h" #include "hurik.h" int main(void) SetMode(MODE_4 for(c = for(c = if(!(*KEYS for(c for(c } if(!(*KEYS for(c for(c } Also das wars schon! Also viel Spass mit eurem Wissen und | |||||||
| DMA | |||||||
| Das Programm oben ist ja ganz nett, doch es macht igendwelche nicht schönen Grafikfehler beim aufbau des nächsten Bildes. Hier ein Beispiel:
Hier sieht man gut, dass die Pallete kopiert wurde, aber DMA 0 | DMA 0 ist der DMA Modus | der die höchste Priorität hat. Er wird nicht von anderen Prozessen unterbrochen und ist für Zeitkritische Aufgaben da. DMA 1 |
width="437">Das sind die Modi die nur für Soundsachen benutz werden | also im moment für uns uninterresant.
height="12">DMA 2 | DMA 3 | Das ist der Modus, den | man halt für so standart Datenkopieren benutzen sollte, und den wir auch benutzten. |
Und jetzt schauen wir und das Programm mal an damit wir
es verstehen. (Die Make und Source ist genau so wie bei Joypad, nur
halt ner 2 statt der 1.)
#include "gball.h"
#include "hurik.h"
#include "slideshow.h"
int main(void)
{
SetMode(MODE_4 | BG2_ENABLE);
Bis hier ist alles wie oben! Aber nun was ist das das unten? Sieht seltsam
aus! Das schauen uns wir mal genauer an!
REG_DMA3SAD
= (u32)hurikPalette;
REG_DMA3DAD = (u32)BGPaletteMem;
REG_DMA3CNT = 256 | DMA_16NOW;
Was ist den das für ein Gebilde? Da kopieren wir Daten mit
DMA. Und jezt erkläre ich das hier mal genauer.
REG_DMA3SAD ist eine Speicheradresse. Ihr seht das DMA3, dass sagt, dass
wir DMA 3 Modus benutzen. SAD steht für "Sourceadress" und,
das heist übersetzt "Quelladresse". Und das ist hier die Quelle,
woher wir die Daten kopieren. So einfach.
REG_DMA3DAD ist auch eine Speicheradresse, wer häts gedacht =) ! Die ist
genau so wie die da oben, bis auf dass statt dem S ein D da ist. Und das
DAD steht für "Destinationadress", und das heisst "Zieladresse".
Also das ist die Adresse, wo wir die Daten hinkopieren. Einfach oder?
REG_DMA3CNT ist auch eine Adresse, nur hier kommen jetzt Daten rein. Diese
Speicher Adresse ist etwas komplexer. Hier ein kleines Bild, das die Adresse
einfach mal ein bischen besser darstellt:
Wir schreiben den Wert 256 in die Speicheradresse in die
Bits 1 - 15. Damit sagen wir, dass der DMA 256 16 Bit Werte kopieren
soll. Das DMA_16NOW schreibt die Werte 0 in 21 - 22, 23 - 24, 25, 26,
28 - 29, 30 und den Wert 1 in 31. Ok, jetzt erzähle ich mal, was die
Werte genau machen:
den nicht brauchen, schreiben wir eine 0 rein.
werden soll. 00 bedeutet sofort starten. 01 starte im Vblank. 10
starte im Hblank. 11 kann nur im DMA Mode 3 benutzt werden. Der
Kopiervorgang wird gestartet, wenn die erste Zeile gezeichnet wird.
So kann man Flickerfrei Sachen kopieren in Modus 3.
Also wie man kopieren will. 0 steht für 16, 1 für 32.
Bei 1 wird der Vorgang immer bei Hblank oder Vblank wiederholt.
1 Byte erhöht. 01 wie bei 00 nur der Quellzeiger wird es verkleinert.
10 bleibt der Zeiger gleich. 11 ist unbenutzt.
nur alle auf den Zielzeiger bezogen.
256.
Ok, das wars schon. Wie gesagt echt einfach! Schaut mal in die gball.h
bei DMA. Da stehen ein paar Definitionen, wie ihr einfach die Werte setzen
könnt. Das wars schon. Echt einfach, oder? Ihr müsst ja nicht alle Hintergründe
wissen, so lange ihr könnts reicht das fürs erste. Aber es gibt noch eine
kleine Falle! Schaut euch das mal an.
REG_DMA3SAD
= (u32)hurikData;
REG_DMA3DAD = (u32)VideoBuffer;
REG_DMA3CNT = 192000 | DMA_16NOW;
Hier kopieren wir die Bilddaten in den Speicher. Nur irgendwie
stimmt hier was nicht! Und was? Eigentlich müssten wir 38400 Bytes kopieren,
weil ja 240 * 160 = 38400. Aber jetzt werden die Bilddaten in 8 Bit Werten
gespeichert, aber wir kopieren 16 Bit Werte. Also müssen wir nur halb
so viel hinschreiben. Das wärs schon, und diesmal endgültig alles. Einfach
oder? Der Rest des Codes müsste selbsterklärend sein.
while(1)
{
if(!(*KEYS & KEY_LEFT))
{
REG_DMA3SAD
= (u32)hurikPalette;
REG_DMA3DAD
= (u32)BGPaletteMem;
REG_DMA3CNT
= 256 | DMA_16NOW;
REG_DMA3SAD
= (u32)hurikData;
REG_DMA3DAD
= (u32)VideoBuffer;
REG_DMA3CNT
= 192000 | DMA_16NOW;
}
if(!(*KEYS & KEY_RIGHT))
{
REG_DMA3SAD
= (u32)slideshowPalette;
REG_DMA3DAD
= (u32)BGPaletteMem;
REG_DMA3CNT
= 256 | DMA_16NOW;
REG_DMA3SAD
= (u32)slideshowData;
REG_DMA3DAD
= (u32)VideoBuffer;
REG_DMA3CNT
= 192000 | DMA_16NOW;
}
}
}
oder? Im nächsten Tutorials geht es um Sprites, und das wird schon ein
bischen schwerer. Aber keine Angst, es hält sich alles in Grenzen. Also
ich werde mich dann mal ans nächste machen und hoffe ihr seit schön am
üben. Bei Fragen, Anregungen und Verbesserungsvorschlägen fragt einfach
im href="http://andreas.abi-2005.org/pgforum/board.php?boardid=11"
target="_blank">Forum. Viel Spaß!
Dank geht an locke (Christian Locklair), da er meine Rechtschreibfehler
verbessert hat, und das ist genau so schwer, wie das Tut hier zu schreiben!
=)
| < vorige Seite | Seite 1 | nächste Seite > |




Nintendo 3DS
NDS
PSP
iPhone / iPod
Game Boy Advance
N-Gage
PortableGaming (Forum)



Newsfeed