ファミコン開発:OAMの破損問題

今回の内容について、私も正確に理解しているわけではないので、メモ書き程度とみて参考にしてください。

どのような現象かというと、OAM(Object Attribute Memory。要するにスプライト情報を格納する専用のメモリです。通常、メインメモリ内に一時的なスプライト情報を持ち、DMAでOAMへデータを転送します)に長時間アクセスがないと(または書き込みがないと?)、データが破損する可能性があるそうです。この現象はNESの特定のリビジョンでは特に速く起きるということもあるそうです。

Mesenでは【設定→エミュレーション】で設定ウィンドウをだし、【詳細設定】タブ内にある「オブジェクト・アトリビュート・メモリーの崩壊現象を再現する」をチェックすることで現象を確認できます。

また、デバッガの【Option→Break Options→Break on decayed OAM read】にチェックを入れることで破損したOAMに読み込みが発生したときにブレイクさせることができます。

一般的に、シーン切り替えなどでは、描画をOFFにして画面の書き換え処理を行います。ここでの処理は時間がかかることが多いため、OAM崩壊現象が発生しやすくなります。回避法としては、VBlank待ち後に描画をONにしますが、その直後にスプライトデータをDMA転送すればこの問題を回避できます。

私が確認した限りでは、描画をONにしたときにOAM内の値が変化していましたので、描画ONの前よりも後にDMA転送する方が確実のようです。


この記事が気に入ったらサポートをしてみませんか?