Doc.15 GBAの仕様について(CPU) †GBAにはARM7TDMI(16.78MHz)と呼ばれる省電力に特徴的なCPUが使われています。 基本的にアセンブラを知らなくてもゲームは作れるので、 偉そうなこといってますが、ぶっちゃけると ARM7TDMI †ARMには様々な種類のチップが存在していて
ARMステートとThumbステート †windowsでプログラムしている人ならご存知のとおり、 ところがARM7TDMIはARMとThumbの2種類の命令セットが存在します。
このことについて、Dev'rs GBA Dev FAQsでは Should I use a C compiler that generates ARM or Thumb instructions? Thumb code is able to provide up to 65% of the code size of ARM, and 160% of the performance of ARM when accessing 16 bit memory. (Source: ARM DDI 0029E) Since most code is usually run out of ROM(which is 16 bit) it makes sense to use a Thumb compiler. For the times when you need the extra performance of ARM, you can always code these subroutines in ARM assembly language and place them in internal WRAM. メモリ領域(IWRAM, EWRAM, ROM)のサイズ、バス幅、アクセス時間との兼ね合いもあるので
ステートの切り替えについて †C言語でソースコードを書く分には切り替えを意識することは必要なく、 割り込み処理をthumbで書くとハマることになるので注意してください。 割り込みハンドラがthumbで動かない訳 IRQ例外が発生すると現在の状態に関わらずARMステートに移行した後、BIOS の0x00000018に飛ぶわけですよ。 んで、BIOSから割り込みハンドラへと飛ぶのですが、そのときにbx(ARM←→ THUMBステートの移行が出来る)ではなく ldr(ARM←→THUMBステートの移行 が出来ない)で飛んでいるんです。 実際はTHUMBコードで書かれているのに、CPUはARMステートのままなのでARM コードとして解釈されるわけです。だから割り込みハンドラを-mthumbでコン パイルするとうまく動かないわけ。 割り込み関数については必ずARMで書かなくてはいけません。 irq.arm.c irq.arm.h intr.arm.c intr.arm.h という様に、.arm.xとファイル名の末尾に追加するとARMになります。 このあたりの詳しいルールについては C:\devkitPro\devkitARM\gba_rules C:\devkitPro\devkitARM\base_rules ちなみにwikiで用意しているサンプルプログラムは 速さの基準 †速さの基準にMIPSやベンチマークなどが存在します。 重ければアルゴリズムの選定をし直したり、 数値的な基準としてはVBLANK毎にカウントアップしていく割り込み関数を作り、 履歴 †
|