MSX Datapack wiki化計画

5章 V9938のコマンド

 5.1 コマンドの種類

 V9938に備わっている以下のコマンドを使えば、描画(LINE、PSETなど)や画面の部分転送が簡単にできます。
 VDPコマンドの使用例は添付のフロッピーディスクの中に入っていますので、そのサンプルプログラムを参照して下さい。

表4.4 VDPのコマンド一覧表

コマンド名転送元転送先転送単位ニーモニックR#46(上位4ビット)
High speed move
(高速移動)
CPUVRAMバイトHMMC1111
VRAMVRAMバイトYMMM1110
VRAMVRAMバイトHMMM1101
VDPVRAMバイトHMMV1100
Logical move
(論理移動)
CPUVRAMドットLMMC1011
VRAMCPUドットLMCM1010
VRAMVRAMドットLMMM1001
VDPVRAMドットLMMV1000
Line(描線) VDP VRAM ドットLINE0111
Search(探索)VDP VRAM ドットSRCH 0110
Pset(描点) VDP VRAM ドットPSET 0101
Point VRAMVDP ドットPOINT0100
Invalid 0011
Invalid 0010
Invalid 0001
Stop 0000

 V9938は、レジスタR#46(Command register)にデータが書き込まれると、ステータスレジスタS#2のビット0(CE/Command Execute)を1にセットしてからコマンドの実行を開始します。必要なパラメータはコマンド実行前にレジスタR#32〜R#45にセットされていなければなりません。
 コマンドの実行が終了するとCEは0となります。コマンドの実行を途中で中断するには、STOPコマンドを実行して下さい。
 コマンドの動作は、ビットマップモード(SCREEN 5〜8あるいはGRAPHIC 4〜GRAPHIC 7)のときしか保証されません。

 5.2 ページの概念

 V9938のコマンドを使用する場合の位置パラメータはすべてX,Y座標です。つまり、V9938内部のコマンドプロセッサは、VRAMの全エリアを表示モードに応じたX,Y座標でアクセスします。
 画面に表示されるのは、同一ページ内の212ラインです(R#23で指定)。表示ページの選択はR#2で行います。コマンドの実行は、表示ページの選択とは独立して実行されます。
 各表示モードにおけるVRAMとの座標との関係は図4.30のとおりです。

図4.30 各モードのVRAMの座標系

 5.3 ロジカルオペレーション

 V9938では、LINE、PSET、LOGICAL MOVEなどのコマンドを実行するときに、指定したデータと画面上の色を演算することができます。演算(ロジカルオペレーション)は、コマンドを指定するときにR#46(Command register)の下位4ビットに同時に書き込みます。

表4.5 ロジカルオペレーションコード

演算名Operation(演算動作)R#46(下位4ビット)
IMP DC=SC 0000
AND DC=SC×DC 0001
OR DC=SC+DC 0010
EOR DC=SC×DC+SC×DC 0011
NOT DC=SC 0100
0101
0110
0111
TIMPif SC=0 then DC=DC else DC=SC 1000
TANDif SC=0 then DC=DC else DC=SC×DC 1001
TOR if SC=0 then DC=DC else DC=SC+DC 1010
TEORif SC=0 then DC=DC else DC=SC×DC+SC×DC 1011
TNOTif SC=0 then DC=DC else DC=SC 1100
1101
1110
1111
*SC=Source Color code
*DC=Destination Color code
*EOR=Exclusive OR

 5.4 各コマンドの使用法

5.4.1 HMMC(CPU→VRAM高速転送)

 CPUからVRAMの矩形領域(X、Y座標上)へ、V9938経由でデータを転送するコマンドです。データの転送は1バイト単位で行われるので、X座標として指定できる最大値は、表示モードによって制限を受けます。


図4.31 HMMCコマンドの動作

1.HMMC実行手順
1) V9938のコマンドレジスタに必要なパラメータをセットします。

DX転送先基準点 X座標 (0〜511)
DY転送先基準点 Y座標 (0〜1023)
NXX方向転送ドット数(1〜512*1)
NYY方向転送ドット数(1〜1024*2)

 DX、NXともに、GRAPHIC 4と6(SCREEN 5と7)モードのときは下位1ビット、GRAPHIC 5(SCREEN 6)モードのときは下位2ビットが無視されます。
*1 512を指定するときは、NXには「0」を入れます。
*2 1024を指定するときは、NYには「0」を入れます。

DIX転送先基準点からのNXの方向 (0=右、1=左)
DIY転送先基準点からのNYの方向 (0=右、1=左)
CLR(R#44 Color register) 転送データの第1バイト

2) 上記のデータをセットした後、コマンドを実行します。

CMR(R#46 Command register)に11110000Bを書き込む

3) ステータスレジスタS#2のTRとCEをチェックしながら、転送データの第2バイト以降をCLRに転送します。

2.HMMC レジスタセットアップ

3.HMMC コマンド実行

4.HMMC 実行フローチャート

図4.32 HMMCコマンド実行のフローチャート

5.4.2 YMMM(Y方向のVRAM問高速転送)

 VRAM上のDX、SY、NY、DIX、DIYと画面の右端(または左端)で指定される領域をY軸方向(DYで指定)に転送するコマンドです。

図4.33 YMMMコマンドの動作

1.YMMM実行手順
1) V9938のコマンドレジスタに必要なパラメータをセットします。

DY転送先基準点 Y座標 (0〜1023)
DX転送元基準点 X座標 (0〜511)
SY転送元基準点 Y座標 (0〜1023)
NYY方向転送ドット数(1〜1024*)

 DXは、GRAPHIC 4と6(SCREEN 5と7)モードのときは下位1ビット、GRAPHIC 5(SCREEN 6)モードのときは下位2ビットが無視されます。

* 1024を指定するときは、NYには「0」を入れます。

DIX転送元基準点から左右どちらの画面端までを転送するのかを設定(0=右、1=左)
DIY転送元基準点から見たNYの方向 (0=下、1=上)

2) 上記のデータをセットした後コマンドを実行します。

CMR(R#46 Command register)に11100000Bを書き込む

3) 上記の操作でV9938はYMMMコマンドを実行します。コマンドの実行中はステータスレジスタS#2のCEビットが「1」になり、終了すると「0」になります。

2.YMMM レジスタセットアップ

3.YMMM コマンド実行

5.4.3 HMMM(VRAM問高速転送)

 VRAMからVRAMへ矩形の領域を転送するコマンドです。データの転送は1バイト単位で行われるので、X座標として設定できる最大値は表示モードによって制限を受けます。


図4.34 HMMMコマンドの動作

1.HMMM実行手順

1) V9938のコマンドレジスタに必要なパラメータをセットします。

SX転送元基準点 X座標 (0〜511)
SY転送元基準点 Y座標 (0〜1023)
NXX方向転送ドット数(1〜512*1)
NYY方向転送ドット数(1〜1024*2)
DIX基準からのNXの方向 (0=右、1=左)
DIY基準からのNYの方向 (0=下、1=上)
DX転送先基準点 X座標 (0〜511)
DY転送先基準点 Y座標 (0〜1023)

 SX、DX、NXともに、GRAPHIC 4と6(SCREEN 5と7)モードのときは下位1ビット、GRAPHIC 5(SCREEN 6)モードのときは下位2ビットが無視されます。

*1 512を指定するときは、NXには「0」を入れます。
*2 1024を指定するときは、NYには「0」を入れます。

2) 上記のデータをセットした後、コマンドを実行します。

CMR(R#46 Command register)に11010000Bを書き込む

3) 以上の操作でV9938はHMMMコマンドを実行します。コマンドの実行中はステータスレジスタS#2のCEビットが「1」になり、終了すると「0」になります。

2.HMMM レジスタセットアップ

3.HMMM コマンド実行

5.4.4 HMMV(長方形の高速塗りつぶし)

 VRAMの矩形の領域をカラーコードで塗りつぶすコマンドです。データの転送は1バイト単位で行われるので、X座標として指定できる最大値は表示モードによって制限を受けます。


図4.35 HMMVコマンドの動作

1.HMMV実行手順

1) V9938のコマンドレジスタに必要なパラメータをセットします。

NXX方向転送ドット数(1〜512*1)
NYY方向転送ドット数(1〜1024*2)
DIX転送先基準点からのNXの方向 (0=右、1=左)
DIY転送先基準点からのNYの方向 (0=下、1=上)
DX転送先基準点 X座標 (0〜511)
DY転送先基準点 Y座標 (0〜1023)

 DX、NXともに、GRAPHIC 4と6(SCREEN 5と7)モードのときは下位1ビット、GRAPHIC 5(SCREEN 6)モードのときは下位2ビットが無視されます。

*1 512を指定するときは、NXには「0」を入れます。
*2 1024を指定するときは、NYには「0」を入れます。

CLR(R#44 Color register) 塗りつぶしデータ

2) 上記のデータをセットした後、コマンドを実行します。

CMR(R#46 Command register)に11000000Bを書き込む

3) 以上の操作でV9938はHMMVコマンドを実行します。コマンドの実行中はステータスレジスタS#2のCEビットが「1」になり、終了すると「0」になります。

2.HMMV レジスタセットアップ

3.HMMV コマンド実行

5.4.5 LMMC(CPU→VRAM論理転送)

 CPUからVRAMの矩形領域へ、V9938経由でデータを転送するコマンドです。データの転送は1ドット単位で行われ、転送先のデータと演算することができます。


図4.36 LMMCコマンドの動作

1.LMMC実行手順

1) V9938のコマンドレジスタに必要なパラメータをセットします。

DX転送先基準点 X座標 (1〜512*1)
DY転送先基準点 Y座標 (1〜1024*2)
NXX方向転送ドット数(0〜511)
NYY方向転送ドット数(0〜1023)
DIX転送先基準点からのNXの方向 (0=右、1=左)
DIY転送先基準点からのNYの方向 (0=下、1=上)
CLR(R#44 Color register) 転送データの第1バイト

*1 512を指定するときは、NXには「0」を入れます。
*2 1024を指定するときは、NYには「0」を入れます。

2) 上記のデータをセットした後コマンドを実行します。

CMR(R#46 Command register)の上位4ビットに1011Bを、下位4ビットにロジカルオペレーションコード(表4.5参照)を書き込む。

3) ステータスレジスタS#2のTRとCEをチェックしながら、転送データの第2バイト以降をCLRレジスタに転送します。

2.LMMC レジスタセットアップ

3.LMMC コマンド実行

4.LMMC 実行フローチャート

図4.37 LMMC コマンド実行のフローチャート

5.4.6 LMCM(VRAM→CPU論理転送)

 VRAMの矩形領域(X、Y座標上)のデータをCPUに転送するコマンドです。データの転送は1ドット単位で行われます。


図4.38 LMCMコマンドの動作

1.LMCM実行手順

1) V9938のコマンドレジスタに必要なパラメータをセットします。

SX転送元基準点 X座標 (0〜511)
SY転送元基準点 Y座標 (0〜1023)
NXX方向転送ドット数(1〜512*1)
NYY方向転送ドット数(1〜1024*2)
DIX転送先基準点からのNXの方向 (0=右、1=左)
DIY転送先基準点からのNYの方向 (0=下、1=上)

*1 512を指定するときは、NXには「0」を入れます。
*2 1024を指定するときは、NYには「0」を入れます。

2) 上記のデータをセットした後コマンドを実行します。

CMR(R#46 Command register)に10100000Bを書き込む。

3) ステータスレジスタS#2のTRとCEをチェックしながら、ステータスレジスタS#7を読み出します。

2.LMCM レジスタセットアップ

3.LMCM コマンド実行

4.LMCM 実行フローチャート

図4.39 LMCM コマンド実行のフローチャート

注意
  1. 「EXECUTE COMMAND」の前にTRをリセットする必要があるので、「V9938 SET UP」の中でステータスレジスタS#7をリードして下さい。
  2. 最後のデータがステータスレジスタS#7にセットされてTR=1となっていても、V9938内部ではコマンドは終了しCE=0となります。

5.4.7 LMMM(VRAM→VRAM論理転送)

 VRAMからVRAMへ矩形の領域を転送するコマンドです。データの転送は1ドット単位で行われ、転送先のデータと論理演算することができます。


図4.40 LMMMコマンドの動作

1.LMMM実行手順

1) V9938のコマンドレジスタに必要なパラメータをセットします。

SX転送元基準点 X座標 (0〜511)
SY転送元基準点 Y座標 (0〜1023)
NXX方向転送ドット数(1〜512*1)
NYY方向転送ドット数(1〜1024*2)
DIX基準点からのNXの方向 (0=右、1=左)
DIY基準点からのNYの方向 (0=下、1=上)
DX転送先基準点 X座標 (0〜511)
DY転送先基準点 Y座標 (0〜1023)

*1 512を指定するときは、NXには「0」を入れます。
*2 1024を指定するときは、NYには「0」を入れます。

2) 上記のデータをセットした後コマンドを実行します。

CMR(R#46 Command register)の上位4ビットに1001Bを、下位4ビットにロジカルオペレーションコード(表4.5参照)を書き込む。

3) 以上の操作でV9938はLMMMコマンドを実行します。コマンドの実行中はステータスレジスタS#2のCEビットが「1」になり、終了すると「0」になります。

2.LMMM レジスタセットアップ

3.LMMM コマンド実行

5.4.8 LMMV(VRAM論理塗りつぶし)

 VRAMの矩形の領域をカラーコードで塗りつぶすコマンドです。データの転送は1バイト単位で行われ、転送先のデータと論理演算をすることができます。


図4.41 LMMVコマンドの動作

1.LMMV実行手順

1) V9938のコマンドレジスタに必要なパラメータをセットします。

NXX方向転送ドット数(1〜512*1)
NYY方向転送ドット数(1〜1024*2)
DIX転送先基準点からのNXの方向 (0=右、1=左)
DIY転送先基準点からのNYの方向 (0=下、1=上)
DX転送先基準点 X座標 (0〜511)
DY転送先基準点 Y座標 (0〜1023)
CLR(R#44 Color register) 塗りつぶしデータ

*1 512を指定するときは、NXには「0」を入れます。
*2 1024を指定するときは、NYには「0」を入れます。

2) 上記のデータをセットした後コマンドを実行します。

CMR(R#46 Command register)の上位4ビットに1000Bを、下位4ビットにロジカルオペレーションコード(表4.5参照)を書き込む。

3) 以上の操作でV9938はLMMVコマンドを実行します。コマンドの実行中はステータスレジスタS#2のCEビットが「1」になり、終了すると「0」になります。

2.LMMV レジスタセットアップ

3.LMMV コマンド実行

5.4.9 LINE(直線の描画)

 直線を描画するコマンドです。基準点と長辺・短辺からなる長方形の対角線を描画します。データの転送は1ドット単位で行われ、転送先のデータと論理演算することができます。


図4.42 LINEコマンドの動作

1.LINE実行手順

1) V9938のコマンドレジスタに必要なパラメータをセットします。

Maj長辺ドット数(0〜1023)
Min短辺ドット数(0〜511)
MAJ0=長辺はX軸と平行、1=長辺はY軸と平行/または長辺=短辺
DIX基準点からの終点の方向 (0=右、1=左)
DIY基準点からの終点の方向 (0=下、1=上)
DX基準点 X座標 (0〜511)
DY基準点 Y座標 (0〜1023)

2) 上記のデータをセットした後コマンドを実行します。

CMR(R#46 Command register)の上位4ビットに0111Bを、下位4ビットにロジカルオペレーションコード(表4.5参照)を書き込む。

3) 以上の操作でV9938はLINEコマンドを実行します。コマンドの実行中はステータスレジスタS#2のCEビットが「1」になり、終了すると「0」になります。

2.LINE レジスタセットアップ

3.LINE コマンド実行

5.4.10 SRCH(色コードのサーチ)

 基準点から右(左)に境界色(または非境界色)をサーチするコマンドです。
 

図4.43 SRCHコマンドの動作

1.SRCH実行手順

1) V9938のコマンドレジスタに必要なパラメータをセットします。

DIX基準点からの終点の方向 (0=右、1=左)
EQ 0=境界色を発見したときに実行を終了、1=境界色以外を発見したときに実行を終了。
SXサーチ基準点 X座標 (0〜511)
SYサーチ基準点 Y座標 (0〜1023)
CLR(R#44 Color register) 境界色

2) 上記のデータをセットした後コマンドを実行します。

CMR(R#46 Command register)に01100000Bを書き込む。

3) 以上の操作でV9938はSRCHコマンドを実行します。コマンドの実行中はステータスレジスタS#2のCEビットが「1」になり、終了すると「0」になります。また、画面の端に達するまでに境界色を発見した場合にBDビットが「1」になります。

2.SRCH レジスタセットアップ

3.SRCH コマンド実行

4.SRCH 実行フローチャート

図4.44 SRCH コマンド実行のフローチャート

5.4.11 PSET(点の描画)

 点を描画するコマンドです。すでに表示されている点のデータと論理演算することができます。


図4.45 PSETコマンドの動作

1.PSET実行手順

1) V9938のコマンドレジスタに必要なパラメータをセットします。

DX基準点 X座標 (0〜511)
DY基準点 Y座標 (0〜1023)

2) 上記のデータをセットした後コマンドを実行します。

CMR(R#46 Command register)の上位4ビットに0101Bを、下位4ビットにロジカルオペレーションコード(表4.5参照)を書き込む。

3) 以上の操作でV9938はPSETコマンドを実行します。コマンドの実行中はステータスレジスタS#2のCEビットが「1」になり、終了すると「0」になります。

2.PSET レジスタセットアップ

3.PSET コマンド実行

5.4.12 POINT(色コードの読み出し)

 VRAM上の基準点の色コードを読み出すコマンドです。


図4.46 POINTコマンドの動作

1.POINT実行手順

1) V9938のコマンドレジスタに必要なパラメータをセットします。

SX基準点 X座標 (0〜511)
SY基準点 Y座標 (0〜1023)

2) 上記のデータをセットした後コマンドを実行します。

CMR(R#46 Command register)に01000000Bを書き込む

3) 以上の操作でV9938はPOINTコマンドを実行します。コマンドの実行中はステータスレジスタS#2のCEビットが「1」になり、終了すると「0」になります。また、読み出された色コードがステータスレジスタS#7にセットされます。

2.POINT レジスタセットアップ

3.POINT コマンド実行

 5.5 コマンドの高速化

 次の操作をすると、コマンドの処理速度が上がります。

1.スプライト表示を禁止
 レジスタR#8のビット1(SPD)を「1」にすると、スプライトの処理に使っていた時間をコマンドの実行に使用できるので、コマンドの処理速度が上がります。

2.画面表示を禁止
 レジスタR#1のビット6(BL)を「0」にすると、表示の処理に使っていた時間をコマンドの実行に使用できるので、コマンドの処理速度が上がります。

 5.6 コマンド終了時のレジスタの状態

 コマンド終了時のレジスタの状態は表4.6のようになります。

表4.6 コマンド終了時のレジスタの状態

コマンド名SXSYDXDYNXNYCLRCMR HCLR LARG
HMMC* # 0
YMMM* * # 0
HMMM* * # 0
HMMV* # 0
LMMC* # 0
LMCM* # * 0
LMMM* * # 0
LMMV* # 0
LINE* 0
SRCH0
PSET0
POINT* 0
 − 変化なし
 *  コマンド終了時の座標(SY*、DY*)とカラーコード
 #  画面端を検出したときはそのときのカウント数(NYB)となる

 SY*、DY*、およびNYBの値はY方向実行ドット数をNとすると、次のように計算されます。

   SY*=SY+N、DY*=DY+N (DIY=0)
   SY*=SY-N、DY*=DY-N (DIY=1)
   NYB=NY-N

注意

LINEでMAJ=0のときは、N=N-1となります。