Nanashi-softプログラマ専用PSPでプログラミング


◇PSPでプログラミング-新しいAPIを使う-

日々多くの発見があるPSPプログラミング
新しいAPIを使いたい場合、そのまま記述しただけではエラーになります。
ここでは、新しいAPIを使う為の方法を説明します。

●どうすれば使えるようになる?
APIをアセンブラで定義する必要があります。
一般的な雛形で言うと startup.sファイルです。
そうで無い人も「sceDisplay」で検索すると、どこかに定義群が見つかるはずです。
ここでは一般的な startup.sを使用している事を前提に説明します。

API名だけ分っていてもダメで、それを定義する為の情報が必要です。
例えば「sceDisplaySetFrameBuf」を定義したいとすると
「sceDisplay」ライブラリに属していて、関数IDが「0x289D82FE」だと知る必要があります。
更に、引数の数や型も分らなければ、実際に使う事ができません。
これらの情報は API一覧サイトや、掲示板をこまめにチェックしたりして集める必要があります。

●新たにライブラリから定義する
使いたいAPIがあって、ライブラリ名がソースのどこにも無い場合の定義方法です。

例として「sceKernelLibcClock」を定義したいとします。
定義を行う為に必要な情報は以下の通りです。

API名:sceKernelLibcClock
ライブラリ名:UtilsForUser
関数ID:0x91E4F6A7

「sceDisplay」の定義を見て下さい。
STUB_STARTでライブラリ名を定義して、STUB_FUNCで関数IDを定義して、STUB_ENDで閉じています。
この STUB_START〜STUB_ENDを1ブロックとして処理しています。

これを踏まえて、新たに「UtilsForUser」ライブラリを定義します。

STUB_START "UtilsForUser",0x40010000,0x00010005
STUB_FUNC  0x91E4F6A7,sceKernelLibcClock
STUB_END

コピーして定義する際の注意点は、1行目の最後のパラメータです。
0x00010005は、前後2バイト区切りで見ます。0x0001と 0x0005なわけです。
この前の 0x0001が STUB_FUNCの個数を意味しています。
じゃあ何の為に STUB_ENDを書くのか? と思いますが、そういうルールだと思いましょう(^^;

これで、sceKernelLibcClock関数が使用可能になるはずです。

●既にある定義に追加する
使いたいAPIのライブラリ名がソース中に既に有る場合の定義方法です。

例として「sceKernelCreateCallback」を定義したいと思います。

API名:sceKernelCreateCallback
ライブラリ名:ThreadManForUser
関数ID:0xE81CAF8F

ThreadManForUserライブラリは下記のように定義されています。

STUB_START "ThreadManForUser",0x40010000,0x000b0005
STUB_FUNC 0x446D8DE6,sceKernelCreateThread
STUB_FUNC 0xF475845D,sceKernelStartThread
STUB_FUNC 0xAA73C935,sceKernelExitThread
STUB_FUNC 0x9ACE131E,sceKernelSleepThread
STUB_FUNC 0x278C0DF5,sceKernelWaitThreadEnd
STUB_FUNC 0x9FA03CD3,sceKernelDeleteThread
STUB_FUNC 0x55C20A00,sceKernelCreateEventFlag
STUB_FUNC 0xEF9E4C70,sceKernelDeleteEventFlag
STUB_FUNC 0x1FB15A32,sceKernelSetEventFlag
STUB_FUNC 0x812346E4,sceKernelClearEventFlag
STUB_FUNC 0x402FCF22,sceKernelWaitEventFlag
STUB_END

ここに「sceKernelCreateCallback」を追加すると、以下のようになります。

STUB_START "ThreadManForUser",0x40010000,0x000c0005
STUB_FUNC 0x446D8DE6,sceKernelCreateThread
STUB_FUNC 0xF475845D,sceKernelStartThread
STUB_FUNC 0xAA73C935,sceKernelExitThread
STUB_FUNC 0x9ACE131E,sceKernelSleepThread
STUB_FUNC 0x278C0DF5,sceKernelWaitThreadEnd
STUB_FUNC 0x9FA03CD3,sceKernelDeleteThread
STUB_FUNC 0x55C20A00,sceKernelCreateEventFlag
STUB_FUNC 0xEF9E4C70,sceKernelDeleteEventFlag
STUB_FUNC 0x1FB15A32,sceKernelSetEventFlag
STUB_FUNC 0x812346E4,sceKernelClearEventFlag
STUB_FUNC 0x402FCF22,sceKernelWaitEventFlag
STUB_FUNC 0xE81CAF8F,sceKernelCreateCallback
STUB_END

STUB_FUNCに他と同じように関数IDと関数名を記述します。
この STUB_FUNCはどの順番で記述しても構いません。

追加したら、1行目の最終パラメータも修正する必要があります。
0x000b0005の部分は、前後2バイト区切りで意味があります。つまり、0x000bと0x0005なわけです。
この前半分が STUB_FUNCの数を示します。
1つ追加したので、0x000cにする必要があるわけです。

●定義すると起動しなくなる場合(上級者向け)
現在の一般的な雛形の場合、ライブラリ名を記述するだけでフリーズする場合があります。
これを回避する方法を書きますが、プログラムの実行モードを触っている可能性があるので、自己判断で使用して下さい。

「SysclibForKernel」ライブラリの「memcpy」「memmove」関数を定義してみます。
※注意:あくまで例であり、これを書いている時点ではこれらの関数は使用方法が判明していません

STUB_START "SysclibForKernel",0x40010000,0x00020005
STUB_FUNC 0xab7592ff,memcpy
STUB_FUNC 0xa48d2592,memmove
STUB_END

この定義を追加すると、ビルドは可能ですが、実行しようとするとフリーズします。

「.xodata.sceModuleInfo」セクションに 「.byte 0,0,1,1」と記述された箇所があると思います。
雛形によっては word記述で「.word 0x01010000」かも知れません。
ここの値を「.byte 0,16,1,1」もしくは「.word 0x01011000」に変更して下さい。

そうすると、起動時にフリーズしなくなります。
但し、使用可能かどうかとは別問題ですので、関数を呼ぶ際には十分注意して下さい。



TOPプログラマ専用PSPでプログラミング