ファミコン版アルカノイド・コントローラの自作

ファミコン版のアルカノイド・コントローラを自作して、その資料を以下のサイトに公開しました。「DIY FC Paddle Controller」と名付けました。

sites.google.com

 

ファミコンアルカノイド・コントローラは中古で一杯出回っているので、需要はないかと思いますが、作りたかったので作りました。誰も作ってないし。

f:id:nicotakuya:20200319191337j:plain

自作したアルカノイド用コントローラ

外部端子用のケーブルの入手が一番難しいですね。自分の場合、別のファミコン用のコントローラを1つ壊してケーブルを入手してしまいました。NEOGEO用のコントローラ延長ケーブルでも流用できるようです。

 

f:id:nicotakuya:20200320234626j:plain

アルカノイドII

アルカノイドII」で実行した場合、、、

f:id:nicotakuya:20200321225408p:plain

パドルがワープ

、、、異常が出ました。バウスが一瞬ワープします。データ転送に失敗しているようです。

(2020/6/17)

対策しました。

最初の1ビット目を早めに送信したら、バウスがワープしなくなりました。

 

続き

nicotakuya.hatenablog.com

 

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

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

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

sites.google.com

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

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:20200418152711p:plain

HSPで再現したファミコンの色

▲色は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にキャラクタを大量に並べているので、CHR-RAMのハンダ不良を見つけることができます。

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

  

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

 

nicotakuya.hatenablog.com

ファミコン用カートリッジ基板の自作(設計編)

ファミコンのゲーム作りには絶対に手を出すまい、と心に誓っていたのですが、、、考えを改めました。今回も目コピーでカートリッジ基板を作りたいと思います。

f:id:nicotakuya:20200209132328j:plain

ファミコンカートリッジ分解

手持ちのファミコンのカートリッジ(うっでいぽこ)を開けるところから始めます、、、が、方法がよくわからず、マイナスドライバーでこじ開けたらツメが折れてしまいました。

すごい敗北感。

 

f:id:nicotakuya:20200210153731j:plain

基板のサイズを測る

ノギスでサイズを測定します。ピン間隔は2.54mmピッチですね。板厚は1.2mmくらいでしょうか。

 

f:id:nicotakuya:20200301121800p:plain

回路を解析

回路を調べます。ファミコンの資料はネット上に一杯あるので、解説は特に不要だと思います。上の基板の写真は、右側を左右反転してあります。

このカートリッジはマッパー2を採用している「うっでいぽこ」です。プログラムROM容量は128KB。16KB単位でバンク切り替えを行っています。キャラクタRAMは8KBです。キャラクタROMではありません(RAM)。このため、ROM側からデータをRAMにコピーしています。

2つのロジックICはバンク切り替えに使用しています。ファミコンのカートリッジはCPUリード信号とライト信号が兼用になっているという妙な仕様です。プログラムROMはずっとアクティブになったままで、バンク切り替え時に書き込もうとするとデータバスが衝突するようになっています。データバスの衝突を回避するためには、バンクのページ番号をあらかじめROMに書き込んでおくとのことです。「Enri's homepage」というサイトに書いてありました。

 

f:id:nicotakuya:20200229214900p:plain

ファミコンカートリッジ基板。32KB

さっそく基板を設計してみました。外形は目コピーですが、回路は現代の部品にアレンジする必要があります。

キャラクタROMかキャラクタRAMか、どちらかを選択する必要がありますが、やはりRAMのほうが使い勝手がいいです。値段を考えると秋月で売ってる32KB(256Kbit)がベストです。8KBしか使わないので、もったいないですが。端子のピッチは1.27mmですが、これなら手でハンダ付けできます。

プログラムROMはUVEPROMではなく、フラッシュメモリを使います。WE信号をどこかのピンに割り振る必要が出てくるのですが、2本あるVCCのうち1本に割り当てました。

アドレスバスが少ないので、バンク切り替えをしない場合、容量が最大32KB(256Kbit)になってしまいます。ただし、手持ちのフラッシュメモリが512KB(4Mbit)です。バンク切り替えなしでも面白いゲームは作れる(スーパーマリオとか)と思うのですが、これはさすがにもったいないので、この基板はボツにしました。

 

f:id:nicotakuya:20200227083337j:plain

基板のチェック

やっぱりバンク切り替えをするしかないってことになったのですが、一気にハードルが上がります。容量が512KBだと「ドラゴンクエストIV」が有名なので、マッパー1に決めました。マッパー1だとMMC1という専用のICが必要になってしまいますが、当然、売ってません。どうやって入手するのかが大問題ですが、解決を後回しにしてとりあえず設計してみました。

f:id:nicotakuya:20200229214808p:plain

ファミコンカートリッジ基板

最終的に出来上がったCADデータです。

フラッシュメモリのOE信号を外部から制御したいのですが、カードエッジの中に該当する端子がありません。しかたないので、2本あるGNDのうち1本を割り振っています。

バックアップRAMを載せて、リチウム電池を入れる空間を確保しておきました。バックアップRAMには安全装置がなくて、MMC1からチップセレクト信号がきたら書き込み可能になってしまいます。ドラクエのセーブデータが間違って消えてしまうことがよく話題になりますが、これは当然だなと思います。

バンク切り替えとフラッシュメモリの相性がよくありません。1バイト書き込むたびにバンクを切り替えていたら、ものすごい時間がかかってしまいます。なので、いざとなったらジャンパピンでMMC1の電源を切れるようにしてみました。

実際に作ってみて動作に問題がなければ、データを公開しようと思います。

(追記)

f:id:nicotakuya:20200316012824p:plain

基板のCADデータをさらに手直し

その後、基板の高さを50mmから48mmに縮めました。が、作る値段は1円も変わらなかったです。

 

続き

nicotakuya.hatenablog.com

レゴ エデュケーションSpikeプライムを買いました

レゴ エデュケーションSpikeプライムを秋葉原のテクノロジアさんで買いました。

箱から出して、パソコンと接続して動かすまでの様子を動画にしてみました。


レゴ エデュケーションSpikeプライムを動かすまで

 

地球防衛軍3

f:id:nicotakuya:20200116140017j:plain

地球防衛軍3 ミッション達成率100%

地球防衛軍3」を久々に遊んでみました。INFERNOの「星船」「蟲の怒り」「凶蟲行進」がずっと解けずにいたのですが、Youtubeのクリア動画をマネしてみたら全部解けました。何度やってもダメだったのに、武器を変えるだけでなんとかなってしまい、拍子抜けです。やっとジェノサイドガンが使えるようになりました。一発誤爆したら死亡というむちゃくちゃな性能が素晴らしい。

地球防衛軍は3(Xbox360)、4(Xbox360)、5(PS4)と、ひと通り遊んでみましたが、3が一番ストレスなくプレイできますね。ZEXR-GUNが一瞬で置けて、移動もピタッと止まれて、武器のチェンジも早い。遠い敵がボケないでクリアに見える。死骸がバラバラにならないので、邪魔になりやすくてゲーム性が高い気がします。

困難がないとクリアした時の楽しさが生まれないのですが、ストレスが増えすぎると魅力が半減です。バランスが大事ってことでしょうか。「地球防衛軍3」は中古で500円くらいで売ってるのでオススメです。