如何为MOS 6502创建asm延迟

时间:2014-02-09 07:43:38

标签: assembly delay 6502

我是ASM的新手,我正在努力研究如何为以下代码创建延迟:

org $1000

loop: inc $d021
    jmp loop

4 个答案:

答案 0 :(得分:6)

我猜是很清楚。

每帧(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

答案 1 :(得分:0)

例如:

loop: ldx $d021
      inx
      stx $d021
      cpx #100
      bne loop

答案 2 :(得分:0)

这个怎么样?这应该改变背景,等待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

答案 3 :(得分:0)

如果你能确保代码不跨越页面边界,一个有用的方法是在RAM的某处有一对字节,它将保存一个计算的跳转地址,并使用间接跳转到类似于以下内容:

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

如果跳转向量指向tableEnd,代码将到达指令 经过七个周期后的NOP之后。如果它早先指向一个字节,那么八个 周期。前两个字节,九个周期等。设置跳转向量 可能需要一段时间,但延迟本身将顺利调整 从单个周期增量的七个周期到任何更高的值。旗 将被删除,但没有寄存器会受到影响。