最近はESP32のM5Stackが流行っているようですがー、日本人なら、
ルネサスの「ENVISION KIT-RX65N」 ですよ!
Space Invaders は、元々、モノクロで、8080の2MHzくらいのシンプルなハード
なので、まぁ動くと思っていたが、nesemu は、カラーで、スプライトや、BGなど、
CPU(6502、1.7MHz)以外にも、かなり多くのハードウェアーをエミュレ
ーションする必要があるので、正直、普通に動作するとは思っていなかったが、駄目元
で、一応動作テストをしてみた。
-----
以前に、ESP32をやろうと思い、ソースコードのアーカイブを観ていたら、nesemu
のコードがあり、興味を持った。
とりあえず、nesemu 部分のソースを取ってきて、実験的に、Windows 上の OpenGL 環境
で動作試験を行った。
※その過程で、nesemu 関係のコードで、ポーティングに不都合な部分を色々修正した。
当然ながら、Windows 環境では問題無く動作するようになり、OS-Xでも試したが、
どうにも、サウンドストリームを適切に流す事ができず(ノイズが入る)に、中途な状
態で放置してあった。
nesemu のソースはCなので、丸ごと持ってきて、追加してコンパイルが通るまでは直ぐ
出来た、また、カラーテーブル付インデックスカラーを、RX65Nのフレームバッファ
にレンダリングする部分も一瞬で出来たが、動作するにはそこそこの時間が必要だった。
その過程で、POSIXのファイル操作関数にバグがある事が判り、修正したら、直ぐ
に走る事が判った。
※ファイルのシーク関数のステート判定に誤りがあった。
前から判っていた事ではあるが、STLを使うと、非常に多くのメモリーを消費する。
「vector だけならまぁいいか」と思っていたが、実際には、vector を使うには、他の
クラスも必要で、何だかんだ100K近くのRAMを消費して、ROMも250K程余
分に消費する・・・
※I/Oストリームなどを入れると500K近く消費する・・・
なので、vector を諦め、malloc で実装して、余分なメモリーをダイエットした。
RX65Nは二つのメモリーブロックがある。
一つは256K(0x00000000から始まる)、もう一つは384K
(0x800000から始まる)、以前は、RX64Mなどと同等に最初のブロックを
メインメモリにしていた。
LCDのフレームバッファとして16BPPなら255K(480×272×2)のメモ
リーはどうしても必要なので、これを、先頭の256Kに割り当て、メインRAMは後
半の384Kを使うようにリンクローダのスクリプトを修正した。
※この過程で、「start.s」のRAMクリアルーチンにバグがある事が判り修正した。
※RAMは0番地から始まる前提だった・・・
次に、サウンドのバインドを行った。
ファミコンのサウンドをソフトでエミュレーションするのは、そこそこ大変で、処理負
荷も高くなる。
サウンドのエミュレーションを有効にしたら、処理落ちする・・
また、1MビットROMのカートリッジはメモリー不足で動作しなくなった・・
※これは、サウンド関係でメモリを多く消費する為のようだ・・
if(nesrom_) { apu_process(audio_buf_, audio_len_); nes_emulate(1); } // nesemu.hpp の apu_process をコメントアウトすると、1Mカットリッジのゲームが走る(音無)
現状のコードでは、D/A出力用のコードが追加された為1Mビットのカートリッジは、
音無でも動作しない。
「処理落ち」を解消する為、一番処理負荷が高そうな部分に見当を付け、最適化してみ
た・・
本来、ファミコンエミュレーターは8ビットのインデックスカラーなので、LCDコン
トローラーの設定をそうすれば良さそうだが、ドライバーを手直しする必要があり、時
間がかかりそうなので、とりあえず、ビデオのコピー処理を最適化した。
それだけで、サウンドも大体スローダウンする事なく鳴るようになった。
まだ、ソフトの完成度はあまり高く無いが、とりあえず、動作する・・
-----
ファミコンのパッドは、C-MOS4021B、シフトレジスターを使ったもので、
簡単に繋げる。
自分は互換ファミコンのパッドを流用した、5本のコードで接続する。
赤:VCC(本来は5Vだが、3.3Vでも動作する)
黄:GND
青:P/S(P60に接続)
茶:CLK(P61に接続)
白:OUT(P62に接続)
※良く考えたら、ファミコンパッドで使っているICはCMOSで電流をほとんど消費し
ないと思うので、配線を簡略化する為、ポートから供給する事にしたので、ピンアサイン
を変更。
赤:VCC(P60に接続)
黄:GND(P61に接続)
青:P/S(P62に接続)
茶:CLK(P65に接続)
白:OUT(P73に接続)
※このポートは、CN2を使う。
-----
将来的には、「.NES」ファイルを選択したり、ステートのセーブなど、必要な GUI を揃
えたりする予定だが、まだ色々パーツ(ソフト)が揃っていない為、少し時間がかかると
思う。
なので、現状、どのように動作させるか、簡単に記しておく。
・SDカードのインターフェースが必要。(NESファイルを読み込む為)
・D/Aコンバーター出力をアンプに繋ぐ必要がある。(音が欲しいなら)
※ファミコンはモノラルだが、ステレオ出力にしてある。
・ファミコン互換のジョイパッドを接続する必要がある。
・「.NES」ファイルを用意する必要がある。(ぐぐって欲しい)
現在、どのNESファイルを起動するか、「nesemu.hpp」に直接記述してあるので、それ
を修正する。
void service(void* org, uint32_t xs, uint32_t ys) { if(delay_ > 0) { --delay_; if(delay_ == 0) { open("GALAXIAN.NES"); // open("GRADIUS.nes"); // open("DragonQuest_J_fix.nes"); // open("Dragon_Quest2_fix.nes"); // open("Solstice_J.nes"); // open("Zombie.nes"); } } . . .
こんにちは、RX65N Envision Kitの企画や初期ファームの設計を担当したシェルティと申します。ルネサス社員です。公式コミュニティのRenesas Rulzでも活動しております。本職はネットワーク、セキュリティ周りのソフトウェア開発です。
ここまでこのボードを使いこんでいただき、とてもありがたく思います。
私自身ゲーマーでして入り口はファミコンのドラクエでしたから、
この記事にあまりに感動を覚え少々涙が出てきたところでございます。
弊社内メンバーにもこの記事を連絡したいと思います。
私と同様、ゲーマーが多いですから、みな喜ぶと思います。
あと、ソースコードまで公開いただき、ありがとうございます。
こちらも私のほうでもコンパイルして実機で動かしてみたいと思います。
さて、コメントさせていただいたのは、SDHIに関する情報です。
近々、SDHIを活用したSDカードドライバのソースコードをウェブページに公開します。というのは、SD協会がSD Simplified SpecificationとしてSD仕様の一部を公開したことに由来します。
試作に限りますがSD協会の加入無しに試作検討にSD仕様を使えるようになりました。商用利用のないホビーユースについてもSDHIの利用は問題ないものと考えております。
SDHIはSDカード制御用の専用ハード(SDIO無線LANも制御できます)ですので
これからより重要度を増していくる周辺機能と思っています。
6月末にSDカードドライバのリリースを予定していますのでぜひ使っていただけますと幸いです。最初はSDカードドライバだけですが、続いてFATと組み合わせたサンプルも提供していく予定です。
RX65N Envision Kitで動作するSDHI活用+FAT利用可能なサンプルもローカルには提供できますので必要に応じて弊社サポートにお問い合わせください。
今私はAmazon FreeRTOSをRX65N Envision Kitを土台に移植・評価を進めています。GitHubに途中成果を置いてあるのでお時間ありましたら見ていただけると嬉しいです。
Etherで動きます。(TCP/IPはAmazon FreeRTOS内蔵のものを使ってます)
近々無線LANも使えるようにします。
https://github.com/NoMaY-jp/amazon-freertos-renesas-rx
以上です
コメントありがとう御座います。
このボード、今年の2月くらいに入手したのですが、仕事が忙しく、中々触る事が
できずにいましたが、最近ようやく時間が出来たので、活用させて頂いています。
非常に優れたボードで、日本のメーカーからこのようなスタートアップボードが出た
事を嬉しく思います。
私自身、扱い始めて実質数週間なので、まだまだこれからです。
私は、組み込みマイコンのプログラムには、もっと C++ の良さを活用するべきと考
えていて、独自実装を行っていますので、多くの人と考えが違いますが、これから色々とコンテンツを揃えていくつもりです。
これからも宜しくお願いします。