问题标签 [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.
emulation - 6502 CPU 仿真
这是周末,所以我通过编写一个爱好项目来放松整个星期的编程。
昨天写了一个MOS 6502 CPU仿真器的框架,实现了寄存器、栈、内存和所有的操作码。(链接到下面的源)
我可以在我编写的调试器中手动运行一系列操作,但我想加载一个 NES rom 并将程序计数器指向它的指令,我认为这将是找到有缺陷的操作码的最快方法。
我编写了一个快速的 NES ROM 加载器并将 ROM 库加载到 CPU 内存中。
问题是我不知道操作码是如何编码的。我知道操作码本身遵循每个操作码一个字节的模式,该模式唯一地标识操作码,
ETC
但是我不确定我应该在哪里找到操作码参数。是直接跟在后面的字节吗?在绝对内存中,我想它可能不是一个字节,而是一个短字节。
有人熟悉这个 CPU 的内存模型吗?
编辑:我意识到这可能是在黑暗中拍摄的,但我希望有一些老派的 Apple 和 Commodore 黑客潜伏在这里。
编辑:感谢大家的帮助。在我实施适当的更改以对齐每个操作后,CPU 可以加载和运行马里奥兄弟。它除了循环等待开始之外什么都不做,但这是一个好兆头:)
我上传了源码:
https://archive.codeplex.com/?p=cpu6502
如果有人想知道模拟器是如何工作的,那么它很容易理解。至少没有优化,但话又说回来,我正在模拟一个在 2.4ghz 机器上以 2mhz 运行的 CPU :)
low-level - CPU 仿真和锁定到特定的时钟速度
如果您阅读了我的另一个问题,您就会知道我在这个周末花了一个 6502 CPU 仿真器作为编程练习。
CPU 模拟器大部分是完整的,从我有限的测试来看似乎相当准确,但是它运行得非常快,我想将它降低到机器的实际时钟速度。
我当前的测试循环是这样的:
如您所知,每个操作码都需要特定的时间才能完成,因此在倒计时 CPU 周期时钟之前,我不会运行下一条指令。这提供了操作码之间的适当时间,只是整个事情运行得很快。
目标 CPU 速度是 1.79mhz,但是我想要解决时钟问题的任何解决方案,以将速度保持在 1.79mhz,即使我增加了复杂性,所以我不必调整它。
有任何想法吗?
assembly - 如果小于,哪个是正确的分支指令
我昨天写了一个答案: 你见过或做过的最酷的黑客是什么? 而且我非常努力地记住我的 6502 组件,我一生都无法记住如果小于...
有人知道指令是什么吗?BNE 和 BEQ 相等,BCC 用于进位,CMP 基本上是 SBC,会影响进位,但我不确定它是否适用于这种情况。
java - 模拟器框架
有没有什么好的开源框架来开发计算机系统模拟器?我对用 Python 或 Java 编写的东西特别感兴趣,它们可以减少为 8 位处理器(例如 6502、6510 等)开发模拟器所涉及的工作量。
hardware - 如何在真实硬件上测试我的自制任天堂娱乐系统软件?
几年前,我实现了一个NES游戏作为一个类项目,用6502汇编编写。我只在 NES 模拟器上运行过它,但我希望看到它在真正的硬件上运行。有没有开发板可以做到这一点?我知道使用映射器芯片等有点棘手,但我愿意仅限于一个普通的映射器(比如 MMC3)。
assembly - 不使用 x86 的经典汇编语言文本?
我正在寻找详细处理汇编编程原则并且不使用 x86 作为目标架构的文本。我最近没有找到任何类似的书,但我希望在 1970 年代和 1980 年代有一些好的书,当时整个应用程序仍然是用汇编语言编写的。使用的架构也应该是更简洁的设计之一,例如 6502 或 VAX。
assembly - 基本 NES 仿真理论 - 我被卡住了
在此之前,我为这个问题的开放性和一般性的虚弱表示歉意,因为老实说,我对该主题的了解非常不完整,我什至发现很难描述我的问题。我真的不想发帖,但我完全被卡住了。
我已经启动了一个NES模拟器。它被解释(所以没有动态重新计算)。
Atm 它可以加载和映射 roms(mapper 0 roms)并执行初始化代码直到我必须处理中断和 PPU 的地方。这就是我卡住的地方。
这是我的emu atm的示例输出。执行从 8000 开始,我在 800a 遇到了一个无限循环,我不知道如何从那里开始。
所以我的问题是,有人可以为我解释一下通过 PPU 渲染进行 1 次迭代的基础知识,包括循环计数、中断等(即绘制一个完整的 240 扫描线屏幕并移至下一个)。
loops - 在汇编中编写一个while循环
我正在尝试使用 6502 处理器在汇编中编写一个 while 循环,但我无法弄清楚如何编写十六进制代码。我已经看到使用速记编写的示例,其中有一个循环应该开始和结束的标签,但我没有看到任何实际的十六进制代码。
我认为有用的两个代码是:
- 将内存中的一个字节与 X reg 进行比较(速记:CPX,十六进制:EC)。这会将 Z 标志设置为零,如果相等并且
- 如果 Z 标志 = 0,则转移 X 字节(简写:BNE,十六进制:D0)
assembly - 比较击键 - 装配 CCS64
我想比较汇编中的击键(CCS64)。如果我连续输入相同的键,我想做一些事情例如:A A= 这样做
但是如果我输入这个:A B=做其他事情
建议?
lisp - 对 8 位系统上类似 lisp 语言的 VM 感兴趣
我正在寻找可以在 8 位微处理器上运行并支持动态语言的推荐虚拟机。我想要一个 VM 解决方案,因为我认为在代码密度、可移植性和拥有更小的解释器的能力方面有好处,从而为更大的程序留出了更多空间。
我的目标是在 6502 微处理器之类的东西上运行一个完整的 LOGO 解释器,遵循“Apple II 的 LOGO”语法。
我已经看到对PyMite、Java“微型版”的引用,当然现在可以使用 1970 年代的 UCSD p-System 源。
欢迎提出建议。