[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[WitchTech 00351] _pc->_resource について
- Subject: [WitchTech 00351] _pc->_resource について
- From: Tooru Watanabe <erupi@fa2.so-net.ne.jp>
- Date: Thu, 17 Aug 2000 22:12:29 +0900
えるぴと申します。
プログラムに付加されたリソースの先頭を指すポインタ
_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