我在课余时间开始为一个潜在的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
_
阅读
_
代码
看起来很有希望,但我对它的理解还不够充分,无法使用它。
感谢您的宝贵时间。
发布于 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的顺序返回。
因此,该合同的第一部分不能真正地进行太多修改。你不可避免地会看到类似这样的东西:
; 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的预处理器高出一两步,所以您可能最终要编写相同的步骤序列,更像这样:
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会有一个很好的宏编译器,宏编译器的工作是允许你拼写出重复的部分,而不需要复制和粘贴。
https://stackoverflow.com/questions/66406934
复制相似问题