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

How to change kernal SCNKEY routine behaviour in Commodore 64

我正在尝试使用 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 

SCNKEY 不适用于需要同时进行多个按键输入的游戏 table。它是无状态的,只是现在按下的 returns 'the' 键——也就是说,如果按下两个,它只会告诉你一个,官方不保证是哪一个。您可以做的最好的事情是考虑一个键仍然被按下,直到 SCNKEY 报告按下了其他东西或者没有按下任何东西,但是对于第二次同时按下的按键是被忽略还是替换第一个,这将是偶数。

如果您的程序不符合只有 'the' 键被按下的正统观念,您将不得不自己动手操作硬件。 Codebase64 offers some example code;我的摘要版本是(已正确设置 CIA,但可能已经正确配置):

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

通用例程需要单独测试每一行以避免阴影 — 假设您要求同时读取第 4 行和第 5 行,方法是将 0 存储到 DC00 的第 3 位和第 4 位,而您得到的结果是最上面的位清楚,你不会知道是否按下了 v 或 n 或两者,只知道至少有一个按下了。

请参阅上面相同 link 的最底部,了解英语键盘上的 table 行和列;它们是物理键布局的结果,因此其他语言的变化与它们的键盘一样多。如果您正在编写游戏并且对按键的布局比它们的符号更感兴趣,那么您不必担心语言。

是的,C64 没有按键重复功能(就像我现在正在输入的这个编辑器一样)。

解决这个问题的典型方法是轮询内存位置 197,它保存着当前的键盘扫描码。要尝试一下,运行 这个: 10 printpeek(197):goto10

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