GBA カートリッジから起動された場合、GBAモードでの動作となり、DSの機能は使用不可になります。
GBA のワイヤレスアダプタは、DS の WiFi機能とは互換性が無いようです。
GBA独自の機能はDSのGBAモードでは使えません。
- 8bit DMG/CGB カートリッジはDSではサポートされていません。
- 0x40000800 の、未公開内部レジスタは使用できません。
- GBAの通信端子はDSには付いていないので通信機能は使えません。
動作速度について
GBAモードでは、ARM7、タイマー、サウンドの速度が 16.76MHz になります。
オリジナルGBAが 16.78MHz らしいので、DSのGBAモードの方が若干遅いようです。
周辺機器のレジスタについて
DSモードの 0x04000000 ~ 0x04000900 のレジスタは GBAモードでは使えません。
X/YボタンとタッチスクリーンはGBAモードでは使用できません。
GBA用のFlashカートリッジは動くようですが、サイズ的に合わないものがあるようです。
無理やり挿さないでください。
BIOSについて
GBAのBIOSは未使用領域の最後の1ビットを除き、ほぼオリジナルと同じみたいです。
この、最後の1ビットを使って、DSのGBAモードで動いているか、オリジナルのGBAで動いているか、プログラム的に検出可能なようです。
やり方:
uint32 getChecksum(void) {
// Figure out what we're running on
uint32 result;
asm volatile("swi 0x0D\n"
"mov r0, %0\n"
: "=r"(result) : : "r1", "r2", "r3"
);
return result;
}
...
value = getChecksum();
if (value == 0xBAAE1880)
drawString(0, 19, "DS の GBA モードで動いている");
else if (value == 0xBAAE187F)
drawString(0, 19, "GBA で動いている");
else
drawString(0, 19, "エミュレータ上で動いている");
上記のコードはDS、GBAともに動きます。
1ビット違う場所というのは、0x3F0c です。この場所は、普通の起動プロセスでは全く使用されません。BIOSダンプか、チェックサム呼び出しでのみ発見できます。
DSの、0x04000136 から始まるレジスタ REG_KEYXY と、IR レジスタは、GBAモード時に限って常に0を返します。
DSモードからGBAモードに移行
DSモードから GBA モードに移行させるためのコード :
--- NDS9: ---
ZEROFILL VRAM A,B ; スクリーンを黒にクリアする (他の色や画像でもかまいません)
POWCNT=8003h ; 2D エンジン A を上画面に設定 (0003h=下画面)
EXMEMCNT=... ; メインメモリのモード設定 (clear bit14)
IME=0 ; 割り込み禁止
SWI 06h ; halt と割り込み停止 (lockdown)
--- NDS7: ---
POWERMAN.REG0=09h ; サウンドアンプを有効、上画面バックライトON (05h=下画面)
IME=0 ; 割り込み禁止
wait for VCOUNT=200 ; V-Blank待ち
SWI 1Fh with R2=40h ; カスタム halt (40h)を使ってGBAモードに移行
GBAモードに移行する前に、ファームウェアの「 GBAモード時スクリーン表示設定」を確認してください。
もし上画面にGBAの画面が表示されるように設定されている場合、ARM9から POWER_CR レジスタのLCD入れ替えビットをセットするようにしてください。
使わない方の画面はARM7のSPIを使ってオフにしておいてください。
GBAスクリーン枠
DSの画面はGBAより大きいため、未使用領域に枠を付けることができます。
枠を付ける操作は、必ずGBAモードに移行する前に行ってください。
(枠というのは、スーパーゲームボーイのようなものです。)
枠を付ける操作 :
- 1. 画面をテキストモードの2Dモードに設定します。フレームバッファモードを使うとGBAの画面更新が30fpsに制限されます。
- 2. VRAMバンクAとBをメインディスプレイに設定します。
- 3. VRAMバンクA、B双方に枠を付けます。(Aのアドレス 0x06800000) (B のアドレス0x06820000) 枠は256x192ピクセルで、16bppビットマップです。GBAの画面からはみ出る部分のみ枠として表示されます。A、B両方のバンクにコピーしなければいけません。片方のみに設定していると、画面がチラつくことがあります。
- 4. ファームウェアの設定と同じようにLCDを入れ替えてください。使わない方はOFFにしておいてください。
- 5. GBA モードでリスタートします。
最終更新:2007年12月09日 22:13