■MAME106S(現時点で最新版のMAME)のMUSASI33を引っこ抜いて、んでSEGADRIVEに乗せて試た。
(今度はちゃんとm68make.cを改造する所から作った)
えっと、取り敢えず「m44+」と銘々。んで、(EBOOT.PBPが)611kbytes。つまり現在サイズが。
m22z05EBOOT.PBP 625kB
m33z05EBOOT.PBP 606kB
m44z05EBOOT.PBP 611kB
で、問題のINSECTOR-Xを起動。
えーーー動かないジャン??なんで??(m33と同じで音楽が鳴りっぱなしになる。ゲームできない)
(ちなみにm22では遊べます。)
もしかして最新の武蔵ってエンバグしてるのかな?(謎)
(2006-07/20、01:27)
■次は(どおせBF03は伸びないだろーから)エリソルデモ。
これ、GensやDGENじゃ再現しないんだよなあ。んで、
エリソル、デモ@5512。
ビル 電車 魚 クモ
STAGE 02 08 10 16
m22+版 ○? ○? ○? ×
m33+版 × ○? ○? ○?
m44+版 ○? ○? ○? ○?
おお、「完全再現?」する。が、嬉しくない事といったら...♪♪♪
(註:そんなん再現しても無意味だよお...)
(2006-07/20、01:44)
■お約束のBF03。
結果: OFF 44 22 11 55
A32m22z05 84 62 71+ 76+ 79 625kb /GCC402_o3+uz402_o1
A32m33z05 81 59+ 68+ 73 75+ 606kb /GCC402_o3+uz402_o1
A32m44z05 81 59 68+ 73 76 611kb /GCC402_o3+uz402_o1
まあ、BF03だけがベンチじゃないけど、体感的には(m33とm44は)変わらんでしょ。オソラク。(やっぱ変わるかも?)
(註:BF03は一部の機能(だって画面はほとんど使わんし。反面、音源とZ80は使う)なんで、
BF03で全く同じ結果が出ても、ゲームをやってみると全く速さが違ったりする)
■「m33+」と「m44+」。パフォーマンス殆ど変わらんし、もう「m33+」は要らんかなと思って「m44+」で、
「MW4」を立ち上げたら、なんとタイトル画面バグってる!!
ちちちちちょーーーとマテ。眼の錯覚カト思ったつ。しかし現実は...
「m22+」バグる。
「m33+」バグらん。
「m44+」バグる。
...。
■つまり、何が奇妙なのかマトメ。
インセクターX MW4 エリソル
「m22+」 ○ × ×
「m33+」 × ○ ×
「m44+」 × × ○
じゃ、じゃんけんヤッテんじゃねーんだ。ナゼ?
(2006-07/20)
■新武蔵君はガンヒーもOKらしい。「m22+」、「m33+」はダイズワールドの「レーザービーム」みたいな
「電気」みたいな「順番覚えゲー」みたいな敵でえみゅが死ぬんだけど、「m44+」ではOK。んで、「ブラック」まで
は行ったんだけど。疲れて、死んだ。タブンOKっぽいな。参考まで。(これ以上のチェックはステート付けないとさ)
(2006-07/20、22:15)
■いちよ、ガンヒーOKちゅーメリットあるんで「A32M44Z05_tresure.zip」で別館にUPしといたでつ。よろ。
(2006-07/20、23:00)
■さてと、新武蔵君。あなたは一体何処が変わったの?
んで、segadriveの「m33+」は良く判らんので、picodriveの「m33+(違うもの)」に登場願った。
えっと、昔の事なんでワスレタが、大体合わせた時期もあった気がする。ってゆーか大体ってゆーか、
おおよそちゅーか、約ってゆーか。まあ、合わせよーと努力した時期もあった(と思う)。ちうわけで、
いまいち信頼性に欠けるが、まあ調べてみよ。
えっとハヤイ話しが、「picodriveのm33+のm68k_in.c」vs「segadriveのm44+のm68k_in.c」。
◇m44+になって命令が追加されてる。
追加>bcc 32 . . 0110....11111111 .......... U 10
追加>bra 32 . . 0110000011111111 .......... U 10
追加>bsr 32 . . 0110000111111111 .......... U 18
それから「movem」の一部で、「pcdi」、「pcix」アドレッシング(PCリラティブ系)は、別命令に分離した。
変更>movem 16 er . 0100110010...... A..DXWLdx. U 12
変更>movem 16 er . 0100110010...... A..DXWL... U 12 //「pcdi」、「pcix」アドレッシングを外す。
変更>movem 32 er . 0100110011...... A..DXWLdx. U 12
変更>movem 32 er . 0100110011...... A..DXWL... U 12 //「pcdi」、「pcix」アドレッシングを外す。
(註:「d」は「pcdi」。「x」は「pcix」の事)
こうやって、「pcdi」、「pcix」アドレッシングを外し別命令に分離。その追加された別命令は、
追加>movem 16 er pcdi 0100110010111010 .......... U 16
追加>movem 16 er pcix 0100110010111011 .......... U 18
追加>movem 32 er pcdi 0100110011111010 .......... U 16
追加>movem 32 er pcix 0100110011111011 .......... U 18
これで命令追加/変更は全部だな。あとは中身の詳細を見ないと何ともいえん。が、取り敢えずこんだけ。
■ちなみに基礎知識:
「pcdi」は、「ディスプレーメント付プログラムカウンタ相対形式」つまりd16(PC)。例えば、 movem.l _LABEL_START-_LABEL_OFFSET(PC),D0-D7/A0-A7とか。
(単なるPC相対)
「pcix」は、「インデックス付プログラムカウンタ相対形式」つまりd8(PC,IX)。例えば、 movem.w 7(PC,D5),D0-D4/A5-A7とか。
(「ショートオフセット+レジスタ」指定のPC相対)
の事。(説明間違ってても、知らんもんね)
■予想だが、この辺のいずれかが上手くいかないと、エリソルやガンヒーは無理なんじゃないかな?
(註:synz様:例えばC68kではMOVEM16erPCDIマシンコード:0100110010111010つまりOP_0x4CBAは、
24クロック消費してるの露骨に間違いですぜ。24→16。
MOVEMのこれら4つを直せば、もしかしたらDGEN160の新コア?で直るのかも?)
1.原因は32ビットアドレッシングがあるのに16ビットアドレッシングで処理されちまってる。
2.movemのPC相対系は「クロック」が違う。
のどっちかでしょーね。多分。で、本物の「m68000」には?
(1.)の
BCC32は無いと思う。
BRA32も無いと思う。
BSR32も無いと思う。
つまりこいつらはm44になって「エンバグ」してる可能性が高い。ううう、後で外して実験してみよ。
(2.)のmovem(m68ではブロック転送命令の代わりにマニアは良く使う。
例えば、movem.l (a7)+,d0-d7/a0-a6の一命令で一気に60バイト連続転送出来る。FILLやCLEARなら、速いから有用だ。)。
movemは複雑で(m68kえみゅでは)バグの温床なんだよなあ。よく調べないと何ともいえない。
「バグ」ではなくて「高速化の為に分離」した可能性もある。
後でしらべよ。
註:現在のMUSASI用語?では「BRA32」は、「bra.l」の事。例えばbra.l _LABEL とかの事。
m68000には「bra.b」、「bra.w」はあるが、「bra.l」は存在しない。(m68020とかには「bra.l」はある)
後述するがちなみに、「bra.l」に相当するマシンコードを実行するとm68000では「bra.b」になる。
■前項(1.)疑問に思って調査してみた。で、なーる程。
本物の「m68000」にはBCC32、BRA32、BSR32は無い。がこれらの命令を実行した場合どおなるのか?
「m33+」の対応は「BCC16、BRA16、BSR16」が実行される。
「m44+」の対応は「BCC8、BRA8、BSR8」が実行される。
どっちが本物動作かわからんが「m44+」の対応も(可能性として十分)ありそうだ。
と思ってマシンコード見たら、なーんだどっちも「BCC8、BRA8、BSR8」が実行されるじゃねえか!
つまり「m44+」の対応は「エンバグ」ってゆーか動作は変わらないから「エン重」。重くなるダケ。
「m68000」の「.」をうっかり「U」に「書き間違えた」って落ち。なあんだMAMEが悪いんジャン。
(註:あるいは原作者は、統合したかったのかも知れない。が、統合できないし、しても重くなるだけじゃん。
特にBcc(条件分岐)(つまりC言語でいえばif。)は頻繁に使う命令だろうし。)
ちうわけで「BCC32、BRA32、BSR32」はめでたく外れた。
コンパイルしなおして609kb→607kbになった。
PSP実機で動作確認してみた。動作変わらず。BF03は、
結果: OFF 44 22 11 55
A32m22z05 84 62 71+ 76+ 79 625kb /GCC402_o3+uz402_o1
A32m33z05 81 59+ 68+ 73 75+ 606kb /GCC402_o3+uz402_o1
A32m44z05 81 59 68+ 73 76 611kb /GCC402_o3+uz402_o1
A32m44z05 81 59+ 68+ 73 76 607kb /GCC402_o3+uz402_o1 +unlessBXX32
m33+より速くなってる。(マニアなら体感できる(?))
(2006-07/21、16:16)
■さてと、まだやってないから妄想なんだが、3すくみの謎はどーもm44+が正しそうだな。
(だって正しくなきゃ、エリソルデモが再現される事などありえんでしょ?)つまり現在CRTCの
実装でよくワカンナイから128クロック。とかなってる。あの辺。あの辺を直せは、「MW4」のタイトルが直ったり、
インセクターXが動くよーになるんではないのかな?と思ってる。もちろん「パノラマコットン」や「バーニングフォース」や
「ターボアウトラン」等々。多々のソフトが影響を受けるから、慎重に直さんとあかんが、またCRTC弄る必要が、
あるってこったな。
あと原因は解からんが現在のsegadriveはm33+の方が実機っぽかった。気がする。m44+ではmpuが正しい?分、
却って現状のCRTCでは変わってしまう気がする。(実機より速く終わる)マニアにしか解からん微妙な差だが。
っていうかautoFPSが悪いのかもしれん。いずれにしろ、まだぐちゃぐちゃしてる。原因が良くワカンナイ。
(2006-07/21、16:32)
■movemは、C68kのファイル名「c68k_op4.inc」で言えば、
// MOVEMaR // movem16er,pcdi
OP_0x4CBA:<中略(この中でもクロック消費)>
//RET(24);//間違い
RET(16);//武蔵33@MAME106s
// MOVEMaR // movem16er,pcix
OP_0x4CBB:<中略(この中でもクロック消費)>
//RET(28);//間違い
RET(18);//武蔵33@MAME106s
// MOVEMaR // movem32er,pcdi
OP_0x4CFA:<中略(この中でもクロック消費)>
//RET(28);//間違い
RET(16);//武蔵33@MAME106s
// MOVEMaR // movem32er,pcix
OP_0x4CFB:<中略(この中でもクロック消費)>
//RET(32);//間違い
RET(18);//武蔵33@MAME106s
だろう。
んで、正確な消費クロックは、ワードは。16+4n。ロングは18+8n。(MAME106s以外の資料でも調べた)
nは(movemで)積むレジスタの数(0から16)。
nが0の場合は、何もしないで意味不明だが。そーゆー命令も許されるだろ。タブン。(アセンブラでは表記出来ない)
(2006-07/22、02:07)
■あれえ?m44+で「dbf」のクロック変えた(外す)らMW4のタイトルが直る。
そおいや昔m33+でバグってたから直したよーな記憶が?いやあれはBccだったかな?忘れちゃった。
いずれにしろ、武蔵33はBXX系とDBXX系は精査する必要があるな。
(2006-07/22、02:47)
おお、「dbf」直すとm44+のエリソルデモSTAGE16のクモの最後。尻切れトンボみたいに終わっちゃうのが、
m33+みたいに直るです。やっぱMAMEのMUSASI33のDBFはエンバグですな。DBCCの条件の所から、
「コピペ」で抜いてきたからこういう事になってる。ここはクロックも変えないと駄目です。実機(m68000)でも
この辺のクロック計算はマニア度が高い。ちうか間違えがち。m68000の「条件」とは何なのか?どういう
ロジックなのか考えれば消費クロックが見えてくる。
(2006-07/22、03:01)
ヨシ、最新のじゃんけんはこうなったゾ。
インセクターX MW4 エリソル
「m22+」 ○ × ×
「m33+」 × ○ ×
「m44+」 × ○ ○
これで少なくとも「3すくみ」のバランスは崩れたワケだな。
(2006-07/22、03:10)
■いちよー、「A32M44Z05_tresure2.zip」で別館にUPしたです。設定ファイル込みで、199kbですう。
(2006-07/22、03:30)
■■「dbf(dbra)の謎」(註:「dbf」は「dbra」のマニアックな呼び方)
現在のMUSASI33。最新版DBRAのクロックおかしいです。えっと現在m68000は、
M68KMAKE_OP(dbf, 16, ., .)
{
uint* r_dst = &DY;
uint res = MASK_OUT_ABOVE_16(*r_dst - 1);
*r_dst = MASK_OUT_BELOW_16(*r_dst) | res;
if(res != 0xffff)
{
uint offset = OPER_I_16();
REG_PC -= 2;
m68ki_branch_16(offset);
USE_CYCLES(CYC_DBCC_F_NOEXP);//12-2==10(計10クロック消費)
return;
}
REG_PC += 2;
USE_CYCLES(CYC_DBCC_F_EXP);//12+2==14(計14クロック消費)
}
参考1:基準消費は12クロック
dbf 16 . . 0101000111001... .......... U 12
参考2:相対消費分。
#define CYC_DBCC_F_NOEXP -2
#define CYC_DBCC_F_EXP 2
になってるケドm68000の仕組み上。
M68KMAKE_OP(dbf, 16, ., .)
{
uint* r_dst = &DY;
uint res = MASK_OUT_ABOVE_16(*r_dst - 1);
*r_dst = MASK_OUT_BELOW_16(*r_dst) | res;
if(res != 0xffff)
{
uint offset = OPER_I_16();
REG_PC -= 2;
m68ki_branch_16(offset);
USE_CYCLES(CYC_DBCC_F_NOEXP);//12-2==10(計10クロック消費)
return;
}
REG_PC += 2;
//12+0==12(計12クロック消費)
}
だと思う。だと思うんだが、何故か両方上手くいかない。もちっと調べよう。
(2006-07/23、23:07)
やっぱdbraヨクワカンナイ。何故か知らんがdbccと(同じ)ではない。あたりまでは解ったんだか、
深い部分に謎が。
1.dbcc説(MAME)
2.dbccだが逆説。(dbfはTRUEとFALSEの消費が逆説)
3.全然違う説。
ううう、なぜか2か3の気がするんだ。なんでだろ?
(2006-07/28、21:56)