| < 2007年4月 > | ||||||
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| 8 | 9 | 10 | 11 | 12 | 13 | 14 |
| 15 | 16 | 17 | 18 | 19 | 20 | 21 |
| 22 | 23 | 24 | 25 | 26 | 27 | 28 |
| 29 | 30 | 1 | 2 | 3 | 4 | 5 |
次の日記: 2007/04/02 23:20 [gdb over translation]
| < 2007年4月 > | ||||||
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| 8 | 9 | 10 | 11 | 12 | 13 | 14 |
| 15 | 16 | 17 | 18 | 19 | 20 | 21 |
| 22 | 23 | 24 | 25 | 26 | 27 | 28 |
| 29 | 30 | 1 | 2 | 3 | 4 | 5 |
カルドセプト (正確にはカルドセプト エキスパンション・プラス) が動かないバグ、実に素敵なバグでした…。
FS2 は PS の BIOS を自力で実装してるわけですが、今回のバグはここでした。(今更コンパイラにバグがあったらすごく凹みますが)
PS にはスレッドの概念があって、BIOS でサポートがされています。当然、あるものは実装しなければならないので、根性で実装してあります。ちなみに、協調型なのかプリエンプティブ型なのかは知りません。知らなくても、こちらの実装には関係ありません。(タイマ割り込みで順番にスレッドを切り替えさせれば、事実上プリエンプティブ型にできるわけですしね)
で、一応 BIOS の関数というかシステムコールなので、返り値が存在します。この辺は全部、勝手に CPU のレジスタをいじって設定するわけですが、ここが素敵なことになってました。
void thread_ChangeTh(plugin_systemservices *context,int class_code,int function_code)
{
thread_descriptor *threads;
unsigned index;
(中略)
thread_switch(context,psx_load_word(context,0x110) + index * sizeof(thread_descriptor));
context->execution_data->reg[PSRegIndexCPU + PSRegV0] = 0;
とりあえず、返り値 0 がセットされてます。スレッドを切り替えた後に。返り値を戻す先は ChangeTh を 呼び出した側のスレッド(のコンテキスト)なので、これだと切り替えた先の CPU レジスタを壊してしまいます。
というわけで、逆にしたらここは通過。こんな単純で怖いバグが残っててびっくり…。
ちなみに、まだステージ開始時に本体ごと SIGSEGV で落ちる問題が残ってます。今度は誰だぁー。
Intel Mac だと rosetta 上のプロセスはデバッグできないのかな?gdb が落ちちゃう…。この辺は PowerPC な Mac に頼るしかないのかなぁ。
あ、あと WindowMode プラグインには、なんか NewGWorld とか素敵なレガシー関数が山ほど書いてありました。誰だ、こんなの書いたの。
どうやら表示がおかしくなるのは、この辺が悪いっぽい。104 でコンパイルしたら、Deprecated って怒られたし。
<Trackback URI> http://linkage.white-void.net/cgi/tb.cgi/diary/2007040201
コメントフォーム