カードリッジ

前回のメモリエリアでは、カードリッジ以外のメモリ領域(IWRAM, EWRAM, PAK ROM)にコードや変数を置く方法を説明をしました。ところが電源を入れたとき、すべてのデータはROM(カードリッジ)にあります。その時点からいったいどうやってIWRAMやEWRAMに配置されていくのか、その流れを見ていきましょう。

gbaファイルの正体

実機にカードリッジを挿し電源をONにすると、そのカードリッジ内容はメモリの0x08000000からアクセスできるようになります。gbaファイルとは、その内容をファイル化しただけのものです。もちろんカードリッジはROM(リードオンリーメモリ)なので書き換え不可。大昔ということもあってデータは暗号化もされていませんでした。いい時代やったなあ・・・。ROM領域にアクセスされる最初のファイルは「C:\devkitPro\devkitARM\arm-none-eabi\lib\gba_crt0.ld」(github)です。よかったら平行して読んでみてください。

ヘッダ

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

エミュレータで見るとこのようになります。(Tools -> Memory viewer)

1.png

main関数までの処理

main関数が実行されるまでの流れは以下のとおりです。

エミュレータで逆アセンブルするとこんな表示になります。

2.png

チェックサムを忘れずに

自作ゲームを作って実機で動かそうとしたらタイトルロゴで止まる、でもエミュレータでは大丈夫という現象。こんなことがあったらロムが壊れていないかのチェックサムを疑ってください。devkitProにはgbafix(C:\devkitPro\tools\bin)と呼ばれるチェックサム変更ツールがあります。忘れずに実行してください。

マルチブート

マルチブートとはカードリッジを使わずに通信ケーブルなどで起動する仕組みです。たとえば実機を2台持っていて、対戦ゲームをしたい場合を想像するとわかりやすいと思います。一方はマリオカートのカードリッジを装着していて、一方は通信ケーブルのみで繋がっている。この状態でホスト側からゲスト側にデータを転送して対戦をする、という仕組みです。

devkitProではカードリッジなし状態を想定した制作も可能です。VBA-1.8.0-beta3ではファイル名で区別しており、xxx.gbaでしたらxxx.mb.gbaまたはxxx.mbとなります。インターネットでダウンロードしてきた自作ゲームがフリーズする場合、そもそもIWRAM, EWRAM領域にのみ展開されることを想定して作られているわけで、そりゃフリーズしますよね、という話です。

履歴


トップ   一覧 検索 最終更新   ヘルプ   最終更新のRSS