Gameboy Advance 内部構造
Gameboy Advance 内部構造 ------------------------
この文書はGameboy Advance上の一般的なメモリマップとグラフィックスモードの不完全なガイドです。
これは、グラフィックスを表示し、制御を読むために使用される必要のあるデータ構造とレジスタの詳細を含んでいます。
これを書いた時点では、Gameboy Advanceはまだ発売されていないので、ここに書いていることと、最終的なハードウェアは違うかもしれません。
この文書は、Gameboy Advanceについての公に利用有効な文書がないことにムカついたので書きました。
これは私の知らないことがたくさんあり、非常に不完全なので、誤りがあれば、電子メールを送って私に知らせてください。
これは任天堂の公式文書を見ずに作られました。
この文書になにか修正や追加があれば、agentq@millstone.demon.co.ukで私にメールしてください。
うまくいけば、これは多くのアマチュアのコーダがGBA用の独自のソフトウェアを書き始めるのに十分でしょう。
by AgentQ
Revision 1.0 - 08/02/2001
日本語版:BERO
http://www,geocities.co.jp/Playtown/2004/
bero@geocities.co.jp
メモリマップ
----------
このセクションは、CPUから見えるメモリ領域全体と、それが何に使用されるかリストします。
ゼロページ:
位置:0x00000000
サイズ:255バイト
私は、これが何のためにあるかわかりません。
外部作業RAM:
位置:0x02000000
サイズ:256Kb
この領域はゲームのデータとコードに利用できます。
内部作業RAM:
位置:0x03000000
サイズ:32Kb?
この領域も利用できます。
私は、なぜ作業RAMが2つに分かれているのかわかりません。
たぶん、Gameboy Colorのエミュレーションのためでしょうか?
IO RAM:
位置:0x04000000
サイズ:1Kb
この領域は、GBAグラフィックス、サウンド、DMAと他の機能を制御するために使用する全てのメモリマップドIOがあります。
パレット:
位置:0x05000000
サイズ:0x400バイト
この領域は、パレットモードでの15ビットの色値を指定します。
OAM:
位置:0x07000000
サイズ:0x400バイト
これはオブジェクトアトリビュートメモリ(Object Attribute Memory)で、GBAのスプライトを制御するために使用されます。
VRAM:
位置:0x06000000
サイズ:0x20000バイト
ビデオRAMは、ビットマップモード時のフレームバッファと、タイルモード時のタイルデータとタイルマップを蓄えるために使用されます。
ROM:
開始:0x08000000
サイズ:カートリッジのサイズ?
ゲームカートリッジ中のROMはこの領域に現われます。
ビデオモード
-----------
GBAは、ビットマップモード、タイルモードを含む多くのグラフィックスモードを持っています。
現在のビデオモードはLCDレジスタの下位3ビットにセットされます。(IO RAMセクションを参照)
現時点では、モード0、3、4、5に関する情報だけがあります。
モード0:
このモードでは、8ビットのパレットでタイルの4枚のBG面を表示できます。
これらは8x8タイルで構成され、タイルのビットマップはタイルデータアドレスに格納されます。
このデータのアドレスはレジスタBG0-BG3で設定します。
GBAの解像度は240x160なので、30x20タイルが表示されます。
SCXとSCYレジスタは64x64タイルまでのより大きな領域をスクロールするために使用できます。
このモードでは、各ピクセルのデータは8ビットのパレットインデックスとして格納されます。
0x05000000にあるパレットは、256のパレットエントリーの各々に対する15ビットの色値を格納します。
(形式はモード3の解説を参照。)
最大64x64ピクセルの128個までのスプライトをBG面と同様に表示することができます。
これらは、0x05000200に位置する第2のパレットを使用します。
スプライト表示方法の詳細は、OAMセクションを参照してください。
背景タイルとスプライトの両方はパレットエントリー0を透明色として使用します。
この色のピクセルは表示されず、他のBG面とスプライトが通り抜けて表示されます。
タイルマップは画面上のタイルのレイアウトを格納し、512x512までのサイズを選択可能です。
タイルマップは、以下の形式で各タイルへの16ビットのエントリーを持ちます:
F E D C B A 9 8 7 6 5 4 3 2 1 0
X X X X V H T T T T T T T T T T
T = タイル番号
V = 1の場合、上下反転
H = 1の場合、左右反転
さらにタイルマップのアドレスを変更できます。
モード3:
標準の240x160のビットマップモード。
マップは0x06000000から開始し、長さ0x12C00バイトです。
1ピクセル当たり16ビットで、以下の形式です:
F E D C B A 9 8 7 6 5 4 3 2 1 0
X B B B B B G G G G G R R R R R
R = 赤、G = 緑、B = 青
これは、十分な色範囲が直接表示されることを有効にします。
残念ながら、このモードのフレームバッファはページフリップするには大きすぎます。
選択肢としては。垂直帰線中に作業RAMからVRAMにフレームバッファをコピーすることでしょう。
しかし私は、GBA CPUが転送を十分に速く行うように十分に速いかどうかわかりません。
このモードでグラフィックスを表示するには、BG2を有効にして、BG0、BG1、BG3を無効にする必要があります。
モード4:
8ビットパレットの240x160のビットマップモード。
ビットマップは0x06000000あるいは0x0600A000から開始します。これはLCDレジスタのビット3で設定します。
非表示画面に描画して交換する、ページフリップ技術のために使用できます。
パレットは0x5000000にあり、256個の16ビット値を含んでいます(解説はモード3を参照)。
このモードでグラフィックスを表示するには、BG2を有効にして、BG0、BG1、BG3を無効にする必要があります。
モード5:
これは、160x128以下の解像度の別の16ビットのビットマップモードと思います。
私は、GBA LCDスクリーンに適合するためにこれが拡大されるか真中に表示されるか(より適切な選択と思います)わかりません。
このモードを使用するという利点はおそらく、利用可能な2つのフレームバッファがあることで、モード3では不可能なページフリップを実行するためにこれを使用できます。
LCDレジスタのビット3が0の場合、フレームバッファの開始を0x06000000に、1の場合、0x6005000に設定します。
これはGameboy Colorのエミュレートにも使われるモードかもしれません。
(Gane Boy Colorの解像度は160x144で、モード5の解像度に似ているので)
OAM(スプライト)
-------------
GBAは128個の同時のスプライトをサポートします。
これらは最大64x64ピクセルのサイズです。
0x07000000から開始するOAMは、128個のスプライトの各々への1つのエントリーを持っています。
これらのエントリーは長さ8バイトで、次の形式です:
バイト1と2
F E D C B A 9 8 7 6 5 4 3 2 1 0
S S X X X X X X J J J J J J J J
J = スプライトのY座標(ピクセル)
S = 以下を参照
バイト3と4
F E D C B A 9 8 7 6 5 4 3 2 1 0
S S X X X X X I I I I I I I I I
S = スプライトサイズ。サイズ値の上位2ビットはバイト1にあり、下位2ビットはバイト3にあります。
これは、次の方法でスプライトのサイズをセットする、4ビットの値を形成します:
0000: 8 x 8 1000: 8 x 16
0001: 16 x 16 1001: 8 x 32
0010: 32 x 32 1010: 16 x 32
0011: 64 x 64 1011: 32 x 64
0100: 16 x 8 1100: 未使用
0101: 32 x 8 1101: 未使用
0110: 32 x 16 1110: 未使用
0111: 64 x 32 1111: 未使用
I = スプライトのX座標(ピクセル)
バイト5と6
F E D C B A 9 8 7 6 5 4 3 2 1 0
X X X X P P T T T T T T T T T X
P=プライオリティ。
これは、どのBGがスプライトの前か制御します。
11:スプライトは、BG3の後ろに、他のすべての面の前に表示されます。
10:スプライトは、BG2とBG3の後ろに、BG0とBG1の前に表示されます。
01:スプライトは、BG1、BG2とBG3の後ろに、BG0の前に表示されます。
00:スプライトはすべてのBG面の後ろに表示されます。
注:これは、すべてのBG面の前にスプライトを表示することができないように見えます、したがって、このフィールドは間違っている思います。
T=タイル番号。
この値はタイルデータ領域へインデックスで、表示されるタイルのビットマップを選択します
(以下を参照)
バイト7と8
これらのバイトはスプライトの回転と拡大縮小を制御します。
私はこれらのバイトの形式がわかりません。
これを知っていれば、私にメールしてください!
タイルデータ領域は、各タイルの実際のビットマップを含んでいます。
スプライトは、Gameboy ColorのようにBG面とタイルデータを共有しません。
スプライトタイルデータは0x06010000から開始します。
タイルはすべて8x8ピクセルの大きさです。
モード0では、1枚のタイル当たり64バイト(1ピクセル当たり1バイト)です。
これは256個のカラーパレットへのインデックスである、8ビットの値です。
(上記の表示モード解説を参照)
スプライトは、0x05000200で始まる第2のパレットを使用します。
スプライトが8x8ピクセルより大きい場合、スプライトの幅と高さの複数のタイルがくっつきます。
例えば、もし32x32スプライトを設定し、タイル番号を5に設定すれば、スプライトは以下のように表示されます:
---------------------
| 5 | 6 | 7 | 8 |
| | | | |
---------------------
| 9 | 10 | 11 | 12 |
| | | | |
---------------------
| 13 | 14 | 15 | 16 |
| | | | |
---------------------
| 17 | 18 | 19 | 20 |
| | | | |
---------------------
IO RAM
------
アドレス:0x4000000 - LCD、スクリーンモード
F E D C B A 9 8 7 6 5 4 3 2 1 0
X X X S L K J I X X X X A M M M
M = ビデオモード。上記のビデオモードリストを参照してください。
A = このビットは、ビットマップモードにおけるビットマップの開始アドレスを制御し、ページフリップのために使用されます。
詳細は、特定のグラフィックスモードの解説を参照してください。
I = 1の場合、BG0の表示を有効にします。
J = 1の場合、BG1の表示を有効にします。
K = 1の場合、BG2の表示を有効にします。
L = 1の場合、BG3の表示を有効にします。
M = 1の場合、OAM(スプライト)の表示を有効にします。
アドレス:0x4000006 - LCY
この位置は、LCDハードウェアの現在のy位置を格納します。
1ライン表示される度に1ずつ増加します。
160ラインの表示の後に、次の画面の開始の前に69ラインの垂直帰線期間がありますy。
このレジスタが160に達するのを待つことは、プログラムを60ヘルツに同期させる共通の方法です。
アドレス:0x4000008 - BG0
アドレス:0x400000A - BG1
アドレス:0x400000C - BG2
アドレス:0x400000E - BG3
これらのアドレスは4つのBG面をセットアップします。
形式は次のとおりです:
F E D C B A 9 8 7 6 5 4 3 2 1 0
Z Z X M M M M M X X X X S S X X
Z = タイルマップのサイズ
00:256x256(32x32タイル)
01:512x256(64x32タイル)
10:256x512(32x64タイル)
11:512x512(64x64タイル)
M = キャラクタタイルマップの開始アドレス。
0x6000000+M*0x800
S = キャラクタタイルデータの開始アドレス。
0x6000000+S*0x4000
注:私は、これらのレジスタ中の他のビットが使用されることを知っていますが、何のために使用されるか知りません。
知っていれば、私にメールしてください。
アドレス:0x4000010 - BG0 SCX BG0の水平スクロール位置
アドレス:0x4000012 - BG0 SCY BG0の垂直スクロール位置
アドレス:0x4000014 - BG1 SCX BG1の水平スクロール位置
アドレス:0x4000016 - BG1 SCY BG1の垂直スクロール位置
アドレス:0x4000018 - BG2 SCX BG2の水平スクロール位置
アドレス:0x400001A - BG2 SCY BG2の垂直スクロール位置
アドレス:0x400001C - BG3 SCX BG3の水平スクロール位置
アドレス:0x400001E - BG4 SCY BG3の垂直スクロール位置
F E D C B A 9 8 7 6 5 4 3 2 1 0
X X X X X X S S S S S S S S S S
S = スクロール値(ピクセル)
これらのレジスタは、GBAの表示の左上隅に表示されるピクセルをセットします。
標準のGameboyのように、4つのBG平面はすべて上下と左右がつながっています。
アドレス:0x4000098 - KEY、入力レジスタ
F E D C B A 9 8 7 6 5 4 3 2 1 0
X X X X X X J I D U L R S E B A
A = Aボタン
B = Bボタン
E = SELECTボタン
S = STARTボタン
R = Dパッド右
L = Dパッド左
D = Dパッド上
U = Dパッド下
I = 右ボタン
J = 左ボタン
このレジスタは、GBAのボタンの状態を格納します。
キーが押された時「0」ビットで、キーが押されない時「1」ビットになります。
アドレス:0x40000D4 - DMA3SRC DMA3転送元アドレス
DMA転送のための32ビットの転送元アドレス。
アドレス:0x40000D8 - DMA3DST DMA3転送先アドレス
DMA転送のための32ビットの転送先アドレス。
アドレス:0x40000DC - DMA3CNT DMA3制御レジスタ
このアドレスは、大量のデータ(1Kbまでの)がメモリのある領域から別の領域に転送されることを可能にするDMA転送を制御します。
さらに、ソースアドレスが転送毎に増加されない場合、メモリを定数値でクリアするために使用できます。
最初に、DMA3SRCとDMA3DSTレジスタに望むアドレスを指定します。
DMA3CNTアドレスのNフィールドに「1」を書くことで、転送を開始します。
F E D C B A 9 8 7 6 5 4 3 2 1 0
N A A B B S X X L L L L L L L L
N = DMA操作を有効にする。
A = 転送先アドレスの増加:
00:転送毎に増加
01:転送毎に減少
10:不変
11:転送毎に増加
B = 転送元アドレスの増加:
00:転送毎に増加
01:転送毎に減少
10:不変
11:不変
有効であれば、選択したサイズによって2または4バイトずつ増加/減少します。
S = サイズ。
1の場合32ビット(ワード)、0の場合16ビット(ハーフワード)をコピーします。
L = 転送するワードまたはハーフワードの数