[英]Waiting for a change on $D012 (C64 assembler)
我在仿真C64机器上玩asm时遇到了一些问题。
我想要做的是检查键盘上的键“N”是否被按下,然后程序应该等待更改显示在地址$ D012上。 现在我不明白的是我如何“等待”改变出现? 任何人都可以告诉我它的全部意义吗?
检查键盘上的N按钮是否按下很简单 - 只需使用子程序FFE4(输入)和FFD2(输出)。
我真的不想要为我做任何事情,但如果我能得到关于D012如何工作以及如何“等待”改变的快速信息,我将非常感激。
提前致谢!
$d012
包含当前的栅格线。
如果你只需要等到寄存器改变,那就等到下一个栅格线,你可以做简单的忙等待:
lda $d012 ;load the current raster line into the accumulator
cmp $d012 ;check if it has changed
beq *-3 ;if not, jump back and check again
编辑:
如果要等待多个栅格线,例如3:
lda $d012
clc ;make sure carry is clear
adc #$03 ;add lines to wait
cmp $d012
bne *-3 ;check *until* we're at the target raster line
您可以使用栅格IRQ处理程序响应$d012
的更改。 我会从我的游戏代码中引入一些细节,因为如果你使用错误的咒语组合,这可能很麻烦。 这也应该给你足够的东西谷歌。
特别是,您可能希望在代码提及中查看在$0314
中安装int处理程序,在这种情况下,您的IRQ处理程序将使用commie自己的默认处理程序进行链接,并且您需要跳过此处的pha ... pha
位。你的处理程序的开始。 如果您需要使用它的一些I / O代码,这将非常有用。
;;; -----------------------------------------------------------------------------
;;; install raster interrupt handler
;;; -----------------------------------------------------------------------------
sei ; turn off interrupts
ldx #1 ; enable raster interrupts
stx $d01a
lda #<int_handler ; set raster interrupt vector
ldx #>int_handler
sta $fffe
stx $ffff
ldy #$f0 ; set scanline on which to trigger interrupt
sty $d012
lda $d011 ; scanline hi bit
and #%01111111
sta $d011
lda #$35 ; disable kernal and BASIC memory ($e000 - $ffff)
sta $01
asl $d019 ; acknowledge VIC interrupts
cli
loop_pro_semper
jmp loop_pro_semper
然后你像这样处理这些中断:
;;; -----------------------------------------------------------------------------
;;; raster IRQ handler
;;; -----------------------------------------------------------------------------
int_handler
pha ; needed if our raster int handler is set in fffe instead of 0314
txa
pha
tya
pha
; ... do your stuff here ...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.