Developer Tips/de

< Developer Tips

Quellcode Ausschnitte

Video-System-Autoerkennungs-Routine

Die libogc von DevkitPPC r15 setzt den Video-Modus automatisch durch einen Funktionsaufruf.

Hier ist die Video-Erkennungsroutine aus dem DivKitPro Wii-Beispiel.

rmode = VIDEO_GetPreferredMode(NULL);
VIDEO_Configure(rmode);

Zurückspringen zum Loader

Es wäre eine gute Ideen eine Zurückspringen zum "loader" zu ermöglichen. Ansonsten müsste man die Wii neustarten um die Homebrew zu beenden.

    // Binde einfach die unistd.h-Headerdatei ein und rufe die ''exit()'' Funktion auf, um zum loader zurück zu kommen
    // Das Returnen aus der main Funktin funktioniert ebenso
    #include <unistd.h>
    // ....
    exit(0);

Anmerkkung: Der __crtmain-Code ist fehlerhaft, da er standardmäßig nicht exit aufruft. Kann man selbst verbessern. Zusätzlich ruft es nicht die Konstruktoren der globalen Objekte in C++ auf. Das kommt davon wenn man unsauber zusammengestrickte Einzeiler verwendet.

Wii Neustarten

Es wäre eine gute Idee in jeder Homebrew die Möglichkeit einzubauen die Wii neuzustarten. Hier ist der Quellcode dafür.

SYS_ResetSystem(SYS_RESTART,0,0);

Oder rufe mit SYS_RETURNTOMENU die HOME-Menü wieder aufzurufen, SYS_POWEROFF die Wii auszuschalten (automatisch bei entsprechender Schlaff oder Standby-Modus, je nachdem die WC24-Einstellung). Der Modus wird genau anzugegeben mit SYS_POWEROFF_STANDBY oder SYS_POWEROFF_IDLE, indem kannst du gegen die Einstellung vorgehen.

Wiimote Abfragen

A separate article is available: How to use the Wiimote.

Debugging Tipp

Wenn du mit einem Absturzt deiner Homebrew konforniert wirst, siehst du meist eine Adresse mit einigem Maschinen-Code auf dem Display. Hier ist mein Trick um die Stelle im C++-Code zu lokalisieren.

Angenommen deine Homebrew stürzt ab und folgendes wird angezeigt:

    CODE DUMP:
    
    800084ac:   809F0020 2F840000 ...
    800084bc:   ...
    800084cc:   ...

Die 800084ac ist die Speicheradresse in Hex an der der Fehler auftrat. 809F0020 ist der Maschinen-Code der den Fehler produziert.

  • Schritt 1:

Ändere in deinem Makefile die CXXFLAGS-Zeile zu:

  CXXFLAGS = -save-temps -Xassembler -aln=$@.lst $(CFLAGS)

Das -save-temps Attribut speichert ddie assemblierte-Zwischencode-Datei, die interessant sein könnte. Das -Xassembler -aln=$@.lst Attribut erzeugt eine Liste der Dateien die assemblierten und Maschinen-Code enthalten. Jetzt Compiliere dein ganzes Projekt erneut. Anmerkung: Das wirkt sich nur auf C++ Code aus.

  • Schritt 2:

Schaue dir die Map-Datei an die erstellt wurde. Die Map ist dort zu finden wo auch das Wii-Template Makefile ist. Normalerweise ist es im Built-Unterordner, als irgendwas.map Datei. Suche in Map-Datei nach der Speicheradresse die am nähsten an der steht die wir im CORE DUMP gehen haben. Hier ein Beispiel:

    0x80008464                ShooterView::Render(BibGraphicsDevice&)

Das sagt mir, dass der Absturtz 72 Byte in der ShooterView::Render() Funktion war. Jetzt müssen wir die Render() Funktion noch im Code finden

  • Schritt 3:

Suche in der Listen-Datei nach der gesuchten Funktion. Hier ein Beispiel:

   473              		.globl _ZN11ShooterView6RenderER17BibGraphicsDevice
   474              		.type	_ZN11ShooterView6RenderER17BibGraphicsDevice, @function
   475              	_ZN11ShooterView6RenderER17BibGraphicsDevice:
   476              	.LFB1465:
   477              		.loc 1 158 0
   478              	.LVL20:
   479 02d0 9421FF00 		stwu 1,-256(1)

Die Funktionsnamen sind hier beschnitten denn es handelt sich um C++ Code ( Siehe http://en.wikipedia.org/wiki/Name_mangling#Name_mangling_in_C.2B.2B). Die Adresse des ersten Befehls von Render() ist an der Stelle 02d0. Das ist gleichzeitig Zeile 158 in unserer Datei (".loc 1 158 0"). Um den Fehler zu finden müssen wir an Stelle 0x318 ( = 0x2d0 + 72 ) suchen. Wie hier:

                               .loc 1 168 0
   528 0314 809F0020 		lwz 4,32(31)
   529 0318 2F840000 		cmpwi 7,4,0

Hier sehen wir die Maschinen-Adresse 0x318 mit dem Maschinencode. Der nähste .loc Befehl sagt uns, dass das Problem in Zeile 168 in unserer ShooterView.cpp aufgetaucht ist. Für mehr Informationen zu Assembler-Ausgaben, gibt es dieses Manual: http://sourceware.org/binutils/docs-2.18/as/index.html

Grunstätzliche Programmier Tips

  • Kommentierte deinen Code durchgehend, das hilft anderen Fehler zu finden.
  • Jeder ungenutzt Code sollte aus dem Programm verschwinden, außer es ist ein Programm um anderen etwas zu Erklären.
  • Wenn es eine Routine gibt die effizienter (schneller und/oder mit weniger Code) arbeitet, nutze diese.