ゲームボーイ/カラー アーキテクチャ
(copetti.org)- Game Boy系統は、低い電力予算の中で DMG-CPU SoC、PPU、APU、ブートROM、Game Pak を組み合わせ、携帯型ゲーム機のCPU・グラフィックス・オーディオ・互換性・コピー防止を1つのシステムに統合している
- CPUはSharpの SM83コア をベースに約4.19 MHzで動作し、Game Boy ColorのCPU CGBは同系統を維持しつつ、デュアルスピードモードで約8.38 MHzまで引き上げられる
- グラフィックスは160×144のLCDとVRAMベースのPPUが タイル・背景・スプライト・ウィンドウ を組み合わせる方式で、Colorモデルは16 KB VRAM、32,768色パレット、追加DMAによって表現力を拡張した
- オーディオは4チャンネル APU が担当し、Game Pakは32 KBの基本アドレス空間を超えるためにMemory Bank Controllerを使用し、LinkケーブルとColorの赤外線によって外部通信をサポートする
- ブートROMはNintendoロゴとROMヘッダのチェックサムを検査した後にゲームを起動し、このロゴ要件は 著作権・商標権 を利用した配布統制の仕組みとして機能した
Game Boy系統の範囲と設計方針
- Game Boyシリーズは NESの携帯版 とみなすこともできるが、単なる縮小版ではなく、独自の機能と拡張の方向性を持つ構造である
- Game Boyブランドは2世代にわたって続いた
- 第4世代にはモノクロのGame Boyと、Game Boy Pocket、Lightのような改訂版が含まれる
- 次の世代には、Virtual Boyの後に発売された Game Boy Color が含まれる
- 分析の焦点は、モノクロGame Boyの基本構造と、その構造がColorモデルでどのように拡張されたかにある
CPUとメモリ構造
- Nintendoは複数の汎用チップをメインボード上に配置する代わりに、CPUと主要構成要素を収めた 単一チップ設計 を選択した
- このSoCは DMG-CPU または Sharp LR35902 と呼ばれる
- Sharp Corporationが製造し、Nintendoの要件に合わせた電力効率、コピー防止、追加I/O実装に有利だった
- 小売カタログでは入手できないチップだったため、競合他社がそのまま複製しにくかった
-
SM83 CPUコア
- DMG-CPU内部の主プロセッサは Sharp SM83 である
- Zilog Z80とIntel 8080を混合したような構成で、約 4.19 MHz で動作する
- SM83はZ80と8080の機能の一部だけを維持している
- Z80の
IX、IYレジスタと、8080のIN、OUT命令がない - I/Oポートを使えないため、構成要素は メモリマップ される必要がある
- Intel 8080のレジスタセットだけを持つため、汎用レジスタは7個である
- Z80拡張命令のうち、ビット操作命令の一部のみが実装されている
- Z80の
- SharpはZ80や8080にない新命令も追加した
LDHは$FF00から始まるメモリマップ末尾256バイトへアクセスするために設計された- 命令サイズが1バイト小さくなるため、わずかに高速に動作できる
-
Game Boy ColorのCPU変更点
- Game Boy Colorには新しいSoCである CPU CGB が搭載されるが、SM83 CPUコア自体は概ね維持されている
- 最大の例外はクロック速度で、約 8.38 MHz まで2倍になる
- 同じCPUコアを維持することで、開発者は既存のプログラミング知識を再利用でき、新アーキテクチャ再設計のコストや下位互換実装の負担も減らせる
- CPU CGBは2つの動作モードを提供する
- Normal mode: SM83が約4.19 MHzで動作する
- Dual-speed mode: SM83が約8.38 MHzで動作する
- この選択は、1990年代後半の時点で古い技術を使い続けるという代償も残した
-
アドレス空間とRAM
- SM83は 8ビットデータバス と 16ビットアドレスバス を維持しており、最大64 KBのメモリをアドレス指定できる
- メモリマップはGame Pak領域、WRAM、HRAM、VRAM、ジョイパッド・オーディオ・グラフィックス・LCDなどのI/O、割り込み制御領域で構成される
- 初代Game Boyのメインボードには汎用メモリである 8 KB WRAM が搭載され、これはNESの4倍の容量だった
- SoC内には 127 B HRAM もある
LDH命令でより高速にアクセスできる小さな領域である- HRAMバス自体がWRAMより技術的に速いわけではないが、CPUに優先権がある
- DMA動作中にCPUが外部メモリへアクセスできない状況で重要になる
- Game Boy ColorはWRAMを 32 KB に増量した
- CPUのアドレス指定能力はそのままなので、全メモリを一度に接続することはできない
- 追加の24 KB WRAMへのアクセスには バンクスイッチング を使う
- 既存8 KB領域の最後の4 KBを7つのバンク間で切り替える
SVBKレジスタがWRAMバンク選択に使われる
グラフィックス: PPU、LCD、レイヤー構成
- Game Boyのグラフィックスは、CPUが計算を行い、DMG-CPU SoC内の独立した PPU が画面をレンダリングする構造である
- 内蔵 LCD は160×144ピクセルの解像度を提供する
- モノクロGame BoyのLCDは、白、薄灰色、濃灰色、黒の4段階のグレーのみを反射する
- 緑がかったLCDのため、画面はやや緑色に見える
- すべてのGame Boyは、地域ごとの電源周波数に依存する家庭用ゲーム機とは異なり、単3電池4本 で動作する
- CPUクロックとリフレッシュレートは地域によって変化しない
- リフレッシュレートは 59.7 Hz である
-
VRAMとタイルベースレンダリング
- PPUは 8 KB VRAM に専用接続され、レンダリングに必要なデータの大半をここから読み取る
- より高速なアクセスが必要な一部資料はPPU内部に保存される
- CPUのVRAMアクセスはPPUが仲介し、ゲームはVRAM領域に正しいデータを配置しなければならない
- 基本のレンダリング単位は タイル である
- タイルは8×8ピクセルのビットマップである
- 各タイルは16バイトを占める
- VRAMのTile setまたはTile pattern table領域に保存される
- 色はパレットを通じて4段階のグレーから選択される
- モノクロGame Boyは最大3つのパレットを定義できるが、レンダリングされるレイヤーの種類によって使用が制限される
-
背景、スプライト、ウィンドウ
- 最終フレームは 3つの重なるレイヤー で構成される
- 背景レイヤーは 256×256ピクセル、すなわち32×32タイルのマップである
- 実際の画面には160×144ピクセルのみが表示される
- ゲームは表示する背景領域を選び、それを移動させて スクロール効果 を実現する
- 背景レイヤーでは1つのパレットしか使えない
- スプライトは独立して動かせるタイルである
- 相互に重なったり、背景の後ろに配置されたりできる
- 表示優先順位はpriority属性で決まる
- 透明色 が追加されるため、実際に表示可能なグレーは3段階になる
- 専用の2つのパレットのいずれかを選択できる
- スプライト定義はPPU内部の OAM(Object Attribute Memory) に保存される
- ゲームは通常、OAM DMAを呼び出してRAMまたはROMからOAMへデータをコピーする
- DMAが有効な間、CPUは外部メモリへアクセスできない
- 各OAM項目にはタイルインデックス、X-Y位置、パレット、優先順位、上下・左右反転フラグが含まれる
- PPUのスプライトレンダリングには制限がある
- 1スキャンラインあたり最大 10個
- 1フレームあたり最大 40個
- 制限を超えると一部のスプライトは描画されない
- ウィンドウレイヤーは 160×144ピクセル のマップで、画面全体を覆うことができる
- 背景とスプライトの上にレンダリングされる
- スクロールしない
- 残っているタイルマップ1つだけをウィンドウレイヤーに割り当てられる
- 背景と同じパレットを共有する
- 透明ではないため下のレイヤーを完全に隠すが、タイミングベースのラスタ効果と組み合わせて部分的に使うこともできる
- ゲームは主にライフカウンタ、スコア、常時表示情報にウィンドウレイヤーを使用する
-
フレーム更新とラスタ効果
- CPUはPPUがVRAMを読み取っている間、テーブルを変更できない
- システムはPPUがアイドル状態のときに発生する割り込みを提供する
- Horizontal Blank は1本のスキャンラインが終わった後に始まり、まだ描画されていないフレーム部分を調整できる
- Vertical Blank はすべてのスキャンラインが終わった後に始まり、次のフレームのグラフィックスを更新できる
- OAM search はスキャンライン開始時に発生し、PPUがそのラインのスプライトを決定している間にOAM以外の領域を更新できる
- ウィンドウレイヤーと追加割り込みのおかげで、画面がすべて描画される前にフレームの一部を変更できる
- スキャンラインごとに異なるスクロール値を適用すると、各行が異なる速度で動く wobble effect を作れる
Game Boy Colorのグラフィックス拡張
- Game Boy ColorのPPUは元のPPUの上位集合として動作し、互換性のために2つの動作モードを提供する
- CGB mode: Game Boy Color用タイトルの視覚的改善を提供する
- DMG mode: 拡張機能を無効にした従来モードである
- Game Boy Colorのメインボードには 16 KB VRAM がある
- 従来の2倍の容量である
- CPUのアドレス制限のため、8 KBバンク2つで構成される
VBKレジスタがVRAMバンク切り替えに使われる
- PPUは2つのVRAMバンクへ同時にアクセスできる
- 開発者は
VBKでVRAMバンクを埋める - タイルマップでタイルがどのバンクにあるかを指定すれば、PPUが処理する
- 開発者は
- 追加VRAMは、2倍のタイル保存、より多くのパレット保存、タイルメタデータの拡張、追加パレットや効果の参照に使われる
-
色と追加DMA
- Game Boy Colorの新しいPPUは 32,768色 の中からパレットを定義できる
- 開発者は Palette Memory に最大16個のカラーパレットを保存する
- 背景・ウィンドウ用が8個、スプライト用が8個である
- 各パレットは4色をエンコードする
- 各項目は16ビット値だが、実際に使われるのは15ビットだけである
- Palette MemoryはCPUが直接アドレス指定できず、新しいレジスタが書き込みバッファとして機能する
- 背景とウィンドウのタイルは8個のパレットのいずれかを参照できる
- スプライトタイルも8個のパレットを参照できるが、1項目は依然として透明色に予約されており、3色パレットの制約は残る
- タイルセットは2倍に拡張され、VRAMに2倍多くのタイルを保存できる
- 背景・ウィンドウのタイルマップも拡張され、より多くのメタデータを保持できる
- 背景とウィンドウのタイルは上下・左右反転が可能で、重複グラフィックスをVRAMに保存する必要を減らせる
- CPU CGBにはVRAMへデータをコピーする 追加DMAユニット がある
- Game PakまたはWRAMからVRAMへコピーできる
- General-purpose DMAはいつでも転送できるが、転送中にメモリアクセス優先権を取るため画面のティアリングが生じることがある
- H-Blank DMAはH-Blank中のみ転送するため画面アーティファクトを避けられるが、16バイト単位に制限され、LCDスキャン中には停止する
オーディオ: 4チャンネルAPU
- オーディオは APU(Audio Processing Unit) が担当し、Programmable Sound Generator方式で合計 4チャンネル を提供する
- APUはGame Boyの各改訂版を通じて変わらなかった構成要素の1つである
- CPUのように高速化することはできない
- オシレータ速度を変えても音質が向上するのではなく、音程が変わる
- 機能を増やすには回路を追加する必要があり、コストも増える
-
チャンネル構成
- パルス波チャンネルは2つあり、主にメロディと効果音に使われる
- パルス幅を変えることで4種類の音色を提供する
- 1つ目のチャンネルは専用の sweep control を持つ
- チャンネル数が限られているため、ゲーム中に効果音が鳴るとメロディが途切れることがある
- 3つ目のチャンネルは ユーザー定義波形 をサポートする
- 32個の4ビットサンプルで構成される波形をwavetableに保存する
- 音量と周波数を制御できる
- ノイズチャンネルは1つである
- ホワイトノイズのように聞こえるランダム波形の集合である
- ゲームでは主に打楽器や環境音効果に使われる
- clean staticとrobotic staticの2つの音色を提供し、周波数調整も可能である
- パルス波チャンネルは2つあり、主にメロディと効果音に使われる
-
ミキサーと拡張オーディオピン
- ミキサーはステレオ出力を提供し、チャンネルを左右に配置できる
- 内蔵スピーカーはモノラルなので、パンニング はヘッドホン出力でしか聞こえない
- ミキサーハードウェアはカートリッジの専用ピンにも接続されている
- カートリッジが追加ハードウェアでアナログ音声を出力すれば、追加チャンネル をストリーミングできる
- 市販されたゲームでこの機能を使ったものはなかった
- この機能はGame Boy Advance時代に削除された
ブートROMと動作方式
- Game BoyはNES/Famicomのように直接ゲームを起動するのではなく、まず内部 256バイトROM から起動する
- 基本的なブート手順は次のとおりである
- 電源が入るとCPUはアドレス
0x0000から読み始める - RAMとAPUが初期化される
- カートリッジROM内のNintendoロゴのグラフィックをDisplay RAMへコピーして画面上部に描画する
- カートリッジがない、または正しく挿入されていない場合、ロゴは壊れたタイルとして表示されることがある
- ロゴが下へスクロールし、象徴的なサウンドが再生される
- ゲーム内のNintendoロゴをコンソールROM内のロゴと比較する
- カートリッジROMヘッダに対して高速な チェックサム を実行する
- 検査に失敗するとコンソールは停止する
- コンソールROMはメモリマップから取り除かれる
- CPUがゲームの実行を開始する
- 電源が入るとCPUはアドレス
- 画面に表示されたNintendoロゴはVRAMから消去されないため、ゲーム側でこのロゴにアニメーションやトランジション効果を適用できる
-
Game Boy Colorのブート変更点
- Game Boy ColorのROMサイズは 2 KB に増加した
- ブートシーケンスは、挿入されたゲームがGame Boy専用かGame Boy Color用かを確認する
- カートリッジROM内の特定メタデータを検査し、結果に応じてDMGまたはCGBモード有効化レジスタを設定する
- DMGゲームが挿入されると、ブートプログラムはPalette RAMを 計算されたパレット で埋める
- ゲームのメタデータに依存する単純なアルゴリズムを使う
- モノクロゲームがGame Boy Color上で色付き表示される仕組みである
- ユーザーは起動中のボタン組み合わせで選択されたパレットを変更できる
- NintendoロゴはHRAMにもコピーされる
- チェックサム段階ではHRAM内のロゴ前半だけを検査する
Game Pak、ゲーム制作、外部通信
- 当時の高性能志向のゲームは、高級言語コンパイラの成熟度が十分でなかったため、主に アセンブリ言語 で書かれていた
- 市販ゲームはNintendoのGame Boy向けカートリッジである Game Pak として配布された
- 基本の保存容量はアドレス空間の制約により最大 32 KB である
- Memory Bank Controller、すなわちmapperを使えば、より大きなゲームが可能になる
- 市場に出た最大のGame Pakは、初代Game Boyで1 MB ROM、Game Boy Colorで8 MB ROMを搭載した
- 一部のGame Pakは、リアルタイムクロック、追加SRAM、保存維持用の外部バッテリーを含んでいた
-
Color時代のカートリッジ種別
- Game Boy Colorの動作モード追加により、ゲームは3種類に分類される
- Game Boy: すべてのGame Boyモデルと完全互換で、常にDMGモードで動作する
- Game Boy Color enhanced: モノクロモデルと互換性を保ちながら、Game Boy ColorではCGBモードで視覚的に強化される
- Game Boy Color exclusive: Game Boy Colorでのみ互換性があり、そのハードウェアを活用するよう最適化されている
- 3種類には区別を助ける公式カラーがあった
- PokémonやDonkey Kongのような一部ゲームは別デザインを使用していた
- Game Boy Colorの動作モード追加により、ゲームは3種類に分類される
-
Linkケーブルと赤外線
- Game Boyゲームは初めて Game Boy Link ケーブルを通じて外部ハードウェアと通信できるようになり、マルチプレイやアクセサリ利用が可能になった
- Linkケーブルはコンソールの6ピンサブコネクタに接続され、インターフェースは SPI(Serial Peripheral Interface) プロトコルを使用する
- 1台のGame Boyがmasterとしてクロック信号を駆動し、もう一方はslaveになる
- 各転送でmasterとslaveは8ビットパケット1個を交換する
- 初代Game Boyの転送速度は 8 Kbit/s、すなわち1 KB/sである
- Game Boy Colorはhigh speedモードで最大 512 Kbit/s、すなわち64 KB/sに達する
- Nintendoは最大4台のGame Boyが同時にデータ交換できる 4-Player Adapter も発売した
- 基本SPIは維持される
- アダプタがmasterとして動作し、ゲームが従うべき追加通信レイヤーを実装する
- Game Boy Colorには 赤外線トランシーバー が含まれる
- LEDとフォトトランジスタで構成される
- Pokémon Goldのようなタイトルで無線データ交換に使用された
- システム自体は通信プロトコルを実装しない
RPレジスタ1つがIRセンサー動作、送信ビット、最後に受信したビットをエンコードする- Nintendoは公式Game Boy Developer Manualに参照実装を提供した
コピー防止構造
- コンソールはゲームをすぐに実行せず、まず複数の検査を行うことで、未承認カートリッジの実行を防ぎ、カートリッジが正しく挿入されているかも確認する
- ゲームはROMヘッダ内にNintendoロゴのコピーをタイル形式で含めていなければ検査を通過できなかった
- Nintendoはこれにより 著作権と商標権 の法的枠組みを配布統制に活用できた
- その後の Sega v. Accolade 事件では、こうした要件を満たすために著作権ロゴを使用することはフェアユースであると判断され、企業に権利が認められた
- ゲーム内部でも追加のコピー防止策を実装できた
- ブートレグでは通常、より大きいSRAM容量を検査した
- ゲームプレイ中の任意の時点でROMチェックサムを実行し、コード改変を検出した
まだコメントはありません。