エミュレータのデバッグコンソール

VisualBoyAdvance-1.8.0-beta3には嬉しいことにデバッグ用のコンソールがTools->Loggingについています。コンソールを使えば処理の順番が正しく行われたかのチェックや、変数の値を見ることも可能になります。俗にいうprintfデバックです。

1.png

表示にはVBA方式とMappy方式の2種類あり、Mappy方式の方が優れているのでこちらを利用してください。VBA方式は「swi 0xff」を使用してエミュレータの独自処理にフックさせています。実機で動かすと素直にswi命令が動いてしまい、破綻しますので推奨されません。対するMappy方式はldr、andなどの無意味なシグネチャ処理によって実現しています。とても行儀が良いです。

void mappylog(char* buf)
{
	asm("mov r2, %0; ldr r0,=0xc0ded00d; and r0,r0" :: "r"(buf) : "r2", "r0");
}
void vbalog(char* buf)
{
	asm("mov r0, %0; swi 0xff;" :: "r"(buf) : "r0");
}

2024/02/18追記

mGBAでもprintfデバッグは可能です。ただし最新バージョンの0.10.3を使っても日本語(sjis)は文字化けします。

 #define REG_DEBUG_ENABLE  *(volatile u16*) 0x4FFF780
 #define REG_DEBUG_FLAGS   *(volatile u16*) 0x4FFF700
 #define REG_DEBUG_STR      (char*) 0x4FFF600
 
 void MgbaLog(char* buf)
 {
 	REG_DEBUG_ENABLE = 0xC0DE;
 
 	u32 len = _Strlen(buf);
 
 	while(len)
 	{
 		u32 write = _Min(len, 256);
 
 		_Memcpy(REG_DEBUG_STR, buf, write);
 		REG_DEBUG_FLAGS = 0x102;				// mGBA Warning
 
 		buf += write;
 		len -= write;
 	}
 }

自然に帰ろう

テキスト出力できるということはprintf関数やsprintf関数が使用できるな、と考えたくなるものです。しかし標準ライブラリは個人的に極力控えるべきだと思っています。GBAプログラミングの楽しみの1つには、大いなる無駄であることが醍醐味です。printfを自作してみましょう(爆。

履歴


トップ   一覧 検索 最終更新   ヘルプ   最終更新のRSS