PSPでHello Worldを表示してみる

こんにちは。今回はPSPで動作するアプリケーションを組んでみたいと思います。

きっかけ

PSP(PlayStation Portable)はソニー・コンピュータエンタテインメント(SCE)が2004年に発売した携帯ゲーム機です。発売からはや17年が経とうとしているこの時代に何をトチ狂ったことを、と思われるかと存じますが。

かつてPSPの初期型(記憶にある範囲では1000型と2000型の初期ロット)にはカーネルレベルに不具合というか脆弱性が存在しまして、ファームウェアを不正に書き換え、SCEの認めていないプログラムを実行する、というのが流行りました。パンドラバッテリーとかマジックメモリースティックとか、憶えている方もいらっしゃるのではないでしょうか。私もPSP 2000の初期ロットを持っていて、相当に改造を加えた記憶があります。CFWとか、UMDからISO吸い出しとかねw

ただ、その頃はカーネルが何なのかも自分が何をやっているのかもよく分かっていなかったので、CFW導入の際も、サイトに書かれているまま、人に言われるままに手順を踏んでいるだけに過ぎませんでした。

で、一応SEとして5年経験を積みまして、そろそろ中身も理解できるようになっているんじゃないかなという期待も込めまして、復習がてらやってみたものであります。

今回はカーネルとか深いことを考えずにとりあえずCFWありきで自作プログラムを動かすところまでやります。

開発環境

MacとかLinuxとかの環境は幾つか紹介されているサイトを見ましたが、私はMS信者なので今回も徹頭徹尾Windows環境をぶっ通します。

なお、実機デバッグのCFWには 5.50 Prome-4 を使用します。

セットアップ

Minimalist PSPSDKを適当な場所にインストールします。

今回はCドライブ直下に置いたものとみなします。

C:\\pspsdk\\bin にPATHを通します。

開発環境ディレクトリを作成し、Visual Studio Codeを開きます。

コマンドパレットから「C/C++: Edit Configuration (JSON)」を選択し、 .vscode/c_cpp_properties.json を作成します。

↓こんな感じでインクルードファイルを設定します。

{
    "configurations": [
        {
            "name": "Win32",
            "includePath": [
                "C:\\pspsdk\\lib\\gcc\\psp\\4.3.5\\include",
                "C:\\pspsdk\\psp\\include",
                "C:\\pspsdk\\psp\\sdk\\include",
                "${workspaceFolder}/**"
            ],
            "defines": [
                "_DEBUG",
                "UNICODE",
                "_UNICODE"
            ],
            "intelliSenseMode": "gcc-x64"
        }
    ],
    "version": 4
}

.vscode/tasks.json を構成します。

{
    "version": "2.0.0",
    "tasks": [
        {
            "label": "build",
            "type": "shell",
            "command": "make",
            "group": {
                "kind": "build",
                "isDefault": true
            }
        },
        {
            "label": "clean",
            "type": "shell",
            "command": "make",
            "args": [
                "clean"
            ]
        }
    ]
}

Makefile を書きます。

TARGET = TEST
OBJS = main.o

CFLAGS = -O2 -G0 -Wall -g
CXXFLAGS = $(CFLAGS) -fno-exceptions -fno-rtti
ASFLAGS = $(CFLAGS)

LIBDIR =
LDFLAGS =
LIBS = -lpspgum -lpspgu

EXTRA_TARGETS = EBOOT.PBP
PSP_EBOOT_TITLE = Test
PSP_EBOOT_ICON = NULL
PSP_EBOOT_ICON1 = NULL
PSP_EBOOT_UNKPNG = NULL
PSP_EBOOT_PIC1 = NULL
PSP_EBOOT_SND0 = NULL

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

で、コードを書きます。

#include <pspkernel.h>
#include <pspdebug.h>

PSP_MODULE_INFO("Hello World", PSP_MODULE_USER, 1, 1);
PSP_MAIN_THREAD_ATTR(PSP_THREAD_ATTR_USER);

int main(int argc, char *argv[]) {
    pspDebugScreenInit();
    pspDebugScreenSetXY(0, 0);
    pspDebugScreenPrintf("Hello World!!");

    return 0;
}

Ctrl + Shift + B でビルドします。

出力されたファイルのうち EBOOT.PBP なるファイルをPSPの PSP\\GAME\\(AppName) に突っ込みます。 (AppName) は任意の半角英数でよいです。

PSPから起動すると、Hello Worldが表示されました。

API References

有志の Official Source Documentation に書いてあることを翻訳します。

pspDebugScreenInit()

デバッグスクリーンを初期化します。

pspDebugScreenSetXY(int x, int y)

スクリーンを指定した (x, y) 座標に設定します。

pspDebugScreenPrintf(const char* fmt, …)

デバッグスクリーンに printf します。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です