Doc.8 GBAの仕様について(SRAM)

GBAには電源を切ってもデータが残る領域としてCart RAMがあります。
この部分のメモリにはSRAM(32KB)、EEPROM(512B or 8KB)、Flash ROM(64KB)などの種類があるようです。
この中で特に扱いやすいのはSRAMで、homebrewで作られている方はだいたいSRAMを使用しています。
ここではSRAMの使い方のみを説明します。

アクセス方法

SRAMは32KBのサイズを持っていてアドレスは0E00:0000h〜E007:FFFhまでとなっています。
読み書きにはポインタを使い、レジスタの設定などの前準備はまったく不要です。
ただし実機でテストしたい場合、マジコンの種類によってはCart RAMの形式を指定する必要があるかもしれません。
以下に関数を用意しましたので、参考にしていただければと思います。

#define ADR_SRAM     (u8*)0xe000000

u8 SRAMRead8(u32 offset)
{
	u8* sram = (u8*)ADR_SRAM + offset;
	return (u8)sram[0];
}

u16 SRAMRead16(u32 offset)
{
	u8* sram = (u8*)ADR_SRAM + offset;
	return (u16)sram[0] | (u16)sram[1]<<8;
}

u32 SRAMRead32(u32 offset)
{
	u8* sram = (u8*)ADR_SRAM + offset;
	return (u32)sram[0] | (u32)sram[1]<<8 | (u32)sram[2]<<16 | (u32)sram[3]<<24;
}

void SRAMWrite8(u32 offset, u8 data)
{
	u8* sram = (u8*)ADR_SRAM + offset;
	*sram = (u8)(data & 0xff);
}

void SRAMWrite16(u32 offset, u16 data)
{
	u8* sram = (u8*)ADR_SRAM + offset;
	*sram++ = (u8)((data   ) & 0x00ff);
	*sram   = (u8)((data>>8) & 0x00ff);
}

void SRAMWrite32(u32 offset, u32 data)
{
	u8* sram = (u8*)ADR_SRAM + offset;
	*sram++ = (u8)((data    ) & 0x000000ff);
	*sram++ = (u8)((data>>8 ) & 0x000000ff);
	*sram++ = (u8)((data>>16) & 0x000000ff);
	*sram   = (u8)((data>>24) & 0x000000ff);
}

u8* SRAMGetPointer()
{
	return ADR_SRAM;
}

関数にも記載されていますが、SRAMは8bitづつしかアクセスできないのでそのことは忘れないでください。

履歴

  • 2014/11/09
  • 2007/09/26

Last-modified: 2014-11-12 (水) 20:22:59 (2831d)