0000:0000-0000:3FFF | BIOS - システム ROM (16 KBytes) |
0000:4000-01FF:FFFF | 使われない |
0200:0000-0203:FFFF | WRAM - オンボード(外部RAM) Work RAM (256 KBytes) 2 Wait |
0204:0000-02FF:FFFF | 使われない |
0300:0000-0300:7FFF | WRAM - インチップ(内部RAM) Work RAM (32 KBytes) |
0300:8000-03FF:FFFF | 使われない |
0400:0000-0400:03FE | I/O レジスタ |
0400:0400-04FF:FFFF | 使われない |
0500:0000-0500:03FF | BG/OBJ パレット RAM (1 Kbyte) |
0500:0400-05FF:FFFF | 使われない |
0600:0000-0617:FFFF | VRAM -ビデオ RAM (96 KBytes) |
0618:0000-06FF:FFFF | 使われない |
0700:0000-0700:03FF | OAM - OBJ 属性 (1 Kbyte) |
0700:0400-07FF:FFFF | 使われない |
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 | 使われない |
1000:0000-FFFF:FFFF | 使われていない (未使用のアドレスバス上位4ビット) |
※ upper 4bits of address bus unusedってどういう意味だ?
デフォルトで、ワークRAMの0300:7F00h-0300:7FFFhの256バイトは、割り込みベクタ、割り込みスタック、BIOSコールのスタック用に予約される。
※割り込みベクタって何じゃい?と思ったらこちら[デジタル用語辞典](俺も思った)。
残りのWRAMは何に使おうが自由である(0300:7F00hに初期に配置されるユーザースタックを含む)。
バス幅、サポートされている読み書き幅、8/16/32Bit時のアクセスクロックサイクルを記す。
領域 | バス | 読み | 書き | サイクル |
BIOS ROM | 32 | 8/16/32 | - | 1/1/1 |
ワーク RAM 32K | 32 | 8/16/32 | 8/16/32 | 1/1/1 |
I/O | 32 | 8/16/32 | 8/16/32 | 1/1/1 |
OAM | 32 | 8/16/32 | 16/32 | 1/1/1 $ |
ワーク RAM 256K | 16 | 8/16/32 | 8/16/32 | 3/3/6 $$ |
パレット RAM | 16 | 8/16/32 | 16/32 | 1/1/2 $ |
VRAM | 16 | 8/16/32 | 16/32 | 1/1/2 $ |
ゲームカートリッジ ROM | 16 | 8/16/32 | - | 5/5/8 $$/$$$ |
ゲームカートリッジ Flash | 16 | 8/16/32 | 16/32 | 5/5/8 $$/$$$ |
ゲームカートリッジSRAM | 8 | 8 | 8 | 5 $$ |
タイミングの注釈:
$ もし、同時にGBAがビデオメモリにアクセスしたなら、1サイクル追加される
$$ デフォルトの待ち状態の設定、システムコントロールの章を見ること
$$$ シーケンシャルと非シーケンシャルアクセスは個別のタイミングとなる
1サイクルは概算で59.59ns(すなわち16.78MHz clock)。
全メモリは(ゲームカートリッジのSRAMは除く)、16Bit、32BitでDMAアクセスが出来る。
DMA3だけは(もちろんCPUも)、ゲームカートリッジのROMにアクセスできる。
ゲームカートリッジのSRAMはCPUからのみアクセスできる(8Bit単位の転送に制限されている)。
※ restricted to bytewise 8bit transfersってよくわからん。ニュアンスはわかるが
SRAMは、外部WRAM拡張としてサポートされている。
それは、バッテリーバッファーを用いた記憶装置ではない。
そのために、ROM領域のどこかに配置されたFlashROMを使うことを推奨するだろう。
※要約できん
ゲームカートリッジのウエイト状態の構成の詳細については、各チャプターを読んで下さい。
SRAMはライブラリを介してだけアクセスすべきかな?
これらのメモリ領域は、H-BlankかV-Blank間のみアクセスできる(もし、ディスプレイが、DISPCNTレジスタの強制ブランクビットにより無効になっていなければ)。
これらは、OAMメモリの追加の制限である。
DISPCNTの「H-Blank Interval Free」がセットされている時だけH-Blank中のアクセスが許可される(ただし、表示可能なオブジェクトは少なくなるだろう)。
CPUは、いつでもVRAM/OAM/パレットにアクセスできるように思われ、もし、ディスプレイコントローラーと同時にメモリにアクセスしていたならば、自動的にウエイト(1クロック)が入る。(いいかれば、古い8Bitゲームボーイとは違い、データは失われない)
ゲームカートリッジROMのバスは16Bitsに制限されていることに注意。
だから、ゲームパックROM内部からのARM命令の実行は、それほどよくないパフォーマンスに終わるだろう。
したがって、各オペコードがすぐに読まれるTHUMB命令を使用することをより推奨するだろう。
(ARM命令は、ゲームカートリッジROMから内部ワークRAMにコピーすることで最良のパフォーマンスで使用できる)
たとえARM CPUそれ自身が外部回路によりリトルエンディアンとビッグエンディアンを選択することが可能だとしても、GBAではそのような回路はない。
また、データフォーマットは常にリトルエンディアン。
つまり、メモリの内の16Bitや32Bitのデータにアクセスするとき、最下位ビットは最初のバイト(最小アドレス)に格納されていて、最上位ビットは最後のバイトに格納される。(いいかえれば、80x86やZ80CPUと同じ)
※知ってると思うけど、リトルエンディアンはこちらを参照。
※80x86つまり、Pentiumなんかと同じリトルエンディアンなのでわかりやすいかと