■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)