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 - 0x03 | 32 bit ARM B Jump to start of ROM executable |
0x04 - 0x9F | Nintendo Logo data |
0xA0 - 0xAB | Game Title |
0xAC - 0xAF | Game Code |
0xB0 - 0xB1 | Maker Code |
0xB2 - 0xB2 | 0x96 Fixed |
0xB3 - 0xB3 | Main Unit Code |
0xB4 - 0xB4 | Device Type |
0xB5 - 0xBB | Reserved Area |
0xBC - 0xBC | Mask ROM Version |
0xBD - 0xBD | Compliment Check |
0xBE - 0xBF | Reserved Area |
エミュレータ上で見るとこんな具合です。(Tools -> Memory viewer)
main関数までの処理 †
さて、main関数が実行されるまでの流れは以下のとおりとなります。大雑把に読んでください。
- 電源ON
- BIOSから起動し任天堂のタイトルロゴを表示する
- ROMの先頭領域0x08000000番地へジャンプ
- 割り込みベクタと、スタックの設定
- EWRAM領域を0クリア
- IWRAM領域のbssを0クリア
- EWRAM領域のsbssを0クリア
- 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
履歴 †