#10MUSASI2.0A→MUSASI3.3化(2006-01/27) | //www.旧型、PSP開発幼稚園.game.jp/(本館)

#10MUSASI2.0A→MUSASI3.3化(2006-01/27)

#10MUSASI2.0A→MUSASI3.3化(2006-01/27)

■(注:このDGENは1.00です。最新のDGENはもっとず-----っと遥か彼方に進んでいます。
(現在本家の最新版は1.30)
スキルがあり、開発をしたい方は開発者に直接コンタクトをとって下さい。
私は開発者とは全く関係のない第三者です。
あくまでこのページの話は実験用途(教育用)です。)

□謎:昨日の状態から、68020と68010関係の命令を、 削除し、(絶対に実行されないがリンクされている) サイズを小さくしただけの状態で、(もちろん命令テーブルは変わるが) 「BF03チェック」をしてみたら、昨日の状態より5fps近く下がった。 その後最適化が進み同程度まで盛り返し、 また現在は3fps位下がっている。どうして、そおなるのか。さっぱり判らない。
■MUSASI2.0AとMUSASI3.3の基本的な構造の違いが クロック周りだけという事は、判った。 MUSASI2.0A  「土壇場クロック加算式」 (実行速度が速いが、メンテナンスしにくい) MUSASI3.3   「クロックテーブル参照式」(実行速度が遅いが、メンテナンスしやすい)
「CPU68K」はMUSASI2.0A同じ、「土壇場クロック加算式」である。
MUSASI2.0AとMUSASI3.3は原理は殆ど同じものながら、変数名や外部仕様、内部仕様は、 大きく異なる。これをMUSASI3.3にちかずけてみる事にする。 なぜMUSASI3.3をMUSASI2.0Aにちかずけて見ないのかというと、 そんなことしたら、管理者の如き単細胞では、「絶対にエンバグする」。 ちまちま何百個の単純作業を手で行うより、 「エディターの置換機能」と「コンパイラのエラー発見機構」に頼った方が良い。 というよりそれら(と同程度の機能)がなければ、管理者には(そんな単純作業は)絶対にできない。 (専用プログラムを組めば話は別)
これはクロックの値を万が一書き間違えた場合に、本質的にチェックする機構がないためである。
説明用: DBcc(){ if(条件){ ADD_CLK(xxx); } else { ADD_CLK(zzz); } return; }
ぐらい単純なら、まず間違えないが、実際はもっと複雑で何箇所にか分けて加減算をしている部分もある。 それに、「C68K」というのは、構造から判断して、 恐らく「MUSASI2.0A」のカスタマイズ版ではないか、と管理者は思う。 もし不安定というのならば、カスタマイズする段階で(クロック周りを)エンバグしている可能性がある。 この辺も、実際がどおなっているのか、チェックしてみる必要がある。 そういう訳で、MUSASI2.0AをMUSASI3.3に、近づけてみる事にする。
■MUSASI2.0AのABCD命令変更。 昔のふるーーーい、メガドラエミュで、(たとえばDOSの頃の初期のDGEN(1998年)) ゲームは遊べるんだけど、スコアがバグって、FFFFC286点とか(確かシャドーダンサーとか) 変な点数にならなかった? あれは、いろいろあるけど、多分この辺のバグ。(このバグとは直接関係がないかもしれないが) ABCD命令なんて普通の68Kプログラマーは、スコア表示ぐらいにしか使わんからね。(ハッカーは別)
「m68kopac.c」(名称の意味:68の命令、AC系が入ってるファイル) の始めのほうの5つ。例えばこんな感じ(現時点)
MUSASI2.0A改 void m68k_op_abcd_rr(void)     /*作業中で完全に名称一致してない。*/ { uint* r_dst = &DX; uint src = DY; uint dst = *r_dst; uint res = LOW_NIBBLE(src) + LOW_NIBBLE(dst) + (FLAG_X != 0); FLAG_V = ~res; /* Undefined V behavior */ if(res > 9) res += 6; res += HIGH_NIBBLE(src) + HIGH_NIBBLE(dst); if ((FLAG_X = FLAG_C = res > 0x99) != 0) /* ←ここの8ビットシフトは保留 */ res -= 0xa0; FLAG_V &= res; /* Undefined V behavior part II */ FLAG_N = NFLAG_8(res); /* Undefined N behavior */ res = MASK_OUT_ABOVE_8(res); //if (res != 0) FLAG_Z = 1; FLAG_Z |= res; *r_dst = MASK_OUT_BELOW_8(*r_dst) | res; USE_CLKS(6); }
MUSASI3.3 void m68k_op_abcd_8_rr(void) { uint* r_dst = &DX; uint src = DY; uint dst = *r_dst; uint res = LOW_NIBBLE(src) + LOW_NIBBLE(dst) + XFLAG_AS_1(); FLAG_V = ~res; /* Undefined V behavior */ if(res > 9) res += 6; res += HIGH_NIBBLE(src) + HIGH_NIBBLE(dst); FLAG_X = FLAG_C = (res > 0x99) << 8; if(FLAG_C) res -= 0xa0; FLAG_V &= res; /* Undefined V behavior part II */ FLAG_N = NFLAG_8(res); /* Undefined N behavior */ res = MASK_OUT_ABOVE_8(res); FLAG_Z |= res; *r_dst = MASK_OUT_BELOW_8(*r_dst) | res; }
(注:途中の「NFLAG_8()」は実は何もしないが、ソースをMUSASI3.3と比較するのが 便利なようにMUSASI3.3に合わせてある。) VフラグとNフラグのきちんとした処理を追加した。 ここは要するに、UNDOCUMENTS68K関係の資料だ。 MUSASI2.0Aはこれが反映されてないが、 MUSASI3.3は反映されている。という事。 途中の8ビットシフトはよく判らなかったので保留。 あとで、調べる必要がある。
■それはそうと昨日「MAMEの総本家」に遊びにいったら、 MAME1.02→MAME1.03にVerUPしてたので、ソース落としてきました。 (このサイトができた頃(2005-12/29)は1.02だった。確か。) で、このソースが、11MB(圧縮)なんだけど、展開すると63MB(圧縮)になるんだよね。 さらに展開すると、何百MBになるだろうから、今は出来ないけど (今空き163MB、この中からWinのキャッシュも捻出) 圧縮ファイルから、ソース取り出す事はできる。 で、MUSASIを引っ張ってこようって話。
で、MAMEのMUSASIを引っ張ってきた。 ライセンスにMUSASI3.3って書いてある。けど、中身みたら、68040とか対応してるし、 僕が5年前にみたMUSASI3.3とは別物。 つまりMUSASI3.3とは書いてあるものの、Verがぜんぜん違うらしい。 これはMUSASI3.3自体を作り直さないと、駄目かもしれない。 (m68kmake.cを動かして、ソースファイルを自動作成させるんだっけ、確か。)
つまり、MUSASI3.3というのは、1つのVerを指しているのではなく、 VerがMAMEの進化に合わせて無限にある。という事。 どうりで、MUSASI3.3=2001年ってのは、いかにも古すぎると思ったんだ。 これは、(マニアでないと)かなり判らないよなあ。 (管理人はすっかり騙されました) ということはMUSASI2.0Aも複数Verがある可能性がある。 2000年頃のMAMEのソースを探してきて、最新版をひっぱってくる必要が あるな。(手に入るかどうかは別として) オフィシャルのサイトより多分そっちの方が、手に入る可能性は高い。 これは、ZIPLIBオフィシャルのサイトみたいなもんだ。 古いソースを入手するのには、コツがある。 (例外はあるが)基本的にわたしはインターネット始めたばかり(去年の12月の末)で、 古いソースというのは何も持っていない。 (もう一ヶ月、経つのか。早いな、そろそろインターネット初心者とはいえないかも、多分?)
もう一度、最新のMAMEから取ってきたMUSASI3.3を使ってPSPにリンクしてみよう。 (クロック関連のバグ取れてるかも知れないし) その為には、CD焼かなくちゃ。 (このPCにはDOS/V用の開発環境がない。cygwinのも意図的に消した。残り容量のせい) →ふう、なんとか焼いた。わけ判らんCDがまた一枚増えてしまった。空き863MBになった けど、どうせ一時の事だ。(2006-1/28、9:34)