MEってのがあるらしい。
■えええと、ちょっと前。yoyoFrに行った時。通常版とME版ってゆーのがあってさ。
その頃から「ME」ってなんじゃらほい。って思ってた事は思ってた気がする。
どうやら、
October 27, 2005 20:39:40 http://ameblo.jp/pspusr-ls/entry-10005551939.html#cbox
去年の10月...半年以上オクレテル。ちうか、去年の10月はマダあちしインターネットなかつたでしゅ。
で、http://www.stashbox.org/uploads/1129672725/meccode.zipがサンプルコードの例。(環境がないと無意味)
ちなみにこの辺の話は、 http://rukapsp.hp.infoseek.co.jp/cgi-bin/bbs03/yybbs.cgi?page=5&bl=0
からたずねた。
■えええと、手抜きしないで説明すると。
PSPには「CPU」とは別に「CPUみたいなもの」があって、「それ」は333MHzで駆動できるそう。
で、その「CPUみたいなもの」の名前が「メディアエンジン=MediaEngine=ME」ちう訳。
「CPUみたいなもの」ぢゃなくってタブンCPUそのものだと思う、常識で考えて。
PS2はGPUをEE(エモーションエンジン)とかゆー用語で呼んでたし、まーそーにーらしい用語の付け方だが、
つまりべたな用語で言えば「サブCPU」だな。
で、「サブCPU」ちうのは、まーそれなりに苦労にたえない歴史がある。
古くは「FM7」(というPCが太古の昔あった)ハッカー以外には活用されなかった。
「サターン」「メガCD」「32X」(というゲーム機が古代にあった)SEGAの極一部以外には活用されなかった。
ACは比較的かつよーしたけど、「パフォーマンス向上」が目的ではなくて、「分業」が目的だったり。
■で、あちしは初心者であつて。んなもん使った事ないケド。(っていうかやり方すらワカラン)
e氏やruka氏は使ってみたそーな。
■そゆーわけで、ここから妄想記事モードON。
メガドラエミュの場合、絶対ひつよーな気がする。だって、「PSPE」で動かす必要は絶対にない。
(それならPCのGENS辺りで遊んでくれ)
で、「メインCPU」と同期が出来ないそうだから、「音源用途」が最適だよな。
「音源」は重い処理だし、そもそも「メインCPU」と同期する必要性がまったくない。
なぜなら「人間の耳」の「工学特性」として、「(時間的な)位相」には「とてつもなく鈍感」だからだ。
たとえば、44100でレンダリングするとして、「正確な時間で鳴らした音」と、(1フレーム=1/60秒)
「わざと5フレーム遅らせてた時間で鳴らした音」の区別が付く「人間」はいない。(耳の仕組みではなく、
脳みそが音を理解する仕組みの都合上らしい)
(注:「近くに基準の時間の音」があれば、「時間位相差の区別は付く」し、「絶対的な音の長さ」の「区別も付く」。
それらの「区別」とこの場合の(位相ずれの)「区別」とは話が別なんで「混同」しない様に)
「視力」の方は「1フレーム」遅らせれば「区別が付く」癖に、実は「音」はこの体たらくなんである。
もちろん「(時間的な)位相だけ鈍感」なんであって、「解像度(量子化ビット数)」や「帯域(サンプリング周波数)」に、
関しては、(個人差があるが)それなりに敏感なんである。あと、時間的な位相であっても、「ワウフラッター」の様な
相対的なズレに関してはもちろん敏感だ。それは視力で言えば「エッジ検出」のよーなもんだからな。アタリマエだ。
そのうちなんとかしなきゃナラン問題な気がスル。
(2006-06/22、00:38)
■で、ちと先ほどのMEのサンプル眺めてみた。(PSPSDKインストールが前提だから、眺めるダケ)
えっと、エーゴでコメントがありますやね。で、エート。0x80000000から0x80200000はスタックで、はじめのほー
は使ったらイカンが適当に大きさを取って、最後のほーはMEでのわーくに使ってヨシ。って書いてある。
それからMEは「kernel-mode」で起動するひつよーがある。(startup.Sさんしょー、あちしは「user-mode」しか使った事ない)
で、「kernel-mode」の場合は「HOME終了」が出来ねー。って書いてある。(が、古い情報かも知れない)
ふうん。変数の受け渡しは、アドレスに、
unsigned int g_counter;//CPU側の普通ーのへんすー。
void me_func(void){//この関数はME側(あとで丸ごとメインからMEへコピーしちゃう)(もしかして直接呼ぶのかも??)
unsigned int *pctr;
pctr = (unsigned int *)(((int)&g_counter)|0x40000000);//(ME用に強制)アドレス加工しちゃうにゃご。
while(1){//無限ループ(ME終わっちゃうとめんどい)
(*pctr) += 12345;//でME側から弄れる。(MEが動いてる限り弄り続ける)
}
}
で、me_funcの登録は、
#define vsync sceDisplayWaitVblankStart
void xmain(void){
中略(初期化)
me_startproc((u32)me_func,0x10000);//ME登録
{
unsigned int *pctr;
pctr = (unsigned int *)(((int)&g_counter)|0x40000000);//(メイン用に強制)アドレス加工しちゃうにゃご。
while(1){//無限ループ(メイン終わっちゃうとめんどい)
pspDebugScreenPrintf("ME Counter: %08x\n", *pctr);//でメイン側から(MEの挙動を)読める??
//HOME終了はできんから自前で処理(って出来るジャン)
sceCtrlReadBufferPositive(&ctl, 1);
if(ctl.Buttons & PSP_CTRL_HOME)//(そっか「kernel-mode」なら「HOMEキー」直接読めるんだあ)
{
sceKernelExitGame();//おちまい
}
vsync();
}
me_startprocの中身は、
static void me_startproc(u32 func, u32 param)
{
memcpy((void *)0xbfc00040, me_stub, (int)(me_stub_end - me_stub));//これが噂の丸ごとコピー。MEスタートアップルーチンのコピー??
_sw(func, 0xbfc00600);
_sw(param, 0xbfc00604);
sceKernelDcacheWritebackAll();
sceSysregMeResetEnable();
sceSysregMeBusClockEnable();
sceSysregMeResetDisable();
}
よくワカランにゃあ。_swって何?STUB_WRITE?あとで調べにゃ。そうそう「me_stub」ってのは、
アセンブラのかんすー。えっと、
; file:"mestub.S"
; this stub is from the melib package, (c)mrbrown
#include <regdef.h>
#define STATUS $12
#define CAUSE $13
#define CONFIG $16
#define TAGLO $28
#define TAGHI $29
#define IXIST 0x01
#define DXIST 0x11
.global me_stub
.global me_stub_end
.set noreorder
.set noat
me_stub:
li k0, 0xbc100000
li t0, 7
sw t0, 80(k0)
mtc0 zero, TAGLO
mtc0 zero, TAGHI
;;--------------------------------まつです
li k1, 8192
a:
addi k1, k1, -64
bne k1, zero, a
;;
cache IXIST, 0(k1)
;;--------------------------------まつです
li k1, 8192
b:
addi k1, k1, -64
bne k1, zero, b
;;
cache DXIST, 0(k1)
;;--------------------------------で、
mtc0 zero, CAUSE
li k0, 0x20000000
mtc0 k0, STATUS
sync
li t0, 0xbfc00000 //べーすあどれすでし(つまり0xbfc00000+0x604==0xbfc00604)
lw a0, 0x604(t0) //こっちが引数?
lw k0, 0x600(t0) //ここが関数?
li sp, 0x80200000 //ここにガシガシ積めばいいの?MEのかんすー(me_func)で、暗黙に使われるスタック?
jr k0 //ほーい、オツカレーMEの登録かんすー(つまりme_func)実行??
nop
me_stub_end:
しろーとにはむずかしーにゃー?ってゆーか、「PSPSDKなしで書くの」むづかしそーにゃん。STUBの辺りがさ。
(2006-06/22、11:39)