如何在Commodore 64中更改内核SCNKEY例程行为

wiz*_*wor 6 assembly kernel c64 6502

我正在尝试使用Commodore 64中的内核例程来实现游戏控制.

下面的代码有一个例外.每个键击计为单个输入.例如:如果你一直按住按钮就没有效果.您必须释放并再次按下每个动作.我该如何改变这种行为?只要关键按下,我就想重新开始动作.

    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 
Run Code Online (Sandbox Code Playgroud)

Tom*_*mmy 10

SCNKEY不适合需要多个同时键输入的游戏.它是无状态的,只是简单地返回现在按下的"键" - 即如果两个按下,它只会告诉你一个,并且官方不保证哪个.你能做的最好的事情就是考虑一个按键仍然被按下,直到SCNKEY报告其他东西被按下或者什么都没有,但是对于是否忽略第二个同时按键或者替换第一个同时按键,它甚至是可能的.

如果你的程序不符合正统,只有被按下的''键,你必须自己打硬件.Codebase64 提供了一些示例代码 ; 我的摘要版本是(已经正确设置了CIA,虽然它可能已经适当配置):

  1. 向DC00写一个字节,其中包含您想要同时扫描的每一行的0;
  2. 从DC01读取一个字节并检查前四位以找出所选行中哪些键被按下.

通用例程需要单独测试每一行以避免阴影 - 假设您要求在第3位和第4位将0存储到DC00时同时读取第4行和第5行,并且返回的结果清除了最高位,你不知道是否按下了v或n或两者,只有至少其中一个是.

有关英语键盘上行和列的表格,请参见上面相同链接的最底部; 它们是物理键布局的结果,因此其他语言的变化与键盘一样多.如果您正在编写游戏,并且您对键的布局比对符号更感兴趣,那么您无需担心语言.