我是ASM的新手,我正在努力研究如何为以下代码创建延迟:
org $1000
loop: inc $d021
jmp loop
答案 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之后。如果它早先指向一个字节,那么八个 周期。前两个字节,九个周期等。设置跳转向量 可能需要一段时间,但延迟本身将顺利调整 从单个周期增量的七个周期到任何更高的值。旗 将被删除,但没有寄存器会受到影响。