Last Update 08/02/02

ロックマン5のスレッドに関する記述です。


ロックマン5では、ステージやパレットアニメーションの処理等をスレッドで管理している。

$80-8F スレッドの状態管理
4bytesで1組。0〜3の4つまでのスレッドの状態を管理できる。

byte0   -> スレッドの状態
byte1   -> スレッドのスリープタイマー
byte2-3 -> スレッドの状態が休止中ならばbyte2にスレッドのスタックポインタが格納される。
           新規登録されたスレッドならばbyte2-3にスレッドハンドラのアドレスが格納される。

スレッドの状態
00未使用
01休止状態のスレッド。NMIの度にスリープタイマーがデクリメントされ、0になったときに実行可能状態(04)へ遷移する。
02実行中のスレッド。スレッド休止ルーチン($FF22,$FF24)を呼び出すことで休止状態(01)へ遷移する。
04実行可能なスレッド。実行時に実行状態(02)へ遷移する。
08新規登録されたスレッド。実行可能でもある。実行時に実行状態(02)へ遷移し、スレッドハンドラへジャンプする。

スレッド関係のサブルーチン
jsr $FF22実行中のスレッドを休止する。
スリープタイマーに#$01をセットしてスレッドを休止状態にする(つまり、次のNMIが終了するまで待つ)。
その後、スレッドの状態監視ループに入り、実行可能なスレッドが見つかればそのスレッドを実行する。
jsr $FF24実行中のスレッドを休止する。
Aレジスタの値をスリープタイマーにセットしてスレッドを休止状態にする。
その後は同上。
スリープタイマーは、デクリメント後に0かどうかのチェックが行われるため、Aレジスタに#$00をセットして 呼び出した場合256回NMIの終了を待つことになる。
jsr $FEF3スレッドを新規登録する。
$93-94にスレッドハンドラのアドレス、 Aレジスタにスレッドの状態管理に使用するスロット(0〜3)をセットして呼び出す。
jsr $FF03スレッドを終了する。
Aレジスタで指定した番号(0〜3)のスレッドを終了する(スレッドの状態に00を格納する)。
jmp $FF0B実行中のスレッドを終了する。
実行中のスレッドを終了し、スレッドの状態監視ループに入る。