概要
- Donkey Kong Country 2 の特定ステージで、 ZSNESエミュレータ のバグにより回転バレルが正常に動作しない現象
- バグの原因は open bus挙動の未実装 によるもの
- 実機や他エミュレータ(Snes9x)では正しく動作し、 バレルの停止判定 にopen busの値を利用
- 65816 CPU のアドレッシングやメモリバンク構造の説明
- ゲーム内部の処理やアセンブリコード解析を通じたバグの詳細解説
Donkey Kong Country 2とZSNESのバレル回転バグ
- Donkey Kong Country 2の一部ステージ(例: Barrel Bayou)で回転バレルの操作が異常になる現象
- 本来:プレイヤーが 左/右ボタンを押している間だけ回転
- ZSNESでは:一度押すと 永遠に回転 し続け、逆方向を押すと逆回転が止まらない
- このバグは 難易度を大幅に上昇 させ、本来のゲーム性を損なうもの
原因:Open Bus挙動の未実装
- SNES実機では 未マッピングアドレス へのアクセスで「open bus」挙動が発生
- 直前にバスに載った値が再読込される仕様
- ゲームは バレル停止判定 にこのopen bus値を利用
- ZSNESではopen bus挙動が未実装のため、 常に0が返り、判定が正常に働かない
- Snes9x等の他エミュレータでは バグが修正済み
65816 CPUとメモリアドレッシング
- SNESのCPUは 65C816(65816)
- 24ビットアドレスバス、8ビットバンク+16ビットオフセットで管理
- プログラムバンク(PBR)、 データバンク(DBR) の概念
- メモリバンク$B3の$2000/$2001アドレスは 未マッピング でopen busとなる
- 16ビットアクセス時は 2回の8ビットリード を連続実行
- ゲームコードはこの仕様を想定して記述
ゲーム内部処理の解析
- バレル回転処理のアセンブリコード例
- バレルの向き ・ 回転量 ・ 一時変数 の管理
- 回転停止判定は XOR+AND演算 で、open bus値(本来は0x2020)を利用
- ZSNESではopen bus値が0となるため、 停止判定が常に失敗 し回転し続ける
- 実機やSnes9xでは 0x2020 が返ることで、バレルが正しい方向で停止
まとめ
- Donkey Kong Country 2の 回転バレルバグ はZSNESの open bus未対応 が原因
- ゲームはopen bus挙動を前提に判定を組んでおり、エミュレータの再現性が重要
- ZSNESは開発終了 (最終リリース2007年)、今後の修正は見込めない
- バグ回避には 他エミュレータの利用 推奨