世界を動かす技術を、日本語で。

ゲームボーイカートリッジの仕組みについて知りたくなかったこと以上のこと

概要

  • Game Boyカートリッジ の自作に挑戦した経緯と目的の説明
  • RP2040マイクロコントローラ のPIO機能活用への興味
  • カートリッジの基本構造 やバスの仕組みの解説
  • 初心者向け に体系的な情報整理
  • レトロゲーム機 としてのGame Boyの魅力や特徴の紹介

Game Boyカートリッジ自作の記録

  • Allison Parrish によるGame Boyカートリッジ自作プロジェクト
  • ブートレグ(非公式)カートリッジ は昔から存在し、多数のサードパーティ製やオープンソース設計も流通
  • RP2040マイクロコントローラ のPIO(Programmable I/O)機能を使いたいという動機
  • 数年かけて設計し、 自作カートリッジの設計を公開
  • このドキュメントは 新しい研究ではなく、既存情報の整理・解説 が目的

前提知識と参考資料

  • デジタルメモリの基礎知識 (バイト、アドレス、プロセッサの役割など)が必要
    • 詳細はSebastian Lagueの「Exploring How Computers Work」やAll About Circuitsの該当章が参考
  • マイクロプロセッサと電子部品の通信 について基本的な理解
  • 16進数・2進数 の知識
  • Game Boyのハードウェア概要 はRodrigo Copettiの分析記事が有用

記法・注意事項

  • 16進数は0x、2進数は0b で表記
  • ピン名の前にアンダースコア (_)がある場合、アクティブロー(0Vで動作)
  • 💡マーク付きの段落は技術的な補足、読み飛ばし可
  • ICの動作説明は 外部から見た挙動 に限定
  • DMG(初代Game Boy)SoC を中心に説明
  • Game Boy Pocket, Color, Advance も基本的に同様のカートリッジインターフェース

Game Boyが特別な理由

  • シンプルで理解しやすい設計、学習・解析が容易
  • 携帯性・省電力性 に優れる
  • コピーガード・リージョンロックなし で自作ソフト開発が容易
  • 豊富な技術ドキュメント・回路図 がコミュニティにより公開
  • 膨大なソフトウェアライブラリ と新作ゲームの継続的リリース
  • C言語やアセンブラ、ビジュアルスクリプト 等、多様な開発ツールチェーン
  • 100百万台以上の普及台数、エミュレーションやFPGA実装も容易
  • 低コストかつ拡張性が高いプラットフォーム

Game Boyカートリッジの基本

  • 1980~90年代はソフトとハードの境界が曖昧
    • Game Boy本体には OSや書き換え可能な不揮発性メモリが存在しない
    • ソフトを配布するには ROM等のICを搭載したカートリッジ(ハード)を出荷 する必要
  • カートリッジ独自のハードウェア拡張 (加速度センサ、RTC等)が容易
  • ハードウェアが正常動作しないと本体が起動しない というリスク

カートリッジの物理構造とバス

  • カートリッジ下部の金属端子=エッジコネクタ、Game Boy本体と接続

  • ROM IC がエッジコネクタと導通

  • 32ピン構成

    • 電源(5V)、GND、クロック、リセット、AIN 等のピン
    • 主要27ピン は以下に分類
      • フロー制御ピン :_WR(書き込み)、_RD(読み出し)、_CS(チップセレクト)
      • アドレスバス :A0~A15(16ビット)
      • データバス :D0~D7(8ビット)
  • 読み出し動作の基本

    • Game Boyが _WRをHigh、_RDをLow にし、アドレスバスに読みたいアドレスをセット
    • ROM ICが該当アドレスのデータをデータバスに出力
    • 起動時はアドレス0x0100から命令を読み出し

バスの仕組み

  • バス=複数のハードウェアが接続されたピン群
  • バスに値を書き込む=各ピンにHigh(5V)またはLow(GND)をセット
  • 例:アドレス0x4567の場合、A0~A15に2進数で割り当て
  • 例:データ0xABの場合、D0~D7に2進数で割り当て
  • High=1、Low=0 として扱う
  • バスをドライブする=その時点で電圧を出力しているコンポーネント
  • パラレルバス :1ビットごとにピンがあり、同時に複数ビット転送
    • シリアルバス は1本の線で順次転送、パラレルは高速だが拡張性が低い

この続きや、他の技術的詳細については新たな見出しで整理可能です。

Hackerたちの意見

33c3のアルティメットゲームボーイトークも見てみてね: https://www.youtube.com/watch?v=HyzD8pNlpwI

TIのTXB0108もこの目的に使えるけど、自動方向検出機能があって、上で言った方向ロジックが必要なくなるんだ。うん、これらは使わない方がいいよ。電気ノイズがあると翻訳方向を入れ替える傾向があって、入力が出力になっちゃうことがあるから。たまに全てが無事に生き残って、次のエッジで戻ることもあるけど、時には魔法の煙が出ちゃうこともある。星の配置が悪いと、工業事故になることも。こういう部品は隠れた危険があって、あまり目立って宣伝されるべきじゃないと思う。見た目はシンプルだけど、専門家向けだよ。失敗モードをよく理解してない限り、他に合理的な選択肢がない場合以外は使わない方がいい。

あと(気が向いたから/他のことを先延ばしにしてるから)、デザインについての初見レビューをちょっと: https://git.sr.ht/~aparrish/abc-pcb/tree/main/docs/abc-pcb.p... : - U6とU8は近くにデカップリングが必要。LVCロジックは遷移中の消費電力がひどいから、これらのゲートから何らかの遷移速度を期待するなら、しっかり供給した方がいいよ。明示的にこれらの部品専用でなくてもいいけど、物理的に近くにある必要がある。 - 特に太いWideBusの16ビットレベル変換器にはそれが特に重要。理由があって複数の電源ピンがあるんだ。厄介なデバイスだから、すべての電源入力ピンをそれぞれのキャパシタでデカップリングしてね。 - U6の出力はバス方向が間違ってるように見える?多分重要じゃない(全然問題じゃないかも、私は普段Altium使ってるからKiCadはあんまり) - VBUSはロジックレベルじゃないから、信頼性を求めるならロジック信号として使わない方がいいよ(動くけど... ほとんど... でも時々変なことになる)、それに複数のものをこれで駆動しようとすると、うまくいかないから(入力閾値が少し違って、微妙に違うタイミングで切り替わると悲しいことになる)。シュミットトリガー(1G17など)で整理してね。 - USBポートにはESD保護がない。生き残らせたい?ECMF02-4CMX8みたいなものを試してみて、実装は簡単だよ(はんだ付けはちょっと面倒だけど)。 - Q1の状態は描き方が悪くて、一目では理解できない。これらの部品をAとBのサフィックスを付けた普通のMOSFETとして描いた方が、回路がわかりやすくなるよ。 - IC2(なんでU2じゃないの?)の4, 5, 6, 7行はクロスドライブされてる。両側をグラウンドにしないで、悲しいことになるから。入力側をグラウンドにして、出力は接続しない方がいいよ、チップに強く駆動されてるから。どうしても誰かを満足させる必要があるなら、抵抗を使って引っ張ってもいいけど(医療!医療?医療?)。 - U7のSENSEピンはあまり電流を引かない(約25nA)から、その抵抗分圧器で電力を消費する理由はないよ。どこかに大きな電解コンデンサを詰め込んで、PDNをしっかりダンピングすることを考えてみて。

これめっちゃ面白い、シェアしてくれてありがとう!

おめでとう、いい仕事だね!.. さあ、ユーザーを追跡しない素敵なIOTガジェットを作って売って、ミリオネアになっちゃおう。シンプルな水漏れ検知器とか。

そういうのはもうたくさんあるし、めっちゃ安いよね。

それは違う、ゲームボーイのカートリッジの仕組みについて知りたかったのはこれだけだよ。ありがとう! :)

コメントを盗まれた!

昔のお気に入りのGB開発リソースがなくなってて悲しかった: https://web.archive.org/web/20150410063839/http://www.devrs.... ほとんどのリンクはすでに死んでたけど、そこにはクールなインスピレーションを与えるプロジェクトがいくつかあったんだ。

俺のポケモン青版、20年くらい前に洗濯機と乾燥機にぶち込んじゃったけど、今でもちゃんと動くんだよね。ハードウェアってすごいな。SDカードもそんな耐久性あるのかな?

乾燥機の熱の方が水より問題になりそうだな。

ゲームボーイ用のカスタムソフトを書くのに、コピー防止やリージョンロックを回避する必要はないよ。ゲームボーイにはそれがないからね。リージョンロックはないけど、ロゴチェックは通過しないといけないんじゃない?

彼らが言ってるのは、デバイスのハードウェアを改造したりソフトウェアをハックする必要はないってことだと思うよ。ROMのヘッダーにブロブを含めるだけでいいんだ(RGBDSツールチェーンを使ってるなら、RGBFIXが自動で挿入してくれるし)。それに、セガ対アッコレードでその慣習は終わったし、以来誰もそれを強制しようとはしてないと思う。

今月からKiCadとPCBデザインをちょっと遊びで始めたんだけど、誰かオリジナルのゲームボーイPCBを作ってオープンソースにした人いる?

PCBデザインの良いリソースってある?