第 4 回:Flipper が司る 6 つの I/O インターフェース詳細
ゲームキューブのシステム LSI 「Flipper」は、CPU (Gekko) からの通信を仲介するため、物理メモリ空間の 0x0C000000 以降の領域に各種 I/O 制御用のハードウェアレジスタをマッピング (MMIO) しています。各インターフェースはそれぞれのレジスタブロックを持ち、ビット単位のフラグ操作によって周辺機器の制御や高速転送 (DMA) を実行します。
0x0C006000光ディスクドライブとのパラレル通信およびデータ暗号化解除、メインメモリ (1T-SRAM) への DMA 転送を制御します。セキュリティ層が強固なため、転送時にはレジスタを介した厳密なコマンド送出が必要です。
0x0C006000 (DI_STATUS): カバーの開閉状態 (リッドスイッチ) の検知、ブレーク (中断) フラグ、割り込みステータス。0x0C006004 (DI_CONTROL): 転送開始フラグ (DMA 開始)、読み込み/書き込みの方向指定。0x0C006008 〜 0x0C006014 (DI_DMA_ADDR / LEN): メインメモリ側の転送先絶対アドレスおよび転送バイト数を指定。0x0C006800メモリーカードや内蔵 IPL ROM、SRAM、時計 (RTC) など、多彩な SPI (シリアル) 型デバイスを制御する拡張インターフェースです。独立した 3 つのチャンネルを持ち、設定レジスタによって転送クロック (速度) を動的に変更できます。
| チャンネル | 接続デバイス 0 | 接続デバイス 1 | 接続デバイス 2 |
|---|---|---|---|
| EXI チャンネル 0 | メモリーカード スロット A | 内蔵マクロニクス複合チップ (IPL ROM / RTC / 内蔵 SRAM) |
底面シリアルポート 1 (ブロードバンドアダプタ等) |
| EXI チャンネル 1 | メモリーカード スロット B | 未接続 | 未接続 |
| EXI チャンネル 2 | 底面シリアルポート 2 | 未接続 | 未接続 |
各チャンネルの制御レジスタ (EXI_CR) の下位ビットにより、接続デバイスに応じた周波数 (1MHz / 2MHz / 4MHz / 8MHz / 16MHz / 32MHz) を選択。IPL ROM の高速展開時には最高速の 32MHz が割り当てられます。
0x0C006400前面にある 4 つのコントローラポートを制御します。任天堂独自の双方向シリアルプロトコルをハードウェアレベルでパケット処理し、1 フレーム (16.6ms) の間にすべてのポートの状態を自動で世論調査 (ポーリング) する仕組みを持っています。
SI が自動スキャンしてメモリに格納する入力バッファ (8 バイト) の構造は以下の通りです。このバイト列が CPU にダイレクトに引き渡されます。
| バイト位置 | 格納されるデータ (低レイヤビット表現) |
|---|---|
| Byte 0 - 1 | デジタルボタンフラグ (A, B, X, Y, START, 十字キー, Z, L, R ボタンの ON/OFF) |
| Byte 2 | メインアナログスティック X 軸 (0x00 〜 0xFF / センター 0x80) |
| Byte 3 | メインアナログスティック Y 軸 (0x00 〜 0xFF / センター 0x80) |
| Byte 4 | C スティック X 軸 |
| Byte 5 | C スティック Y 軸 |
| Byte 6 | L トリガー アナログ深度値 (0x00 〜 0xFF、押し込み検知は Byte 0-1 に反映) |
| Byte 7 | R トリガー アナログ深度値 |
0x0C006C00サウンド出力と 16MB の A メモリ (A-RAM) へのアクセスを制御します。Flipper 内の DSP と完全に連動し、オーディオサンプリング周波数の同期や切り替えを司ります。
AI_CONTROL) により、32 kHz (一般的なゲーム時) と、48 kHz (高品質なムービーシーン等) の 2 モードをハードウェアで瞬時に切り替えます。0x0C005000埋め込みフレームバッファ (EFB) から読み出された映像データを画面に出力するタイミングを制御します。ゲームキューブが国内外の様々なテレビ表示規格や高解像度出力に対応できたのは、この VI の柔軟なレジスタ設計によるものです。
0x0C003000Gekko CPU と Flipper のメインシステムバスを繋ぐ、すべての通信の玄関口 (ブリッジ) です。CPU へのデータ供給の最適化に加え、ハードウェア最大の特徴である「割り込み (Interrupt) の集約」を行います。
DI の DMA 転送完了、SI のコントローラスキャン完了、VI の画面垂直同期 (V-Blank) など、システム内で発生するあらゆるハードウェアイベント信号は、まず一度この PI へと集約されます。PI はそれらのフラグを 1 本のラインにまとめ、Gekko CPU の「外部割り込みピン」へと通知します。CPU はこれを受けて、適切なゲーム内プログラム (割り込みハンドラ) を実行する仕組みとなっています。
「ゲームボーイプレーヤー」などを接続する本体底面のハイスピードポートは、外見こそ独立した外部 I/O ポートですが、内部設計は非常にユニークです。実はこのポート、通常の I/O バスではなく、「A メモリ (A-RAM)」のバスに直結されています。
システムからは「A メモリの 16MB 目以降に広がる延長空間」として認識されるため、本来オーディオ用途であるはずの ARAM DMA 転送をそのまま外部デバイスとの通信に転用できます。この設計により、CPU の負荷を一切増やすことなく、外部機器からの大容量データをメインメモリへ超高速に流し込むという、当時の I/O の常識を超えた極めて合理的な転送システムを実現しています。