私は ASM を初めて使用し、次のコードの遅延を作成する方法を試しています。
org $1000
loop: inc $d021
jmp loop
コメントは十分に明確だと思います。
フレームごとに色を変えるコードサンプル (1/50 秒)
sei ; enable interrupts
loop1: lda #$fb ; wait for vertical retrace
loop2: cmp $d012 ; until it reaches 251th raster line ($fb)
bne loop2 ; which is out of the inner screen area
inc $d021 ; increase background color
lda $d012 ; make sure we reached
loop3: cmp $d012 ; the next raster line so next time we
beq loop3 ; should catch the same line next frame
jmp loop1 ; jump to main loop
毎秒色を変えるコードサンプル
counter = $fa ; a zeropage address to be used as a counter
lda #$00 ; reset
sta counter ; counter
sei ; enable interrupts
loop1: lda #$fb ; wait for vertical retrace
loop2: cmp $d012 ; until it reaches 251th raster line ($fb)
bne loop2 ; which is out of the inner screen area
inc counter ; increase frame counter
lda counter ; check if counter
cmp #$32 ; reached 50
bne out ; if not, pass the color changing routine
lda #$00 ; reset
sta counter ; counter
inc $d021 ; increase background color
out:
lda $d012 ; make sure we reached
loop3: cmp $d012 ; the next raster line so next time we
beq loop3 ; should catch the same line next frame
jmp loop1 ; jump to main loop
コードがページ境界を越えないようにすることができる場合、有用なアプローチは、計算されたジャンプ アドレスを保持する RAM のどこかにバイトのペアを用意し、次のようなものへの間接ジャンプを使用することです。
TableStart:
cmp #$C9
cmp #$C9
cmp #$C9
cmp #$C9
cmp #$C9
...
TableEnd:
nop
ジャンプ ベクトルが tableEnd を指している場合、コードは 7 サイクル後に NOP の後の命令に到達します。1 バイト早く指している場合は、8 サイクル。2 バイト前、9 サイクルなど。ジャンプ ベクトルの設定には少し時間がかかる場合がありますが、遅延自体は 7 サイクルから 1 サイクル単位でより高い値までスムーズに調整できます。フラグは破棄されますが、レジスターは影響を受けません。
これはどう?これにより背景が変更され、4 秒待ってから再度変更されます。永遠に繰り返します。
秒数は 0 から 255 までの任意の値に変更できることに注意してください。
これはマシン用ですが、をにNTSC
変更できます。60
50
PAL
main:
inc $D021
ldx #4 // Wait 4 seconds
loop1:
ldy #60
loop2:
waitvb:
bit $D011
bpl waitvb
waitvb2:
bit $D011
bmi waitvb2
dey
bne loop2
dex
bne loop1
jmp main
例えば:
loop: ldx $d021
inx
stx $d021
cpx #100
bne loop