前回に引き続き、趣味でファミコン用カートリッジを自作する試みです。
資料は以下のページで公開中です。
必要なことは上記のページに書いたので、ここではオマケ的な情報を書きたいと思います。
▲必要な部品です。基板はP板.comに注文したら、8日後に届きました。さすが、早くてクオリティが高いです。
価格は15枚注文して、2万6598円(税込み)でした。20枚でも30枚でも値段が大して変わらないのですが、ゴミになる可能性があるので、この枚数にしました。
▲ 基板の組み立て後の様子。
元々はマッパー1用に作った基板ですが、MMC1を付けずにバンク切り替えなしで使っています。これにより、PRG-ROM 32KB/CHR-RAM 8KBという特殊な仕様になってしまいました。結果として違法コピーに使えなくなったので、良かったかなと思います。
▲プログラムです。ファミコン用プログラムの作り方は「NES研究所」というサイトを参考にしました。
ここで公開されているC言語版の「Hello World」というサンプルプログラムをベースに作っています。起動すると「NesMain」という関数が呼び出されるようです。
サンプルは「CC65」というフリーの開発環境を使っています。「Hello World」はそのままビルドすると、cfgファイルの「__STACKSIZE__」という部分でエラーが出てしまいます。理由は不明ですが、cfgファイルのラスト3行を注釈にするとエラーが出なくなりました。
「Hello World」はCHR-ROMなのに対して、今回の自作基板はCHR-RAMを採用しています。 そのため、ファイル「startup.asm」を次のように書き換えます。
(変更前)
.byte $01 ; CHR-BANKS
↓
(変更後)
.byte $00 ; CHR-BANKS
あと、RAMは空っぽなので、 起動直後にPRG-ROMからキャラクタデータをコピーする必要があります。
▲今回、完全オリジナルの8x8ドット・フォントを作ってみました。 8バイト×192文字=約1.5Kバイトの容量を使っています。
▲手始めにカラーテストのプログラムを作ってみました。上の写真はエミュレータで実行した様子です。
ファミコンは色使いが独特です。
同時に出せるBGの色数は3色×4パレット=12色です。スプライトも3色×4パレット=12色です。さらに背景色を含めると、12+12+1=25色まで同時発色が可能ということになります。
▲色はRGBではなく、色相と明るさで表現します。色相が12種類+グレースケールが1種類あって、これに明るさが4諧調あるので、表現可能な色は(12+1)×4=52色です。自作プログラムで色の見た目を数学的に描画してみました。0x3*番は白っぽい色です。
0x20番と0x30番が同じ色です。あと、0x*F番に真っ黒の色が存在するので、それと相殺して全52色かなと解釈しています。
▲専用フラッシュメモリライターです。これは吸い出し機ではありません。ラズパイに自作の基板を合体させています。
基板代を節約するため、昔作ったスーファミ用フラッシュメモリライターのピン配置を入れ替えて使ってます。60pinのカードエッジコネクタが千石で410円でした。
書き込みプログラムは「Pi STARTER」で動いてます。nesファイルは先頭の16バイトがヘッダ情報なので、それを除外して書き込みます。
▲ドキドキしながら電源を入れましたが、最初は失敗。メチャクチャな画面が表示されました。
原因の1つは接触不良。これは接点復活材スプレーで対策しました。
もう1つの原因はBGとスプライトの初期化が抜けていたことです。エミュレータだと自動的に初期化されているので、ミスに気が付きませんでした。
▲修正したら無事に動きました。
▲シューティングゲーム風のプログラムです。BGにキャラクタを大量に並べているので、CHR-RAMのハンダ不良を見つけることができます。
自機を操作して弾を撃つことができます。当たり判定がないので、残念ながらゲームにはなっていません。
▲ファミコン特有の仕様として、VRAMの割り振るアドレスをカートリッジ側で決定するという機能があります。BGの幅と高さを2×1画面で表示するか、1×2画面で表示するかの違いです。「Vミラーリング」と「Hミラーリング」と言ったりするのですが、どっちがどっちかわかりにくいです。上の写真はVミラーリングのところをHミラーリングに間違えたという失敗例です。この場合は配線し直しましょう。
▲ガワです。純正品のガワは手に入らないので、パチモンに頼るしかありません。これは意匠権の侵害になる可能性があります。本物にソックリすぎてはいけません。
AliExpressで検索したら一杯出きますが、ここでは「funline Store」というショップの「10 個交換用ファミコン FC 8 ビットゲームカードシェル日本バージョン JP ゲームプレーヤー」を注文してみました。購入時の価格は10個で2292円でした。
注文から24日後、深センから届きました。いつもよりも時間がかかったような気がします。
ガワの上部の四角い穴にマイナスドライバーを入れて、こじ開けました。この手のプラスチック製品は割れやすかったりするのですが、これは割れずに開けることができました。品質は問題ないと思います。
写真の赤丸の部分は基板を固定する出っ張りです。事前に基板に穴を空けておく必要があります。中央の出っ張りは「うっでいぽこ」の穴よりも位置が3mmくらい上でした。左右の出っ張りも今回の基板には合いません。
▲出っ張りをニッパーで切断して、それをホットボンドで貼り付けてみました。グラつくかと心配していましたが、問題なさそうです。
ところで、この「Mindkids」ってどういう意味でしょうか。検索したら、ファミコン用の怪しいカートリッジ基板が出てきましたが、その関連製品ってことでしょうか。