メモリエリア

メモリエリアは次のようになっています。ここではザックリと概要のみ説明しますので詳細はGBATEKを読んでください。

エリア開始位置終了位置大きさ
System ROM0000:0000h0000:3fffh16kb
EWRAM0200:0000h0203:ffffh256kb
IWRAM0300:0000h0300:7fffh32kb
IO RAM0400:0000h0401:03ffh1kb
PAL RAM0500:0000h0500:03ffh1kb
VRAM0600:0000h0601:7fffh96kb
OAM0700:0000h0700:03ffh1kb
PAK ROM0800:0000h--
Cart RAM0e00:0000h--

System ROM

別名BIOSと言われていて、自前の関数群だと思ってください。CPUのシステムコールで呼び出します。除算やLZ77圧縮された画像データを解凍する関数などは使用頻度が高いようです。電源ONした時に一番最初に表示されるタイトルロゴやコードも、このプログラム内に含まれています。

EWRAM

External work RAMの略でゲーム上で使用される画像やコードを置いたりします。もしカードリッジを挿さない状態でマルチブートケーブルを使用した場合、転送されたデータはEWRAM領域に配置されます。

IWRAM

GBAの中でもっとも高速な領域です。スピードを求められる処理はIWRAMに置くことをお奨めします。ただし大きさが32kbしかないため、何を置くか慎重に選ぶ必要があります。

IO RAM

GBAのグラフィックやサウンド、ボタンなどをコントロールしています。アクセス方法は変数を読む込んだり、書き込んだりする方法と同じです。ヘッダファイルにメモリの位置をdefineしてアクセスします。

PAL RAM

BG(画面)とスプライトのパレットを設定する領域です。

VRAM

VRAM領域は画面と反映像になっています。数字を書き換えることで画面が即座に変化します。この書き換えは高速である為、画面更新期間(垂直帰線期間)を無視して描画を行った場合、画面がチラついてしまうので注意が必要です。

OAM

スプライトの設定をする領域です。

PAK ROM

カードリッジの領域です。

Cart RAM

ゲームのセーブデータに使用されます。Cart RAMには様々な種類があってSRAM、EEPROM、Flash ROMなどがあります。自作ゲーム開発では簡単に実装できるSRAMが人気のようです。

メモリのアクセス

Address Bus Width and CPU Read/Write Access Widths
Shows the Bus-Width, supported read and write widths,
and the clock cycles for 8/16/32bit accesses.

Region        Bus   Read      Write     Cycles
BIOS ROM      32    8/16/32   -         1/1/1
Work 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 *
Work RAM 256K 16    8/16/32   8/16/32   3/3/6 **
Palette RAM   16    8/16/32   16/32     1/1/2 *
VRAM          16    8/16/32   16/32     1/1/2 *
GamePak ROM   16    8/16/32   -         5/5/8 **/***
GamePak Flash 16    8/16/32   16/32     5/5/8 **/***
GamePak SRAM  8     8         8         5     **

Timing Notes:

*   Plus 1 cycle if GBA accesses video memory at the same time.
**  Default waitstate settings, see System Control chapter.
*** Separate timings for sequential, and non-sequential accesses.
One cycle equals approx. 59.59ns (ie. 16.78MHz clock).

All memory (except GamePak SRAM) can be accessed by 16bit and 32bit DMA.

表のRead, Writeは、そのメモリにアクセスできるビット単位を表しています。よくみるとVRAMは8bit単位で読めるが、8bit単位で書き込めないことがわかります。これはハードウェアの制約なので十分注意してプログラミングしなくてはなりません。エミュレータで動くが実機で動かない、というよくあるハマりポイントの1つです。また、CyclesはIWRAMが1/1/1に対して、GamePak ROMは5/5/8なのでアクセススピードだけでも5倍違うということが分かります。忘れずに覚えておいてください。

指定したいメモリ位置にコードを置く方法

自分の書いたコードを指定したメモリ位置に置くにはマクロを使います。使い方は次のとおりです。

// IWRAM領域
IWRAM_CODE void SpriteInit()
{
    //
}
// EWRAM領域
EWRAM_CODE void SpriteInit()
{
    //
}
// ROM領域(指定なし)
void SpriteInit()
{
    //
}

ヘッダファイル(.h)内のプロトタイプ宣言にも同じように指定することを忘れないでください。一方、変数の定義は次のように指定することができます。指定なしの場合、IWRAMになるので注意してください。

u32 test1 EWRAM_BSS;  // EWRAM領域
u32 test2 IWRAM_DATA; // IWRAM領域
u32 test3;            // IWRAM領域(指定なし)

ファイルは「C:\devkitPro\libgba\include\gba_base.h」(github)内で定義されています。正しくメモリ上に置かれているか確認する方法については、コンパイル後に生成されるマップファイル(.map)で確認可能です。

履歴


トップ   一覧 検索 最終更新   ヘルプ   最終更新のRSS