[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[WitchTech 00351] _pc->_resource について



えるぴと申します。
プログラムに付加されたリソースの先頭を指すポインタ
_pc->_resourceについて、ちょっと気になる事を発見したので
一応ご報告いたします。

今、自分はちょっとしたシューティングゲームを作っており、
フォントパターンをリソースとして付加し、初期化時にリソースを検索して、
フォントを設定するようにしています。

しかし、どうやらプログラムが/rom0の特定位置に配置された時のみ、
リソースの検索に失敗する(結果、フォントが正しく設定されない)事が
あるようなので、何度かプログラムをワンダーウィッチに転送しなおして、
_pc->_resourceの値を表示させてみました。
以下、その結果です。

----1回目
FP_SEG(_pc->_resource)	:9000
FP_OFF(_pc->_resource)	:FA30
CS			:9C98
DS			:1000
----2回目
FP_SEG(_pc->_resource)	:A000
FP_OFF(_pc->_resource)	:3CB0
CS			:A0C0
DS			:1000
----3回目
FP_SEG(_pc->_resource)	:A000
FP_OFF(_pc->_resource)	:7F30
CS			:A4E8
DS			:1000
----

どうやら、_pc->_resourceの値は、セグメント値にCSの上位4ビットをセットし、
残りをオフセットにセットしているようです。
そのため、以下のようにfarポインタでリソースを検索するルーチンを作ると、
リソースの配置位置によってはリソースを正しく検索できません。

----以下、ダメな検索ルーチン例
res_t far *findResource(res_t far *res, WORD type, short id)
{
	while ( res->magic == RESID ) 
	{
		if ( (res->type == type) && (res->id == id) )
		{
			return res;
		}
		res = (res_t far *)(((BYTE far *)(res)) + (res->size << 4));
	}
	return NULL;
}
----

で、仕方がないので、下記のようにリソースの検索前にポインタを正規化(?)
するようにしてみました。

----以下、64KBまでは大丈夫な検索ルーチン例
res_t far *findResource(res_t far *res, WORD type, short id)
{
	unsigned long	seg, off;
	
	seg = FP_SEG(res);
	off = FP_OFF(res);
	seg += off / 16;
	off %= 16;
	res = MK_FP(seg, off);
	while ( res->magic == RESID ) 
	{
		if ( (res->type == type) && (res->id == id) )
		{
			return res;
		}
		res = (res_t far *)(((BYTE far *)(res)) + (res->size << 4));
	}
	return NULL;
}
----

他にもっと良い方法がありましたら御教授下さい。
#あ、例によってコンパイラはLSI-Cを使用しています。

--------
    えるぴ(渡邉 徹)    E-mail address : erupi@fa2.so-net.ne.jp



ML Archives