首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在ca65上读取NES (6502)汇编的控制器输入有什么好方法吗?

在ca65上读取NES (6502)汇编的控制器输入有什么好方法吗?
EN

Stack Overflow用户
提问于 2021-02-28 15:50:08
回答 1查看 283关注 0票数 0

我在课余时间开始为一个潜在的NES游戏项目学习6502汇编,我在设置控制器输入的读数时遇到了一些麻烦。我的背景是C,所以我熟悉内存和它是如何工作的,但是汇编中的流控制仍然让我摸不着头脑。

因为我是新手,所以我认为我应该从简单的开始,使用文中描述的逐个按钮的方法。

https://www.vbforums.com/showthread.php?858965-NES-6502-Programming-Tutorial-Part-5-Controller-Commands

..。这工作得很好,但它确实是重复和冗长的。

有没有一种更优雅的方式来做这件事,而不是完全超出我的能力范围?如果没有一些帮助,我不知道如何集成其他来源的代码。

https://wiki.nesdev.com/w/index.php/Controller

_

阅读

_

代码

看起来很有希望,但我对它的理解还不够充分,无法使用它。

感谢您的宝贵时间。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-03-01 03:15:03

NES上的控制器是串行设备,每个都包含一个内部移位寄存器。要读取控制器,请执行以下操作:

将1设置为$4016的b0;这将导致控制器开始连续采样其输入并重新加载其8位移位寄存器;

将0设置为$4016的b0;这将导致控制器停止采样其输入,并停止重新加载其移位寄存器;

对于控制器1,每次从$4016读取将返回b0中移位寄存器的最低有效位,并导致该寄存器移位;

对于控制器2,$4017执行等效的读取和移位操作。

输入按A、B、Select、Start、Up、Down、Left、Right的顺序返回。

因此,该合同的第一部分不能真正地进行太多修改。你不可避免地会看到类似这样的东西:

代码语言:javascript
复制
; Get current controller inputs into their shift registers.
LDA #1
STA $4016
LDA #0
STA $4016

假设您对所有8个输入都感兴趣,并且仅为示例而对控制器1感兴趣,那么从$4016开始肯定会有至少8个读取。由于它也是用于重置移位寄存器中内容的选通脉冲,因此它们最好是只读-不写或读-修改-写。

同样不幸的是,比特1到7为0也不是真的。所以,例如,你不能

从4016美元起,一次得到一点结果。而且在这种情况下,非官方的操作码在执行方便的加载和And操作时似乎都不是那么有用。

所以,如果你想将结果累加到A中,那么事情就不会变得那么优雅了。

您提供的链接:

vbforums.com的建议是从$4016开始加载8次,每次测试最低的位,并在该循环中做出适当的反应。它使用

(设置Z)和

(测试它)在加载后测试比特,而

(将位0移入进位)和

(为了测试进位)我可能会更优雅,因为它更紧凑。

相反,NesDev维基链接通过进位将游戏板输入的每一位滚动到另一个字节中,因此您最终在内存中得到一个8位的值,该值等于控制器的移位寄存器中的值,您可以在空闲时对其进行测试和操作。

如果你只关心“重复和冗长”,那么我认为问题可能出在你的工具上,而不是硬件上--找一个宏汇编器。它们中的许多都比C的预处理器高出一两步,所以您可能最终要编写相同的步骤序列,更像这样:

代码语言:javascript
复制
MACRO nextBit source destination {
    lda source        ; Read next bit from controller.
    lsr               ; Move bit to carry.
    ror destination   ; Roll bit from carry to top of local state.
} ENDMACRO

; Get controllers to reload their shift registers.
lda #1
sta $4016
lda #0
sta $4016

; Copy shift registers to local memory.
FOR n, 0, 8
    nextBit $4016 controller1State
    nextBit $4017 controller2State
NEXT

这是用于BBC Micro的特定现实汇编程序使用的宏语法,并且几乎可以肯定不是您的汇编程序使用的宏语法,因为几乎没有标准化。但是NES会有一个很好的宏编译器,宏编译器的工作是允许你拼写出重复的部分,而不需要复制和粘贴。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66406934

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档