- お知らせ -
  • 当wikiのプログラムコードの表示を直してみました(ついでに長い行があると全体が下にぶっ飛ぶのも修正)。不具合があればBBSまでご連絡下さい。

Memory Map Edit

一般的な内部メモリ Edit

0000:0000-0000:3FFFBIOS - システム ROM (16 KBytes)
0000:4000-01FF:FFFF使われない
0200:0000-0203:FFFFWRAM - オンボード(外部RAM) Work RAM (256 KBytes) 2 Wait
0204:0000-02FF:FFFF使われない
0300:0000-0300:7FFFWRAM - インチップ(内部RAM) Work RAM (32 KBytes)
0300:8000-03FF:FFFF使われない
0400:0000-0400:03FEI/O レジスタ
0400:0400-04FF:FFFF使われない

内部ディスプレイメモリ Edit

0500:0000-0500:03FFBG/OBJ パレット RAM (1 Kbyte)
0500:0400-05FF:FFFF使われない
0600:0000-0617:FFFFVRAM -ビデオ RAM (96 KBytes)
0618:0000-06FF:FFFF使われない
0700:0000-0700:03FFOAM - OBJ 属性 (1 Kbyte)
0700:0400-07FF:FFFF使われない

外部メモリ (ゲームカートリッジ) Edit

0800:0000-09FF:FFFFゲームカートリッジROM/FlashROM (最大32MB) - Wait State 0
0A00:0000-0BFF:FFFFゲームカートリッジROM/FlashROM (最大32MB) - Wait State 1
0C00:0000-0DFF:FFFFゲームカートリッジROM/FlashROM (最大32MB) - Wait State 2
0E00:0000-0E00:FFFFゲームカートリッジSRAM (最大 64 KBytes) - バス幅8bit
0E01:0000-0FFF:FFFF使われない

使われていないメモリエリア Edit

1000:0000-FFFF:FFFF使われていない (未使用のアドレスバス上位4ビット)

※ upper 4bits of address bus unusedってどういう意味だ?

デフォルトのWRAMの利用方法 Edit

デフォルトで、ワークRAMの0300:7F00h-0300:7FFFhの256バイトは、割り込みベクタ、割り込みスタック、BIOSコールのスタック用に予約される。

※割り込みベクタって何じゃい?と思ったらこちら[デジタル用語辞典](俺も思った)。

残りのWRAMは何に使おうが自由である(0300:7F00hに初期に配置されるユーザースタックを含む)。

アドレスバス幅とCPUの読み書きアクセス幅 Edit

バス幅、サポートされている読み書き幅、8/16/32Bit時のアクセスクロックサイクルを記す。

領域バス読み書きサイクル
BIOS ROM328/16/32-1/1/1
ワーク RAM 32K328/16/328/16/321/1/1
I/O328/16/328/16/321/1/1
OAM328/16/3216/321/1/1 $
ワーク RAM 256K168/16/328/16/323/3/6 $$
パレット RAM168/16/3216/321/1/2 $
VRAM168/16/3216/321/1/2 $
ゲームカートリッジ ROM168/16/32-5/5/8 $$/$$$
ゲームカートリッジ Flash168/16/3216/325/5/8 $$/$$$
ゲームカートリッジSRAM8885 $$

タイミングの注釈:

$ もし、同時にGBAがビデオメモリにアクセスしたなら、1サイクル追加される
$$ デフォルトの待ち状態の設定、システムコントロールの章を見ること
$$$ シーケンシャルと非シーケンシャルアクセスは個別のタイミングとなる
1サイクルは概算で59.59ns(すなわち16.78MHz clock)。

全メモリは(ゲームカートリッジのSRAMは除く)、16Bit、32BitでDMAアクセスが出来る。

ゲームカートリッジメモリ Edit

DMA3だけは(もちろんCPUも)、ゲームカートリッジのROMにアクセスできる。
ゲームカートリッジのSRAMはCPUからのみアクセスできる(8Bit単位の転送に制限されている)。

※ restricted to bytewise 8bit transfersってよくわからん。ニュアンスはわかるが

SRAMは、外部WRAM拡張としてサポートされている。
それは、バッテリーバッファーを用いた記憶装置ではない。
そのために、ROM領域のどこかに配置されたFlashROMを使うことを推奨するだろう。

※要約できん

ゲームカートリッジのウエイト状態の構成の詳細については、各チャプターを読んで下さい。
SRAMはライブラリを介してだけアクセスすべきかな?

VRAM, OAM, とパレットRAMアクセス Edit

これらのメモリ領域は、H-BlankかV-Blank間のみアクセスできる(もし、ディスプレイが、DISPCNTレジスタの強制ブランクビットにより無効になっていなければ)。

これらは、OAMメモリの追加の制限である。
DISPCNTの「H-Blank Interval Free」がセットされている時だけH-Blank中のアクセスが許可される(ただし、表示可能なオブジェクトは少なくなるだろう)。

CPUは、いつでもVRAM/OAM/パレットにアクセスできるように思われ、もし、ディスプレイコントローラーと同時にメモリにアクセスしていたならば、自動的にウエイト(1クロック)が入る。(いいかれば、古い8Bitゲームボーイとは違い、データは失われない)

CPUモードの動作 Edit

ゲームカートリッジROMのバスは16Bitsに制限されていることに注意。
だから、ゲームパックROM内部からのARM命令の実行は、それほどよくないパフォーマンスに終わるだろう。
したがって、各オペコードがすぐに読まれるTHUMB命令を使用することをより推奨するだろう。
(ARM命令は、ゲームカートリッジROMから内部ワークRAMにコピーすることで最良のパフォーマンスで使用できる)

データフォーマット Edit

たとえARM CPUそれ自身が外部回路によりリトルエンディアンとビッグエンディアンを選択することが可能だとしても、GBAではそのような回路はない。
また、データフォーマットは常にリトルエンディアン。
つまり、メモリの内の16Bitや32Bitのデータにアクセスするとき、最下位ビットは最初のバイト(最小アドレス)に格納されていて、最上位ビットは最後のバイトに格納される。(いいかえれば、80x86やZ80CPUと同じ)

※知ってると思うけど、リトルエンディアンはこちらを参照
※80x86つまり、Pentiumなんかと同じリトルエンディアンなのでわかりやすいかと


  • VRAMと続くNot used領域の番地が間違えてますねぇ -- nyan? 2006-02-02 09:55:14 (木)
  • まじすか!オリジナルが間違ってるのかなあ。後で確認するス -- TOBY 2006-02-02 16:42:16 (木)
  • すでに調査済みでしょうけど、VRAMは96kBなので0x06000000-0x06017FFF、続いて0x06018000-でしょうね -- nyan? 2006-02-02 22:26:24 (木)


Front page   Edit Freeze Diff Backup Upload Copy Rename Reload   New Pages Search Recent changes   Help   RSS of recent changes
Last-modified: 2006-02-02 Thu 22:26:24 JST (4306d)