ホーム   »  スポンサー広告  »  スポンサーサイト   »  PSPプログラミング  »  第8弾 : プラグインの作成

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

第8弾 : プラグインの作成

どうもブログ続かないですねw
これは私自身の問題ですが。

さて、今回はプラグインの作成を解説しましょう。

プラグインとは *.prx のように拡張子がprxのファイルです。
通常sepluginsディレクトリにコピーして、同ディレクトリのvsh.txtなどにパスを記述していますね。

プラグインは数多くリリースされています。
カーネルモードでの動作が可能なこと。
それからXMBやゲーム中でも動作可能なことが利点として挙げられます。
CFW/LCFWもそのほとんどがプラグインです。

一つ問題があります。
文字の表示が難しいという点です。

EBOOT.PBP形式の場合、pspDebugScreen系で文字列の表示、描画ができました。
プラグインではpspDebugScreen系は使えません(使えるかもしれないが、それなりの知識が必要)。

では、文字描画は出来ないのか?というと出来ます。
カラクリはPSPの画面描画処理に割り込みをしてプラグイン側で上書き描画するというものです。
具体的に言うとPSPのVRAMアドレスを取得し、VRAMの内容を書き換える処理です。

点や線の描画は単純ですが、文字の描画は複雑です。
なので今回はプラグインのテンプレートだけを作りましょう。

作成するプラグインは以下3つのファイルが必要です。
・main.c
・Makefile
・exports.exp

exports.expとはエクスポートファイルといい、プラグインが外部に公開する情報を指定するファイルです。


PSP_BEGIN_EXPORTS

PSP_EXPORT_START(syslib, 0, 0x8000)
PSP_EXPORT_FUNC(module_start)
PSP_EXPORT_FUNC(module_stop)
PSP_EXPORT_VAR(module_info)
PSP_EXPORT_END

PSP_END_EXPORTS

exports.exp ファイル

特に変更することはないので説明は割愛します。


TARGET = kprx
OBJS = main.o exports.o

USE_KERNEL_LIBC = 1
USE_KERNEL_LIBS = 1

INCDIR =
CFLAGS = -O2 -G0 -Wall -fno-builtin-printf
CXXFLAGS = $(CFLAGS) -fno-exceptions -fno-rtti
ASFLAGS = $(CFLAGS)

LIBDIR =
LIBS =

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

Makefile ファイル

参加させるファイルはOBJSに追加していき、必要なライブラリはLIBSに追加していくのでしたね。
このメイクファイルがデフォルトで結合するライブラリは
-lpspdebug -lpspdisplay_driver -lpspctrl_driver -lpspsdk -lpspkernel
です。


#include <pspkernel.h>

PSP_MODULE_INFO( "kprx", PSP_MODULE_KERNEL, 1, 1 );

int main_thread( SceSize args, void *argp )
{
// to do

return 0;
}

int module_start( SceSize args, void *argp )
{
int thid = sceKernelCreateThread( "main_thread", main_thread, 7, 0x800, 0, NULL );
if( thid >= 0 )
sceKernelStartThread( thid, args, argp );

return 0;
}

int module_stop( SceSize args, void *argp )
{
return 0;
}

main.c ファイル

PSP_MODULE_KERNEL = 0x1000 です。カーネルモードプラグインで在るコトを表します。

main_thread関数はスレッドです。
プラグインの殆どの主な処理はここに記述します。
sceKernelCreateThread関数の第6引数がmain_thread関数の第2引数に渡されます。
今回はNULLです。

module_start関数内でmain_threadスレッドは作成されます。
殆どのプラグインのmodule_start関数は似ています。
初期化処理など、モジュールスタート時に必要な処理を書くといいでしょう。
ループや待機処理などは記述してはいけません。
PSP起動時にCFW/LCFWがシステムモジュールのロードに割り込み、プラグインを読み込ませるのですが。
このとき、module_start関数で処理が進まなくなると、sceKernelStartModule関数の処理が終わらず、次に読み込まれるモジュールの読み込みもスタートされなくなります。

module_stop関数はモジュールがストップする際に呼び出されます。
何もせず0を返すだけです。
sceKernelStopModule関数が呼ばれると、内部でmodule_stop関数が呼ばれるます。
2012/03/21 編集

これら三つのファイルを保存し同ディレクトリに!_mk.batファイルをコピーし実行するとコンパイルされます。
できた kprx.prx を ms0:/seplugins/ ディレクトリにコピーし vsh.txt に ms0:/seplugins/kprx.prx 1 と記述し再起するとプラグインが動作します。バグがあるとPSPは起動しないでしょう。

これで一通りのプラグイン開発の説明が終わりました。
今回は視覚に訴えるものが無いので物足りなかったでしょう。
次回、点や線の描画を解説します。
スポンサーサイト
Comment
いまさらですが…
module_stop はアンロードの際ではなく、
sceKernelStopModule関数が呼び出された際に
実行するものと思われます。

突然、失礼いたしました。
Re: いまさらですが…
> module_stop はアンロードの際ではなく、
> sceKernelStopModule関数が呼び出された際に
> 実行するものと思われます。
>
> 突然、失礼いたしました。

ご指摘ありがとうございます。
修正しました。
Trackback
Trackback URL
Comment Form
管理者にだけ表示を許可する
Twitter...A

estuibal=Y.K < > Reload

検索フォーム
RSSリンクの表示
リンク
QRコード
QR
ブロとも申請フォーム
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。