20

这是周末,所以我通过编写一个爱好项目来放松整个星期的编程。

昨天写了一个MOS 6502 CPU仿真器的框架,实现了寄存器、栈、内存和所有的操作码。(链接到下面的源)

我可以在我编写的调试器中手动运行一系列操作,但我想加载一个 NES rom 并将程序计数器指向它的指令,我认为这将是找到有缺陷的操作码的最快方法。

我编写了一个快速的 NES ROM 加载器并将 ROM 库加载到 CPU 内存中。

问题是我不知道操作码是如何编码的。我知道操作码本身遵循每个操作码一个字节的模式,该模式唯一地标识操作码,

0 - BRK
1 - ORA (D,X)
2 - COP b

ETC

但是我不确定我应该在哪里找到操作码参数。是直接跟在后面的字节吗?在绝对内存中,我想它可能不是一个字节,而是一个短字节。

有人熟悉这个 CPU 的内存模型吗?

编辑:我意识到这可能是在黑暗中拍摄的,但我希望有一些老派的 Apple 和 Commodore 黑客潜伏在这里。

编辑:感谢大家的帮助。在我实施适当的更改以对齐每个操作后,CPU 可以加载和运行马里奥兄弟。它除了循环等待开始之外什么都不做,但这是一个好兆头:)

我上传了源码:

https://archive.codeplex.com/?p=cpu6502

如果有人想知道模拟器是如何工作的,那么它很容易理解。至少没有优化,但话又说回来,我正在模拟一个在 2.4ghz 机器上以 2mhz 运行的 CPU :)

4

7 回答 7

12

操作码占用一个字节,操作数在后面的字节中。例如,查看此处的字节大小列。

于 2008-09-21T18:59:56.733 回答
4

如果您查看http://www.atarimax.com/jindroush.atari.org/aopc.html之类的参考资料,您会看到每个操作码都有一个指定为的编码:

HEX LEN TIM

HEX 是您的 1 字节操作码。紧随其后的是 LEN 字节的参数。请查阅参考资料以了解这些论点是什么。TIM 数据对仿真器很重要——它是该指令执行所需的时钟周期数。你需要这个来让你的时间正确。

这些值(LEN、TIM)未在操作码本身中编码。您需要将此数据存储在程序加载器/执行器中。这只是一个大查找表。或者您可以定义一种迷你语言来对数据和阅读器进行编码。

于 2008-09-21T19:03:49.940 回答
1

这本书可能会有所帮助: http: //www.atariarchives.org/mlb/

此外,尝试检查任何其他 6502 汇编器/模拟器/调试器,以了解汇编如何被编码为机器语言。

于 2008-09-21T18:57:54.510 回答
1

6502 手册在网络上的各个历史站点上。KIM-1 随他们一起发货。也许他们比你需要知道的更多。

于 2008-09-21T19:09:37.927 回答
1

这更好 - 6502指令集矩阵:

https://www.masswerk.at/6502/6502_instruction_set.html

于 2019-03-20T15:35:03.637 回答
0

Apple II rom 包含一个反汇编程序,我想这就是它的名称,它会以一种很好的格式向您显示十六进制操作码和 3 个字符操作码和操作数。

因此,鉴于可用内存很少,他们设法将整个 6502 指令集的 3 个字符操作码的操作数字节数(始终为 0、1 或 2)塞入一个非常小的空间,因为它真的不多。

如果你能挖出一个apple II rom,你可以从那里剪切和粘贴......

于 2009-02-04T23:33:11.210 回答
0

6502有不同的寻址模式,同一条指令有几个不同的操作码取决于它的寻址模式。查看以下链接,这些链接描述了 6502 从内存或直接从 ROM 中检索数据的不同方式。

http://obelisk.me.uk/6502/addressing.html#IMM

于 2018-03-18T15:21:50.620 回答