Assembly 如何改变Commodore 64中的内核SCNKEY常规行为

Assembly 如何改变Commodore 64中的内核SCNKEY常规行为,assembly,kernel,6502,c64,Assembly,Kernel,6502,C64,我正在尝试使用Commodore64中的内核例程实现游戏控件 下面的代码只有一个例外。每个按键笔划都算作单个输入。e、 g:如果你一直按住按钮,就没有效果了。每次移动都必须释放并再次按下。我怎样才能改变这种行为?只要按住键,我就想重新开始动作 GETIN = $FFE4 SCNKEY = $FF9F keyScan: jsr SCNKEY ;get key jsr GETIN ;put key in A cmp #65 beq le

我正在尝试使用Commodore64中的内核例程实现游戏控件

下面的代码只有一个例外。每个按键笔划都算作单个输入。e、 g:如果你一直按住按钮,就没有效果了。每次移动都必须释放并再次按下。我怎样才能改变这种行为?只要按住键,我就想重新开始动作

    GETIN  =  $FFE4
    SCNKEY =  $FF9F

keyScan:
    jsr SCNKEY  ;get key
    jsr GETIN   ;put key in A

    cmp #65
    beq left

    cmp #68
    beq right

    jmp keyScan 

SCNKEY
不适用于需要同时输入多个按键的游戏。它是无状态的,只返回现在按下的“键”——即,如果按下两个键,它只会告诉你一个,并且官方不保证是哪个键。最好的办法是考虑一个仍然被按下的键,直到<代码> SCNKEY 报告是否有其他东西被按下,或者什么都没有,但是对于第二个同时的按键是否被忽略或替换第一次,甚至是个赔率。 如果你的程序不符合只按下“the”键的正统说法,你必须自己点击硬件。代码基64;我的摘要版本是(正确设置了CIA,但可能已经进行了适当配置):

  • 向DC00写入一个字节,该字节包含要同时扫描的每一行的0
  • 从DC01中读取一个字节并检查前四位,以确定所选行上的哪些键被按下
  • 一般例程需要单独测试每一行以避免阴影-假设您要求同时读取第4行和第5行,将0存储到第3位和第4位的DC00,并且返回的结果清除了顶部位,您不知道是否按了v或n或两者,只知道至少有一个是


    请参阅上面相同链接的最底部,以查看英语键盘上的行和列表;它们是物理键布局的结果,因此其他语言的差异与它们的键盘一样大。如果你在写一个游戏,你对按键的布局比对它们的符号更感兴趣,那么你不必担心语言

    是的,C64没有重复键(就像我现在输入的编辑器一样)

    解决此问题的典型方法是轮询内存位置197,它保存当前键盘扫描代码。要进行尝试,请运行以下命令: 10 printpeek(197):转到10


    您可以看到197的值发生了变化,并且实际上保持了它的值。当然,键值不是ascii,甚至不是petscii,但你可以通过实验找到你感兴趣的键值的扫描码。

    这类似于ZX Spectrum,在ZX Spectrum中,有些游戏确实使用多行的“阴影”来允许在多行键盘上用相同的键控制游戏(例如“k/l”)与“o/p”的工作方式相同。(不确定键盘的实际布局,也许我是1)。对于像arkanoid这样的一些游戏,实际上几乎整个键盘都是左键或右键工作的。:这是一个很好的问题