ゲームボーイのカートリッジがどう動くのかを、知りたくなくなるほど詳しく
(abc.decontextualize.com)- ゲームボーイのカートリッジを自作するために、長年にわたる研究と設計プロセスを経ている
- この記事は、カスタムゲームボーイカートリッジを作るために必要な主要な技術情報を、初心者の視点から体系的に整理している
- ゲームボーイは、シンプルでありながら拡張性に優れたハードウェア構造のおかげで、レトロゲーム開発やハードウェアハッキングのコミュニティにとって魅力的なプラットフォームである
- カートリッジは、ゲームデータや追加ハードウェア(例: RTC、センサーなど)を内蔵でき、ゲームボーイに新しい機能を与えられる
- メモリバンクコントローラ(MBC)回路によって、容量拡張と選択的なメモリアクセスが可能になり、多様な方法でゲームが実行される
紹介と目標
- 著者は個人的に、ゲームボーイのカートリッジを完全に一から制作するという目標を立てた
- ゲームボーイカートリッジの内部構造と動作原理に関する知識を、オープンソースとして整理し公開している
- 記事の目的は、難度の高い技術情報を初心者の視点で誰でも追えるように再構成することにある
- ハードウェアの内部動作原理ではなく、外部から観察される**振る舞い(behavior)**を中心に説明している
- DMG(初期型ゲームボーイ)のSoCを基準に説明しており、ゲームボーイ系デバイスの基本的なカートリッジインターフェースは似通っている
ゲームボーイプラットフォームの特別さ
- ゲームボーイは、単純さと設計の直感性のおかげで、ハードウェアとソフトウェアの構造を頭の中で把握しやすい
- 携帯性と低消費電力という特性に加え、複雑な保護機構やリージョンロックのない構造により、誰でも開発できる
- 技術文書、ハードウェア図面、コミュニティベースの資料が豊富に蓄積されている
- 公式/非公式のゲームライブラリが膨大で、オープンソースの開発ツールチェーンやビジュアルスクリプティングツールなども活発に保守されている
- ハードウェアドライバだけでなく、高精度なエミュレータやFPGA実装など、拡張性の高いエコシステムが形成されている
ゲームボーイカートリッジの基本構造
- 昔のコンソール機は、ソフトウェアとハードウェアの境界があいまいである
- ゲームボーイには、OSや内蔵の不揮発性ストレージがない。すべての実行コードと追加ハードウェアはカートリッジに内蔵される
- そのため、カートリッジが完全に動作してはじめて、ゲームボーイは起動・動作できる
- カートリッジ下部の**32ピンの「エッジコネクタ」**は、本体と信号をやり取りする中心的なインターフェースである
- カートリッジと本体の間では、信号が**電源、制御(読み取り/書き込み/チップ選択)、アドレスバス(16ビット)、データバス(8ビット)**に分類される
バス(Bus)と動作原理
- バスとは、複数の部品が1本の信号線群を共有し、データをやり取りできる構造である
- ゲームボーイのCPUは、欲しいアドレスをアドレスバスに、データをデータバスに載せる
- バス構造は**並列(parallel)**であるため、各ビットに対応するピンが実際に存在する
- 速度面では有利だが、バスを共有する分、**衝突/コンテンション(同時書き込み)**の危険がある
- 複数のICが同時にデータを出力すると、**ショート(過熱や故障の危険)**が発生するため、常に1つのICだけが有効でなければならない
ゲームボーイの主要なメモリ分類
- ゲームボーイは最大4種類のメモリIC(内蔵RAM、ビデオRAM、カートリッジROM、カートリッジRAM)を搭載できる
- 実際にはビデオRAMは独立したバスを使うため、一般的な説明では除外される
- 内蔵RAM/カートリッジRAM/ROMの組は、同じアドレスバスとデータバスを共有する
- 必ず一度に1つのチップだけがデータバスへの書き込み/読み取りを行う
- 実務上の用語として、**内蔵RAM(WRAM)、カートリッジRAM(SRAM)、ビデオRAM(VRAM)、高速RAM(HRAM)**とも呼ばれる
Chip Select(チップ選択)と回路構成
- 各メモリチップには、**チップ選択信号(CS/CE, Chip Select/Chip Enable)**ピンがある
- チップ選択信号の状態によって、特定のチップだけがデータバスにアクセスできる
- ゲームボーイはチップ選択のために、アドレスバスの上位3ビット(A15, A14, A13)とCPUの_CSピンを再利用している
- この接続により、同時に2つ以上のチップが有効にならないことが保証される
- たとえば、A15が0のときだけROMチップが有効になり、RAMは別の論理で有効化される
メモリマップ(Memory Map)とプログラマの視点
- ハードウェアのアドレスやピン状態は抽象化され、プログラマは論理的なメモリマップだけを認識する
- 16ビットのアドレス空間では、0x0000–0x7FFFのアドレス領域はカートリッジROM、0xA000–0xBFFFはカートリッジRAM、0xC000–0xDFFFは内蔵RAMにマップされる
- 特定のアドレスへアクセスすると、自動的に目的のメモリ範囲が有効になり、それ以外は無効化される
- メモリマップ資料は、ゲームボーイ文書における重要な参照資料として活用される
メモリバンクコントローラ(MBC; Memory Bank Controller)
- MBCは、ゲームボーイカートリッジで32KBを超えるROM容量や追加RAM/周辺機器の接続を可能にする中核回路である
- さまざまな種類のMBCが市販されたが、ここでは比較的シンプルで汎用的なMBC5を基準に説明している
- MBC5はスイッチング(banking)手法によって、最大8MBのROMと128KBのカートリッジRAMをサポートする
- RAMのアクセス制御や、外部センサー/RTCなどの別ハードウェア制御も可能である
- カートリッジのROMアドレスピンのうち上位ビット(A22~A14)はMBC5が動的に制御し、下位ビットだけを本体のアドレスバスに直接接続する
ROMバンキング(Banking)の原理
- ゲームボーイのCPUは最大64KBのアドレス空間を持つが、実際にROMアクセスへ使うのは32KB(16KB+16KB)だけである
- **MBC5はROMチップの上位アドレス(バンク選択)**を直接制御し、16KB単位で任意の領域をCPUアドレス空間へマップする
- ハードウェア的には、CPUのアドレスバス下位14ビット(A0~A13)がROMチップへ直接つながり、残りはMBC5から入力される
- 実際のゲーム実行中にソフトウェアが特定のメモリアドレスへ値を書き込むと、MBCがそれを検知して内部の選択バンク値を更新する
MBCプロトコルとメカニズム
- MBC5は、特定のアドレス/制御信号の組み合わせを検知して、ROMバンク選択、RAMバンク選択、そのほかの機能の有効化/無効化などを行う
- たとえば、A15=0、A13=1、A14=0(0x2000~0x3FFF)領域で書き込み動作が起きると、データバス上の値をROMバンク番号として記録する
- プログラマは実際には、バンク切り替え処理を低レベル回路制御としてではなく、特定のアドレスにデータを書き込むだけのようにコーディングする
- カートリッジRAMの使用、センサー、RTCなども同様のパターンで制御される
- このようなバスの再利用(リユース)手法は、部品点数を減らして価格を下げる効果がある
結論とコミュニティ活用
- ゲームボーイカートリッジ構造の特徴は、低コスト・高信頼性・拡張性にある
- カートリッジを自作するなら、上記の構造とプロトコルに対する正確な理解が必須である
- コミュニティと豊富な文書を積極的に参照すれば、ハードウェアとソフトウェアを統合した開発プロセスへの参入障壁を大きく下げられる
参考資料と追加学習の道筋
- Rodrigo CopettiによるGame Boy/Game Boy Color Architecture
- gbdev.io, Pan Docsの技術文書
- さまざまなオープンソースのカートリッジ設計図やツールチェーン(例: GBDK, RGBDS など)
- 自作プロジェクトの例: abc.decontextualize.com
(該当記事の後半では、MBC設計のバリエーション、EEPROM/フラッシュメモリ、入出力IC、周辺機器統合など、さらに複雑な要素も扱われているが、上記の項目はゲームボーイカートリッジの動作原理に関する中核的な内容に当たる)
1件のコメント
Hacker News のコメント
TI の TXB0108 を使った経験を共有したい。自動方向検出機能のおかげで方向ロジックを別途追加する必要がないように見えるが、実際には使用は勧めない。電気的ノイズがあると方向が切り替わって入力が出力になってしまうことがあり、そのたびに機器がうまく耐えるか、ひどいといわゆる「魔法の煙」現象が起きる。運が本当に悪ければ産業現場の事故につながることもあり得る。こういう部品はプロ向けの隠れた危険が多いので、過度に宣伝されるべきではないと思う。失敗モードを正確に理解しているか、ほかに代替手段がない場合にだけ使うべきだ
こういう部品は本当に予測不能だ。出力側に数インチのトレースやコネクタがあるだけでも、出力リンギングのせいで自動方向反転が頻繁に起きる。専門家でなければ使えないレベルで、まさに使いたくなるような状況ほど逆に使いにくい
実際に、かなり高速で方向が切り替わり続けて深刻なノイズと発振が発生した経験がある。プルダウン関連の制約もかなりあるが、両側とも同じ方向にプルするときはまだましだった
別の作業を先延ばしにするついでに、abc-pcb.pdf の設計を第一印象でいくつか見てみた
この記事が、自分がカスタムカートリッジを作っていた頃にあれば本当によかったと思う
自作ゲーム Cubeat では、GB のオーディオ入力ピンに OPL3-L チップをつないで FM 音楽を実装した。MBC ロジックは 7400 シリーズの単一ロジックチップだけを使っている
いつか必ず完成させてリリースしたいが、GB でこういう面白いトリックを実装してみるのは本当に楽しい経験だ
Cubeat 情報
まさにこのレベルで Game Boy カートリッジの構造について知りたかった
Game Boy カートリッジは、RAM とディスク容量をアプリと一緒に提供するという発想が新鮮だ。考えてみれば理にかなっている
もし携帯電話もこういう方式で動いていたなら、数年ごとにチップ技術が改善されるたびに新しいカートリッジを買って高性能アプリを動かしたり、新しいアンテナを差し込んだりしてアップグレードできたのではないかと想像する
モジュラー式の携帯電話は昔から提案されてきたが、実用的でなかったり有用でなかったりした。すべての部品をソケット接続にするとチップ間レイテンシは増え、信頼性も落ちる。ポケットの中で一日中揺さぶられる製品ではなおさら脆弱だ
実際には携帯電話で一つの部品だけが旧式になるわけではなく、カメラ、画面、CPU、RAM、バッテリーなどほぼすべてを同時にアップグレードしたくなる。そうなると個別に交換するより、単に新しい携帯電話を買ったほうがよい。個別交換で得られるのはせいぜいケース代の節約くらいだ
マイクロコントローラの ROM ホットパッチシステムについて議論しているが、こうした理由からチップにアプリを全部載せてそのまま起動する構造の利点は確かにある。ただ、ユーザーの要求はどんどん変わるので、ますます複雑になっていくようだ
良いアイデアであることは確かだが、差し込まれる側の機器のハードウェア性能が限界になるのではないかという懸念もある
カートリッジにより高速な RAM を載せることはできても、既存ボードがそれを十分活用できるのかは疑問だ
より高速なストレージを追加できたとしても、それを受けるハードウェアがそのままなら実質的な効果がどれほどあるのかははっきりしない
カメラまで差し込めたらと想像したことすらある
Game Boy 向けのカスタムソフトウェア制作ではコピー防止やリージョンロックのハードウェアを回避する必要がないという話について、実際にはロゴチェックを通過しなければならないのではないかと質問している
そして Sega v. Accolade 判決以降、実際にはタイトルチェック方式はもはや法的に強制できないので、実質的な回避障壁はない
以前よく見ていた GB 開発資料サイトの devrs.com がもう運営されていないのは残念だ。すでにほとんどのリンクは死んでいるが、刺激的なプロジェクトが多い場所だった
Ultimate Game Boy Talk(33c3 発表)の動画も参考になる
Ultimate Game Boy Talk - 33c3
自分の Pokemon Blue は 20 年前に洗濯機で洗われて乾燥機にも入ったのに、今でも正常に動いている。本当に頑丈なハードウェアだ。SD カードがこういう扱いに耐えられるのか気になる
今月 KiCad と PCB 設計を遊び半分で始めたのだが、オリジナルの Game Boy PCB 全体を自分で作ってオープンソースとして公開した事例があるのか気になる
FunnyPlaying という会社が GBC、GBA PCB を自作して販売している。オープンソース版は見つけにくい
nataliethenerd の GitHub には CGB リバースエンジニアリングプロジェクト があるが、ライセンスは非商用だ
「CGB-CPU-04 ボードを使ってスキャン、研磨、再作成し、CGB 回路図を整理した。値などは元の回路を参照した」と説明している
PCB 設計の参考になる資料のおすすめも知りたい