等待$ D012的更改(C64汇编程序)

时间:2013-09-15 10:20:06

标签: assembly 6502 c64

我在仿真C64机器上玩asm时遇到了一些问题。

我想要做的是检查键盘上的键“N”是否被按下,然后程序应该等待更改显示在地址$ D012上。现在我不明白的是我如何“等待”改变出现?有人能告诉我它的全部意义吗?

检查键盘上的N按钮是否按下很简单 - 只需使用子程序FFE4(输入)和FFD2(输出)。

我真的不想要为我做任何事情,但如果我能得到一些关于D012如何工作以及如何“等待”改变的快速信息,我会非常感激。

提前致谢!

2 个答案:

答案 0 :(得分:4)

$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

答案 1 :(得分:2)

您可以使用栅格IRQ处理程序响应$d012中的更改。我会从我的游戏代码中引入一些细节,因为如果你使用错误的咒语组合,这可能很麻烦。这也应该给你足够的东西谷歌。

特别是,您可能希望在代码提及的$0314中安装int处理程序,在这种情况下,您的IRQ处理程序将与commie自己的默认处理程序链接,您需要跳过{位于处理程序开头的{1}}位。如果您需要使用它的一些I / O代码,这可能很有用。

pha ... pha

然后你就像这样处理这些中断:

;;; -----------------------------------------------------------------------------
;;; 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