1)割り込み禁止 2)ステータスレジスタから VDP コマンド実行状態を読み出す 3)VDP コマンド実行中なら 2)へ 4)R#32 〜 R#45 に必要なデータを入れる 5)VDP コマンド実行(R#46 書き込み) 6)ステータスレジスタから VDP コマンド実行状態を読み出す 7)VDP コマンド実行中なら 6)へ 8)割り込み許可 ※R#n......VDP のコントロールレジスタの n 番この方法では、VDPコマンド実行中はずっと割込み禁止状態になり、特に大きなグラフィックを扱う場合には、割り込みが無視されてしまう確率が高くなります。 例えばタイマ割り込みが頻繁に無視される結果、タイマ割り込みを利用したBGMの演奏が間延びするといった現象が起こります。
1)割り込み禁止 2)ステータスレジスタから VDP コマンド実行状態を読み出す。 読み出し後、ステータスレジスタの番号を 0 にしておくのを 忘れずに 3)割り込み許可 4)VDP コマンド実行中なら 1)へ 5)割込み禁止 6)R#32 〜 R#45 に必要なデータを入れる 7)VDP コマンド実行(R#46 書き込み) 8)割り込み許可テクハンの方法に比べ、前回の実行状態確認の段階(1〜4)において、必要なときだけ割込み禁止とすることにより、割り込みが無視されるのを防いでいます。
なお、タイマ割り込みなどの割り込み処理にVDPコマンドを使うルーチンを追加した場合には、メイン側のVDPコマンドの使用手順は以下のようにします。
1)割り込み禁止 2)ステータスレジスタから VDP コマンド実行状態を読み出す。 読み出し後、ステータスレジスタの番号を 0 にしておくのを 忘れずに 3)VDP コマンド実行中でなければ 6)へ 4)割り込み許可 5) 1)へ戻る 6)R#32 〜 R#45 に必要なデータを入れる 7)VDP コマンド実行(R#46 書き込み) 8)割り込み許可先の方法に比べると、前回の実行状態確認の段階における割込み禁止時間が長くなり、割り込みが無視される確率が高くなっています。 特別な事情が無い限りは、割り込みルーチン内ではVDPコマンドを使わないようにし、先の使用手順を用いた方がいいでしょう。
ビーバーさんの「理想的なVDPコマンド」ですが、スピードを追求するならもうちょっと速くすることができます。 昔Mマガにあった「アルゴリズムコンテスト」のネタそのまんまになりますが、「VDPコマンドが実行中かどうかの判定」に入る前に、予めr#nの連続書き込みレジスタ番号を入れておくといいです。1)DI / R#17←32 / (EI:省略可能) 2)DI / R#15←2 / S#2待避 / R#15←0 / EI 3)VDPコマンド実行中なら2)へ 4)DI / R#32〜に書き込み / EI 本来、4)のところでやるべきことを1)でやっているのがミソ。