- 追加された行はこの色です。
- 削除された行はこの色です。
#author("2023-04-14T23:29:09+09:00","","")
** エミュレータのデバッグコンソール [#ba0bef73]
VisualBoyAdvance-1.8.0-beta3にはとても嬉しいことにデバッグ用のコンソールがついています。メニューの''Tools->Logging''にあります。このコンソールを使えば処理の順番が正しく行われたかのチェックや、変数の値を見ることが可能になります。私の知る限りVBA方式とMappy方式の2種類がありますけれど、今はMappy方式を利用してください。~
#ref(clip_1.png,nolink)
- vba.h
#ifndef VBA_H
#define VBA_H
#ifdef __cplusplus
extern "C" {
#endif
#include "gba.h"
IWRAM_CODE void vbalog(const char* msg);
IWRAM_CODE void mappylog(const char* msg);
#ifdef __cplusplus
}
#endif
#endif
- vba.s
@ Functions available to be used with VBA
@ Compile with GAS
.file "vba.s"
.section .iwram,"ax",%progbits
.code 16
.text
.align 2
.global vbalog
.thumb_func
.type vbalog,function
@ log a message to VBA's output console or GDB console
@ r0=message to log
vbalog:
swi 0xff
bx lr
.align 2
.global mappylog
.thumb_func
.type mappylog,function
mappylog:
mov r2,r0
ldr r0,=0xc0ded00d
mov r1,#0
and r0,r0
bx lr
.data
VBA方式はswi命令を呼び出し、エミュレータの独自処理にフックさせています。~
実機で動かすと素直にswi命令が動いてしまい、破綻しますので注意してください。~
対するMappy方式はldr、andなどの無意味なシグネチャ処理によって実現しています。~
とても行儀が良いです。~
*** 発展方法 [#o8b05bc7]
sprintf関数と併用すれば、文字列の中に16進数表記なども扱えるようになります。~
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
int debug(char *fmt, ...)
{
char s[80];
va_list marker;
va_start(marker, fmt);
int r = vsprintf(s, fmt, marker);
va_end(marker);
mappylog(s);
return r;
}
意図しない長さの文字列を扱う場合、スタック変数のs[80]が壊れる場合もありえます。~
妙な挙動をした場合はこのあたりを疑ってみてください。~
** 履歴 [#n0f2659c]
- 2014/11/14
- 2007/09/28