■
忘れそうなので、とりあえず、普通のスプライトを出すメモだけ残しておこう
RAM 上にディスプレイリストテーブルを予め用意して、
Suzy(グラフィックコントローラーチップ)を発破する。
各テーブルは、リンクアレイチェーン形式となり、
フォーマットは SCB: ラベル以下の通り
SCB:
.dc.b $c4,$10,$20 ;SPRCTL0,SPRCTL1,SPRCOLL
.dc.w SCB2,Bitmap ;次のテーブルへのアドレス,画像データアドレス
.dc.w 0,0 ;X座標値,Y座標値
.dc.w $100,$100 ;横拡大率,縦拡大率
.dc.b $01,$23,$45,$67,$89,$ab,$cd,$ef ;パレット変換テーブルSCB2:
.dc.b $c4,$10,$20
.dc.w NULL,Bitmap2
.dc.w 12,55
.dc.w $100,$100
.dc.b $01,$23,$45,$67,$89,$ab,$cd,$efBitmap:
.dc.b ・・・・・・・ ;画像データ
Bitmap2:
.dc.b ・・・・・・・ ;画像データ
- -
SPRCTL0 : スプライトコントロール0
B7,B6 = bits/pixel-1 (1,2,3,4)
B5 = H flip, 0 = not flipped
B4 = V flip, 0 = not flipped
B3 reserved
B2,B1,B0 = Sprite Type
7 -> shadow
6 -> exclusive-or, shadow
5 -> non-collidable
4 -> normal
3 -> boundary
2 -> boundary-shadow
1 -> background-no collision
0 -> background, shadowつまり、ごく一般的なスプライトを使用するなら、0xc4 で良い
- -
SPRCTL1 : スプライトコントロール1
B7 = literal attribute, 0=normal, 1=totally literal
B6 = Sizing algorithm choice, 0=adder (algo 4), 1=shifter (algo 3)
SET IT T0 ZERO!!!!, algo 3 is broke
※ハードのバグがあるらしく、Bit6 を 1 にしてはいけないらしいB5,B4 = Reloadable depth.
0=none.
1=Hsize,Vsize.
2=Hsize,Vsize,Stretch.
3=Hsize, Vsize,Stretch, Tilt.B3 = Palette re-load. 0=reload the palette, 1 use existing palette.
B2 = Skipsprite. 1 skip this sprite, 0=use this sprite.
B1 = Start drawing up (1=up, 0=down)
B0 = Start drawing left (1 left, 0=right)拡大縮小だけサポートするなら、0x10 となる
- -
SPRCOLL
ハードウェアでのスプライト自動衝突検出を行うためのフラグ。
とりあえず、今回は考えないことにするので、
$20 に固定にしておけばよいみたい
- -
次のテーブルへのアドレス
次の SCB(スプライトコントロールブロック=ディスプレイリスト)
へのリンクアドレスを設定する
NULL(ゼロ)を指定すると、終端 SCB となる。
- -
画像データアドレス
sprpack.exe にて作成された圧縮グラフィックデータを
格納した場所を指定する。画像データは、RAM上になくてはならない。
- -
X座標値,Y座標値
その名の通り。ただし、スプライトの左上ではなく、
中心点が基準となる。
- -
横拡大率,縦拡大率
その名の通り。小数部8ビットの固定少数値となり、
0x100 で 100%となり、最大で 0x200(200%)まで指定可能。
- -
パレット変換テーブル
通常は例のままにしておけばよい。
ここで、リアルタイムに、カラーインデックスに対する
パレット番号を変換するためのテーブルを指定できる。
たとえば、スト2みたいに、色違いだけのキャラを
表示させたい時には、ここをいじるだけで、
同じ画像データを使いまわすことも可能。
- -
その他
発破(一括描画開始)のかけ方
■Lyxass(アセンブラ)
SHOW というマクロが用意されているので、それを使う。
sprite_scb
dc.b $C4,$10,$20
dc.w 0
dc.w spritebuf
dc.w 0,0
dc.w $100,$100
dc.b $01,$23,$45,$67,$89,$AB,$CD,$EFspritebuf:
.dc.b ・・・・・・ ;画像データ
■CC65(Cコンパイラ)
やはり、マクロが用意されているので、以下のような感じで、
SCB テーブル内のデータを書き換えたりできる。
そして、DrawSprite マクロで発破をかけるextern char Bitmap2; // 画像データをオブジェクトファイル化して外部参照しているの意味
extern char SCB1[];
#asm
_SCB1 dc.b $c4,$10,$20
dc.w 0,_Bitmap2
dc.w 0,0,$100,$100
dc.b $01,$23,$45,$67,$89,$Ab,$cd,$ef
#endasm:
:void foo(){
SCBX(SCB1) = 40;
SCBY(SCB1) = 51;
DrawSprite(SCB1);}
■補足
SHOW や DrawSprite は 1Int 内で何回でも発行してもよい
故に、SCB 内のリンクアドレス部分は、0 を指定すると、
とりあえず、そこで一括表示を一時停止という意味合いとなる。