In memory of Ben “bushing” Byer, who passed away on Monday, February 8th, 2016.

Developer Tips/de: Difference between revisions

From WiiBrew
Jump to navigation Jump to search
Blooper4912 (talk | contribs)
mNo edit summary
CarstenK (talk | contribs)
some updates with latest english
Line 1: Line 1:
=Quellcode Ausschnitte=
=Quellcode Ausschnitte=
==Video-System-Autoerkennungs-Routine==
==Video-System-Autoerkennungs-Routine==
Bitte binde eine automatische Erkennungsroutine ((VIDEO_GetCurrentTVMode()) ein um HDTV/EDTV zu erkennen und setze den dazugehörigen Video-Modus.
Die libogc von DevkitPPC r15 setzt den Video-Modus automatisch durch einen Funktionsaufruf.
 
Die aktuelle automatische Erkennungsroutine arbeitet nicht mit PAL60 ((480i @ 60 Hz bei einer PAL Wii), die das offizielle Nintendo RGB-Kabel nutzt.


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


    switch(VIDEO_GetCurrentTvMode())
    {
        case VI_NTSC:
            rmode = &TVNtsc480IntDf;
        break;
        case VI_PAL:
            rmode = &TVPal528IntDf;
        break;
        case VI_MPAL:
            rmode = &TVMpal480IntDf;
        break;
        default:
            rmode = &TVNtsc480IntDf;
        break;
    }
    VIDEO_Configure(rmode);
==Wii Neustarten==
Es wäre eine gute Idee in jeder Homebrew die Möglichkeit einzubauen die Wii neuzustartn. Hier ist der Quellcode dafür.
<source lang="c">
<source lang="c">
void Reboot()
rmode = VIDEO_GetPreferredMode(NULL);
{
VIDEO_Configure(rmode);
// Thanks to hell_hibou
int fd = IOS_Open("/dev/stm/immediate", 0);
IOS_Ioctl(fd, 0x2001, NULL, 0, NULL, 0);
IOS_Close(fd);
}
</source>
</source>


Line 39: Line 13:
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.
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.


<source lang="c">
     // Binde einfach die unistd.h-Headerdatei ein und rufe die ''exit()'' Funktion auf, um zum loader zurück zu kommen
     // 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
     // Das Returnen aus der main Funktin funktioniert ebenso
Line 44: Line 19:
     // ....
     // ....
     exit(0);
     exit(0);
</source>


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.
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.
<source lang="c">
SYS_ResetSystem(SYS_RESTART,0,0);
</source>
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=
=Debugging Tipp=
Line 99: Line 85:


[[Category:German Pages]]
[[Category:German Pages]]
{{Languages|Developer_Tips}}

Revision as of 03:36, 20 July 2008

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.