理想的な VDP コマンドの使用手順

(New:1997/4/7)
(Update:1998/6/22)
「MSX2テクニカルハンドブック(アスキー出版局)」(以下テクハン)によると、VDPコマンドの実行手順は大体次のようになっています。
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の演奏が間延びするといった現象が起こります。
そこで、理想的なVDPコマンド使用手順として次のようなものが挙げられます。
1)割り込み禁止
2)ステータスレジスタから VDP コマンド実行状態を読み出す。
  読み出し後、ステータスレジスタの番号を 0 にしておくのを
  忘れずに
3)割り込み許可
4)VDP コマンド実行中なら 1)へ
5)割込み禁止
6)R#32 〜 R#45 に必要なデータを入れる
7)VDP コマンド実行(R#46 書き込み)
8)割り込み許可
テクハンの方法に比べ、前回の実行状態確認の段階(1〜4)において、必要なときだけ割込み禁止とすることにより、割り込みが無視されるのを防いでいます。
また、実行状態確認は前回実行したものに対してのみとすることにより、現在のコマンド実行中に他のプログラムを実行させるといったことが可能となります。 もともとVDPコマンドは並列処理の可能性を持っているものですが、こうすることにより、その特徴を生かせるわけです。

なお、タイマ割り込みなどの割り込み処理にVDPコマンドを使うルーチンを追加した場合には、メイン側のVDPコマンドの使用手順は以下のようにします。

1)割り込み禁止
2)ステータスレジスタから VDP コマンド実行状態を読み出す。
  読み出し後、ステータスレジスタの番号を 0 にしておくのを
  忘れずに
3)VDP コマンド実行中でなければ 6)へ
4)割り込み許可
5) 1)へ戻る
6)R#32 〜 R#45 に必要なデータを入れる
7)VDP コマンド実行(R#46 書き込み)
8)割り込み許可
先の方法に比べると、前回の実行状態確認の段階における割込み禁止時間が長くなり、割り込みが無視される確率が高くなっています。 特別な事情が無い限りは、割り込みルーチン内ではVDPコマンドを使わないようにし、先の使用手順を用いた方がいいでしょう。
(New:1998/6/17 Update:1998/6/22) このページについて、めらまんさんからアドバイスを頂きました。 転載許可ありがとうございます。
ビーバーさんの「理想的な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)でやっているのがミソ。
	

MSXの適当手帳 MSX駅 西山駅