ファミコンの画面描画

どこか(※)で読んだ


ファミコンは全画面を一度に書き換えることができない。
一度に書き換えられるのはスクロール1ライン分の32キャラ程度。
これを超える場合、画面描画を止める必要がある。
コナミゴエモンの3D迷路で移動のたびに画面が一瞬真っ暗に
なるのは、画面全体を書き換えるために描画を止めてるからだ」
というのは、実際のところ何故なのか調べてみた。

(※)Beep復活号の「アニマル浜口の〜」という記事だった


http://hp.vector.co.jp/authors/VA042397/nes/ppu.html

PPUが支配するVRAM領域に対してはCPUから直接アクセスが出来ないため、I/Oポートを使うことになります。手順を説明すると、I/O【0x2006】を使ってアクセスしたいVRAMのアドレスを登録します。そしてI/O【0x2007】に対して書き込みと読み込みを行うことでアクセスする事が出来ます。VRAMに読み書きを行うとI/O【0x2000】の2bit目の値によって、現在指しているVRAMのアドレスが1byteまたは32byteインクリメントされます。

ファミコンの画面サイズは 256 x 240 ピクセルで1秒間に60回画面が更新されますが、実際には240ラインを描画した後に20ライン程分の時間何も描画しない特殊な時間があります。その時間を「VBlank」と言って、通常VRAMにアクセスするのはこの期間内にするべきとされています。VBlank中かどうかはI/O【0x2002】のステータスビットで確認できる他、VBlankが始まる時にNMI割り込みを発生させることも出来ます。ちなみに、VBlank期間外にVRAMにデータを書き込もうとすると容赦なく画面がバグりますので注意してください。

http://peace.2ch.net/test/read.cgi/gamedev/1343539143/268


268 :名前は開発中のものです。:2014/06/08(日) 02:53:09.19 id:CkZRo6BG
>>267
続き
非VBlank期間中にCPUがVRAMにアクセスできる方法があります。
PPUレジスタ $2001 のbit3とbit4を0にして、BGとスプライトを非表示にすることです。
画像の信号を作るためのPPUのCHR-ROMやVRAMへのアクセスが止まるので
PPUバスが開放され、CPUはPPUを介してVRAMにアクセスできます。

代わりに、画面に何も表示されない箇所が現れることになります。
BGとスプライトを非表示にするタイミングにばらつきがあると、
画面がちらつく現象となります。

> VBlankのタイミングと書き換えは理解しずらいのですが、ファミコンのPPUの仕様なんですかね。
ファミコンの設計による制限であるため、仕様と言えば、その通りです。

まとめると

  • ファミコンのVRAMはCPUから直接変更できないため、PPU経由で行なう。具体的にはPPUのI/Oレジスタでアドレス設定後、データレジスタでアクセスする。
  • VRAMのアクセスはVBLANK期間に行なわなければならない。
  • VBLANK以外の時間はCPUがVRAMにアクセスすると、PPUがVRAMにアクセスしているのでバスアクセスが競合して正常に画面描画されなくなってしまう。
  • 1/60 x (20/260) = 1msぐらい?
  • この時間でアクセスできるのが32バイト程度ということらしい・・・