Skip to content

Latest commit

 

History

History
101 lines (65 loc) · 5.24 KB

memory.md

File metadata and controls

101 lines (65 loc) · 5.24 KB

メモリマップ

メモリマップ

内部メモリ

空いている領域は未使用領域です。

アドレス サイズ バス幅 名称 用途
00000000-00003FFF 16KB 32bit BIOS 起動プログラムなどを実装したROM
02000000-0203FFFF 256KB 16bit WRAM(オンボード) プログラムを入れる外部メモリ EWRAMとも
03000000-03007FFF 32KB 32bit WRAM(チップ) ARM内蔵の高速メモリ IWRAMとも
04000000-040003FE 1KB 32bit IOレジスタ IO機能を制御するレジスタ

内部メモリ(画面描画用)

空いている領域は未使用領域です。

アドレス サイズ バス幅 名称 用途
05000000-050003FF 1KB 16bit パレット 256色分色を記憶可能
06000000-06017FFF 96KB 16bit VRAM LCD に表示するデータを入れる
07000000-070003FF 1KB 32bit OAM オブジェクトと背景を重ねる機能

外部メモリ (Game Pak)

Game Pak = カートリッジのことです。

アドレス サイズ バス幅 名称 備考
08000000-09FFFFFF 32MB 16bit カートリッジROM/FlashROM WaitState 0
0A000000-0BFFFFFF 32MB 16bit カートリッジROM/FlashROM WaitState 1
0C000000-0DFFFFFF 32MB 16bit カートリッジROM/FlashROM WaitState 2
0E000000-0E00FFFF 64KB 8bit SRAM --
0E010000-0FFFFFFF -- -- 未使用 --

0A000000-0BFFFFFF0C000000-0DFFFFFF08000000-09FFFFFFで、アクセスに必要な待機時間(WaitState)が違います。基本的に08000000-09FFFFFF(WaitState 0)のみが使用されます。

0x1000_0000-FFFF_FFFFは使用できません。

WRAMについて

デフォルトでは、WRAMの0x0300_7F00-0x0300_7FFFの256バイトは、割り込みベクタ、割り込みスタック、BIOSコールスタック用に予約されています。

残りのWRAMは、0x0300_7F00から配置されているユーザースタックを含めてどのような用途にも自由に使用できます。

アクセス

バス幅とCPUが一度に読み書き可能なbit数、アクセスに要するサイクルの一覧です。

メモリ領域 バス幅 Read幅 Write幅 サイクル(8/16/32bit)
BIOS 32 8/16/32 - 1/1/1
EWRAM 16 8/16/32 8/16/32 3/3/61
IWRAM 32 8/16/32 8/16/32 1/1/1
IOレジスタ 32 8/16/32 8/16/32 1/1/1
パレット 16 8/16/32 16/32 1/1/22
VRAM 16 8/16/32 16/32 1/1/22
OAM 32 8/16/32 16/32 1/1/12
GamePak ROM 16 8/16/32 - 5/5/81,3
GamePak Flash 16 8/16/32 16/32 5/5/81,3
GamePak SRAM 8 8 8 5 1

これ以外にも16bitごとまたは32bitごとのDMA転送がSRAMをのぞいた全てのメモリに可能です。

1: サイクルはwaitstateの設定によって変わってきます
2: GBAが同時にビデオメモリにアクセスする場合はプラス1サイクルされます
3: シーケンシャルアクセスとノンシーケンシャルアクセスのタイミングを分けます。

VRAM、OAM、パレット

VRAM、パレットは、HBlank中またはVBlank中のみアクセス可能です。 DISPCNTレジスタのFBlankビット(DISPCNT.7)で表示が無効化されているときはそれ以外のタイミングでもアクセスできます。

OAMはさらにアクセス条件が厳しいです。 DISPCNTのbit5が1の場合にのみ、HBlank中のアクセスが許可されます。

ROM(GamePak ROM, カートリッジROM)とSRAM

CPUとDMA3のみがROMにアクセスできます。

SRAMにはCPUしかアクセスできず一度に8bitごとしかアクセスできません。 SRAMは電池形式とフラッシュメモリ形式があります。

ROMのバス幅は16bitに制限されているため、ROMの内部からARM命令(32bit)を実行すると、あまり良いパフォーマンスが得られません。よってTHUMB命令(16bit)を使うことをお勧めします。

ただし、どうしてもARM命令を使いたい時はROMから内部のWRAMにコードをコピーすることで、パフォーマンスを落とさず実行が可能です。

データフォーマット

GBAでは常にデータはリトルエンディアン形式です。

メモリのミラー

特殊な挙動を参照

BIOS領域からの読み込み(0x0000_0000..0000_3FFF)

特殊な挙動を参照

不使用メモリ領域からの読み込み (0x0000_4000..01FF_FFFF, 0x1000_0000..FFFF_FFFF)

特殊な挙動を参照