バグのないプログラムはない、といわれるくらい、 最初から期待どおりに動くプログラムをつくるのは難しいことです。
そこで必要になってくるのがデバッグ作業です。 今回はデバッグに有効な手法をいくつか紹介したいと思います。
デバッグの方法として一番最初にあげられるのが、ソースを穴があくほどじっくり眺めることです。 何のひねりもないですが、基本は重要です。
次にデバッガでトレース実行というのがあげられますが、 SFXVIではほぼ無理ですね。
それから、最初とだぶりますが、完成したプログラムをディスアセンブルして、 アセンブラソースファイルを眺めてみるというのもあります。 もちろんアセンブラがわからないと意味がありません。
あまり使えなさそうなのばっかり紹介してきたのでそろそろ実践的なものに行きましょう。
大体において、期待通りに動かないというのは、行なわれるはずの処理が行なわれない、 変数の内容が期待どおりの値にならない、といったことになります。
しかし、具体的にどこがおかしいかは、ソースを眺めるだけではなかなか気が付きにくいものです。 では、どうするか。
必要な情報を全て画面に表示してしまうのです。 システム標準で用意されているデバッグモードにパラメータ表示機能があります。 基本的なパラメータはここでリアルタイムに参照出来ます。 ちなみにこれは対戦中に ESC - P - D の順にキーボードから入力すれば使用可能です。
ここで参照出来ない値は、自分で表示させなければなりません。
if( flg == ON ) 演出表示_テキスト( 2, 10, 0, "ON " ); else 演出表示_テキスト( 2, 10, 5, "OFF" );
こういった処理を任意の場所(たとえばOPT_サイクルなど)に挿入すればいいのです。
また、これでは変数の値の表示は出来ません。 値を表示させる場合は以下のような関数を用意して、任意の場所で呼び出すのがいいでしょう。
//--------------------------------------------------------------------------- void Fnc表示_10進数字( short x,short y,short value,short keta,short pal) //--------------------------------------------------------------------------- { short i; short pat=pal*256+52; for( i = 0 ; i < keta ; i++ ) { Bkg設定_表示(x+keta-i,y,pat+(value % 10)); value /= 10; } }
呼び出し方法
Fnc表示_10進数字( 2 , 10 , カウンタ , 4 , 10 ); // BG座標( 2 , 10 )の位置に変数「カウンタ」の値を右詰め4桁、 // パレット番号10で表示します
数値を毎サイクル表示させる場合、値が目まぐるしく変化すると読み取りにくくなります。 また、値を記録しておいて、あとで参照したいという場合、画面に表示する方法はあまり得策とはいえません。
こういった場合は奥の手、コンソールドライバを利用しましょう。 コンソールドライバとは condrv.sys のことです。 もとは文字の出力を高速化するためのものですが、出力をバッファに記録し、いつでも参照出来るバックログを備えています。 これは現在では手に入れるのは難しいかもしれませんね。 しかし非常に便利ですので、なんとか見つけ出してください。
バックログバッファには、通常の文字列出力のほぼすべてが記録されます。特に難しいことはありません。 printf() や DOS PRINT など、どれでも対象になります。
とは言ってもSFXVI標準APIにはそういった関数は用意されていませんが。
数値の表示は printf() を使用するのがよいでしょう。 この場合 XC もしくは LIBCライブラリをもっている必要があります。 XC なら CLIB.L か CLIB.A、 LIBC ならlibc.a という名前のライブラリを一緒にリンクしてやります。
プログラムの例
printf( "%d." , カウンタ );
リンクバッチファイルの例
link.bat
echo off rem CB_V0200 echo ・全オブジェクトのリンクを開始します。 set SFXVI_GCC_OBJS=action.o func.o command.o shot.o mmp_act.o mmp_sub.o mmp_opt.o mmp_vct.o mmp_cpu.o set SFXVI_GCC_LIBS=..\..\..\LIB\SFXVILIB.A ..\..\..\LIB\SFXVI6BI.A ..\..\..\LIB\SFXVIICC.A ..\..\..\LIB\SFXVIRUN.A set SFXVI_GCC_EXEC=..\OBJECT\ACTION.X rem Cライブラリの存在パスは自分の環境にあわせて変更すること set SFXVI_CLIBS=C:\XC\LIB\CLIB.L echo ・%SFXVI_GCC_OBJS% をリンク中です。 HLK.X -o%SFXVI_GCC_EXEC% %SFXVI_GCC_OBJS% %SFXVI_GCC_LIBS% %SFXVI_CLIBS% -x echo ・完了しました。 echo on
バックログはSFXVI起動中は参照出来ませんので注意してください。
また、テキスト画面を無断で使用することになりますので、 SFXVIのバージョン次第では誤動作する可能性もあります。注意してください。 それが気になる場合は、 start.bat を以下のように書き換えてみてください。
start.bat 抜粋
echo ・ SFXVIシステムを起動しています。 sfxvi.x > xconc pause ・ SFXVIシステムを終了しました。(なにかキーを押して下さい)
どうでしょうか。デバッグというものはつまらなくてつらいものですが、それを緩和 出来ればと思って、色々な方法を説明してみました。 この他にも「シリアル接続でターミナルデバッグ」「VCT_ヘルプ表示でデータ表示」 といったことが可能ですが、それはまた別の機会に・・・。