この章では、VDPを操作するのに必要なコントロールレジスタ、パレットレジスタ、ステータスレジスタ、VDPにアクセスする方法などについて説明します。
2.1 コントロールレジスタのアクセス
V9938のコントロールレジスタ(R#0〜R#46)にデータをセットする方法は、直接指定と間接指定の2通りあります。
2.1.1 直接指定
ポート#1に、データ、レジスタ番号の順に出力する方法です。この順番は必ず守らねばならないので、割り込みルーチンなどでV9938をアクセスしているときには注意が必要です。
2.1.2 間接指定
コントロールレジスタR#17(Control register pointer)でレジスタ番号を指定する方法で、非オートインクリメントとオートインクリメントの2つのモードがあります。
1.非オートインクリメント
直接指定でR#17にレジスタ番号をセットし、ポート#3にデータを出力します。R#17の値は間接指定では変更できません。
非オートインクリメントモードでは、R#17の内容は不変なので、再セットする必要はありません。このモードはVDPコマンドの実行時など、同じレジスタに連続してデータを送るときに使用します。
2.オートインクリメント・モード
直接指定でR#17にレジスタ番号をセットし、ポート#3にデータを出力します。このときR#17のAIIビットに「0」をセットすると、ポート#3にデータを出力するたび、R#17の内容はオートインクリメントされます。
このモードを使用すると、スクリーンモードの変更時など、連続した多数のレジスタを一度に書き換える場合に便利です。
2.2 パレットレジスタのアクセス
パレットレジスタにデータをセットするためには、レジスタR#16(Color palette address pointer)にパレット番号を指定します。そして、ポート#2ヘデータを連続で出力します。これは、V9938のパレットレジスタ(P#0〜P#15)は9ビットの長さを持つため、最初に赤と青の輝度、次に緑の輝度とデータを2度に分けて出力する必要があるからです。
R#16は、ポート#2にデータを2バイト書き込むとオートインクリメントします。
2.3 ステータスレジスタのアクセス
V9938のステータスレジスタ(S#0〜S#9)を読み出すには、レジスタR#15(Status register pointer)にステータスレジスタ番号をセットし、ポート#1を読み出します。
MSXの割り込みルーチンは、R#15に「0」がセットされていることを前提にしています。したがって、ステータスレジスタをアクセスする前には、必ず割り込みを禁止し、目的の処理が終了した後に、R#15に「0」をセットしてから割り込みを解除して下さい。
2.4 VRAM(VIDEO RAM)のアクセス
V9938には128KバイトのVRAMと64Kバイトの拡張RAMを接続することができます。拡張RAMはVDPコマンド実行時にワークエリアとして使用することができます。ただし、MSX2では拡張RAMは使用しないので、R#45のビット6には常に「0」を設定して下さい。
メモリマップは以下のようになっています。
VRAMアクセスは次の手順で行います。
- バンク切り換え(VRAM〜拡張RAM)
- アドレスカウンタセット(A16〜A14)
- アドレスカウンタセット(A7〜A0)
- アドレスカウンタセット(A13〜A8) 読み出し・書き込み指定
- データの読み出し・書き込み
1.アドレスカウンタセット(A16〜A14)
レジスタR#14(VRAM Access base address register)を使って、アドレスカウンタの上位3ビット(A16〜A14)をセットします。
このレジスタは、TMS9918互換モードのときには、オートインクリメントを指定してもカウントアップしません。
2.アドレスカウンタセット(A7〜A0)
ポート#1に、アドレスカウンタの下位8ビット(A7〜A0)にセットするデータを出力します。
3.アドレスカウンタセット(A13〜A8) 読み出し・書き込みの設定
ポート#1に、アドレスカウンタの残りの6ビット(A13〜A8)にセットするデータと読み出し・書き込みの指定を出力します。
4.データの読み出し・書き込み
ポート#0にデータを読み出し・書き込みをすると、アドレスカウンタが自動的にインクリメントされるので、連続してアクセスすることができます。
ただし、TMS9918互換モードのときには、A16〜A14はインクリメントされません。
2.5 V9938の画面構成
V9938の画面は以下のような構成になっています。