* Doc.15 GBAの仕様について(CPU) [#he1e7860]
GBAには''ARM7TDMI(16.78MHz)''と呼ばれる省電力に特徴的なCPUが使われています。~
開発元はイギリスの[[ARM社:http://www.jp.arm.com/]]です。~

基本的にアセンブラを知らなくてもゲームは作れるので、~
予備知識程度で知っておくのがいいと思います。~

偉そうなこといってますが、ぶっちゃけると~
こんな項目を書いた自分も実はさっぱりなのです、わっはっは。(^^;~

** ARM7TDMI [#wb77b5d4]
ARMには様々な種類のチップが存在していて~
区別は名称(ARM7)以降の''TDMI''の1文字ごとの意味でしているようです。~
ここで特に注意しておきたいのは''T''のThumb機能(命令セット)です。~

| T | Thumb機能                |
| D | デバッグ機能             |
| M | 乗算機能強化型           |
| I | リアルタイムトレース機能 |

** ARMステートとThumbステート [#z0ca63c2]
windowsでプログラムしている人ならご存知のとおり、~
PC互換機上ではx86命令セットの1種類で動いています。~

ところがARM7TDMIは''ARM''と''Thumb''の2種類の命令セットが存在します。~
違いについては以下のとおりです。~

| 命令セット | 命令サイズ | 特徴                                 |
| ARM        | 4バイト   | サイズが大きい分命令に幅がある。     |
| Thumb      | 2バイト   | サイズが小さい分命令が限られている。 |

このことについて、[[Dev'rs GBA Dev FAQs:http://www.devrs.com/gba/files/gbadevfaqs.php]]では~
次のようなアドバイスをしています。~

 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)のサイズ、バス幅、アクセス時間との兼ね合いもあるので~
基本的には以下のような表を指針にさせていただければと思います。~

| 領域  | おすすめステート | 理由              |
| IWRAM | ARM or Thumb     | サイズが少ない為  |
| EWRAM | Thumb            | バス幅が16bitの為 |
| ROM   | Thumb            | バス幅が16bitの為 |


** ステートの切り替えについて [#v202f7a8]
C言語でソースコードを書く分には切り替えを意識することは必要なく、~
コンパイラがすべてやってくれています。~

割り込み処理をthumbで書くとハマることになるので注意してください。~
[[正直日記:http://www.liarsoft.org/diary/20051005.html#20051005p1]]さんのサイトの内容を以下に引用させていただきました。~

 割り込みハンドラがthumbで動かない訳
 
 IRQ例外が発生すると現在の状態に関わらずARMステートに移行した後、BIOS
 の0x00000018に飛ぶわけですよ。
 
 んで、BIOSから割り込みハンドラへと飛ぶのですが、そのときにbx(ARM←→
 THUMBステートの移行が出来る)ではなく ldr(ARM←→THUMBステートの移行
 が出来ない)で飛んでいるんです。
 
 実際はTHUMBコードで書かれているのに、CPUはARMステートのままなのでARM
 コードとして解釈されるわけです。だから割り込みハンドラを-mthumbでコン
 パイルするとうまく動かないわけ。

割り込み関数については必ずARMで書かなくてはいけません。~
devkitProのmakefileを使用する場合、作り方はファイル名で決まります。~

 irq.arm.c
 irq.arm.h
 intr.arm.c
 intr.arm.h

という様に、.arm.xとファイル名の末尾に追加するとARMになります。~
この関数(ARM)からthumbコードにジャンプした時は~
コンパイラがうまく切り替えてくれるので気にしなくて大丈夫です。~

このあたりの詳しいルールについては~
以下のファイルが詳しく書いてあります。~

 C:\devkitPro\devkitARM\gba_rules
 C:\devkitPro\devkitARM\base_rules

ちなみにwikiで用意しているサンプルプログラムは~
自作makefileを使っています。参考程度に見てやってください。~
xxx_arm.cという定義をしていたり、多少コンパイルオプションが異なります。~


** 速さの基準 [#j4533f70]
速さの基準にMIPSやベンチマークなどが存在します。~
とはいうものの、プログラマに必要なのは自分のコードがどう動くか、~
軽いか重いか、体感という大雑把な基準でいいと思います。~

重ければアルゴリズムの選定をし直したり、~
根本的に書き直します。~

数値的な基準としてはVBLANK毎にカウントアップしていく割り込み関数を作り、~
調べたい関数の前後にカウントを保持するように作ればいいと思います。~
ほかにも60fpsや30fpsの数値をきっちり出すのも手です。~


** 履歴 [#e04f2feb]
- 2017/11/16
- 2014/11/21
- 2007/10/16