プログラミングや低レイヤで遊ぶ人

基本的には遊んだことを記事にしていく

ファミコンエミュレータ作り その2

golangによるファミコンエミュレータ作り

完成までのマラソン記事。がんばってやり切るぞい

また、注意点としてこの記事はコードを更新しながら作成していっていくので記事で書いてある内容と実際のコードに差が生まれる可能性はあります。

コード本体         

この記事の内容と最終目標

この記事の内容

ファミコンエミュレータを作成していく過程を記事にしていきます。基本的にはコードの説明なので、コードを眺めながらこの記事を読むのがベストです。

最終目標

本当はマッパー0のカセットが実行できるくらいまで実装するとかなり画面映するのですが、そこまでやると後半は細かい昨日をひたすら足していくだけのつまらない内容になるのでこの記事群での最終目標は下の図のような画面を表示することを目標とします。なお、申し訳ないのですがさすがに著作権的にあれな気がするのでこのromイメージはgithubには上げていません。 f:id:jumdtw:20200506193714j:plain ちなみに、この美少女は「アメイジンググレイス」というゲームのヒロインの一人です。とても面白いゲームなのでおすすめ。
アメイジンググレイスHP

環境

go version go1.13.8 windows/amd64

上記の環境で基本的にはやっていきます。windows以外での動作確認は基本しません。

golangを使う理由が特にあるわけではありません。ただのノリです。(rustやjavascriptで実装している人もいるらしい)






ファミコンへの描画の仕方


ファミコンへの描画の方法はすでに様々な記事で紹介されています。
ただ、具体的な方法で紹介されているものが少なかったのでその辺を複数回にわたって説明できればいいなと考えています。

ちなみに、描画がに関しての情報で参考になったもののリンクを下記に貼ります。

電子書籍「ファミコンゲーム製作入門」
NES研究室 ~グラフィック~
Memory-Mpa of Nes
ファミコンで始める ~ 6502マシン語ゲームプログラミング

ファミコンにはPPUというCPUとはまた別途のグラフィック専用のパーツがくっついています。PPU のVRAMに描画したい情報を書き込むと無事画面に映し出すことができるわけです。しかし、CPUはPPUのVRAMに直接アクセスができません。そのためメモリの $2006に書き込みたいVRAMNのメモリ位置を指定 します。そして $2007に書き込みたい値を書き込む ことでVRAMへの書き込みができます。

・0x3700 ~ : パレット情報。使用する色群を決める。
・0x23c0 ~ : attribute情報。要するに、使用するパレットの指定
・0x2000 ~ : ネームテーブル。CHAROMの内どれを描画するのかを決める。


多分説明を淡々と書いてもわかりづらいと思うので、次回実際に描画してエミュレータに必要な部分を追加していきます。

参考

壁は通り抜けられませんよ ~NES基礎知識 - PPU