MSX Datapack wiki化計画

2章 基本入出力

 この章では、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アクセスは次の手順で行います。

  1. バンク切り換え(VRAM〜拡張RAM)
  2. アドレスカウンタセット(A16〜A14)
  3. アドレスカウンタセット(A7〜A0)
  4. アドレスカウンタセット(A13〜A8) 読み出し・書き込み指定
  5. データの読み出し・書き込み

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の画面は以下のような構成になっています。