Doc.5 GBAの仕様について(カードリッジ)

前回のメモリエリアでは、カードリッジ以外のメモリ(IWRAM, EWRAM)に
配置する方法を説明をしました。

GBAの電源を入れたとき、すべてのデータはROM領域(カードリッジ)にあるわけで、
いったいどうやって配置されていくのか見ていきましょう。

詳しいソースコードは
「C:\devkitPro\devkitARM\arm-none-eabi\lib\gba_crt0.s」にあるので
よかったら平行して読んでみてください。

.gbaファイルの正体

GBAにカードリッジを挿し、電源をONにするとカードリッジメモリは
0x08000000からアクセスできるようになります。
ようするに、.gbaファイルは0x08000000からアクセスできる内容をファイル化したものです。

ROM(リードオンリーメモリ)なので書き換え不可。
大昔なので暗号化もされていませんでした。

ヘッダ

GBA上だと0x08000000〜0x080000bf、.gbaファイル上だと0x00〜0xbfまでの
192(0xc0)サイズ分をヘッダと呼びます。
内容は特に気にすることはないので素通りしましょう。

以下の表はHeadspin's Guideから引用しました。

0x00 - 0x0332 bit ARM B Jump to start of ROM executable
0x04 - 0x9FNintendo Logo data
0xA0 - 0xABGame Title
0xAC - 0xAFGame Code
0xB0 - 0xB1Maker Code
0xB2 - 0xB20x96 Fixed
0xB3 - 0xB3Main Unit Code
0xB4 - 0xB4Device Type
0xB5 - 0xBBReserved Area
0xBC - 0xBCMask ROM Version
0xBD - 0xBDCompliment Check
0xBE - 0xBFReserved Area

エミュレータ上で見るとこんな具合です。(Tools -> Memory viewer)

clip_1.png

main関数までの処理

さて、main関数が実行されるまでの流れは以下のとおりとなります。大雑把に読んでください。

  • 電源ON
  • BIOSから起動し任天堂のタイトルロゴを表示する
  • ROMの先頭領域0x08000000番地へジャンプ
  • 割り込みベクタと、スタックの設定
  • EWRAM領域を0クリア
  • IWRAM領域のbssを0クリア
  • EWRAM領域のsbssを0クリア
  • IWRAM領域のdataへ変数(初期値)をコピー
  • IWRAM領域のiwramへコードをコピー
  • IWRAM領域のiwram0へiwram0のコードをコピー
    iwramとiwram0は別定義です。
    gba_cart.ldに.iwram0〜9までが定義されています。詳しい事はわかりませんが
    おそらく容量が少ないために再配置できるように区切りを設けたのではないかと思います。
  • EWRAM領域へコードや変数(初期値)をコピー
  • libcやmalloc等の設定
  • main関数へ

変数にはあらかじめ初期値が決められているものと
されていない0クリアされるものがあります。

詳しく見るとEWRAM領域を2回0クリアしている部分や
IWRAMの細かいコピーに対して、EWRAMのコピーは大雑把やなあとか
突っ込んではいけません(^^;。

ちなみにエミュレータ上で逆アセするとこんな感じになります。

  • gba_crt0.s(48行目)
    @---------------------------------------------------------------------------------
    start_vector:
    @---------------------------------------------------------------------------------
    	mov	r0, #0x4000000			@ REG_BASE
    	str	r0, [r0, #0x208]
    
    	mov	r0, #0x12			@ Switch to IRQ Mode
    	msr	cpsr, r0
    	ldr	sp, =__sp_irq			@ Set IRQ stack
    	mov	r0, #0x1f			@ Switch to System Mode
    	msr	cpsr, r0
    	ldr	sp, =__sp_usr			@ Set user stack
clip_2.png

履歴

  • 2014/10/31
  • 2007/09/14

添付ファイル: fileclip_2.png 269件 [詳細] fileclip_1.png 218件 [詳細]

Last-modified: 2014-10-31 (金) 22:39:40 (2843d)