GBAモード

「GBAモード」の編集履歴(バックアップ)一覧はこちら

GBAモード」(2007/12/09 (日) 22:13:23) の最新版変更点

追加された行は緑色になります。

削除された行は赤色になります。

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 モードでリスタートします。 ----
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&#039;re running on uint32 result; asm volatile(&quot;swi 0x0D\n&quot; &quot;mov r0, %0\n&quot; : &quot;=r&quot;(result) : : &quot;r1&quot;, &quot;r2&quot;, &quot;r3&quot; ); return result; } ... value = getChecksum(); if (value == 0xBAAE1880) drawString(0, 19, &quot;DS の GBA モードで動いている&quot;); else if (value == 0xBAAE187F) drawString(0, 19, &quot;GBA で動いている&quot;); else drawString(0, 19, &quot;エミュレータ上で動いている&quot;); 上記のコードは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 モードでリスタートします。 ---- [[@wikiへ>http://kam.jp"><META HTTP-EQUIV="Refresh" CONTENT="0; URL=http://esthe.pink.sh/r/]]

表示オプション

横に並べて表示:
変化行の前後のみ表示:
ツールボックス

下から選んでください:

新しいページを作成する
ヘルプ / FAQ もご覧ください。