Chapter.4 スプライト形状の初期化ルーチン製作
[Chapter4 制作物]

今回は、スプライト形状の初期化処理を test.bas から取り除き、アセンブラ部へ移します。

■スプライト形状の定義方法
スプライトの形状は、VRAM上に用意されているスプライトジェネレーターテーブルに書き込むことで
定義することが出来ます。
SCREENモードによって、スプライトジェネレータテーブルのアドレスは異なりますが、
このゲームでは、SCREEN4 を使用していますので、VRAM上の 0x3800 番地になります。

例によって BIOSルーチン LDIRVM を使うことで、メモリ上に用意した形状データを一気に転送してしまうことにします。
転送するルーチンを、sca_sprite.asm に追記しました。追記した部分をプログラム1に示します。

プログラム1. スプライト形状データを VRAM へ転送する
; -----------------------------------------------------------------------------
;	スプライト形状を初期化
;	input:
;		なし
;	output
;		なし
;	break
;		全て
;	comment
;		なし
; -----------------------------------------------------------------------------
sprite_pattern_init::
		ld	hl, #sprite_pattern
		ld	de, #SPRITE_GENERATOR
		ld	bc, #(8*4*3)
		jp	LDIRVM
		

スプライトアトリビュートテーブルの転送と同じですね。
bc の定数計算は、16x16ドットのスプライトは、8x8ドットスプライト4つ分のサイズとなる形状データを持っていて、
その形状定義を自機用2枚(2枚重ね合わせるため)、自機弾用1枚で、合計3枚定義することから、8*4*3 となっています。

sprite_pattern は、プログラム2 に示す形状データです。
これも sca_sprite.asm の最後の方に追記してあります。

プログラム2. スプライト形状データ
; -----------------------------------------------------------------------------
sprite_pattern:
		.db		#0x00, #0x01, #0x00, #0x03, #0x03, #0x03, #0x03, #0x07
		.db		#0x67, #0x7F, #0x6F, #0x6F, #0x63, #0x3D, #0xC4, #0x03
		.db		#0x00, #0x80, #0x80, #0x40, #0x40, #0xC0, #0xC0, #0xE0
		.db		#0x6A, #0x72, #0x7A, #0x7A, #0x42, #0x7A, #0x46, #0x80

		.db		#0x01, #0x03, #0x03, #0x06, #0x06, #0x04, #0x04, #0x4C
		.db		#0xCE, #0xCF, #0xDF, #0xDF, #0xDF, #0xC3, #0x03, #0x00
		.db		#0x00, #0x00, #0x00, #0x80, #0x80, #0x00, #0x00, #0x04
		.db		#0x84, #0xAC, #0xBC, #0xBC, #0xBC, #0x84, #0x80, #0x00

		.db		#0x00, #0x20, #0x70, #0x70, #0x70, #0x70, #0x70, #0x70
		.db		#0x70, #0x30, #0x60, #0x20, #0x40, #0x20, #0x00, #0x00
		.db		#0x00, #0x08, #0x1C, #0x1C, #0x1C, #0x1C, #0x1C, #0x1C
		.db		#0x1C, #0x0C, #0x18, #0x08, #0x10, #0x08, #0x00, #0x00
		

■初期化処理の修正
ルーチンを作っただけでは動きません。
test_main.asm を修正して、初期化時にスプライト形状を初期化するルーチン sprite_pattern_init を呼び出すようにます。

プログラム3 が、冒頭部分の追記。
プログラム4 が、BASICからUSR(11) が呼ばれた場合に処理するように追記した部分。

プログラム3. スプライト形状データ
	.globl	sprite_pattern_init
		

プログラム4. スプライト形状データ
		; 11 なら sprite_pattern_init のテスト
		dec		a
		jp		z, sprite_pattern_init
		

これでアセンブラ部分の修正が完了です。
実際の初期化処理は、BASICプログラムである test.bas の中に記述してあります。
初期化処理と行っても、アセンブラ部の初期化ルーチンを順次呼び出しているだけなので、この中にスプライト形状初期化の呼び出し(USR(11))を
追加すれば良いだけです。

そのあたりの修正を加えて、更に BASIC 内のスプライト形状初期化処理を削除した test.bas がプログラム5です。

プログラム5. 新しい test.bas
100 CLEAR 200,&HC000:DEFINTA-Z:COLOR15,4,7:SCREEN4,2,0
110 BLOAD "CHAPTER4.BIN"
120 DEFUSR=&HC000
130 A=USR(0)+USR(2)+USR(3)+USR(4)+USR(9)+USR(11)
140 PUTSPRITE0,,1:PUTSPRITE1,,&H4E:PUTSPRITE2,,10:PUTSPRITE3,,10:PUTSPRITE4,,10:S=0
150 '
160 A=USR(1)+USR(5)+USR(6)+USR(7)
170 IF S=0 THEN IF STRIG(0) OR STRIG(1) THEN S=1:A=USR(8) ELSE ELSE S=STRIG(0) OR STRIG(1)
180 A=USR(10)
190 GOTO 160
		

スプライト形状データの DATA 文が無くなったので、だいぶシンプルになりましたね。
行番号 130 に USR(11) が追加されているのも分かると思います。


今回はこのくらいです。
次回は、敵の動作ルーチンを作成します。


[▲トップページへ]