anago の GUI 化の続き

Squirrel 周り

flash memory device のリストアップをせなならんのだが、まったく考慮してない作りになっていた。flashdevice.nut を書き直し、Squirrel の関数の戻り値として文字列をとれるように処理を追加。

ついで、 flash mode も動くように dump mode と同じような改修。ちょっと困ったのが、文字列出力。目につく puts と printf は snprintf と先日の void ポインタ+関数ポインタ利用で対処、まだ標準出力がでる。これをしらべたらスクリプトからの出力だった。

文書を読んでたら foreign pointer なるものがあったので、ここに出力先のポインタを埋めろとは書いてなかったがそれ以外に思いつかなかったので利用。たぶん1個しか使えないし、printfunc 登録の次に書いてあったら、ねぇ。vsnprintf とかいうマニアックなものがつかえた。

static void print_other(HSQUIRRELVM v, const SQChar *s, ...)
{
	va_list arglist;
	va_start(arglist, s);
	char str[80];

	vsnprintf(str, 80, s, arglist);
	struct textcontrol *p = 
		(struct textcontrol *) sq_getforeignptr(v);
	p->append(p->object, str);

	va_end(arglist);
}

HSQUIRRELVM qr_open(struct textcontrol *p)
{
	HSQUIRRELVM v = sq_open(0x400);
	sqstd_seterrorhandlers(v);
	sqstd_register_iolib(v);
	if(p == NULL){
		sq_setprintfunc(v, printfunc);
	}else{
		sq_setforeignptr(v, (SQUserPointer) p);
		sq_setprintfunc(v, print_other);
	}
	sq_pushroottable(v);
	return v;

動かなかったら別の対策でも考えるかと思ったらさっくり動いたのでおしまい。

再描写関連


動作中にウィンドウを触らなければ、ある程度は勝手に更新してくれるが、応答なしになるのは事実。これにはthread を使うのがスマートらしい。結構難しそうなのでどうしたものか。あまりこれに時間を使いたくない。

Linux にもっていて対策せずにうごくんなら Windows API から無理矢理 DoEvents でもよんで適当にごまかす。動かないなら、どうしようね。

単純にやってないこと

  • dump/program 切り換えボタンの設置
  • dump の長さ 2倍,4倍 フォームの設置
  • program の compare check の設置
  • 適当にメニューをつくる
  • Window の位置を画面中央以外にする (真ん中に置かれたら絶対に移動するよね? 毎回やられたらうざいよね)

ファームレベルの問題

FF3 (SQF-FC) を転送すると、NRZI 関連で停まる。0x5A でデータが埋まってるの? 他に再発するデータがあれば問題にするが、クライアントもファームも修正しないといけないので、かなりよろしくない。