GBAには電源を切ってもデータが残る領域としてCart RAMがあります。カードリッジを分解して覗いてみると本体チップの横にある小さなチップがそれに当たります。もちろんセーブ機能がないゲームだった場合は入っていないので注意してください。折角の機会ですから型番を検索して仕様を調べてみるのもいいかもしれません。この部分のメモリにはSRAM(32KB)、EEPROM(512B or 8KB)、Flash ROM(64KB)などの種類があります。特に扱いやすいのは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づつしかアクセスできないのでそのことは忘れないでください。