#??不思議ちゃんの謎を追え(探偵編)(SEGADRIVE)
ピンポーン、本日は予定を変更して臨時ニュースをお伝えしております。
うふふ。少しだけ、「不思議ちゃん2」の素顔の片鱗が見えたよ。ちらっとだけどね。
えーとね、今お魚さん(genesis plus)のコードをサルベージしてdgen(SEGADRIVE)に移植手術を施してるとちう。
なんだけど...。
ジェネラー(メガドラー)にはお馴染みの、そおだなm68000から見て、
0x00c00005番地だな。このI/O(モトローラだから、実態は単なるメモリ)なんだけど、
この番地のREADをvdp_ctrl_r();とするとだな。DGEN(SEGADRIVE)はこんなコードになる。
unsigned md::vdp_ctrl_r(void){
unsigned short temp;
temp=coo5;
#if 00 //←ここはコメント
coo5 &= ~0x0020; // clear sprite hit flag on reads
coo5 |= 0x0200; // fifo empty
coo5 ^= 0x0004; /* hack (red zone) */
temp |= (coo5 & 0x03BF); // clear spr over
#endif
temp |= (pal? 1 : 0); // こんな所で、やんないで初期化でなんとかしたい。
return(temp);
}
お魚さん(picodrive)はこう。
unsigned md::vdp_ctrl_r(void){//←お魚さんはCなんすけど。
unsigned short temp;
temp=coo5;
#if 1
coo5 &= ~0x0020; // clear sprite hit flag on reads
coo5 |= 0x0200; // fifo empty
coo5 ^= 0x0004; /* hack (red zone) */
temp |= (coo5 & 0x03BF); // clear spr over
#endif
//temp |= (pal? 1 : 0); // こんな所で、やんないで初期化でなんとかしたい。
return(temp);
}
dgenはアクセスする度に、palを判断してるが、それは単なる無駄。
まあそれは置いといて。
ここの#ifで括った部分。この処理を入れると、「不思議ちゃん2」は起動しない。
取り敢えず「管理人版DGEN100A19」で確認。多分「A18」でも同じ(原理の)事が出来る。
(上のコードは説明用であって、実物とは全然違うよ。カット&ペーストじゃ駄目だよ。念のため)
ちなみに、「不思議ちゃん2」以外では、管理人が試した範囲では、全く変わらない。
「不思議ちゃん2」が起動しない原因を探しているのではない。「不思議ちゃん2」は起動しないのが
本来のありようであって、起動する事自体が「不思議」なんである。
合理的に考えて、nko氏の「不思議ちゃん2で遊びたい!」っていう執念が、導いた結果だろう(多分)
だから、「不思議ちゃん2が起動する」原因を探しているんである。おんなじ事だけど、論理的には正反対だ。
わかるかな?
「不思議ちゃん2が起動する」原因は、当然一つではない。複数の要因が組み合わさって、奇跡的に起動する。
でなけりゃ、辻褄が合わない。現に管理人の元にした。DGEN100正規版では、起動しないんである。
これが、執念でなくて何であろう。絶対に執念だ。合理的に考えれば、それ以外の可能性は薄い。
結言:執念は奇跡。
よし、次は、お魚さん「管理人版MD022A09」で試してみよう。
(でも、ちと用事。2006、3/1、19:50)
少し補足。68000なら5番地は奇数番地でアドレスエラーじゃないの。っていう半可通に配慮して、
始めから、ここ「の」READって書いてあるだろ。ここ「を」READとは誰も書いてない。(訂正してないよ)
ここはZ80からも読むので、全部で3通り(2通りじゃないよ、頭使ってね、ロングは現実の68000も
単にワード変換してるだけ、だから含めないよ)の読み方がある。
管理人が知らないだけで、さらに他からも読まれる可能性がある。(VDPコマンド経由やDMA)
しかし上記のコードは仕様変更の途中で、Z80やバイトREADのマスクを掛けてなかった為。修正し
再検査してみた。
やはり結果は変わらない。
(22:51)
ここまで解かれば「逆汗」(なんか禁止されてるみたいなんで仕方なく)した方が、早いかもな。(23:05)
■さらに「不思議ちゃん2」にアリバイを詰問してみた。
既に関数の仕様が変わってるので注意。
unsigned md::vdp_ctrl_r(void){
unsigned short temp;
temp=(coo5);
#if 1
// coo5 &= ~0x0020; // clear sprite hit flag on reads
coo5 |= 0x0200; // fifo empty
// coo5 ^= 0x0004; /* hack (red zone) */
temp |= (coo5 & 0x03BF); // clear spr over
#endif
coo4 ^= 0x03; // ここの動作は少し変わる。
temp |= (coo4<<8);
temp |= (pal? 1 : 0); // こんな所で、やんないで初期化でなんとかしたい。
return(temp);
}
これでも、「不思議ちゃん2」は一応起動。する。が、ボタンを押すとホールドアップ。
(スプライト割り込みのハードウェアー機能をソフトウェアーからも読めるんだろ、多分。原因はきっと
この辺だな。きっとそんな変な事してるソフトは少ないんだろな。そんな変な機能使うと、あたり判定が
かえって大変だからな、普通)
上記#if内の//コメント。どちらを外しても「不思議ちゃん2」は起動しない。
これは「Gens」辺りを調査してみる必要がありそうだな。
もうこの辺で今日は寝る(事にする)よ。(23:19)
■これは想像なんだが、優先順位の低いOBJを2枚用意して(画面では見えない)
重なった部分をあたり判定部分と仮定し、他のOBJとのハードウェアーのあたり判定を使って、
見えない二枚とも当たってれば、「当たり」と判定するように、作ってあるんだろな。
その場合ハードウェアーのOBJ割など使用したら、CPU時間がもったいないから、ソフトでこのビットを読んで、
判断してるんだろ。このビットを殺すといつまでたっても、あたり判定が終わらずに無限ループになるって理屈だ。多分な。
まあ妄想だけど、大体こんな感じじゃあないのかな。(ホントとに寝るよ。23:35)