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版