我正在尝试使用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不适合需要多个同时键输入的游戏.它是无状态的,只是返回现在按下的“键” – 即如果按下两个键,它只会告诉你一个,并且官方不保证哪个.你能做的最好的事情就是考虑一个按键仍然被按下,直到SCNKEY报告其他东西被按下或没有任何东西,但是对于是否忽略第二个同时按键或替换第一个按键,它甚至可能性很小.
如果你的程序不符合正统,只有被按下的”键,你必须自己打硬件. Codebase64 offers some example code;我的摘要版本是(已经正确设置了CIA,虽然它可能已经适当配置):
>向DC00写入一个字节,其中包含您想要同时扫描的每一行的0;
>从DC01读取一个字节并检查前四位以找出所选行中哪些键被按下.
通用例程需要单独测试每一行以避免阴影 – 假设您要求在第3位和第4位将0存储到DC00时同时读取第4行和第5行,并且返回的结果清除了最高位,你不知道是否按下了v或n或两者,只有至少其中一个是.
有关英语键盘上行和列的表格,请参见上面相同链接的最底部;它们是物理键布局的结果,因此其他语言的变化与键盘一样多.如果您正在编写游戏,并且您对键的布局比对符号更感兴趣,那么您无需担心语言.