MSX Datapack wiki化計画

6章 スプライトの変更点

  • 追加された行はこのように表示されます。
  • 削除された行はこのように表示されます。
,{t},{BSIZE:1 0|SIZE:100%}
,{BSIZE:0}←[[5章 V9938のコマンド]]                                                            ,{BSIZE:0|RIGHT}[[7章 その他の機能]]                                                              →

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

{{svg 図4.47.svg}}
*スプライトのY座標の最上端の座標は255です。
'''図4.47 スプライト表示面'''

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

,{t},{BSIZE:0 0}
,{c},{BSIZE:0|SIZE:50},{BSIZE:0|SIZE:160},{BSIZE:0|SIZE:300}
,,■スプライトモード1,SCREEN 1〜3
,,                   ,GRAPHIC 1、GRAPHIC 2、MULTI COLOR
,,■スプライトモード2,SCREEN 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のスプライトモードと互換性があります。
{{svg 図4.48.svg}}
'''図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

{{svg 図P558-1.svg}}

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

{{svg 図P558-2.svg}}

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バイトのデータを書き込みます。

{{svg 図4.49.svg}}
'''図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ドットずつ出現させることができます。

{{svg 図4.50.svg}}
'''図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個のパターンが対応します。
 
{{svg 図4.51.svg}}
'''図4.51 スプライトモード1のパターンジェネレータテーブル'''


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

{{svg 図4.52.svg}}
'''図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との互換性はありません。

{{svg 図4.53.svg}}
'''図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) スプライトの表示

{{svg 図P563.svg}}

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

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

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

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

{{svg 図4.54.svg}}
'''図4.54 VRAM上の各テーブルの関係'''


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

{{svg 図4.55.svg}}
'''図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個のパターンを指定することができます。

{{svg 図P566.svg}}


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

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


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

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

{{svg 図4.56.svg}}
'''図4.56 スプライトの組み合わせ'''


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

{{svg 図4.57.svg}}
'''図4.57 カラーテーブルのCCビット'''

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

{{svg 図4.58.svg}}
'''図4.58 スプライトの重ね合わせ例'''

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

{{svg 図P569-1.svg}}

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

 ステータスレジスタ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モード時のスプライトの色'''
,{t},{BSIZE:2 0}
,{c BSE},{BSIZE:0 1 0 0|CENTER|SIZE:40}
,{c BSC},{BSIZE:0 0 0 0|CENTER|SIZE:40}
,{c BS1},{BSIZE:0 0 1 0|CENTER|SIZE:40}
,{c BS2},{BSIZE:0 1 1 0|CENTER|SIZE:40}
,{c BS0},{BSIZE:0|CENTER}
,{c},{BSE},,,, {BSE},,, {BSE},,, {BS0},,
,COLOR CODE{COLS:4},,,,GREEN{COLS:3},,,RED{COLS:3},,,BLUE{COLS:3},,
,{c},{BS1},{BS1},{BS1},{BS2}, {BS1},{BS1},{BS2}, {BS1},{BS1},{BS2}, {BS1},{BS1},{BS1}
,C3,C2,C1,C0, G2,G1,G0, R2,R1,R0, B2,B1,B0
,{c},{BS0},{BS0},{BS0},{BSE}, {BS0},{BS0},{BSE}, {BS0},{BS0},{BSE}, {BS0},{BS0},{BS0}
, 0, 0, 0, 0,  0, 0, 0,  0, 0, 0,  0, 0, 0
, 0, 0, 0, 1,  0, 0, 0,  0, 0, 0,  0, 1, 0
, 0, 0, 1, 0,  0, 0, 0,  0, 1, 1,  0, 0, 0
, 0, 0, 1, 1,  0, 0, 0,  0, 1, 1,  0, 1, 0
, 0, 1, 0, 0,  0, 1, 1,  0, 0, 0,  0, 0, 0
, 0, 1, 0, 1,  0, 1, 1,  0, 0, 0,  0, 1, 0
, 0, 1, 1, 0,  0, 1, 1,  0, 1, 1,  0, 0, 0
, 0, 1, 1, 1,  0, 1, 1,  0, 1, 1,  0, 1, 0
, 1, 0, 0, 0,  1, 0, 0,  1, 1, 1,  0, 0, 0
, 1, 0, 0, 1,  0, 0, 0,  0, 0, 0,  1, 1, 1
, 1, 0, 1, 0,  0, 0, 0,  1, 1, 1,  0, 0, 0
, 1, 0, 1, 1,  0, 0, 0,  1, 1, 1,  1, 1, 1
, 1, 1, 0, 0,  1, 1, 1,  0, 0, 0,  0, 0, 0
, 1, 1, 0, 1,  1, 1, 1,  0, 0, 0,  1, 1, 1
, 1, 1, 1, 0,  1, 1, 1,  1, 1, 1,  0, 0, 0
, 1, 1, 1, 1,  1, 1, 1,  1, 1, 1,  1, 1, 1

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

,{t},{BSIZE:0}
,{c},{BSIZE:0|SIZE:20},{BSIZE:0|SIZE:60},{BSIZE:0}
,,TP=0,カラーコード0は透明として扱われる
,,    ,スプライトのカラーコード0で指定された部分は表示されず、他のスプライトと重なっても衝突は発生しません。
,,TP=1,カラーコード0はパレットレジスタで指定された色になる(GRPAHIC7のときのみ、固定色R=0、G=0、B=0にセットされる)
,,TP=1,カラーコード0はパレットレジスタで指定された色になる(GRAPHIC7のときのみ、固定色R=0、G=0、B=0にセットされる)
,,    ,スプライトのカラーコード0で指定された部分は表示され、他のスプライトと重なると衝突を発生します。


 ※修正
 6.1.2 スプライトモード1の表示
   1) スプライトのサイズ……R#1のビット1 が抜けている(以下番号繰り下げ)

,{t},{BSIZE:1 0|SIZE:100%}
,{BSIZE:0}←[[5章 V9938のコマンド]]                                                            ,{BSIZE:0|RIGHT}[[7章 その他の機能]]                                                              →