MSX Datapack wiki化計画

6章 スプライト

 V9938は32個のスプライトを表示することができます。スプライトは8×8または16×16ドットの大きさです。また、横方向の1ドットの大きさは表示モードにかかわらず画面の1/256で、画面上の任意の位置に表示することができます。
 スプライトは独立した表示面を持っており、他の表示面のデータには影響を及ぼしません。


  • スプライトのY座標の最上端の座標は255です。

図4.47 スプライト表示面

 V9938には2種類のスプライト表示モードがあります。この2種類のモードは、画面表示モードによって自動的に選択されます。

■スプライトモード1SCREEN 1〜3
GRAPHIC 1、GRAPHIC 2、MULTI COLOR
■スプライトモード2SCREEN 4〜8
GRAPHIC 3〜7

 6.1 スプライトモード1

 スプライトモード1はTMS9918のスプライトと同機能で、GRAPHIC1、2、MULTICOLORモード(SCREEN 1〜3)で使うことができます。

6.1.1 スプライトモード1の特徴

 32個のスプライトには各々に#0〜#31までの番号がつけられており、番号の若い方が優先度が高くなります。CRTの1水平線上には優先度の高い順に4個表示され、5番目以降のスプライトは表示されません。
 スプライトモード1はTMS9918のスプライトモードと互換性があります。

図4.48 スプライトモード1の最大表示数

 2個のスプライトが衝突した(パターン1の部分が重なった)ときは、ステータスレジスタS#0のビット5が「1」になるので、衝突の発生を知ることができます。
 また、1水平線上に5個以上のスプライトが並んだときには、ステータスレジスタS#0のビット6が「1」になり、S#0の下位5ビットに5番目のスプライトの番号がセットされます。

6.1.2 スプライトモード1の表示

 スプライトを表示するには、次の操作を行います。

1) スプライトのサイズ……R#1のビット1


2) スプライトの拡大……R#1のビット0


3) スプライトパターンジェネレータテーブルのセット
 VRAM上のスプライトパターンジェネレータテーブルに、スプライトのパターンをセットします(#0〜#255)

4) スプライトアトリビュートテーブルのセット
 VRAM上のスプライトアトリビュートテーブルに、スプライトの座標、スプライトのパターン番号と色をセットします(#0〜#31)。

6.1.3 スプライトアトリビュートテーブル

 32個あるスプライトの各々の表示位置(X、Y)、色、パターン番号などを指定するためのVRAMの領域です。この領域の先頭アドレスはR#5とR#11(Sprite attribute table base address register)で指定します。スプライト1個につき4バイトのデータを書き込みます。


図4.49 スプライトモード1のアトリビュートテーブル

1) Y座標 (0〜255)
 スプライトのY座標を指定します。
 このY座標の値を208にすると、そのスプライトより優先度の低いスプライトは表示されません。例えば、#10のスプライトのY座標を208にすると、#10〜#31のスプライトは表示されません。

2) X座標 (0〜255)
 スプライトのX座標を指定します。

3) パターン番号 (0〜255)
 スプライトパターンジェネレータテーブル上のパターン番号を指定します。スプライトのサイズが16×16のときは、4個のパターン番号を1個のスプライトに使用しますが、このうちどれを指定しても構いません。
 スプライトのサイズを8×8に指定した場合は256個のパターンを、16×16に指定した場合は64個のパターンを指定することができます。

4) カラーコード (0〜15)
 スプライトパターンのビットが「1」の部分の色を指定します。「0」の部分は透明です。

5) EC (Early Clock)
 このビットが「1」のとき、スプライトの表示は32ドット左にシフトされます。この機能を使うと、スプライトを画面の左端から1ドットずつ出現させることができます。


図4.50 アトリビュートテーブルのECビット

6.1.4 スプライトパターンジェネレータテーブル

 スプライトのパターン(形)を指定するためのVRAMの領域です。この領域の先頭アドレスはR#16(Sprite pattern genetator table base address register)で指定します。
 この領域には、8バイトで1単位のパターンを最大256個書き込むことができます。これらのパターンには#0〜#255までの番号がつけられており、スプライトのサイズが8×8ドットの時はスプライト1個に対して1個のパターンが対応し、16×16ドットのときはスプライト1個に対して4個のパターンが対応します。
 

図4.51 スプライトモード1のパターンジェネレータテーブル

6.1.5 スプライトパターンジェネレータテーブルデータセット例


図4.52 スプライトパターンジェネレータテーブルの例

 スプライトのサイズを16×16とした場合、スプライトアトリビュートテーブルで指定するパターン番号は#0〜#3のどれでもかまいません。

 6.2 スプライトモード2

 スプライトモードはV9938で新たに追加された機能で、GRAPHIC 3〜7モード(SCREEN 4〜8)で使うことができます。

6.2.1 スプライトモード2の特徴

 32個のスプライトには各々に#0〜#31までの番号がつけられており、番号の若い方が優先度が高くなります。CRTの1水平線上には優先度の高い順に 8個表示され、9番目以降のスプライトの重なった部分は表示されません。
 スプライトモード2はTMS9918との互換性はありません。


図4.53 スプライトモード2の最大表示数

 2個のスプライトが衝突した(透明でない部分が重なった)ときは、ステータスレジスタS#0のビット5が1になるので、衝突の発生を知ることができます。このときの衝突座標は、ステータスレジスタ#3〜#5にセットされます。
 1水平線上に9個以上のスプライトが並んだときは、ステータスレジスタS#0のビット6が1になり、S#0の下位5ビットに9番目のスプライトの番号がセットされます。
 スプライトの色は1水平線ごとに指定できます。
 スプライトカラーテーブルのCCビットを指定することによって、スプライトを組み合わせて使えます。これにより横方向の色をより多く指定することができます。

6.2.2 スプライトモード2の表示

 スプライトを表示するには、次の操作を行います。

1) スプライトのサイズ
 スプライトモード1と同じです。

2) スプライトの拡大
 スプライトモード1と同じです。

3) スプライトの表示


4) スプライトパターンジェネレータテーブルのセット
 VRAM上のスプライトパターンジェネレータテーブルに、スプライトのパターンをセットします(#0〜#255)

5) スプライトカラーテーブルのセット
 VRAM上のスプライトカラーテーブルに、スプライト色、EC、CC、ICを1ラインずつセットします。

6) スプライトアトリビュートテーブルのセット
 VRAM上のスプライトアトリビュートテーブルに、スプライトの座標、スプライトのパターン番号と色をセットします(#0〜#31)。

6.2.3 VRAM上の各テーブルの関係


図4.54 VRAM上の各テーブルの関係

6.2.4 スプライトアトリビュートテーブル

 32個あるスプライトの各々の表示位置(X、Y)、色、パターン番号を指定するためのVRAMの領域です。スプライト1個につき3バイトのデータを書き込みます。


図4.55 スプライトモード2のアトリビュートテーブル

1) Y座標 (0〜255)
 スプライトのY座標を指定します。
 このY座標の値を216にすると、そのスプライトより優先度の低いスプライトは表示されません。たとえば、#10のスプライトのY座標を216にすると、#10〜#31のスプライトは表示されません。

2) X座標 (0〜255)
 スプライトのX座標を指定します。

3) パターン番号 (0〜255)
 スプライトパターンジェネレータテーブル上のパターン番号を指定します。スプライトのサイズが16×16のときは、4個のパターン番号を1個のスプライトに使用しますが、このうちどれを指定しても構いません。
 スプライトのサイズを8×8に指定した場合は256個のパターンを、16×16に指定した場合は64個のパターンを指定することができます。


6.2.5 スプライトパターンジェネレータテーブル

 スプライトモード1と同じです。

6.2.6 スプライトカラーテーブル

 スプライトモード2では、32個のスプライトの各ラインごとにパターン1の部分の表示色(0の部分は透明に固定)、優先順位の有無、衝突検出の有無、EC(Early Clock)の指定をすることができます。
 スプライトカラーテーブルの先頭アドレスは、スプライトアトリビュートテーブルの先頭アドレスの値から512を引いた値に自動的にセットされます。


図4.56 スプライトの組み合わせ

6.2.7 スプライトの組み合わせ

 スプライトモード2において、カラーテーブルのCCビットを「1」にすると、スプライトの優先順位をなくすことができます。
 CCを「1」に指定した部分(1ラインごと)は、そのスプライトより若い番号で、かつCCが「0」のスプライトの存在する水平線上にのみ表示されます。この様子を図示したものが図4.57です。
 このときも、スプライトが1水平線上に8個を超えると、9個目のスプライトは表示されません。


図4.57 カラーテーブルのCCビット

 CCを「1」に指定した部分は、そのスプライトより若い番号で、かつ最もそのスプライトに番号が近いスプライトのCC=0の部分とは、たとえパターンが重なっても衝突の検出は行われません。また、重なった部分は各スプライトの色コードのORを取って表示されます。


図4.58 スプライトの重ね合わせ例

スプライトの衝突

 スプライトの表示色が透明でなく、かつCCが「0」の部分が重なると衝突が発生します。衝突が発生するとステータスレジスタS#0のビット5が「1」になります。このビットはS#0を読み出すことによってリセットされます。


 このとき、レジスタR#8のマウスフラグ(MS)またはライトペンフラグ(LP)がセットされていなければ(MSXではセットされることはない)、ステータスレジスタS#3〜S#6にスプライトの衝突座標がセットされます。
 

 ステータスレジスタS#3〜S#6はS#5を読み出したときにリセットされます。また、ステータスレジスタS#3〜S#6にセットされる値には、実際の衝突座標に対して次式のようなオフセットがつけられています。

実際の衝突座標 (XC, YC)
      X=XC+12    Y=YC+8     X=(S#4,S#3)
                            Y=(S#6,S#5)

 6.3 スプライトの色設定

 GRAPHIC 7(SCREEN 8)以外の表示モードでは、スプライトの色コードは各モードの色コードと共通です。つまり、スプライトの画面上での表示色はパレットレジスタの値で決定されます。
 GRAPHIC 7(SCREEN 8)モードにおいてはスプライトの表示色は固定されており、パレットレジスタの影響を受けます。GRAPHIC 7モードにおけるスプライトの色を表4.7に示します。

表4.7 GRAPHIC 7モード時のスプライトの色

COLOR CODEGREENREDBLUE
C3C2C1C0G2G1G0R2R1R0B2B1B0
0000000000000
0001000000010
0010000011000
0011000011010
0100011000000
0101011000010
0110011011000
0111011011010
1000100111000
1001000000111
1010000111000
1011000111111
1100111000000
1101111000111
1110111111000
1111111111111

TPとスプライト
 TP(レジスタR#8のビット 5)を操作することにより、カラーコード0は次のように定義され、スプライトもその影響を受けます。

TP=0カラーコード0は透明として扱われる
スプライトのカラーコード0で指定された部分は表示されず、他のスプライトと重なっても衝突は発生しません。
TP=1カラーコード0はパレットレジスタで指定された色になる(GRAPHIC7のときのみ、固定色R=0、G=0、B=0にセットされる)
スプライトのカラーコード0で指定された部分は表示され、他のスプライトと重なると衝突を発生します。
※修正
6.1.2 スプライトモード1の表示
  1) スプライトのサイズ……R#1のビット1 が抜けている(以下番号繰り下げ)