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