第9章 スプライトDMA


DMA転送

 今まで$2003と$2004のレジスタでスプライトを出力してきました。これではスプライトの数が増えてくると大変です。 しかしファミコンには、あらかじめ全てのスプライトデータを用意して、スプライトRAMに一気に送る方法があります。 それがスプライトDMAです。

 スプライトRAMの一つのスプライトデータは、4バイトで構成されることを第5章で説明しました。 ファミコンはスプライトを最大64個表示できます。4×64=256(10進数)=$100(16進数)の領域が必要になるので、 DMAでスプライトRAMに転送する$100分のRAMを確保します。どこに確保すれば良いのでしょうか?

第1章で、ユーザーが自由に使えるRAMは$0000〜$07FFまでと説明しました。$0000〜$00FFはゼロページなので使用したくはありません。 $0100〜$01FFはスタック領域です。というわけで、$0200以降をスプライト用のバッファにします。

スプライトDMAレジスタ

 まずは、RAM上にスプライト用の領域を確保します。以下の例では$0300番地からになっています。

	.bank 0			 ; バンク0
	.org $0300	 ; $0300から開始、スプライトDMAデータ配置
Sprite1_Y:     .db  0   ; スプライト#1 Y座標
Sprite1_T:     .db  0   ; スプライト#1 ナンバー
Sprite1_S:     .db  0   ; スプライト#1 属性
Sprite1_X:     .db  0   ; スプライト#1 X座標
Sprite2_Y:     .db  0   ; スプライト#2 Y座標
Sprite2_T:     .db  0   ; スプライト#2 ナンバー
Sprite2_S:     .db  0   ; スプライト#2 属性
Sprite2_X:     .db  0   ; スプライト#2 X座標

	.org $8000	 ; $8000から開始
Start:
	; プログラム本体はここから

 そして、DMA転送する予定のスプライトデータをを更新します。その後スプライトを更新したいタイミングで、$4014レジスタに転送するRAMのアドレスの百の位を書き込みます。 以下の例では、$0300番地からのスプライトデータをDMA転送しています。

	; スプライト描画(DMAを利用)
	lda #$3  ; スプライトデータは$0300番地からなので、3をロードする。
	sta $4014 ; スプライトDMAレジスタにAをストアして、スプライトデータをDMA転送する

 第8章のサンプルをスプライトDMAを利用するように直しました。これをダウンロードして、nesasm giko009.asmでアセンブルしてください。 8x8を2つつなげたスプライトを動かすことができます。
トップページ 前のページ 次のページ
SEO [PR] 爆速!無料ブログ 無料ホームページ開設 無料ライブ放送