问题标签 [6502]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
6502 - LDA / ROL / STA - 指令说明
有人可以解释每条指令 LDA、ROL、STA 给出的结果到底是什么吗?
我想到了这个:
是否正确,解释?
assembly - 在 Commodore 64 上使用程序集写入磁盘文件
我正在尝试按照这个Codebase64 Tutorial学习如何使用内核例程编写磁盘文件。
我已经复制了我用 Acme Crossassembler 编写的例程,如下所示。它无法打开文件并给出错误消息:“文件未打开”
我已经使用 C64 Programmer's Reference 准备了下面列出的基本例程。它在相同的环境中按预期工作。
那么,为什么我的 asm 例程不起作用?
我正在测试副 2.4
string - DASM 汇编器中的 ASCII 到 C64 屏幕代码
我正在通过 C64 仿真器学习 6502 micro 的组装。当前正在尝试将字符串输出到屏幕。这是我的代码:
因为我的编辑器(win 10 上的记事本++)使用类似 ascii 的字符代码,所以"HELLO"
inmessage
是位 48 45 4C 4C 4F。这会在屏幕的左上角给出以下输出:
通过查看此处的准将屏幕代码表,我猜这是正确的。
如果我将第 6 行更改为,lda hexmsg,x
那么我得到的正是我所追求的,单词HELLO
.
我对 DASM 汇编器还不是很熟悉,并且很难找到它的完整文档(如果存在的话)。我发现的大多数教程只有你声明message .byte "HELLO"
或类似的东西,它只是工作,因为他们使用的汇编程序自动将类似 ascii 的文本字符串自动转换为准将字符串,但 DASM 似乎没有这样做。
有谁知道我可以让 DASM 做到这一点的方法,或者推荐另一种方法来简单地将字符串输入到汇编程序中,而不是手动将我的字符串输入为一堆十六进制数据?
assembly - 6502 处理器如何在 ROM 和 RAM 之间传输数据?
我一直试图了解旧的 6502 处理器是如何工作的,特别是对于任天堂娱乐系统。让我感到困惑的一件事是系统如何将相关数据从 ROM 移动到 RAM 中,因为所有的汇编指令似乎都在处理 RAM-RAM 命令。例如,如果游戏需要在马里奥中加载一个敌人,CPU如何识别要加载的相关区域,然后加载它们?一旦它在 RAM 中,我有一个不错的理解,但是它将数据放入我不理解的 RAM 中。谢谢!
assembly - 从 6502 汇编器获取随机数
尝试使用 JSR $E09A 在我的 Commodore 64 (C64) 上生成一系列随机数,并从 $63 和 $64 中检索数字。(根据我看到的所有文档,当您使用 BASIC 中的 RND(0) 时,它是相同的例程。但无法对其进行迭代。以下将起作用,并在执行时在 $63 和 $64 中放置不同的数字本身。
现在,当我尝试使用以下代码迭代 10 次时,它永远不会返回。
我是否错过了一些如此明显的东西,我看不到它。我不担心它有多“随机”。此时我只想要一系列随机数。
emulation - 每条指令 6502 个周期时序
我正在用 C 编写我的第一个 NES 模拟器。目标是使其易于理解和循环准确(但不一定必须是代码高效的),以便以正常的“硬件”速度玩游戏。在深入研究 6502 的技术参考资料时,这些指令似乎消耗了多个 CPU 周期 - 并且根据给定条件(例如分支)也有不同的周期。我的计划是创建读写函数,并通过使用switch
.
问题是:当我有一个多周期指令时,例如 a BRK
,我是否需要模拟每个周期中到底发生了什么:
...或者我可以在一个“周期”(一个switch
case
)中执行所有必需的操作,而在剩余的周期中什么都不做吗?
由于这两种方法都消耗了所需的 7 个周期,所以两者之间没有区别吗?(准确性方面)
就我个人而言,我认为方法 1 是可行的解决方案,但是我想不出一个合适的、简单的方法来实现它……(请帮忙!)
assembly - 存储在 6502 内存中的字节是有符号的还是无符号的?
在为我的 6502/NES 仿真器创建指令函数时,我一直在理解 6502 中带符号字节和二进制补码的概念。显然,诸如 BMI 之类的分支指令使用内存中的带符号字节进行前向/后向分支,还有一些指令允许对负数进行算术运算。负标志也检测累加器的第 7 位。(二进制补码)
这是否意味着内存中的所有字节都已签名,并且我可以将内存初始化为int8_t CPUMEMORY[0x10000];
而不是uint8_t CPUMEMORY[0x10000]
?
不过,困扰我的是,当运算结果超过无符号 8 位限制(即 255)时会设置进位标志。但如果所有字节都已签名,这不应该是 127 吗?(溢出标志可以做到这一点,但是有一个进位标志有什么意义呢?)
emulation - 6502 存储指令(STA、STX 等)和内存地址
在编写我的 6502/NES 仿真器时,这真的很困扰我……
6502的存储指令操作如下:
但是,该指令使用绝对寻址模式,它应该返回存储在内存中的 8 位值$2A78
。该AND
指令确实遵循以下规则:
因此,在正常情况下,STA
绝对指令应该将累加器的值存储在 8 位零页地址中,该地址存储在$2A78
. 如果要真正将值存储在 中$2A78
,寻址模式不应该是即时的吗?- 例如STA #2A78
此外,是否有任何其他指令表现得像商店指令一样“异常”?
assembly - 6502汇编语言中结构数组相对于并行数组的优势?
我从那天写了很多 6502 的理解是并行数组比存储数据的结构更好。
想象一下,你想要一张怪物统计数据表,在 C 语言中会这样定义
您可以将其存储为结构数组
或者您可以将其存储为并行数组(通常使用宏或工具来生成)。注意:我在 C 中显示代码,但请想象它是 6502 程序集。
在 6502 中,给定一个 itemNdx,您可以使用这样的并行数组访问所有字段
就好像您使用结构而不是并行数组一样
结构版本必须计算每个结构的偏移量。在上述情况下,与并行阵列版本相比,它多了 5 条指令。最重要的是,计算偏移量的数学是手工编码的,这意味着如果结构发生变化,就必须在任何时候重写它的大小。最重要的是,您只能拥有一张256 / sizeof(Monster)
大桌子。如果您有更多字段(20 到 30 个并不少见),这意味着您的表只能有 8 到 12 个条目,而与并行数组一样,您可以有 256 个条目。如果您想遍历表,还有一个优势。使用并行数组,您只需增加inx
一条指令 x 。对于结构,您必须添加 sizeof(monster) ,其中添加仅适用于 a 将是
这比并行数组版本多 3 条指令。
这似乎是并行数组是 6502 汇编语言的客观胜利,但是 John Carmack 从他的计划文件中有这个晦涩的评论
......实际上,一直回到理解苹果II汇编语言中并行数组的结构的优点......
有谁知道这些优势是什么?
我能想到的唯一优点是使用结构数组分配动态数组更容易,但大多数游戏在 6502 天内没有分配任何东西。他们硬编码修复了大小的内存数组,所以看起来不可能是这样。6502 也没有缓存,所以没有缓存优势。
此外,如果您使用完整的指针,您可以处理超过 256 个项目,但使用完整的指针要慢得多,并且比上面显示的任何一种方法都需要更多的代码,因此它们通常是最后的选择。
您可以通过为每个项目创建一个并行指针数组来摆脱乘法。您仍然有 2 行并行数组不需要的设置,并且您仍然会使其余代码变得更慢和更大。每次访问 8 个周期 vs 5 和每次访问 5 个字节 vs 3。
基本上,如果绝对必须,您只会使用指针。如果您可以选择并行阵列,那么您似乎应该始终选择它们。