#??不思議ちゃんの謎を追え(探偵編)(SEGADRIVE) | //www.旧型、PSP開発幼稚園.game.jp/(本館)

#??不思議ちゃんの謎を追え(探偵編)(SEGADRIVE)

#??不思議ちゃんの謎を追え(探偵編)(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)