PSPプログラミングをはじめる前に確認しておきたいこと

まず、PSPを持っている必要があります。加えて、自作プログラムが動作可能なカスタムファームウェアをPSPに導入済みであることも前提となります。
カスタムファームウェアの導入などに関してはEmu on PSP+PS3が詳しいです。
次に必要なのはコンピュータです。Windows系列のOS、特にWindowsXPが搭載されていると良いでしょう。Vistaでも良いです。別にLinux系列のOSでも良いのですが、後述の開発環境構築講座が役に立たなくなります。
最後に、時間と根気が必要です。おそらくこの二つが最も重要です。非公式なSDKやライブラリを使う以上、どこにバグが潜んでいるかわかりません。うまく動かなかったらまず自分のコードを疑い、ライブラリを疑い、SDKを疑い、果てはPSPを疑う必要があります。ローマは一日にして成らず、ゆっくり確実に組んでいきましょう。

書き忘れましたが、当然のごとくC言語とC++言語のどちらかをある程度使いこなせることが前提となります。

開発環境構築講座

開発環境にはSDKとしてMinimalist PSPSDK for Windowsを、IDEとしてVisual C++ 2008 Express Editionを使うのがお勧めです。特に前者はコンパイル済みのSDKをインストールしてくれるので、他の方法と比較してインストールの時間が非常に短くて済みます。
適当にインストールしてください。設定は全部デフォルトのままで良いです。で、インストールが終わったら一度IDEを起動してください。初回起動時の処理が数分間行われますが、スルーの方向でいいです。
とりあえず開発環境の構築は以上です。詳しい説明を思いっきりかっ飛ばしましたが、これくらいの説明で解るような方(もしくは、解らなかった部分を自力で調べられる方)でないとPSPの開発は無理です。教えて君や初心者気取りには絶対に無理です。大抵の情報はインターネット上に存在します。英語だったら翻訳サイトでも活用してください。解らなかったら聞く前に自分で調べる。これが鉄則です。公式のマニュアルなんて存在しないのですから。

プロジェクトの作成

ここでは前述の開発環境がインストールされていることを前提に手順を書きます。他の環境の場合は適宜読み替えるなり、自分なりの方法を模索してください。
IDEを起動したら「ファイル」→「新規作成」→「プロジェクト」と進んでください。大き目のダイアログボックスが出るはずです。プロジェクトの種類で「全般」を選択し、テンプレートで「メイクファイルプロジェクト」を選択してください。プロジェクト名や場所はお好みでどうぞ。ただ、日本語や全角文字が含まれているディレクトリは避けた方がいいかもしれません。
ダイアログがメイクファイル プロジェクト ウィザードというものになったと思います。概要に興味は無いので「次に」を押しましょう。すると何やら文字列を入力できそうなフォームがいくつか出てきます。これらで用があるのは「ビルドコマンドライン」「消去コマンド」「リビルドコマンドライン」の三つです。それぞれ「make」「make clean」「make rebuild」と入力して「次へ」を押しましょう。リリース構成なんてどうでもいいです。外部SDKを利用する以上、どうせ変わりません。さっさと「完了」を押してしまいましょう。
今度はIDEの左側に表示されている(はずの)ソリューションエクスプローラを適当に右クリックして「追加」→「新しい項目」と選択してください。テンプレートでは「C++ファイル」を選択してください。そしてファイル名の欄には「test.c」と入力し、場所欄は変更しないでください。ファイルが生成されたら次の内容を打ち込んでください。

  1. #include <pspkernel.h>
  2. PSP_MODULE_INFO("TEST", 0, 1, 1);
  3. PSP_MAIN_THREAD_ATTR(THREAD_ATTR_USER|THREAD_ATTR_VFPU);
  4. int main(){}
最後に、プロジェクトのディレクトリ(つまりtest.cが存在するディレクトリ)に「Makefile」という名前のファイルを作ります。拡張子は付けずに「Makefile」という名前で作ってください。そうしたらワードパッド等のテキストエディタで開いて、次のように打ち込んでください。
  1. TARGET = TestProject
  2. OBJS = test.o
  3. INCDIR =
  4. CFLAGS = -O3 -G0 -Wall
  5. CXXFLAGS = $(CFLAGS) -fno-exceptions -fno-rtti -fcheck-new
  6. ASFLAGS = $(CFLAGS)
  7. LIBDIR =
  8. LDFLAGS =
  9. LIBS =
  10. EXTRA_TARGETS = EBOOT.PBP
  11. PSP_EBOOT_TITLE = Title
  12. PSPSDK=$(shell psp-config --pspsdk-path)
  13. include $(PSPSDK)/lib/build.mak
ここまで無事に終わりました?終わったらIDE上でF7キーを押してみてください。なにやらIDEの下の方にいろいろと表示され、プロジェクトのディレクトリに「EBOOT.PBP」ファイルが生成されていれば成功です。PSPで実行すると、目の前が真っ暗に…じゃなくて、画面が真っ暗になってフリーズした揚句、10秒後に電源が落ちます。これは先ほどのソースコードが本当に最低限のもので、プログラムが終了する際にXMBに戻る処理を行っていないからです。兎も角、これで貴方もPSPプログラマの端くれとなったわけです。めでたしめでたし。

Makefileのいじり方

先ほどMakefileを作りました。これの必要最低限の文法を身につけておかないとPSPのプログラミングがはかどりません。ライブラリの組み込みやソースコードの分割など、全てこのMakefileに情報を与えなければいけないからです。
例えるならば…ソースコードがプログラムの「設計図」であり、Makefileは「どの設計図」から「どのようにして」プログラムを組み立てるのかという「手順書」となります。
兎も角、少しづついじってみましょう。まずは、ソースコードを追加する場合です。便宜上、ソースコードの名前はhoge.cとします。

  1. OBJS = test.o
先ほどのMakefileのこの部分を
  1. OBJS = test.o hoge.o
このようにするとhoge.cがコンパイルの対象になります。ここで、hoge.oを追加したことに注意してください。hoge.cではありません。hoge.oをMakefileに追加することで、hoge.*という名前のソースコードを追加するという事になります。逆に言うとhoge.cでもhoge.cppでもMakefileに追加するのはhoge.oです。

次に、ライブラリを追加してみます。その前に算術系の関数をいくつか使ってコードを書いてみてください。math.hをインクルードすると使える関数(たとえばsin関数)です。おそらくコンパイルが成功した後、リンクに失敗するでしょう。算術系関数はCの標準関数のくせにデフォルトのリンク対象になっていないので、Makefileで指定する必要があります。
  1. LIBS =
この部分を
  1. LIBS = -lm
とします。ちなみに、C++言語のnewやdeleteもデフォルトのリンク対象になっていません。使いたいときは同様に-lstdc++を追加すればokです。指定するライブラリが複数ある場合は必ず半角スペースで区切ってください。

Makefileの基本は使うものが増えたら半角スペースを空けてから継ぎ足すことです。それだけで大体必要なことは可能です。 おしまいにもう一つくらい紹介します。
  1. PSP_EBOOT_TITLE = Title
この部分を
  1. PSP_EBOOT_TITLE = poe
とすることでPSP本体に表示されるゲーム名を変更できます。この場合はpoeと表示されるようになります。

DXライブラリPortableの組み込み

では、チュートリアル最終段階としていよいよDXライブラリPortableをプロジェクトに組み込みます。 ダウンロードページから最新版をDLしたら、zip圧縮されているので適当に展開してください。dxlibp.adxlibp.hというファイルが入っているはずです。これをMakefileと同じディレクトリに入れてください。ソースコードからdxlibp.hをインクルードし、MakefileのLIBSの欄にはdxlibp.a -lpspgu -lz -lm -lpsprtc -lpspaudio -lpspaudiocodec -lpsputility -lpspvalloc -lpsppowerを書き加えてください。これだけで組み込みは完了です。
なお、LIBSに追加する時に少し可読性を良くする書き方があります。

  1. LIBS =
  2. LIBS += dxlibp.a -lpspgu -lz -lm -lpsprtc -lpspaudio -lpspaudiocodec -lpsputility -lpspvalloc -lpsppower#DXライブラリPortable使用時に追加
このようにすることで他のライブラリを使うときにごちゃまぜになることを防げます。その結果として-lmが複数になったりしても、リンカがうまいこと判断してくれるので大丈夫です。あと、#を使うことでC++言語の//と同じように行末までコメントアウトが成されます。

さて、組み込んだだけじゃ面白くありません。少し使ってみましょう。 ソースコードのmain関数を以下のようにしてください。ついでにdxlibp.hをインクルードするのも忘れずに・・・

  1. int main()
  2. {
  3. DxLib_Init();
  4. while(ProcessMessage() != -1)
  5. {
  6. ClearDrawScreen();
  7. printfDx("Hello world!");
  8. ScreenFlip();
  9. }
  10. DxLib_End();
  11. return 0;
  12. }

ビルドしたらPSPで実行してみてください。画面の左上の方に決まり文句が表示されたと思います。

おわりに

以上で最低限の開発方法が解ったと思います。解らなかったらまず自分で調べて、試行錯誤してみてください。人に聞くのはそれからです。 …などという普通のプログラマには要らないお説教なんて置いといて、DXライブラリPortableの詳しい使い方はこのWikiにいろいろと書き込むので探してみてください。ちなみに、関数群の動作と名称をDXライブラリというPC向けの2Dゲーム向けライブラリからパクっ…非常に参考にさせていただいていますので、そちらの関数一覧を見た方が全容が把握しやすいかもしれません。(このライブラリを作った一番の動機はDXライブラリへの憧れかもしれませんw)