Я новичок в ASM и пытаюсь понять, как создать задержку для следующего кода:
org $1000
loop: inc $d021
jmp loop
Я новичок в 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
Например:
loop: ldx $d021
inx
stx $d021
cpx #100
bne loop
Как насчет этого? Это должно изменить фон, подождите 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
Если вы можете гарантировать, что код не пересекает границу страницы, полезный подход состоит в том, чтобы иметь пару байтов где-то в ОЗУ, которые будут содержать вычисленный адрес перехода, и использовать косвенный переход в что-то вроде следующего:
TableStart:
cmp #$C9
cmp #$C9
cmp #$C9
cmp #$C9
cmp #$C9
...
TableEnd:
nop
Если вектор перехода указывает на tableEnd, код достигнет инструкции после NOP через семь циклов. Если он указывает на один байт раньше, восемь циклов. Два байта раньше, девять циклов и т. д. Установка вектора перехода может занять некоторое время, но сама задержка будет плавно регулироваться от семи циклов до любого более высокого значения с шагом в один цикл. Флаги будут удалены, но никакие регистры не будут затронуты.
$d012
. - person Michael   schedule 09.02.2014$d012
не изменится 320*50 раз, или используйте растровое прерывание, при котором вы считаете кадры. - person Michael   schedule 09.02.2014