5.1 コマンドの種類
V9938に備わっている以下のコマンドを使えば、描画(LINE、PSETなど)や画面の部分転送が簡単にできます。
VDPコマンドの使用例は添付のフロッピーディスクの中に入っていますので、そのサンプルプログラムを参照して下さい。
表4.4 VDPのコマンド一覧表
コマンド名 | 転送元 | 転送先 | 転送単位 | ニーモニック | R#46(上位4ビット) | |||
High speed move (高速移動) | CPU | VRAM | バイト | HMMC | 1 | 1 | 1 | 1 |
VRAM | VRAM | バイト | YMMM | 1 | 1 | 1 | 0 | |
VRAM | VRAM | バイト | HMMM | 1 | 1 | 0 | 1 | |
VDP | VRAM | バイト | HMMV | 1 | 1 | 0 | 0 | |
Logical move (論理移動) | CPU | VRAM | ドット | LMMC | 1 | 0 | 1 | 1 |
VRAM | CPU | ドット | LMCM | 1 | 0 | 1 | 0 | |
VRAM | VRAM | ドット | LMMM | 1 | 0 | 0 | 1 | |
VDP | VRAM | ドット | LMMV | 1 | 0 | 0 | 0 | |
Line(描線) | VDP | VRAM | ドット | LINE | 0 | 1 | 1 | 1 |
Search(探索) | VDP | VRAM | ドット | SRCH | 0 | 1 | 1 | 0 |
Pset(描点) | VDP | VRAM | ドット | PSET | 0 | 1 | 0 | 1 |
Point | VRAM | VDP | ドット | POINT | 0 | 1 | 0 | 0 |
Invalid | − | − | − | − | 0 | 0 | 1 | 1 |
Invalid | − | − | − | − | 0 | 0 | 1 | 0 |
Invalid | − | − | − | − | 0 | 0 | 0 | 1 |
Stop | − | − | − | − | 0 | 0 | 0 | 0 |
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のとおりです。
5.3 ロジカルオペレーション
V9938では、LINE、PSET、LOGICAL MOVEなどのコマンドを実行するときに、指定したデータと画面上の色を演算することができます。演算(ロジカルオペレーション)は、コマンドを指定するときにR#46(Command register)の下位4ビットに同時に書き込みます。
表4.5 ロジカルオペレーションコード
演算名 | Operation(演算動作) | R#46(下位4ビット) | |||
IMP | DC=SC | 0 | 0 | 0 | 0 |
AND | DC=SC×DC | 0 | 0 | 0 | 1 |
OR | DC=SC+DC | 0 | 0 | 1 | 0 |
EOR | DC=SC×DC+SC×DC | 0 | 0 | 1 | 1 |
NOT | DC=SC | 0 | 1 | 0 | 0 |
− | 0 | 1 | 0 | 1 | |
− | 0 | 1 | 1 | 0 | |
− | 0 | 1 | 1 | 1 | |
TIMP | if SC=0 then DC=DC else DC=SC | 1 | 0 | 0 | 0 |
TAND | if SC=0 then DC=DC else DC=SC×DC | 1 | 0 | 0 | 1 |
TOR | if SC=0 then DC=DC else DC=SC+DC | 1 | 0 | 1 | 0 |
TEOR | if SC=0 then DC=DC else DC=SC×DC+SC×DC | 1 | 0 | 1 | 1 |
TNOT | if SC=0 then DC=DC else DC=SC | 1 | 1 | 0 | 0 |
− | 1 | 1 | 0 | 1 | |
− | 1 | 1 | 1 | 0 | |
− | 1 | 1 | 1 | 1 |
*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座標として指定できる最大値は、表示モードによって制限を受けます。
1.HMMC実行手順
1) V9938のコマンドレジスタに必要なパラメータをセットします。
DX | 転送先基準点 X座標 (0〜511) |
DY | 転送先基準点 Y座標 (0〜1023) |
NX | X方向転送ドット数(1〜512*1) |
NY | Y方向転送ドット数(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 実行フローチャート
5.4.2 YMMM(Y方向のVRAM問高速転送)
VRAM上のDX、SY、NY、DIX、DIYと画面の右端(または左端)で指定される領域をY軸方向(DYで指定)に転送するコマンドです。
1.YMMM実行手順
1) V9938のコマンドレジスタに必要なパラメータをセットします。
DY | 転送先基準点 Y座標 (0〜1023) |
DX | 転送元基準点 X座標 (0〜511) |
SY | 転送元基準点 Y座標 (0〜1023) |
NY | Y方向転送ドット数(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座標として設定できる最大値は表示モードによって制限を受けます。
1.HMMM実行手順
1) V9938のコマンドレジスタに必要なパラメータをセットします。
SX | 転送元基準点 X座標 (0〜511) |
SY | 転送元基準点 Y座標 (0〜1023) |
NX | X方向転送ドット数(1〜512*1) |
NY | Y方向転送ドット数(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座標として指定できる最大値は表示モードによって制限を受けます。
1.HMMV実行手順
1) V9938のコマンドレジスタに必要なパラメータをセットします。
NX | X方向転送ドット数(1〜512*1) |
NY | Y方向転送ドット数(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ドット単位で行われ、転送先のデータと演算することができます。
1.LMMC実行手順
1) V9938のコマンドレジスタに必要なパラメータをセットします。
DX | 転送先基準点 X座標 (1〜512*1) |
DY | 転送先基準点 Y座標 (1〜1024*2) |
NX | X方向転送ドット数(0〜511) |
NY | Y方向転送ドット数(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 実行フローチャート
5.4.6 LMCM(VRAM→CPU論理転送)
VRAMの矩形領域(X、Y座標上)のデータをCPUに転送するコマンドです。データの転送は1ドット単位で行われます。
1.LMCM実行手順
1) V9938のコマンドレジスタに必要なパラメータをセットします。
SX | 転送元基準点 X座標 (0〜511) |
SY | 転送元基準点 Y座標 (0〜1023) |
NX | X方向転送ドット数(1〜512*1) |
NY | Y方向転送ドット数(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 実行フローチャート
注意 |
- 「EXECUTE COMMAND」の前にTRをリセットする必要があるので、「V9938 SET UP」の中でステータスレジスタS#7をリードして下さい。
- 最後のデータがステータスレジスタS#7にセットされてTR=1となっていても、V9938内部ではコマンドは終了しCE=0となります。
5.4.7 LMMM(VRAM→VRAM論理転送)
VRAMからVRAMへ矩形の領域を転送するコマンドです。データの転送は1ドット単位で行われ、転送先のデータと論理演算することができます。
1.LMMM実行手順
1) V9938のコマンドレジスタに必要なパラメータをセットします。
SX | 転送元基準点 X座標 (0〜511) |
SY | 転送元基準点 Y座標 (0〜1023) |
NX | X方向転送ドット数(1〜512*1) |
NY | Y方向転送ドット数(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バイト単位で行われ、転送先のデータと論理演算をすることができます。
1.LMMV実行手順
1) V9938のコマンドレジスタに必要なパラメータをセットします。
NX | X方向転送ドット数(1〜512*1) |
NY | Y方向転送ドット数(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ドット単位で行われ、転送先のデータと論理演算することができます。
1.LINE実行手順
1) V9938のコマンドレジスタに必要なパラメータをセットします。
Maj | 長辺ドット数(0〜1023) |
Min | 短辺ドット数(0〜511) |
MAJ | 0=長辺は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(色コードのサーチ)
基準点から右(左)に境界色(または非境界色)をサーチするコマンドです。
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 実行フローチャート
5.4.11 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上の基準点の色コードを読み出すコマンドです。
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 コマンド終了時のレジスタの状態
コマンド名 | SX | SY | DX | DY | NX | NY | CLR | CMR H | CLR L | ARG |
HMMC | − | − | − | * | − | # | − | 0 | − | − |
YMMM | − | * | − | * | − | # | − | 0 | − | − |
HMMM | − | * | − | * | − | # | − | 0 | − | − |
HMMV | − | − | − | * | − | # | − | 0 | − | − |
LMMC | − | − | − | * | − | # | − | 0 | − | − |
LMCM | − | * | − | − | − | # | * | 0 | − | − |
LMMM | − | * | − | * | − | # | − | 0 | − | − |
LMMV | − | − | − | * | − | # | − | 0 | − | − |
LINE | − | − | − | * | − | − | − | 0 | − | − |
SRCH | − | − | − | − | − | − | − | 0 | − | − |
PSET | − | − | − | − | − | − | − | 0 | − | − |
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となります。