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

我正在尝试使用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或两者,只有至少其中一个是.

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

相关文章

对象的传值与返回说起函数,就不免要谈谈函数的参数和返回值...
从实现装饰者模式中思考C++指针和引用的选择最近在看...
关于vtordisp知多少?我相信不少人看到这篇文章,多半是来自...
那些陌生的C++关键字学过程序语言的人相信对关键字并...
命令行下的树形打印最近在处理代码分析问题时,需要将代码的...
虚函数与虚继承寻踪封装、继承、多态是面向对象语言的三大特...