ファミコン用カートリッジ基板の自作(組み立て編)

前回に引き続き、趣味でファミコン用カートリッジを自作する試みです。

資料(回路図/CADデータ/プログラム)は趣味のページで公開中です。

https://sites.google.com/site/yugenkaisyanico/diy-fc-cartridge

必要なことは上記のページに書いたので、ここではオマケ的な情報を書きたいと思います。 

f:id:nicotakuya:20200312104620j:plain

基板の部品

▲必要な部品です。基板はP板.comに注文したら、8日後に届きました。さすが、早くてクオリティが高いです。

価格は15枚注文して、2万6598円(税込み)でした。20枚でも30枚でも値段が大して変わらないのですが、ゴミになる可能性があるので、この枚数にしました。

 

f:id:nicotakuya:20200314131738j:plain

基板の組み立て完成

▲ 基板の組み立て後の様子。

元々はマッパー1用に作った基板ですが、MMC1を付けずにバンク切り替えなしで使っています。これにより、PRG-ROM 32KB/CHR-RAM 8KBという特殊な仕様になってしまいました。結果として違法コピーに使えなくなったので、良かったかなと思います。

f:id:nicotakuya:20200313080541p:plain

ソース作成

▲プログラムです。ファミコン用プログラムの作り方は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からキャラクタデータをコピーする必要があります。

f:id:nicotakuya:20200313082009p:plain

自作の8x8ドットフォント

▲今回、8x8ドットのフォントを作ってみました。 完全なオリジナルです。8バイト×192文字=約1.5Kバイトの容量を使っています。 

 

f:id:nicotakuya:20200313080316p:plain

カラーテスト

▲手始めにカラーテストのプログラムを作ってみました。上の写真はエミュレータで実行した様子です。

ファミコンは色使いが独特です。

同時に出せるBGの色数は3色×4パレット=12色です。スプライトも3色×4パレット=12色です。さらに背景色を含めると、12+12+1=25色まで同時発色が可能ということになります。 

f:id:nicotakuya:20200316150926j:plain

数学的に求めたファミコンの色

▲色はRGBではなく、色相と明るさで表現します。色相が12種類+グレースケールが1種類あって、これに明るさが4諧調あるので、表現可能な色は(12+1)×4=52色です。自作プログラムで色の見た目を数学的に描画してみました。0x3*番は白っぽい色です。

0x20番と0x30番が同じ色です。あと、0x*F番に真っ黒の色が存在するので、それと相殺して全52色かなと解釈しています。

 

f:id:nicotakuya:20200312140246j:plain

フラッシュメモリにプログラムを書き込み

▲専用フラッシュメモリライターです。これは吸い出し機ではありません。ラズパイに自作の基板を合体させています。

基板代を節約するため、昔作ったスーファミフラッシュメモリライターのピン配置を入れ替えて使ってます。60pinのカードエッジコネクタが千石で410円でした。

書き込みプログラムは「Pi STARTER」で動いてます。nesファイルは先頭の16バイトがヘッダ情報なので、それを除外して書き込みます。

 

f:id:nicotakuya:20200312124013j:plain

起動一回目。見事に失敗

▲ドキドキしながら電源を入れましたが、最初は失敗。メチャクチャな画面が表示されました。

原因の1つは接触不良。これは接点復活材スプレーで対策しました。

もう1つの原因はBGとスプライトの初期化が抜けていたことです。エミュレータだと自動的に初期化されているので、ミスに気が付きませんでした。

f:id:nicotakuya:20200312140751j:plain

うまく動きました

▲修正したら無事に動きました。

このプログラムを公開しようかと思ったのですが、どこかのフラッシュメモリカートリッジに入っているプログラムが「色彩確認ソフト」で、、、それと間違われると困るので、別のプログラムを用意することにしました。

 

f:id:nicotakuya:20200314025837p:plain

シューティングゲーム風のデモプログラム

▲代わりに作ったのが、これ。シューティングゲーム風のプログラムです。BGにキャラクタを大量に並べているので、ハンダ不良を見つけることができます。

自機を操作して弾を撃つことができます。当たり判定がないので、残念ながらゲームにはなっていません。

  

f:id:nicotakuya:20200316000738j:plain

ミラーリングの配線を間違えた場合

ファミコン特有の仕様として、VRAMの割り振るアドレスをカートリッジ側で決定するという機能があります。BGの幅と高さを2×1画面で表示するか、1×2画面で表示するかの違いです。「Vミラーリング」と「Hミラーリング」と言ったりもするのですが、どっちがどっちかわかりにくいです。上の写真はVミラーリングのところをHミラーリングに間違えたという失敗例です。この場合は配線し直しましょう。

 

f:id:nicotakuya:20200305120252j:plain

ファミコンカートリッジのガワ

▲ガワです。

純正品のガワは手に入らないので、パチモンに頼るしかありません。AliExpressで検索したら一杯出きますが、ここでは「funline Store」というショップの「10 個交換用ファミコン FC 8 ビットゲームカードシェル日本バージョン JP ゲームプレーヤー」を注文してみました。購入時の価格は10個で2292円でした。

注文から24日後深センから届きました。いつもよりも時間がかかったような気がします。

ガワの上部の四角い穴にマイナスドライバーを入れて、こじ開けました。この手のプラスチック製品は割れやすかったりするのですが、これは割れずに開けることができました。品質は問題ないと思います。

写真の赤丸の部分は基板を固定する出っ張りです。事前に基板に穴を空けておく必要があります。中央の出っ張りは「うっでいぽこ」の穴よりも位置が3mmくらい上でした。左右の出っ張りも今回の基板には合いません。

 

f:id:nicotakuya:20200316122755j:plain

ガワに基板を入れる

▲出っ張りをニッパーで切断して、それをホットボンドで貼り付けてみました。グラつくかと心配していましたが、問題なさそうです。

f:id:nicotakuya:20200306080647j:plain

「Mindkids」?

ところで、この「Mindkids」ってどういう意味でしょうか。検索したら、ファミコン用の怪しいカートリッジ基板が出てきましたが、その関連製品ってことでしょうか。