#4PSP_MAMEコンパイル後編(2006-02/14)
■アメブロのブログは、40kbytes程度で「僕おなかいっぱいでちゅ。次の記事にして勘弁」と
少し軟弱なので、本日後編です。投稿画面には「全角」でってかいてあるのに、
あれは「半角」での間違いです。全角なら80kbytesまでOKじゃなきゃ筋が通らんぞ。
管理人せっかく他のページにコメントを書いても全角XXX文字にしてください。
で、いつも話を縮小する能力はないからま、いっか。と結局あきらめちゃいますし。
よしんば書けたときには、削りまくったので意味不明か。引用したので迷惑をかけたか。そんな所です。
文字数制限なんてあってもいいから、せめて長さ倍にしてくれ。短歌や俳句じゃねえんだ。
努力は一応したが、結局、私にはできん。そんな能力はない。がーーーっ。
という訳です。はい。
■今日の前編へのリンク(#3MAMEコンパイル前編)
今日の前半のあらすじ
えーと、もう忘れたよ。とにかくmame.cのスピーカー関係誤魔化して殺し、
んでコンパイルが(mame.c)より先に進んだ所。
■
src/usrintrf.c: In function 'setcodesettings':
src/usrintrf.c:2079: error: 'IPT_UI_CLEAR' undeclared (first use in this function)
src/usrintrf.c: In function 'memcard_menu':
src/usrintrf.c:3143: error: invalid use of undefined type 'struct MEMCARDinterface'
src/usrintrf.c:3144: error: invalid use of undefined type 'struct MEMCARDinterface'
src/usrintrf.c:3154: error: invalid use of undefined type 'struct MEMCARDinterface'
src/usrintrf.c:3158: error: invalid use of undefined type 'struct MEMCARDinterface'
src/usrintrf.c: In function 'setup_menu_init':
src/usrintrf.c:3333: error: invalid use of undefined type 'struct MEMCARDinterface'
src/usrintrf.c:3334: error: invalid use of undefined type 'struct MEMCARDinterface'
src/usrintrf.c:3335: error: invalid use of undefined type 'struct MEMCARDinterface'
src/usrintrf.c:3336: error: invalid use of undefined type 'struct MEMCARDinterface'
make: *** [obj/namcos1psp/usrintrf.o] Error 1
さて、根源的な問いとして、メモリーカードです。MAMEは兄弟エミュレーターの
MESSとしてもコンパイルできるように工夫されています。
MESSではメモリーカードはフロッピーディスク代わりになったりするのなら、要りますね。
(実は本当に必要なのかよく知らない)
ちょっと前まで(コナミのDDRの頃だっけ)は、管理者の知る限り、
メモリーカードの必要なアーケードゲーム機はネオジオのみでした。
しかし最近のアーケードゲーム機ではまたメモリーカードにデーターを保存するタイプが
復活していくつかありますね。
でも、そんな新しいゲームPSPで動いてもまずゲームにならないような気がします。
(ネオジオ以外の話です)PSPSPだってどおなってるのかな。
とにかくそんな夢みたいな話には管理者は興味がありません。
そおいうわけでメモリーカードは削除。(MAMEには別に設定保存システムが
搭載されているから、仮にNEOGEOであってもこれに搭載するよう
改造することは可能だったりする)
■メモリーカードはタイニーコンパイルで使用不可に変更。(昔のタイプ)
略
#ifndef MESS
#ifndef TINY_COMPILE
/* MARTINEZ.F 990207 Memory Card */
struct MEMCARDinterface memcard_intf;
#endif
#endif
/* 本当はこの辺のmcd_xxxもメモリーカード関連でいらないんだけど。とりあえずここだけ */
略
#ifndef MESS
#ifndef TINY_COMPILE
if ( memcard_intf.create != NULL &&
memcard_intf.load != NULL &&
memcard_intf.save != NULL &&
memcard_intf.eject != NULL)
{
append_menu(UI_memorycard, UI_MEMCARD);
}
#endif
#endif
略
#ifndef MESS
#ifndef TINY_COMPILE
int memcard_menu(struct mame_bitmap *bitmap, int selection)
{
略
}
#endif
#endif
略
#ifndef MESS
#ifndef TINY_COMPILE
case UI_MEMCARD:
res = memcard_menu(bitmap, sel >> SEL_BITS);
break;
#endif
#endif
■さて'IPT_UI_CLEAR'なんて知らんちゅー。ってメッセージも出てるのでついでに直しちゃいましょう。
inptport.hの(MAME0.89のタイプ)
IPT_UI_CANCEL,
IPT_UI_PAN_UP,
を(MAME1.02のタイプ)
IPT_UI_CANCEL,
IPT_UI_CLEAR,
IPT_UI_PAN_UP,
にして追記します。
■他にももっと色々違うのでこの際直しちゃいたいですけど、まあコツコツ必要なだけにしときましょ。
ここを変更したからには、基本的にリコンパイルしないとMAMEシステム全体の信頼性がないです。
(昔作ったOBJは破棄)(CPUやサウンド等、独立してるOBJは関係がない)
ただし今回は先にコンパイルを進め、リコンパイルは最後の最後に(PSPに転送する直前に)一回だけ
済ませれば、十分でしょう。
■
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
src/usrintrf.c: In function 'builduifont':
src/usrintrf.c:388: error: 'struct RunningMachine' has no member named 'uirotfont'
src/usrintrf.c:389: error: 'struct RunningMachine' has no member named 'uirotfont'
src/usrintrf.c:438: error: 'struct RunningMachine' has no member named 'uirotfont'
src/usrintrf.c:454: error: 'struct RunningMachine' has no member named 'uirotfont'
src/usrintrf.c:455: error: 'struct RunningMachine' has no member named 'uirotfont'
src/usrintrf.c: In function 'ui_drawchar':
src/usrintrf.c:484: error: 'struct RunningMachine' has no member named 'uirotfont'
src/usrintrf.c: In function 'ui_drawbox':
src/usrintrf.c:700: error: 'struct RunningMachine' has no member named 'uirotfont'make: *** [obj/namcos1psp/usrintrf.o] Interrupt
さて、また出てきましたね。'uirotfont'関連のエラーです。ここも根源的な問いになるんですが、
PSPで仮に縦画面のシューティングゲームなどを遊ぶ場合。PS2みたいに
めちゃくちゃ小さい画面で我慢して遊ぶより、普通は多少やりにくくても、PSPを持ち直して、
縦にして、で。でっかい画面で遊んだ方が現実的ですよね。
「ハドソンのアレ」みたいに。管理人はもし遊ぶとしたら、きっとその方法しか使わないです。
その場合(PSPを縦に持って遊んでいる時に)当然MENUを表示しますね。
<ご飯だから、あとでね。 18:36>
えっと再開です。
もう、説明がめんどいのですが、結論から言うとPSPでは管理人は無くてもさして不便でないから、
取り外してしまいたい処です。処なんですが、それの対応をぐじぐじやって、PSPで動かないのはもっと
嫌なんで、今回は残します。
で、MAME1.02を参考にしてもこの辺は仕様が変わってしまったので出てこないです。が、
MAME0.97のソースを見たことはありませんがMAMEの常識から考えて、mame.hの
struct RunningMachine
{
の構造体のどこでもいいから追記します。(こいつも場所を変えたらリコンパイルが必要)
今回は
/* font used by the user interface */
struct GfxElement * uifont;
struct GfxElement * uirotfont;
として、uifontの直下に追加しました。今日だいぶ前にmame.cで殺した部分「uirotfont」で検索して
復活させておきます。
#if 1
if (Machine->uirotfont)
{
freegfx(Machine->uirotfont);
Machine->uirotfont = NULL;
}
#endif
「mame.c」uirotfontの解放部分です。
■
src/inptport.c:450: error: 'IPT_MAHJONG_CHI' undeclared here (not in a function)
src/inptport.c:451: error: 'IPT_MAHJONG_REACH' undeclared here (not in a function)
src/inptport.c:452: error: 'IPT_MAHJONG_RON' undeclared here (not in a function)
src/inptport.c:453: error: 'IPT_MAHJONG_BET' undeclared here (not in a function)
src/inptport.c:454: error: 'IPT_MAHJONG_LAST_CHANCE' undeclared here (not in a function)
src/inptport.c:455: error: 'IPT_MAHJONG_SCORE' undeclared here (not in a function)
src/inptport.c:456: error: 'IPT_MAHJONG_DOUBLE_UP' undeclared here (not in a function)
src/inptport.c:457: error: 'IPT_MAHJONG_FLIP_FLOP' undeclared here (not in a function)
src/inptport.c:458: error: 'IPT_MAHJONG_BIG' undeclared here (not in a function)
src/inptport.c:459: error: 'IPT_MAHJONG_SMALL' undeclared here (not in a function)
make: *** [obj/namcos1psp/inptport.o] Error 1
はい、マージャン関係のエラーですね。MAMEは「オールドゲームを保存する事」にもこだわっていて、
まあその理念は敬服する部分もあるのですが。で、「脱ぎマージャン」にもこだわっていて、えーとその場合の
理念はえーと、その。あのー。はい、何の話でしたっけ。
とにかく管理人は、PSPで(マージャンコンパネが必要な)マージャンゲームをする気はないんですが、
一つだけ例外があるのです。ゲームで遊ぶ気はないので入力は乱数でも何でも構わないのですが、
仮に今回の実験でこのMAMEがPSPで動いた場合。当然欲が出て、他のゲームは動かないかなって
事になりますよね。で、その場合に一から同じ作業をするのは、かったるいので、その辺も少しは
考えてたりします。
で、PSPで重いゲームを動かすのは非現実的だし。軽くて遊べるのないかなって探すと、
「F2」あたりにたどり着くかもしれない。仮にF2が動いたとすると、も少しスピードアップせんと遊べんなって
事態に必ずなるでしょう。その場合、システム基盤ですから、当然すべてのROMでバグらない方法で
最適化をかけなければならない。
その場合F2でもっともチェックが嫌なゲームが「マージャンクエスト」な訳です。(麻雀コンパネが必要だから)
要するに、「ガンフロンティア」や「メタルブラック」を速くしたいと思った場合に、
必ず避けては通れない(?)のが「マージャンクエスト」な訳です。(昔、似たような事、やりましたから)
■まあいいや、ここは殺すか残すかの選択肢ですね。仮に殺しても、ドライバで適当なボタンに
割り当てればいいし、アナログの上下左右もボタンに割り振ればPSPはボタンが16個も使えるし
(方向もボタンとして)なんとでもなるから、削除しちゃえ。
では、「inptport.h」の下の
/* misc other digital inputs */
IPT_SERVICE,
IPT_TILT,
IPT_INTERLOCK,
IPT_VOLUME_UP,
IPT_VOLUME_DOWN,
の下に
#if 000
/* mahjong inputs */
IPT_MAHJONG_A,
IPT_MAHJONG_B,
IPT_MAHJONG_C,
IPT_MAHJONG_D,
IPT_MAHJONG_E,
IPT_MAHJONG_F,
IPT_MAHJONG_G,
IPT_MAHJONG_H,
IPT_MAHJONG_I,
IPT_MAHJONG_J,
IPT_MAHJONG_K,
IPT_MAHJONG_L,
IPT_MAHJONG_M,
IPT_MAHJONG_N,
IPT_MAHJONG_O,
IPT_MAHJONG_P,
IPT_MAHJONG_Q,
IPT_MAHJONG_KAN,
IPT_MAHJONG_PON,
IPT_MAHJONG_CHI,
IPT_MAHJONG_REACH,
IPT_MAHJONG_RON,
IPT_MAHJONG_BET,
IPT_MAHJONG_LAST_CHANCE,
IPT_MAHJONG_SCORE,
IPT_MAHJONG_DOUBLE_UP,
IPT_MAHJONG_FLIP_FLOP,
IPT_MAHJONG_BIG,
IPT_MAHJONG_SMALL,
#endif
を追記し、(おい、そおいうのは残す。といわんか。えーだってMAMEだもん。)
「inptport.c」は、
#if 00
INPUT_PORT_DIGITAL_DEF( 1, IPG_PLAYER1, MAHJONG_A, "P1 Mahjong A", SEQ_DEF_1(KEYCODE_A) )
INPUT_PORT_DIGITAL_DEF( 1, IPG_PLAYER1, MAHJONG_B, "P1 Mahjong B", SEQ_DEF_1
略
INPUT_PORT_DIGITAL_DEF( 1, IPG_PLAYER1, MAHJONG_SMALL, "P1 Mahjong Small", SEQ_DEF_1(KEYCODE_BACKSPACE) )
#endif
略
#if 00
INPUT_PORT_DIGITAL_DEF( 2, IPG_PLAYER2, MAHJONG_A, "P2 Mahjong A", SEQ_DEF_0 )
INPUT_PORT_DIGITAL_DEF( 2, IPG_PLAYER2, MAHJONG_B, "P2 Mahjong B", SEQ_DEF_0 )
略
INPUT_PORT_DIGITAL_DEF( 2, IPG_PLAYER2, MAHJONG_SMALL, "P2 Mahjong Small", SEQ_DEF_0 )
#endif
ですね。
■
src/info.c:523: error: invalid use of undefined type 'struct MachineSound'
src/info.c:523: error: dereferencing pointer to incomplete type
src/info.c:525: error: invalid use of undefined type 'struct MachineSound'
src/info.c:525: error: dereferencing pointer to incomplete type
src/info.c:527: warning: implicit declaration of function 'sound_num'
src/info.c:527: error: invalid use of undefined type 'struct MachineSound'
src/info.c:527: error: dereferencing pointer to incomplete type
src/info.c:536: warning: implicit declaration of function 'sound_name'
src/info.c:536: error: invalid use of undefined type 'struct MachineSound'
src/info.c:536: error: dereferencing pointer to incomplete type
src/info.c:536: warning: passing argument 1 of 'normalize_string' makes pointer
from integer without a cast
src/info.c:537: warning: implicit declaration of function 'sound_clock'
src/info.c:537: error: invalid use of undefined type 'struct MachineSound'
src/info.c:537: error: dereferencing pointer to incomplete type
src/info.c:538: error: invalid use of undefined type 'struct MachineSound'
src/info.c:538: error: dereferencing pointer to incomplete type
src/info.c: In function 'print_game_sound':
src/info.c:621: warning: assignment from incompatible pointer type
src/info.c:626: error: invalid use of undefined type 'struct MachineSound'
src/info.c:626: error: dereferencing pointer to incomplete type
make: *** [obj/namcos1psp/info.o] Error 1
はい、サウンド関係のエラーです。
ちょっと調査した結果。マシンのサウンドの構造体の名称は、
MAME0.89S MachineSound構造体
MAME0.97S MachineSound構造体(多分)
MAME1.02S sound_config構造体
みたいです。
ついでに下の2つはサウンドルートという概念が実装されていて、
MAME0.97S MachineSoundRoute構造体(多分)
MAME1.02S sound_route構造体
みたいです。MAME0.89Sだけ眺めても全く判りませんが、
そおいうわけで、ずうううっと前に、実はMAME102からコピーしてきた
「sndintrf.h」(MAME102)の構造体も弄らなくちゃいけないみたいなんですが、
管理人ちょっと、今日は疲れてきたな。この辺は取り敢えずまだ、よく解からないので、
用調査なんですが。