#14 武蔵まとめ(その1)(2006-01/30)
<まだ書きかけ>
■今日は、MAME0.35のコンパイルをして、
MAME0.35内のMUSASI2.0AにCファイルを生成させ、チェック等してました。
■「MUSASI」について、だいぶ把握できたので、現在判明した知識をまとめておきます。
用語の定義:(注意:正式な用語の定義ではありませんが、このページではこの定義の用語で統一します)
1. 「m68kmake.c」(「MUSASI」生成のCプログラム)と
「m68k_in.c」(「MUSASI」生成の設定ファイル)を
合わせて「MAKE68K」と呼ぶ事にします。
2.「MAKE68K」をC言語の稼動するコンピューター(一般的にはDOS/V)で(OSは何でも構わない)
コンパイルし実行させると以下のファイルを「m68k_in.c」の設定に従い生成します。
「m68kopac.c」(命令コードAC系の処理プログラム)と
「m68kopdm.c」(命令コードDM系の処理プログラム)と
「m68kopnz.c」(命令コードNZ系の処理プログラム)と
「m68kops.c」(MUSASI起動時の初期設定プログラム)と
「m68kops.h」(MUSASIが使うヘッダファイル)を
合わせて「MUSASI」と呼ぶ事にします。
3.「MUSASI」にMUSASIとの「68000用のインターフェイス」(68K用の接続ファイル)を
追加し、コンパイルすると、エミュレーター等でMUSASIが動作可能です。
■MUSASIの原理
MAKE68K
■入手ファイル経路(「→」は、現時点で、管理人が、いるかいらないかの区別。)
表記が同じMUSASI3.3となっていても複数のVerがあるので注意。詳しくは
ここ。(このページは詳しいけど、生成後のファイルを比較しているので、少しピント外れ。
生成前のファイルを比較しないと。駄目ジャンってのはやってみてから気がついた。)
(最新版なのに、2001年から2006年まで進化しない訳がない。)
○PSP版、DGEN1.00SRC(2005年)「dgen_psp_100src.zip」(870,176[bytes])
ttp://syn-k.sakura.ne.jp/dgen_psp/dgen_psp_100src.zip
SYN_Z様のHP内にある。
。MAKE68K「」「」→どちらか一方がいる。(→新コアを作るなら参考にする)
。MUSASI2.0A「」(この武蔵はMAME0.35SRCとほぼ同じ物。)→いらん。
○MAME0.35SRC(1999年7月4日)「」過去のこのVerが(チェックに)必要だった。(MUSASI2.0A)
ttp://www.mame.net/oldmame.html
。MAKE68K「」「」→どちらか一方がいる。(→新コアを作るなら参考にする)
。MUSASI2.0A「」(この武蔵はPSP版DGEN1.00SRCとほぼ同じ物。)→いらん。
○MAME1.03SRC(2006年1月)これは世界最新のMUSASI3.3。
ttp://www.mame.net/downmain.html
。MAKE68K「」「」→いる!(→新コアを作るなら参考にする)
。MUSASI3.3「」(この武蔵はVerが最新。現時点2006-01/27)→いらん。
○PSP版、NEOGEO_CD_0.5SRC(2005年)「neocdpsp-0.5.src.zip」
http://yoyofr.fr.st/ (javaスクリプト有効でないと、駄目かもしれない)
(上部のツールバー「Projects」から「pspNEOCDPSP」を選択し、
「Download - Binaries / Sources」のソースを選択しDL)
。MAKE68K「」「」→いらん。
。MUSASI3.3「」(この武蔵はVerが古い。クロック周りのバグがある。)→いらん。
。C68K「」「」→保留。(→要、クロック周りの正当性チェック)(→新コアを作るなら参考にする)
☆気になる事。
∇お魚さんの奴は、まだファイル開けてすらない。[MDP022s.zip]
新コア(PSPでのみ動作が速く、クロックバグはMAME1.03のMUSASI3.3準拠)を作るのなら、
これも調べないと、もぐり。
∇sougenさんのPSPGenesisもソース落としてどっかにあった筈。
ttp://psp-news.dcemu.co.uk/pspgenesis.shtml [PSPGenesis-v0.15(Source).zip]
これも調べないと、もぐり。
∇そおいえばGensも調べないと。
(仕方ない、今日どれかやるか)
yoyoFrについて、Frがついてるからピーンと来たかも。そう、おフランス。
DGENも、おフランスだし、Gensはドイツだし、ノルウェーはハッカーの国だし。
おぃ日本。メガドラ開発しても、負けてるZo。→ごめんなさい、いい過ぎです。
NNNNN
NN
DDDDDDD
DDDDDDDDD
DDDDDDDDD
FFFFFFFF
FFFFFFF
FFFFFFFF
IIIII
IIIII
II II
すごくいいかげんなヨーロッパ地図。
ファイルのVersion
■PSPで実行する場合のメリット/デメリット。
☆yoyoFr_PSP_NEOGEOCD内のMUSASI3.3
メリットなし、速攻で「MAME1.03SRC内のMUSASI3.3」に置換せよ。
(但し、違いはクロック周りのみ)
☆MAME1.03SRC内のMUSASI3.3
メリット:世界最新のMUSASI。現時点でもっともクロック周りのバグが少ない。
デメリット:PSPで実行させると、実装上の問題からか、重い。
PSP_DGEN1.00で乗せ変え実験をすると、約10fps程度のパフォーマンスダウン。(Vsyncなし)
☆MAME0.35SRC内のMUSASI2.0A
☆PSPDGEN1.00SRC内のMUSASI2.0A
上記2つは、ほぼ同じもの。
メリット:PSPで実行させると、fps測定では速いっぽい。(が、本当は速くないかも知れない)
デメリット:クロック周りがバグだらけなので、本当に速いのか信用がない。
(単に設定クロックより命令を少ししか実行できていないので、
結果的に速そうにfpsの結果が出るだけという可能性がある。
実際はMUSASI3.3と、それ程差がないのかも知れない。
クロック周りのバグが山盛りの現状ではfpsベースでは性能が算定できない。)
ここから、先を読んで全て理解出来るのならば、
もう一般人ではありぇません。マニア!
何故、こんなにクロック周りのバグが(2001年にもなって)山盛りかというと、
そもそもモトローラーの蒔いた公式資料(データーシート)が
クロック表記がめちゃくちゃ(実機と全然違う)だからだ。
それでも2001年になって、解析が進み、実機との差が少なくなっては来た。
これは、2006年になって、さらに解析が進んだという事だ。
(マニアご用達な、「シフト系命令」は実は「可変クロック」に、対応してきた)
2001年ごろは、マニアでは常識の「裏クロック仕様」。これはいろんな人が実機で解析したもの。
は、かなりMUSASI2.0Aで、取り込まれたので、客観的にみて、そこそこの完成度はある。
が、2006年になって、さらに解析が進んだ事により。もっとちゃんとゲームが動作する様になった。
現時点のMUSASI3.3でも、まだクロックにバグがある。
たとえばDIV(68000の割り算命令)は、割る値によって、著しくクロックが変わる嫌な命令だが、
MUSASI3.3では対応していない。(最悪値になる)
この系統の命令は、もっと速く終わる可能性がある。MUL(掛け算系)も同様だ。
まあこの手の命令はタコなソフトでしか(重要な部分では)使用していないし、
(普通は初期化とか計算速度を問わない部分で使用する。一度でもデーターシートのクロック欄を
見たことのある人ならば、つまりまともなプログラマーならば)
割り算命令におもいっきりバグがある。(エミュレータが落ちる)Genecystでさえ、
あれだけ沢山ゲームが動くのだから、
この辺はこだわる理由がないのだけれども。実機とは確実に違う部分だ。
でも、Gensがあれだけ動くんだから、きっと必要ない。
「ソーシャルキングダム」はGenecystで(魔法使いの沼のイベントで)落ちるから、(アドレスが表示される)
ROMの割り算命令の部分にパッチ当てて、Genecystで、最後まで遊びました。
あの部分の割り算命令は、(確かDIVS)どうもあまりに割り算がとろいから簡易ウェイトとして、
使用してるだけです。取っ払って(NOPにして)も、ゲーム進行に全然影響がない。
最近のMUSASI3.3ではシフト系の可変クロックに対応してきた。(シフトする値によってクロックが変わる)
68000内部では割り算も掛け算もシフトと加算を組み合わせて実行しているだけなので、
(マニアが実機で測定し割り出した事実。これは1990年ごろだ。確か)
割り算アルゴリズムの解析が進めばMUSASI3.3でも対応してくるかもしれない。
クロックの値は、数種類しかない事が判っているので、シフトアルゴリズムを元に特定できれば、
テーブル化すればいいだけなので、簡単だ。
だが、肝心のシフトアルゴリズムの詳細が、判明していない。
これは、とりうる引数すべてについてクロックを特定する。
(たくさん同命令をならべループさせ、測定、後でループ分のクロックを引く)
ので、測定に膨大な手間。がかかるし。
(一つの数について最低5分ぐらいは、実機で測定しないと確定しない。
全数測定するのならば、プログラム展開時間を0として計算しても、
(32ビットは4294967296らしいから)「(42億)掛ける(42億)掛ける(5分)」
測定だけで何年もかかる。全数測定など非現実的だ。)
だから、結果を元にアルゴリズムを推測し、アルゴリズムを組み。
シフトの変わり目がクロックの変わり目なので、その近辺だけ、集中的に測定し、
推測したアルゴリズムの正当性を検証する必要がある。
いずれにしても、手間がかかるので2006年現在、詳細はまだ判明していない。
腕に自信のあるハッカーはぜひチャレンジしていただきたい。