ロックマン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 | 実行中のスレッドを終了する。 |
実行中のスレッドを終了し、スレッドの状態監視ループに入る。 |