ステータスを参照する主な目的はVDPコマンドの終了などのチェックである。
ステータスレジスタはR#15にステータスレジスタ番号をセットし、
0x99(Port-1)をリードすることで行なう。
ステータスのリードはI/Oポートの0x99(Port-1)をリードするので、
ステータス読み出しは二つのセクションに分かれる。
ステータスの取得は以下のような関数で実現可能だろう。
//CHECK VDP STSTUS
unsigned char VStatus(unsigned char sreg){
unsigned char rtn;
//R#15
VRegister(15,sreg);
rtn=inp(0x99);
//R#15 CLEAR
VRegister(15,0);
return(rtn);
}
ステータスを読む際に注意する点は、関数の終了時にR#15をゼロクリアして
戻る事。これをしないとその後、VDPが動作しない。
VDPが正しく動作しなくなるので、BIOSのタイマー割り込み期間処理などで
問題が生じる。
VDPアクセス処理なのにシステム全体が不具合を生じるといったトラブルを招く。
ステータス取得関数を用いたVDPコマンド終了待ちの例を以下に示す。
do {
status=VStatus(2) & 1;
} while(status);
このループで、VDPコマンド実行完了までウエイトする。
チェックするレジスタはS#2の1bitの、0/1を確認する。
VDPはCPUと比較して遅いので、待ち時間をウエイトで消費するのは得ではないが、
画面と同期処理する場合は必ずウエイトを待たないと正しく表示されない。
最終更新:2012年04月22日 06:48