GBAモード

「GBAモード」の編集履歴(バックアップ)一覧に戻る

GBAモード - (2007/07/13 (金) 21:18:14) のソース

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






----
ツールボックス

下から選んでください:

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