GBA カートリッジから起動された場合、GBAモードでの動作となり、DSの機能は使用不可になります。 GBA のワイヤレスアダプタは、DS の WiFi機能とは互換性が無いようです。 ***GBA独自の機能はDSのGBAモードでは使えません。 -8bit DMG/CGB カートリッジはDSではサポートされていません。 -0x40000800 の、未公開内部レジスタは使用できません。 -GBAの通信端子はDSには付いていないので通信機能は使えません。 ***周辺機器のレジスタについて 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 モードに移行させるためのコード : .arm mov r2, #0x40 swi 0x1F0000 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 モードでリスタートします。 ----