GBAのスリープメモ

sataさんの日記から転記しました。
またpocketNESのソースコードのio.s suspend 139行目にあります。

GBA開発 swi $03を使ってサスペンド成功。サスペンドの纏め
REG_IME,REG_IE,REG_P1CNT,REG_INTERUPTを保存
REG_IME=IRQ_MASTER_OFF; // 割り込み禁止
SetIRQ(dummy); // なにもしない関数を登録
REG_P1CNT=BIT15 | BIT14 | KEY_SELECT | KEY_START; // サスペンド解除のためのキー設定
REG_IE=IRQ_BIT_KEYS; // キー割り込みだけ有効にする
REG_IME=IRQ_MASTER_ON; // 割り込み許可
// swi $03 を発行 CPUモードによってコードが違うので注意
// asm("swi 0x03"); // THUMB code Stop
asm("swi 0x030000"); // ARM code Stop
// キー割り込みが来るまでここで停止している
REG_IME=IRQ_MASTER_OFF; // 割り込み禁止
REG_IE,REG_P1CNT,REG_INTERUPTを復帰。
REG_IMEを最後に復帰。
最低限コード書くとこんな感じ。順序を間違うとおかしくなる。
ゲーム中とか演奏中でやる場合は画面の表示停止とかDMAやら音の停止などをやらないと、ぶっちり止まるだろうから気持ち悪いかも。