2チップNESの製作

安価な1チップマイコンを2個で、ファミコンをハードウェア・ソフトウェア的に再現してみようという企画です。


2チップNESはAVRマイコン上のソフトウェアエミュレーションでファミコンを再現する予定です。


AVRマイコンというのは、Atmel社製の8Bit1チップマイコンのシリーズのことです。

1チップマイコンというのは、CPU、RAM、ROM、I/Oなど、コンピュータを構成するために必要な
回路を1個のパッケージに集積したICのことを言います。

秋月電子などで、数百円で購入できるので、非常に安価です。


1チップマイコンならば、必要な回路は一通り内蔵しているので、あとは電源さえつなげば
コンピュータとして動作させることが可能です。

この小さなマイコンを使って、ファミコンエミュレータをハード的に実装してみよう!
ということになります。


なぜ2チップかといいますと、AVRマイコンを2個使用して、それぞれファミコン
CPUとPPUに割り当てることを想定しているからです。

PPUをAVRマイコンで実装する

今回の企画で、ネックとなるのは、どちらかというとCPUよりはPPUのほうです。
CPUのエミュレーションはタイミングが適当でも動くことは動きます。
しかし、PPUはビデオ信号を生成しますので、非常に厳密にタイミングを管理する必要があります。
タイミングが狂えば、ビデオ信号が正しくなくなって、TVの映像が乱れてしまいます。

Youtubeを検索すると、上の動画の様にAVRマイコンを使用してビデオ信号を生成している応用をたくさん見ることができます。すごいですね。


ビデオ信号を生成する上で、ファミコンと同等のグラフィックスを生成しながら
I/Oポートに出力する処理が、AVRマイコンのパワーで間に合うかという問題があります。


ファミコンには、21.48MHzのクロック周波数の水晶振動子が入っています。
このクロックがPPUに入力されています。


ファミコンの非表示期間を含んだ解像度は、
341*262
です。
(ちなみに、画面に見える部分の解像度は、256*240です)


横解像度 × 縦解像度 × フレーム周波数 = ドットクロック
です。
つまり、
341[dot] * 262[dot] * 60[Hz] = 5360520[Hz] ≒ 5.36[MHz]
です。
ファミコンのドットクロックは、だいたい5.36MHzぐらいです。

5.36MHzの周波数で、映像信号を出力してやる必要があるわけですね。


AVRマイコンは20MHzで動作する製品もあります。
ちょっとだけオーバークロック動作してもらって、21.48MHzで駆動してやります。
この程度のオーバークロックなら特に問題なく動くはずです。

AVRマイコンのクロック ÷ ドットクロック = という計算をすると、
21.48MHz / 5.36MHz = 4
なので、AVRマイコンの4命令に1度、映像信号を送出すればよいという計算になります。

たったの4命令です。
4命令 per dotのタイミングででVRAMから読み出したデータをデコードして、RGBで出力できるでしょうか?

ここは、アセンブラで慎重に組んでやれば、4命令 per dotは可能だと考えています。

最初の課題

さて、最初の課題として、まずはネックとなるPPUを作成しましょう。
PPUさえできれば、あとは何とかなるからです。


まずは、BGパタンをデコードして、ビデオ信号としてTVに表示することを目標にします。