ファミコンのカートリッジ基板(Mapper3)の自作

Mapper3のファミコンのカートリッジ基板を作ってみました。

3年くらい前に書いた「日経ソフトウエア」のファミコン特集でMapper0の基板を作ったので、それをMapper3に改造しています。実はあらかじめバンク切り替えに対応しやすいように設計しておきました。

 

www.youtube.com

 

Mapper3の仕組みについては、Enriさんのページで詳しく解説されています。

Enri's Home PAGE (ファミリーコンピューター ROMカセット マッパー3)

 

蛇足になってしまいますが解説します。Mapper3というのはカートリッジの仕組みの一つです。バンク切り替えを行って、CHR-ROMの容量を拡張します。アルカノイドのCHR-ROMは2バンク(16KB)。グラディウスのCHR-ROMは4バンク(32KB)。グラフィックをいっぱい表示したい時に役立ちます。

Mapper3のPRG-ROMは32KB固定で、バンク切り替えをしません。

CHR-ROMのバンクを変えるには、PRG-ROMに対して書き込みます。ROMに書き込むことはあり得ないですが、ROM内のバンクキーと同じ値を書き込めばデータバスが衝突しません。たとえば、バンク1にしたい場合、特定の番地に「1」を入れておいて、「*((char *)xxxx番地) = 1;」と書込みます。

グラディウスとかだとロジックICの出力ピンの2本にダイオードが付いていてキーを3Xhにしないと、PPUのアドレスバスの一部が強制的にLowに落ちるように作られてます。間違えてPPUが壊れたりしないのでしょうか。過激なプロテクトです。

 

回路図です。ロジックICでPPUのアドレスバスを2本増やすだけなので、回路はシンプルだと思います。本物は74LS161を使ってますが、74HC161でも問題ありません。

現状だと4バンクですが、アドレスをもう2本足して、16バンクにするといいんじゃないでしょうか。エミュレータ側が対応していないかもしれませんが。

 

実験プログラムです。BG画面に16x16=256個のパターンを並べてみました。贅沢すぎる使い方。バンクを切り替えると一瞬で全部の表示が変わります。この技術はアニメーション表示にも応用可能です。

github.com

 

ついでに紹介しますが、過去に私が書いたレトロゲーム機系の記事は以下の通りです。

日経ソフトウエア2020年5月号 メガドライブ特集。→ムック「土日で楽しむゲームプログラミング入門」に収録。

日経ソフトウエア2020年11月号、2021年1月号、2021年3月号 ファミコン特集(全3回)。→ムック未収録

日経ソフトウエア2021年7月号、9月号 ゲームボーイ特集(全2回)。→ムック未収録

日経ソフトウエア2022年1月号、3月号、5月号 PCエンジン特集(全3回)。→ムック未収録

日経ソフトウエア2022年9月号 レトロゲーム機特集(ファミコンゲームボーイPCエンジンメガドライブのプログラミングをダイジェストで紹介)。→ムック「初心者のためのプログラミング学び方・遊び方」に収録。→「日経クロステック」に再録。

、、、未収録が多すぎです。

雑誌の中古の入手が難しい場合はKindleで買うという方法がありますが、結構いい値段になってしまいます。

 

アタリ仕様ジョイスティックをファミコンに接続する変換アダプタ

アタリ仕様ジョイスティックをファミコンに接続する変換アダプタを作ってみました。昔、ユニバーサル基板で作ったやつをプリント基板でリメイクしました。

 

www.youtube.com

 

ベーマガ1988年6月号より。マイコンソフトの「X-F1」の広告。今回作った変換アダプタとはコンセプトと仕様が似ています。「X-F1」はポートが2人分なのに対して、今回作ったのはポートが1人分になっています。

自分はX-F1を持っていないので、中の回路がどうなっているのか知りません。

 

この「アタリ仕様ジョイスティック」ってフレーズは、今はもう死語かもしれませんが、当時はわりと浸透していたと思います。

手持ちのパソコンの説明書によると、ジョイスティック端子は次のように表記しています。

・PC-6001mkIIは「ジョイスティック端子(9Pコネクタ)」

・X1 turbo IIIは「ジョイスティックインターフェイス

X68000 PRO2は「ジョイスティック用コネクタ(アタリ社規格準拠)」

「アタリ」というわりにAtari 2600とピン配置が微妙に違うのが不思議です。「Dsub 9Pinコネクタ」ってだけのところを、わざわざ「アタリ」と言うことにどんなメリットが?

ジョイスティック端子はパソコンメーカーが好き勝手に作ってきたので、仕様にバラつきがありました。ユーザーにとっては仕様の統一が望まれていたと思います。「アタリ社規格」というのは、具体的にはどういう規格だったのか、気になるところです。

Google翻訳に「アタリ仕様ジョイスティックポート」と入力したら「Atari specification joystick port」と出てきたので、動画ではそのとおり表示しています。海外の人には通じないかも。

 

回路図です。点線で囲んだ部分の回路が2プレイヤー用です。これで「X-F1」に近づいてしまいます。

1人ぶんの変換器を2つ作って、マルチタップで接続したほうが自由度が高いかもしれません。

ラズパイPico用カバー

3Dプリンタで自作したラズパイPico用のカバーです。初代DIY-Keypadの時(2023年7月ごろ)に思い付きました。

 

最新バージョンがこちら。省スペースで使い勝手がいいので独立してGitHubに公開することにしました。

github.com

STLファイルがぽつんと1つあるだけです。

 

ツメが付いていて引っかかるように作ってあります。


 

DIY-Keypad64(キーボードレイアウト変更)

DIY-Keypad64はレイアウトはJP(日本語キーボード)ですが、基板上に紙を貼って強引にUS(英語キーボード)に対応させてみました。


www.youtube.com

JPとUSのレイアウトです。市販のキーボードを参考にしました。

]の隣がバックスラッシュになったことで、Delが邪魔になってしまったので、上段に移動させました。いい場所が思いつかなかったです。

未使用のキーが2つ増えました。

 

DIY-Keypad64(自作USBキーボード)

64個のキーを搭載したUSBキーボードを自作してみました。基板のサイズは138×82mm。1.77インチTFT液晶(AE-ATM0177B3A)を搭載しています。

今のところは単なるキーボードですが、最終的には自作のBASICが動くポケコンにしたいと思っています。単なるキーボードだったら、そこらへんで一杯売っているので、わざわざ作る必要はありません。

 

www.youtube.com

 

ソースと回路図等はGitHubで公開中です。

github.com

 

キーボードをラズパイと接続して、7インチの純正ディスプレイを取り付けてみました。ケースは3Dプリンタで7時間かけて出力した超大作です。

画面の向きが180度逆だったので、「lcd_rotate=~」と入力しようと思ったら、アンダーバーが打てないという致命的なバグを発見。ArduinoのKeyboardライブラリは日本語キーボードのレイアウトに非対応なので、まともにキーコードが送れません。対策にはちょっと工夫が必要です。

(2024/4/1追記)

旧バージョンはアンダーバーが打てない、¥が打てない、見当違いのキーが出てしまう等の致命的な不具合があったのですが、全て解決しました。

press関数やrelease関数を使うのを止めて、sendReport関数を使ってキーコードを直接送るように変更しました。ただし、sendReport関数はprivateメンバに属しています(外部から呼び出せない)ので、"Keyboard.h"を自前で書き換えて、publicメンバに加える必要があります。

全角/半角キーで日本語が入力できるようになりました。

ファンクションキーがないのでスペースで変換するしかありません。fncキーでF7~F9を打てるようにしないといけません(まだ未対応)。

(2024/4/4追記)

「FNC」キーに対応しました。一般的には「FN」というみたいですが、勘違いしたまま作ってしまいました。

次のように割り振ってみました。ファンクションキーが使えるようになったので、日本語入力がちょっとだけ使いやすくなったかもしれません。

・PAGE UP:FNC+UP
・PAGE DW:FNC+DOWN
・HOME   :FNC+LEFT
・END    :FNC+RIGHT
・F1~F9 :FNC+1~9
・F10    :FNC+0
・F11    :FNC+-
・F12    :FNC+^(JP) =(US)
・INSERT :FNC+DEL
WINDOWS:FNC+W
・BREAK  :FNC+B
・PRINT SCREEN:FNC+P (FNC+P+ALTも入力可能)

このほか「無変換」とか「カタカナ」を割り振ることができます。空いてる場所は一杯ありますが、どこに配置したらいいのかわかりません。