setSprite2: ; 2番目のスプライトの座標更新サブルーチン lda Sprite1_X adc #8 ; 8ドット右にずらす sta Sprite2_X lda Sprite1_Y sta Sprite2_Y rtsそして、今までスプライト2の更新を行っていた2箇所を、以下のコードに差し替えます。
; 2番目のスプライト座標更新サブルーチンをコール jsr setSprite2ソースはこれです。jsrでサブルーチンへジャンプして、rtsでjsrの次の行に戻る仕組みということです。
上のnesasm010.asmをさらに改造しましょう。まず、割り込みベクタテーブルは以下のように直します。
.bank 1 ; バンク1に切り替える .org $FFFA ; $FFFAから開始 .dw mainLoop ; VBlank割り込みハンドラ(1/60秒毎にmainLoopがコールされる) .dw Start ; リセット割り込み。起動時とリセットでStartに飛ぶ .dw 0 ; ハードウェア割り込みとソフトウェア割り込みによって発生Startは、最初にNMI割り込み禁止にします。初期化中にmainLoopが実行されたらまずいからです。VBlank待ちも従来通り行います。 そして今までどおり初期化した後、以下のようにNMI割り込みを許可します。第3章で説明したとおり、$2000の7ビット目を1にします。
; PPUコントロールレジスタ1の割り込み許可フラグを立てる lda #%11001000 sta $2000$2000は書き込み専用レジスタなので、$2000をロードしてoraすることはできません。私は間違えてハマってしまいました。
そして、後は無限ループで待ちます。1/60秒毎に割り込みが発生して、mainLoopが呼び出されます。
infinityLoop: ; VBlank割り込み発生を待つだけの無限ループ jmp infinityLoop最後に、mainLoopの終わりに割り込み復帰命令を記述します。mainLoop処理が終わると、上のinfinityLoopに戻るようになります。
NOTHINGdown: ; 2番目のスプライト座標更新サブルーチンをコール jsr setSprite2 rti ; 割り込みから復帰VBlank割り込みに対応したソースがこれです。実行しても特に見た目は変わりませんが・・・。
SEO | [PR] 爆速!無料ブログ 無料ホームページ開設 無料ライブ放送 | ||