GBAモード


※上記の広告は60日以上更新のないWIKIに表示されています。更新することで広告が下部へ移動します。

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 モードでリスタートします。







ツールボックス

下から選んでください:

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