#3MAMEコンパイル前編(2006-02/14) | //www.旧型、PSP開発幼稚園.game.jp/(本館)

#3MAMEコンパイル前編(2006-02/14)

#3MAMEコンパイル(2006-02/14)
MAME_PSP_ICON
■ずっと前のあらすじ
   WEB徘徊してたらドイツのサイト(PSP ARCIVE)発見。サイト内検索で「SRC」で、
   検索し、ソース21個GET。内容がよく解からんサンプルをコンパイル実行したら、
   ボクセルフィールドもどきだったので、少し改造して遊ぶ。PSP_MAME04のソースも発見。

■前々回までのあらすじ
   欲張っても仕方がないので、ターゲットをZシステムに決めるも68000が二個なので、
   始めの実験(PSPで満足な速度が出る)には、ちとキツイ(管理人技術では)と思い、
   ターゲットをシステムⅠ専用エミュとする。(8ビットx4個)

   PSP_MAME04のコンパイルにはMAME0.97Sがいるが、最新版はMAME1.04Sだし、
   (公式ページの)オールドアーカイブは最新が0.69Sで途中がWEB徘徊してみたがソースは
   手に入らない。
   MAME1.04Sでトライ→MAMEの仕様が新しく移植が大変そうで断念。
   MAME0.69Sでトライ→MAMEの仕様が古くて移植が大変そうで断念。

   仕方なく管理人の部屋をあさり、MAME0.65S、MAME0.72S、MAME0.82S、MAME1.02Sを
   発見。0.82Sと1.02Sの間にもう1つDLしたVERがある筈だが、出てこない。

   MAME0.82Sでトライ→なんとかなりそうな雰囲気なので今日の日記はこれ!
前々回:息抜き第2弾MAMEで行ってみよう。(2006-02/13) 
 前回:#2息抜き第2弾システムⅠで行ってみよう。(2006-02/13) 

ふぅ。あらすじ纏めたら、疲れたよ。(今8:30)アメブロメンテ15日までなんだってね。 まさかそんなにかかるとは夢にも思わなかったんで、時間は読んだけど、日付は見もしなかった。 おし、今日はちゃんと(?)起きれたぞ。昨日のことは忘れたから(記憶力いいんじゃなかったの?) すこし復習。(しばらくおまちください)ピンピロ♪ピンピロ♪ピンピロピン♪...
■昨日はnamcos1.makに SOUNDS+=NAMCO_CUS30@ を追記したとこで、寝たんだっけ。
ker' src/mame.c:2262: error: 'struct InternalMachineDriver' has no member named 'spea ker' src/mame.c:2262: error: 'struct InternalMachineDriver' has no member named 'spea ker' src/mame.c:2264: error: 'struct InternalMachineDriver' has no member named 'spea ker' src/mame.c:2268: error: 'struct InternalMachineDriver' has no member named 'spea ker' src/mame.c:2270: error: 'struct InternalMachineDriver' has no member named 'spea ker' src/mame.c:2278: error: 'struct MachineSound' has no member named 'routes' src/mame.c:2280: error: 'struct InternalMachineDriver' has no member named 'spea ker' src/mame.c:2281: error: 'struct MachineSound' has no member named 'route' src/mame.c:2281: error: 'struct InternalMachineDriver' has no member named 'spea ker' src/mame.c:2283: error: 'struct InternalMachineDriver' has no member named 'spea ker' src/mame.c:2286: error: 'struct MachineSound' has no member named 'route' src/mame.c:2290: error: 'struct MachineSound' has no member named 'route' make: *** [obj/namcos1psp/mame.o] Error 1
    InternalMachineDriverとMachineSoundの仕様が変わってますな。 MAME0.89のタイプと、 MAME0.97のタイプと、 どちらに統一しようか、を考える為にソースを見る。 「mame.c」と「mame.c」ね。(本当は「mame.h」と「mame.h」で比較すれば一発だが、肝心のMAME0.97の「mame.h」が無い)
管理人が弄ったMAMEは0.89まで。MAME0.97のソースは見た事がない。 MAME0.97には、管理人が見た事のない(~0.89までは無かった) MachineSpeaker型の構造体が追加されてる。 これは、どっちに仕様を合わせようか、 MAME0.89にあわせる:変更部分が少なくて済む。が、最悪PSPで音が出なくて嵌まる可能性が... MAME0.97にあわせる:変更部分が多いかもしれない。が、最悪PSPで音が出なくて嵌まる可能性が... どっちにしても、音が出なくて嵌まる可能性はある訳か。
MAME0.89式の場合:097の仕様を102から想像し、変更。 MAME0.97式の場合:102の該当部分を097を想像し、移植。
どっちが楽かなぁ。やはり、MAME0.97はPSP実績があるんだから、たとえ、どんなに回りくどくても こっちかな。どっちも嵌まるかもしんないから微妙だな。とりあえずバックアップかもな。
■うーん、MAME0.89とMAME0.97を比較するだけなら、簡単だけどそれにMAME1.02が入ると、 何がなんだか判らなくなっちゃって疲れちゃうよ。 MAME089対MAME097 MAME089対MAME102 MAME097対MAME102 の3種類の検討方法に切り替わる為。
それでもMAME097のファイルが全部あれば、簡単だけど。殆どないから推測しなくちゃいけないし。
■ src/mame.c:499: warning: implicit declaration of function 'printfnw_' src/mame.c: In function 'run_machine_core': src/mame.c:568: warning: implicit declaration of function 'pgFillvram' src/mame.c:568: warning: implicit declaration of function 'pgScreenFlipV' src/mame.c: In function 'vh_close': src/mame.c:868: error: 'struct RunningMachine' has no member named 'uirotfont' src/mame.c:870: error: 'struct RunningMachine' has no member named 'uirotfont' src/mame.c:871: error: 'struct RunningMachine' has no member named 'uirotfont' src/mame.c: In function 'init_buffered_spriteram': src/mame.c:1094: warning: cast increases required alignment of target type src/mame.c:1095: warning: cast increases required alignment of target type src/mame.c:1096: warning: cast increases required alignment of target type src/mame.c:1097: warning: cast increases required alignment of target type src/mame.c: In function 'updatescreen': src/mame.c:1395: warning: implicit declaration of function 'sound_frame_update' src/mame.c: In function 'machine_add_speaker': src/mame.c:1573: error: 'MAX_SPEAKER' undeclared (first use in this function) src/mame.c:1573: error: (Each undeclared identifier is reported only once src/mame.c:157^C src/mame.c:1573: error: for each function it appears in.)make: *** [obj/namcos1p sp/mame.o] Interrupt
あったあった。'uirotfont'がないってエラーメッセージ。実はMAME0.89SとMAME1.02Sでは、 MachineDriverの名前が変わってて、要らん心配をしたんだが、こういうエラーが出るってことは、 少なくともMAME0.89SとMAME0.97SではMachineDriverの名前は同じって事だな。 安心安心。変更部分が少なくて済む筈だ。
MachineDriver構造体のメンバuirotfontについては、元のMAME0.97Sにはあったが、PSPへの移植に 際して、「こんなもんいらん」という事で。取り外された模様。
■MAME初心者向け特別レクチャー: uirotfontっていうのは、アーケードゲームには、画面を横にして遊ぶのと、縦にして遊ぶのがあるよね。 MAMEのメニュー画面用のフォントは、MAMEが独自に定義してるんだけど。「usrintrf.cのuifontdata」 縦のゲームなら縦用の(メニュー専用)フォント。 横のゲームなら横用の(メニュー専用)フォント。 を用意する必要がある。 (が、PSPでは必要がない。PSPを90度回転させれば済む話だ)
ちなみにMAMEでの実装は、 元データー(ROM)→転送→横フォント(RAM) 元データー(ROM)→回転し転送→縦フォント(RAM) となっていて。 ...まあ、ここまで説明すれば解かるじゃろ。(管理人無駄口多い為、自粛)
■参考にしている「MAME097PSP」の「mame.c」ではここが外れてるが、管理人の持ってきた。 MAME089Sの「mame.c」では残ってるので、コメントアウト。 /* free the font elements */ if (Machine->uifont) { freegfx(Machine->uifont); Machine->uifont = NULL; } #if 000 if (Machine->uirotfont) 「mame.c」ではここだけ(開放だけ)だよ。 { freegfx(Machine->uirotfont); Machine->uirotfont = NULL; } #endif
それから、管理人。勘違いしてたみたい。実際は、 MAME089Sでは、MachineSpeakerはあった。 MAME097PSPでは、MachineSpeakerはない。 逆だな。 これは単純に要らないから廃止にしたんじゃろ。多分。 コメントアウトして様子をみよう。(多分それでOKの筈) 「mame.c」の machine_add_speaker(); machine_find_speaker(); machine_remove_speaker(); を#if 000から#endifで、コメントアウト。 /* consistency checks on sound and speakers */から end_resource_tracking();の直前まで を#if 000から#endifで、コメントアウト。
■ src/mame.c: In function 'init_machine': src/mame.c:457: warning: implicit declaration of function 'init_memcard' src/mame.c: In function 'run_machine': src/mame.c:499: warning: implicit declaration of function 'printfnw_' src/mame.c: In function 'run_machine_core': src/mame.c:568: warning: implicit declaration of function 'pgFillvram' src/mame.c:568: warning: implicit declaration of function 'pgScreenFlipV' src/mame.c: In function 'init_buffered_spriteram': src/mame.c:1094: warning: cast increases required alignment of target type src/mame.c:1095: warning: cast increases required alignment of target type src/mame.c:1096: warning: cast increases required alignment of target type src/mame.c:1097: warning: cast increases required alignment of target type src/mame.c: In function 'updatescreen': src/mame.c:1395: warning: implicit declaration of function 'sound_frame_update' src/mame.c: At top level: src/mame.c:1636: error: conflicting types for 'machine_add_sound' src/driver.h:274: error: previous declaration of 'machine_add_sound' was here src/mame.c: In function 'machine_add_sound': src/mame.c:1644: error: 'struct MachineSound' has no member named 'clock' src/mame.c:1645: error: 'struct MachineSound' has no member named 'config' src/mame.c:1646: error: 'struct MachineSound' has no member named 'routes' make: *** [obj/namcos1psp/mame.o] Error 1
ううぅ間違えた。 MAME089Sの「mame.c」と MAME097PSPの「mame.c」を取り違えてた。 さっき逆だと思ったのは逆ではない。つまり廃止されたんじゃなくて、追加されたって事だ。 でも、このエラーメッセージもあとで役に立ちそうだから、ここにメモしとこう。
まてよ。って事はあれだな。 MAME0.89S自体に「uirotfontを開放しないで終了しちゃうバグ」があったって訳か。 まあ、ドスプロンプトでMAMEを実行させて終了したら普通はOSに戻るから影響は無いんだがな。 (Winやlinuxやその他のOSでは、空きリソース回収するから何も問題ない) ドスプロンプトを終了させないで、これをしつこく再起動して終了を延々つづけると、 MSDOSが何もしないから、1回ごとにuirotfontの分だけ、メモリが狭くなる訳か。 uirotfontのサイズなんて微々たるもんだから、これでOSを落とすには何万~何億回も、 起動終了を繰り返さないと逝けないがな。 ■ (DOS版MAMEについて初心者レクチャー: なんでDOS版のMAMEなんてもんがなんであるの? それってDOS用なんでしょ? Win版は当然DirectX(Draw)でVRAM直描きだよ。 何が不満なの? はい、MAMEについて全然判っとりませんね。 まずDOS版MAMEはDOS用ではありません。途中までは確かにDOS用でしたが、現状、本当に ネイティブDOSからは起動できたり、できなかったり、いやまず間違いなく起動できません。 仮に運良く起動できたとしても、終了し。そのまま再起動するのは不可能であります。 あれは、実はWin用なんです。(正確に言うとWinのDPMIマネージャでしかテストしてません。 フリーのDPMIマネージャでは動作も出来ない様です。) だからさあ。どおせWinで使うんでしょ?だったらなんでWin版使わない訳ぇ? そもそもWinのドスプロンプトってコマンドプロンプトだから、ぜんぜん駄目なんじゃないの。 いいえ、Winのドスプロンプトはコマンドプロンプトの振りをしており、通常はWinがフックしてしまう為。 本当にコマンドプロンプトみたいになってしまいますが、MAMEではハッカーがハックした対策コードを 実装する事により。コマンドプロンプトではなくなって、実質ネイティブDOSとして動作できます。 メモリが最大まで利用できるDOSってことですね。 (でもXPの場合は、もしあれが2000/NT系のメモリ管理なら、最大までメモリを利用できるかどうか 解かりませんね。管理人には。) えーMAMEのソース全部読んだけど、そんな対策コードなんて無かったよ。 はい、MAMEのソースリストには含まれません。 しかしDOS版のMAMEは、「Allegroライブラリ」という物を使用していて、 その「Allegroライブラリ」中に対策コードは実装されています。 「I love gates」とかそんなような名前で検索すれば、見つかると思いますよ。 じゃあWin上で実質ネイティブDOSが動くとしてWinのDirectX(Draw)でVRAM直描き版より、 どんなメリットがあるっていうの?同じか危険なら価値ないでしょ? はい、メリットはあるんです。 えええ、DirectXだよ。くれって言えばVRAMくれて直描き可能なんだよ。今はなきIM使えば、 バッファに直接3Dコマンド(のようなもの)送り込めるんだよ。メリットはあってもデメリットなんて 考えられない。 MAMEでは基本的に3Dコマンド直接駆動方式は実装されていません。3Dコマンド部分も全て 含めてチップレベルでのエミュレートです。したがって3Dバリバリで、テクスチャーもグーロや半透明も ステンシルバッファさえも実装してあり60fpsでバリバリ動いていても。それは全て2Dで描画しています。 VRAMは確かにどちらも直描きなんですが、そんな事が問題だったのはDOOMが出た頃のPCのような とんでもなく古い時代の論議だったりします。 別にMAMEにとって見れば全て2Dにしてレンダリングし出来上がった結果 (これは多色高解像32ビット色640x480であったとしても、現在のPCのバス転送速度からみれば、 たいした量(転送時間)ではない) をVRAMに流し込めばいいだけなので、無理にDirectXを使わなくても、blitのバッファに直書きする方式でも。 60fps以上叩き出せるので、実はなんの問題もないです。blit転送は裏でハードウェアーアクセラレーションが 効きますし。これはこれでもったいない使い方ではないんです。 (ただしこの場合、RAM→VRAMの実装方式に制限されてしまうが。DirectXを使わないと VRAMにバッファが本当に取れたかどうかが判らない) (DirectXで真にありがたいのは、DirectXが返すエラーメッセージで、「やったーVRAMにバッファ取れたにょ」 とか「ごめーんシステムメモリにしかテクスチャ取れなかったけん」とかいう一見地味な機能であって、 MSの宣伝とは全く関係がありません。それによってプログラマーがパフォーマンスの対策を立てられる所に 真の価値があります。もし結果が全てDD_OKになるのなら、DirectXいらないです。) そんな事よりもパフォーマンスの鍵を握るのが、メモリ管理だったりします。WinとDOSでは基本的に メモリ管理が違うためパフォーマンスに、差がでます。 <続く> ううう管理人疲れて書けませんが、最近のPCではまた別の事情があり、 やっぱりDOS版は不要となりつつありますが、不要になった訳ではない所が面倒な所。 別に互換性の観点からのみ(そういう意味も一応あるが)DOS版を残してある訳ではなく。 (MAMEは前衛的だから、もしそうならメインのコードからバージョンUPで、 古いコードをすべて削減してしまう) 現在でも色々どろどろした裏事情がある訳なんです。詳しいことはハマって調べてね。 )
■ 前記のスピーカー関連は元に戻さないで取り敢えずこのままにしておく。 もしかしたらここは、本質的に不要かもしれない。保留にして先に進もう。
さて、ワーニングメッセージ。簡単な所から。 'printfnw_'はデバッグメッセージの出力機能みたい。これのプロトタイプ宣言がない。 気分としては、driver.hに追加したい所だが、 (MAMEはdriver.hにさえ追加しておけば、あらゆるファイルから見える構造になっている。) もちっとMAMEらしくosd_cpu.hに追加した。 (osd_cpu.hは名前はともかく(本当はインテル/モトローラ変換だけ吸収したかったらしい) 実際のMAMEは機種別の対策部分の意味合いが強い。 今はどうなってるのか知らんがWin版が始めに出た時に、真っ先にここに当てられてしまった為。 でも、現状のMAMEでは、改善されてるみたい。インテル/モトローラ変換関連しか入ってない みたいだから、どっかに引っ越したらしい。管理人には引越し先が見つけられない為。 古いやり方で勘弁してね。driver.hのどれかのファイルなんだろうケド。) 前に殺した部分の直下。 ///#define isunordered(x, y) __builtin_isunordered(x, y) extern int printfnw_(const char *format); こんなん。ついでに、pgFillvramとかpgScreenFlipVもでてるから、こうしよう 前に殺した部分の直下。 ///#define isunordered(x, y) __builtin_isunordered(x, y) extern int printfnw_(const char *format); #include "pg.h" さらに"pg.h"を多重インクルード防止の為対策コード(?)を追加。
#ifndef _PSP_PG_H #define _PSP_PG_H ここにもとの"pg.h"の中身をいれる。 #endif /* defined _PSP_PG_H */
■さてと、次はMachineSound構造体の'clock'と'config'と'routes'のメンバがない。ってエラーだったな。 こいつは、MAME0.89Sでは、「sndintrf.h」に #ifndef SNDINTRF_H #define SNDINTRF_H struct MachineSound { int sound_type; void *sound_interface; const char *tag; }; って書いてある。確かにそんなメンバはない。が、無いからといって安直に追加してはダメだ。 ここにないだけであって、それに相当する部分の実装はMAME0.89Sでもある筈だからだ。 取り敢えず'clock'か'config'か'routes'でソースを検索してみよう。 ここではあまりみかけん単語。ちぅことで'routes'で検索してみた。 検索で引っかかったファイルは、 mame.c sndintrf.c debughlp.c の3つだけ。もしかしたらこの部分は全く使ってない可能性すらある。もうすこし詳しく調べてみよう。 うんにゃ。sndintrf.cを見る限り。スピーカの辺はないとまずいです。 まとめると、 MAME0.89S   そんなものはない。 (「sndintrf.c」のsound_start();) MAME0.97S   現在のroute_sound方式(「sndintrf.c」のsound_start();) MAME1.02S   現在のroute_sound方式(「sndintrf.c」のsound_init();) ですね。この辺はMAME1.02から盗んできても、特に問題なさそうな気がしますが、 (MAME0.89S時代の古い)ミキサーがどういう事になってんのか、いまいち解かりませんね。 適当にやっつけますか。 で、音が出なくて苦しむ事になりそうですが。 どうもroute_sound();ってのスピーカの接続を決めてるだけなのかもしれない。よく解かりませんが。
実装は、 MAME0.89S   「sndintrf.h」には構造体が二個 MAME0.97S   「sndintrf.h」?入手出来ないので不明。 MAME1.02S   「sndintrf.h」には構造体が五個 MAME1.02Sの「sndintrf.h」を使えばそれで済む話なんだろうか?その後名称を変える必要もあるんだろうか? とにかくやってみるか。
from src/mame.c:135: src/sndintrf.h: At top level: src/sndintrf.h:326: error: parse error before 'xml_data_node' src/sndintrf.h:326: warning: function declaration isn't a prototype src/sndintrf.h:327: error: parse error before 'xml_data_node' src/sndintrf.h:327: warning: function declaration isn't a prototype In file included from src/mame.c:135: src/driver.h:320: error: array type has incomplete element type src/mame.c: In function 'init_machine': src/mame.c:457: warning: implicit declaration of function 'init_memcard' src/mame.c: In function 'run_machine': src/mame.c:517: warning: implicit declaration of function 'sound_start' src/mame.c:542: warning: implicit declaration of function 'sound_stop' src/mame.c: In function 'init_buffered_spriteram': src/mame.c:1096: warning: cast increases required alignment of target type src/mame.c:1097: warning: cast increases required alignment of target type src/mame.c:1098: warning: cast increases required alignment of target type src/mame.c:1099: warning: cast increases required alignment of target type src/mame.c: At top level: src/mame.c:1638: error: conflicting types for 'machine_add_sound' src/driver.h:274: error: previous declaration of 'machine_add_sound' was here make: *** [obj/namcos1psp/mame.o] Error 1
こうなった。 1.'xml_data_node'ってのはさっきは出なくて今回は出た。MAME1.02Sにはあって、 MAME0.97Sにはないという可能性がある。 2.さっきねーよって怒られたメンバは今度は怒られなかったみたい。まだ判りませんがね。 3.'sound_start'と'sound_stop'はMAME102で名称が変更になっている為に(プロトタイプがなくて)ワーニング。 4.'machine_add_sound'の引数が違うって怒られた。
1.は、良くわからんが殺しておこう。対応は「sndintrf.h」(今度はMAME102の奴になった) //void sndintrf_load(int config_type, xml_data_node *parentnode); //void sndintrf_save(int config_type, xml_data_node *parentnode); これは、MAME0.97になくて、最近追加された可能性がある。 3.これは名称をMAME0.97のタイプに合わせましょう。 int sound_start(void);//MAME102 was int sound_init(void); void sound_stop(void);//MAME102 was void sound_exit(void); 4. struct MachineSound *machine_add_sound(struct InternalMachineDriver *machine, const char *tag, int type, void *sndintf)MAME0.89Sの場合 struct MachineSound *machine_add_sound(struct InternalMachineDriver *machine, const char *tag, int type, int clock)MAME0.97SPSPの場合 最後だけ違いますね。driver.hの struct MachineSound *machine_add_sound(struct InternalMachineDriver *machine, const char *tag, int type, void *sndintf); をMAME0.97S_PSPのタイプに変更します。具体的には、MAME097Sのをコピーして貼り付け 最後に;を付けるだけです。
//ruct MachineSound *machine_add_sound(struct InternalMachineDriver *machine, const char *tag, int type, void *sndintf);//MAME089 struct MachineSound *machine_add_sound(struct InternalMachineDriver *machine, const char *tag, int type, int clock);//MAME097
こう変更しました。 ■ src/memory.h:1054: warning: cast increases required alignment of target type src/memory.h: In function 'cpu_readop32': src/memory.h:1055: warning: cast increases required alignment of target type src/memory.h: In function 'cpu_readop64': src/memory.h:1056: warning: cast increases required alignment of target type src/memory.h: In function 'cpu_readop_arg16': src/memory.h:1058: warning: cast increases required alignment of target type src/memory.h: In function 'cpu_readop_arg32': src/memory.h:1059: warning: cast increases required alignment of target type src/memory.h: In function 'cpu_readop_arg64': src/memory.h:1060: warning: cast increases required alignment of target type In file included from src/mame.c:135: src/driver.h: At top level: src/driver.h:322: error: array type has incomplete element type src/mame.c: In function 'init_machine': src/mame.c:457: warning: implicit declaration of function 'init_memcard' src/mame.c: In function 'init_buffered_spriteram': src/mame.c:1096: warning: cast increases required alignment of target type src/mame.c:1097: warning: cast increases required alignment of target type src/mame.c:1098: warning: cast increases required alignment of target type src/mame.c:1099: warning: cast increases required alignment of target type make: *** [obj/namcos1psp/mame.o] Error 1 src/driver.hの322行目とか妙に具体的な事を言うので見てみましょう。 MAME089Sの場合。 UINT32 sound_attributes; struct MachineSound sound[MAX_SOUND]; MAME102Sの場合。 sound_config sound[MAX_SOUND]; speaker_config speaker[MAX_SPEAKER];
やはりスピーカーの仕様が変わってる部分ですね。 本当は前の奴を後の奴に変更すればそれでいいんですが、さきにコンパイルを優先させて sound_attributesについては、後で現状を調べ手を入れましょう。(変な所でつまずくより、多分その方が早い)で、
UINT32 sound_attributes; // need after legacy (MAME089 type) // struct MachineSound sound[MAX_SOUND]; sound_config sound[MAX_SOUND]; speaker_config speaker[MAX_SPEAKER];
こうしといた。それからMAX_SPEAKERがないから追記。(MAME102から持ってきた) #define MAX_SPEAKER 4 /* MAX_SPEAKER is the maximum number of speakers */ これはMAME097でも多分、同じでしょう。 PSPはステレオだし、こんなの2で良いと思うでしょ? これは実物のスピーカーの数の話ではなく、 仮想的なスピーカーの数の話です。管理者がすぐに思い浮かぶのはシステム21 (要するにウィニングランやエアーコンバット)のサラウンドスピーカーですね。左右とサラウンドで4ch ですから。ダライアスのサブウーハはどうなっているんでしたっけ。 あれは、左右スビーカーからの合成なんだけど特別にソフトウェアーから合成出力が制御できたん じゃあなかったでしたっけ。 MAMEシステムのMIXERにそんなコメントがあったような気がする。 (DRIVER関連ではなくて、MAMEシステムでのDARIUS対応です。) まあ、PSPにサラウンドもサブウーハーもついてないんで、ちゃんと動いたらこの辺の実装は簡略化しちゃえば いいんですが、ちゃんと動くまでは、弄るのは10年早い(c)アキラ氏 いや、本当に10年も経ったら年季が入りすぎちゃうよ!