ファミコンエミュレータ

・NesPpu.cs

PPU (画像処理ユニット)の処理が書いてあります。

・CPU のクロックと同期して動く部分
・CPU から IO を通じて設定変更される部分
・ウインドウに画像を表示する部分

が、このファイルに書かれています。
ウインドウの表示領域と、このクラスの接続は、
Graphics クラスのインスタンスの参照を渡すことで行われています。
メインフォームのロード時に、表示部分の PictureBox の Graphics オブジェクトを
NesPpu クラスに渡しています。
1 / 60 秒ごとに、その Graphics オブジェクトに今の画面の情報を転送しています。
DirectDraw は使っていません。

loopyPpu というドキュメントに、ファミコンエミュレータの画像処理タイミングについて
書かれていますが、それに沿って処理をしていないせいか、
スターフォース等で色ずれが起こります。
loopyPpu に書かれている内容に沿ってコードを修正しないと、
画像処理のタイミングがシビアなゲームは全て色やキャラクタがおかしくなるようです。
(といっても、16KB と 32KB のサイズの ROM すべての内、10 本未満です。)

たぶん、今色ズレが起こる原因は、1 ピクセルごとに PPU の状態を更新していないせいかと思われます。
1 ライン毎には状態を更新していますが
(たしか…。これ以外にもファミコンエミュレータのコードを書いたのでどっちに書いたか忘れてしまいました…)、
1 ピクセルごとにパレットやタイルの状態が変わるようになっているゲームもあって、
そういう処理の仕方をしているゲームではうまく画面が描かれないようです。
逆アセして読んだわけではありませんが、V-Blank 中に画面の構成要素をセットするゲームは
今の実装でもうまく動きそうです。
画面のラインが描かれている最中に、タイルの操作をするゲームでは上手く動かないようです。

また、エグゼトエグゼス と 1942 で、タイトル画面からゲーム開始画面に遷移する時に画面が壊れてしまいますが、
それに関しては、NameTable の水平・垂直ミラーの状態を設定するコードが間違えているせいです。。
タイルの処理タイミングが原因ではありません。



メンバ変数リスト (全部で 39 個の関数があります)

メンバ定数リスト (全部で 3 個の定数があります)

メンバ関数リスト (全部で 32 個の関数があります)