第９章

## 第９章　スプライトDMA

### DMA転送

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

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

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

### スプライトDMAレジスタ

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

    	.bank 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転送する

第８章のサンプルをスプライトDMAを利用するように直しました。これをダウンロードして、nesasm giko009.asmでアセンブルしてください。 8x8を２つつなげたスプライトを動かすことができます。

トップページ 前のページ 次のページ

FC2 |  | キャッシング 花 | 無料 掲示板 無料ホームページ