3

私は ASM を初めて使用し、次のコードの遅延を作成する方法を試しています。

org $1000

loop: inc $d021
    jmp loop
4

4 に答える 4

7

コメントは十分に明確だと思います。

フレームごとに色を変えるコードサンプル (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
于 2014-02-10T03:17:35.537 に答える
0

コードがページ境界を越えないようにすることができる場合、有用なアプローチは、計算されたジャンプ アドレスを保持する RAM のどこかにバイトのペアを用意し、次のようなものへの間接ジャンプを使用することです。

TableStart:
    cmp #$C9
    cmp #$C9
    cmp #$C9
    cmp #$C9
    cmp #$C9
    ...
TableEnd:
    nop

ジャンプ ベクトルが tableEnd を指している場合、コードは 7 サイクル後に NOP の後の命令に到達します。1 バイト早く指している場合は、8 サイクル。2 バイト前、9 サイクルなど。ジャンプ ベクトルの設定には少し時間がかかる場合がありますが、遅延自体は 7 サイクルから 1 サイクル単位でより高い値までスムーズに調整できます。フラグは破棄されますが、レジスターは影響を受けません。

于 2016-05-18T18:00:20.523 に答える
0

これはどう?これにより背景が変更され、4 秒待ってから再度変更されます。永遠に繰り返します。

秒数は 0 から 255 までの任意の値に変更できることに注意してください。

これはマシン用ですが、をにNTSC変更できます。6050PAL

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
于 2016-05-02T18:54:09.340 に答える
0

例えば:

loop: ldx $d021
      inx
      stx $d021
      cpx #100
      bne loop
于 2014-02-09T07:47:29.977 に答える