2007年12月2日

GBAのcartかmbか動的に判断する方法

GBAでは、カートリッジ(cart)から起動する方法とブートケーブル(mb)から起動する方法がある。
(ちなみに、mbは"Multi Boot"の頭文字)

2つの方法で、起動時のアドレスが異なる。(cart : 0x08000000, mb : 0x02000000)
これを利用してプログラムで起動モードに合わせて動的に処理を変更するプログラムが書ける。



.arm @ARMモードの場合。THUMBモードの場合はこれではダメ
movs r0, pc, lsl #5
bcs cart_proc
b mb_proc

cart_proc:
@ cart起動時の処理

mb_proc:
@ mb起動時の処理




ロジックは、プログラムの通りだが、
  • プログラムカウンタ(PC)を5ビット左シフトして、
  • キャリーが発生した場合は、cart起動
  • キャリーが発生しなかった場合は、mb起動
と判断すれば良い。(分かり易くするため、ブランチ命令をムダに使ってます‥)


devkitARMでも同様な処理をしているが、こちらはTHUMBモードで動作させているので、
アセンブラの書き方は異なっている。
THUMBモードはまだ良く分かっていないので、今回はARMモードでプログラム作成。

0 件のコメント: