AnMaBaGiMa's Home

PSP Homebrews mit C++ erstellen - Eine Einführung

Was brauche ich zum Start ?

Das wichtigste ist, Ihr braucht eine PSP auf der Ihr Eure Homebrews auch ausführen könnt. Soweit ich weiß braucht Ihr dazu eine CFW. Auf der sehr guten Seite www.pspking.de findet Ihr alles wissenswerte um CFW's und wie man diese auf der PSP installiert.

Nun - es gibt verschiedene Entwicklungsumgebungen für die PSP. Einige sind mehr, die anderen weniger komfortabel. Ich habe schon viel mit der Eclipse IDE als Entwicklungsumgebung gearbeitet und fühle mich dort quasi "zu Hause". Darum habe ich mich für eben diese Entwicklungsumgebung entschieden.

Alles was man braucht ist die C++ Eclipse IDE die man hier runter laden kann. Und dann noch das entsprechende PSPSDK (SoftwareDevelopmentKit). Dies bekommt ihr hier inclusive einer guten Anleitung für die Einrichtung. Für die Eclipse IDE ist es vielleicht nocht wichtig zu erwähnen, dass eine möglichst neue Java Laufzeitumgebung(JRE) auf Eurem Rechner installiert sein sollte. Von der Sun downloadseite kann man diese beziehen.

Grundüberlegungen - wie fange ich an

Zunächst wird davon ausgegangen, dass ein paar Grundkenntnisse zur Entwicklung von Homebrews vorhenden ist. Ohne Probleme kann ein neues Projekt inklusive einer main.c und einem Makefile erstellt werden. Dieses ergibt dann nach dem Compilieren und Linken eine EBOOT.PBP.
So weit so gut....Doch jeder hat bestimmt schon festgestellt, dass bestimmte dinge bei dem Erstellen von Homebrews immer gleich sind, und deren ständiges "copy+paste" auf die Dauer auch ziemlich anstrengend sind. Um dieses Problem zu umgehen, habe ich eine kleine eigene Library geschrieben die in das PSPSDK eingebunden werden kann. Dadurch entfallen bestimmte immer wiederkehrende Aufgaben und man kann sich auf die Eigentliche Arbeit: das programmieren des Homebrews konzentrieren. Wo gibt's diese Library? Diese Library ist Opensource und von der Google-Projektseite herunter geladen werden. Auch wenn es auf der Projektseite eine kurze Anleitung gibt wie man die Library nutzt hier nochmal eine kurze Zusammenfassung. Diese erstellt exemplarisch auf Basis der PSPHBC ein kleines Homebrew. Durch die Nutzung von Klassen in der Bibliothek müssen wir unser Homebrew mit C++ erstellen und compilieren. Darum enden die Sourcefiles alle auf cpp.
Die Schritte die zu machen sind im einzelnen:
  1. Implementieren der Homebrew-Basis Klasse. Der Konstruktor und Destruktor sind dabei protected
    Welche Basisklasse genutzt wird hängt von dem jeweiligen Ziel ab, das das eigene Homebrew verfolgt. Folgende Basisklassen stehen zur Verfügung:
    • ClHomebrew: Absolute Basisklasse für kleine HB's ohne Grafikausgabe
    • Cl2dHomebrew: Basisklasse für einfache 2D-Grafik HB's
    • Cl3dHomebrew: Basisklasse für 3D Homebrews die auf der PSP GU aufsetzen
  2. Bereitstellen der statischen Methoden get_instance und clean_instance für Singleton-Instanziierung der Applikationsklasse
  3. Implementieren der Methode mainthread bzw. render (bei Cl2d- oder Cl3dHomebrew)
  4. Erstellen einer main.cpp nach dem unten dargestellten Muster
main.cpp
extern "C" {
#include 
#include 
}

#include "YourApplivationClass.h"
PSP_MODULE_INFO("PSP HB", 0, 1, 1);
PSP_MAIN_THREAD_ATTR(THREAD_ATTR_USER);
PSP_HEAP_SIZE_KB(-2048);

int main(int argc, char* argv[]){
         ClYourApplicationClass* myHomebrew;
         myHomebrew = ClYourApplicationClass::get_instance();
         if (myHomebrew->init()){
                 myHomebrew->run();
                 myHomebrew->exit();
         }
         ClYourApplicationClass::clean_instance();
         //once finished exit the application
         sceKernelExitGame();
         return 0;
}

Um bei der Erstellung des Homebrews nun auch die neue Bibliothek zu nutzen, muss diese bei den LIBS entsprechend aufgeführt werden. Zusätzlich werden wir für das Compilieren aller cpp-Dateien im Projektverzeichnis einen Wildcard nutzen um die neu erstellten Dateien nicht immer wieder neu in dem Makefile aufführen zu müssen.
Exemplarisch sieht das Makefile dann wie folgt aus:
Makefile
TARGET = YourHomebrew

SOURCES = $(wildcard *.cpp)
OBJS = $(patsubst %.cpp,%.o,$(SOURCES))

INCDIR =
CFLAGS = -G0 -Wall -g
CXXFLAGS = $(CFLAGS) -fno-exceptions #-fno-rtti
ASFLAGS = $(CFLAGS)
BUILD_PRX = 1

LIBDIR =
LDFLAGS =
LIBS= -lpsphbc -lstdc++ -lpsputility -lintraFont -lpspgum -lpspgu -lpsprtc -lpsppower -lpng -lz -lm

EXTRA_TARGETS = EBOOT.PBP
PSP_EBOOT_TITLE = PSP MyHB
PSP_LARGE_MEM=1
PSP_FW_VERSION=550

PSPSDK=$(shell psp-config --pspsdk-path)
include $(PSPSDK)/lib/build.mak