Note
FRAM は Ferroelectric RAM
の略で、FLASHとは別物です。
SRAM: 32KB
セーブ機能の寿命: バッテリー依存
例: ロックマンゼロ2
FRAM: 32KB
セーブ機能の寿命: 10,000,000,000回の読み書き
例: まわるメイドインワリオ
SRAM(Static RAM
)は電池によって通電し続けることでメモリの内容を保存し続けています。
FRAM(Ferroelectric RAM
)は新しめのカートリッジに搭載されていてデータを保持するための電池を必要としません。しかもソフトウェア側では、(EEPROM/FLASHと違って)SRAMと同じようにアクセスできます。
SRAM/FRAM は 0xE000000..E007FFF
にマッピングされ、(WAITCNT.0-1 = 3
の場合)アクセスには8サイクルを要します。バス幅は8bitで固定で、LDRB/LDRSB/STRB
によってのみアクセス可能です。
また、SRAM/FRAMからの読み出しは、WRAMで実行されたコードのみが行うことができます。(ROMで実行されたコードは不可。) 書き込みについては、そのような制限はありません。
SRAM/FRAMカートリッジには基本的にライトプロテクト機能が搭載されていません。
そのため、GBAの電源を入れたままカートリッジを抜き差しすると、クラッシュしたプログラムによって不正にSRAM/FRAMに書き込みが行われてセーブデータが失われることがあるようです。
ソフトウェアでは、以下のように設定することで対策することが推奨されます。
カートリッジを抜いた時にトリガーされる可能性が高いGamepak割り込みを有効にして、GamepakIRQ割り込みハンドラではGBAを無限ループでハングアップするようにします。
当たり前ですが、ROMカートリッジが取り外されたときに備えて、割り込みハンドラはROMではなく、WRAMに配置する必要があります。
ハンドラはGamepakIRQを最優先で処理するようにします。割り込みが禁止されている期間はできるだけ短くし、必要に応じてネストした割り込みを許可してください。