GBAのBIOSを吸い出す

GBAのBIOSは通常読み出すことが出来ませんが、GBAのあるBIOSファンクションコードを利用すると読み出すことが出来ます。
このプログラムでは吸い出したBIOSイメージをxLACONSプログラムをファイルサーバーとしてPCにファイルとしてデータを書き出します。

void AgbMain(){
s32 i,len;

DmaCopy(3, intr_main, IntrMainBuf, sizeof(IntrMainBuf), 32);
*(vu32 *)INTR_VECTOR_BUF = (vu32 )IntrMainBuf;
pio_init();
*(vu16 *)REG_IME = 1;
*(vu16 *)REG_IE = SIO_INTR_FLAG;

for (i=0; i<0x4000; i+=4){
 *((u8 *)0x02020000+i+0) = (MidiKey2Freq((WaveData *)(i-3), 180-12, 0) * 2)>>24;
 *((u8 *)0x02020000+i+1) = (MidiKey2Freq((WaveData *)(i-2), 180-12, 0) * 2)>>24;
 *((u8 *)0x02020000+i+2) = (MidiKey2Freq((WaveData *)(i-1), 180-12, 0) * 2)>>24;
 *((u8 *)0x02020000+i+3) = (MidiKey2Freq((WaveData *)(i-4), 180-12, 0) * 2)>>24;
}
i=PcOpen("bios.bin",PC_CREAT|PC_TRUNC|PC_WRONLY);
len=PcWrite(i,(u8 *)0x02020000,0x4000);
PcClose(i);
PcPrintf("write 0x%x bytes.\n",len);
for(;;); //無限ループ
}

これがソースコードの一部です。PcOpen()関数でPC側のファイルをオープンして、PcWrite()関数で書き込んでいます。
PcPrintf()はメッセージをPCに表示することが出来ます。これらの関数はpiohost.cの中で実装されています。

コンパイルにはdevkitadvのGCCコンパイラが必要ですのでCコンパイラのインストールのページを参照してインストールしてください。

ソースを展開後 "make run" を行うとコンパイルして、btconsを起動してプログラムをGBAに転送します。ブートケーブルでGBAとPCを接続してGBAの電源をOFF/ONにより、転送が開始され終了後自動的にプログラムが実行されます。


ダウンロード

bios.zip プリンターポート版
bios_usb.zip USB版