大佬教程收集整理的这篇文章主要介绍了在 ca65 上读取 NES (6502) 组件的控制器输入的优雅方式是什么?,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我开始在空闲时间为一个潜在的 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_reading_code 看起来很有前途,但我对它的了解还不够充分。
感谢您抽出宝贵时间。
nes 上的控制器是串行设备,每个都包含一个内部移位寄存器。读取控制器:
输入按 A、B、选择、开始、向上、向下、向左、向右的顺序返回。
因此,该合同的第一部分不能真正整理太多。您不可避免地会看到以下内容:
; Get current controller inputs into their shift registers.
LDA #1
STA $4016
LDA #0
STA $4016
假设您对所有八个输入都感兴趣,并且仅以控制器 1 为例,那么肯定会从 4016 美元中读取至少八次。由于它也是重置移位寄存器中内容的选通项,因此它们最好是只读的——没有写或读-修改-写。
此外,不幸的是,第 1 位到第 7 位不是 0。所以例如您不能只从 4016 美元起 ORA
并一次获得一点结果。在这种情况下,没有一个非官方的操作码在进行方便的加载和与操作时似乎有用。
因此,如果您想将结果累积到 A 中,那么事情不会变得那么优雅。
在您提供的链接中:
vbforums.com 的建议是从 $4016 加载八次,每次测试最低位,并在该循环中做出适当的反应。它使用 AND #1
(设置 Z)和 BEQ
(测试它)在加载后测试位,而 LSR
(将位 0 移入进位)和 BCC
(测试携带)可能会更优雅,因为它更紧凑一些。
nesDev Wiki 链接通过进位将游戏手柄输入的每一位滚动到另一个字节,因此您最终在内存中获得一个 8 位值,该值等于控制器移位寄存器中的值,并且您可以在您闲暇时测试和操作它。
如果您只是担心“重复和冗长”,那么我认为问题可能出在您的工具上,而不是硬件上 — 寻找宏汇编程序。其中许多比 C 的预处理器高一两步,因此您最终可能会编写相同的步骤序列,例如:
@H_307_32@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,8 nextBit $4016 controller1State nextBit $4017 controller2State NEXT
这是 BBC Micro 的特定现实生活中的汇编程序使用的宏语法,几乎可以肯定不是您的汇编程序使用的宏语法,因为几乎没有标准化。但是 nes 会有一个很好的宏编译器,而宏编译器的工作是让您无需复制和粘贴就可以拼出重复的部分。
以上是大佬教程为你收集整理的在 ca65 上读取 NES (6502) 组件的控制器输入的优雅方式是什么?全部内容,希望文章能够帮你解决在 ca65 上读取 NES (6502) 组件的控制器输入的优雅方式是什么?所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。