//www.旧型、PSP開発幼稚園.game.jp/(本館) -17ページ目

新武蔵現る。が、

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