Archive für 20.11.2009

Mein erstes Homebrew

Hallo Welt - oder ?

Das ist der Klassiker - oder ? Also wollen auch wir damit starten. Daran lässt sich sehr leicht die grundlegende Struktur erkennen und wir können dies sehr schnell ausbauen um unser Ziel zu erreichen: Ein PSP Spiel….Also los geht’s. Zunächst legen wir uns in eclipse ein neues C/C++ Projekt an. Wenn die Einstellungen in der IDE korrekt sind, dann werden bei der Projektanlage auch gleich alle Include-Pfade für die notwendigen Header-Dateien gesetzt. Nachdem das Projekt nun erfolgreich erzeugt wurde, wird die leere Hülle gefüllt. Es müssen mindestens 2 Dateien vorhanden sein.

Das Makefile

In dem “Makefile” - das genau so heißt und keine Dateiendung hat - wird beschrieben was der Compiler zu tun hat um unser PSP Homebrew zu erstellen. Für den ersten Start sieht das etwa so aus:

TARGET = pspdemo
OBJS = main.o
INCDIR =
CFLAGS = -G0 -Wall -g
CXXFLAGS = $(CFLAGS) -fno-exceptions -fno-rtti
ASFLAGS = $(CFLAGS
BUILD_PRX = 1
LIBDIR =
LDFLAGS =
LIBS=
EXTRA_TARGETS = EBOOT.PBP
PSP_EBOOT_TITLE = PSP Demo
PSP_LARGE_MEM=1
PSP_FW_VERSION=150
PSPSDK=$(shell psp-config --pspsdk-path)
include $(PSPSDK)/lib/build.mak

Das Hauptprogramm

Nachdem wir in unserem Makefile festgelegt haben, dass die Datei “main.o” zum Erstellen der Homebrew genommen werden soll müssen wir in unserem Projekt ein gleichnamige Datei mit der Dateiendung c oder cpp erstellen. In unserem Falle wird die Datei main.cpp heißen. Für ein erstes “Hallo Welt!” muss nicht viel getan werden. Eine Hauptroutine die das Homebrew initialisiert und dann in einer Schleife läuft bis die “home”-Taste der PSP gedrückt wurde.

Zunächst müssen wir einige header-Files einbinden. Da wir eine CPP-Datei nutzen müssen diese als externe “C”-Quelle eingebunden werden. Zusätzlich müssen ein paar feste Makros eingebunden werden die unser Homebrew initialisieren:

/*
* main.cpp
*
* The first simple homebrew
*/
extern “C” {
#include <pspdebug.h>
#include <pspkernel.h>
}
PSP_MODULE_INFO(“PSP Demo”, 0, 1, 1);
PSP_MAIN_THREAD_ATTR(PSP_THREAD_ATTR_USER);

Kommen wir nun zur eigentlichen Hauptroutine. Diese initialisiert die PSP Callbacks, schreibt was auf den Bildschirm und wartet auf die “home”-Taste:

int main(int argc, char* argv[]){//initialisieren Screen
pspDebugScreenInit();
//initialisieren der Callbacks
setupCallbacks();
pspDebugScreenPrintf(“Hallo Welt!”);
while(running()){
}
//Homebrew verlassen
sceKernelExitGame();
return 0;

Die zwei Routinen setupCallbacks und running werden im Grunde in jeder Homebrew gebraucht. Darum macht es Sinn diese zentral für jedes Project verfügbar abzulegen und wieder zu verwenden. Die Dateien callbacks.h und callbacks.c sind in dem Beispielverzeichnis des SDK zu finden. Es bietet sich an diese beiden Dateien in einem Ordner “common” unterhalb des Workspace Ordners zu platzieren. Wenn das erledigt ist muss das Makefile und das Hauptprogramm noch leicht erweitert werden. Das Hauptprogramm um folgendes Include:
#include“../common/callbacks.h”
Das Makefile muss in der liste der Dateien folgendermaßen ergänzt werden:
OBJS = main.o ../common/callbacks.o

Wenn wir nun alles beisammen haben und das Projekt hoffentlich fehlerfrei erstellen konnten, dann sieht das ganze auf der PSP - völlig unspektakulär - folgendermaßen aus:
Hallo Welt auf der PSP

|