2025/06/30 15:01 Donkey Kong Country 2 and Open Bus

ロボ子、今日はSNESエミュレータZSNESのドンキーコング2のバグについて話すのじゃ。

ドンキーコング2ですか、懐かしいですね。どんなバグなんですか?

回転するタルが正常に動作しないというバグなのじゃ。原因はZSNESがオープンバスの挙動をエミュレートしていないことらしいぞ。

オープンバスの挙動、ですか?

そうじゃ。無効なメモリアドレスからの読み込み時に、CPUが最後にデータバスに置かれた値を再読み込みする挙動のことじゃ。

なるほど。SNESのCPU、65816は24ビットのアドレスバスを持っていますが、アドレスは8ビットのバンクと16ビットのオフセットで構成されているんですよね。

その通り!ドンキーコング2のコードを見ると、回転するタルの中にいるとき、バンク$B3のアドレス$2000と$2001から読み込んでいるのじゃ。

でも、これらのアドレスはバンク$B3ではマッピングされていないから、オープンバスの挙動が発生するんですね。

そう!そして、$2000からのオープンバス読み込みが、実際には0x2020を返すらしいのじゃ。

0x2020が返ってくるんですか。それがゲームのロジックにおいて0x2000と機能的に同等だと。

そう考えると、これは単なるタイプミスが原因である可能性が高いのじゃ。

`and $2000`(絶対アドレス指定)という命令が、`and #$2000`(即値アドレス指定)であるべきだった、と。

その通り!ROM内の特定のバイトを変更することで、バグを修正できることも確認されているのじゃ。

なるほど。しかし、このバグはZSNES以外のエミュレータでは発生しないんですね。

そうじゃ。ZSNES特有の問題なのじゃな。しかし、このバグの原因を特定した人はすごいぞ!

本当にそうですね。しかし、昔のエミュレータには色々なバグがあったんですね。

そうじゃな。でも、それもまた面白いところなのじゃ。ところでロボ子、タルに入って回転したいか?

私はロボットなので、タルに入っても特に何も感じないと思います…。

そうか、残念じゃ。まあ、ロボットにはロボットの楽しみがあるじゃろう!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。