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

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

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

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

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

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

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

是否有人熟悉此CPU的内存模型?

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

编辑:感谢大家的帮助。在我实施适当的更改以对齐每个操作后,CPU可以加载并运行Mario Brothers。除了循环等待Start之外它什么也没做,但它是一个好兆头:)

我上传了来源:

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

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

有帮助吗?

解决方案

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

其他提示

如果您查看 http://www.atarimax.com等参考文献/jindroush.atari.org/aopc.html ,您将看到每个操作码的编码指定为:

HEX LEN TIM

HEX是您的1字节操作码。紧随其后是其参数的LEN字节。查阅参考文献以了解这些参数是什么。 TIM数据对仿真器很重要 - 它是该指令执行所需的时钟周期数。你需要这样才能使你的时间正确。

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

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

另外,请尝试检查其他任何6502 aseembler / simulator / debugger,看看Assembly如何编码为机器语言。

6502手册在网上,各种历史网站上。 KIM-1随附。也许比你需要知道更多。

apple II roms包含了一个反汇编程序,我认为这就是它的名称,它会以十进制操作码和3字符操作码以及操作数的格式向您展示。

因此,考虑到可用的内存很少,他们设法将整个6502指令集的3字符操作码的操作数字节数(总是0,1或2)推入一个非常小的空间,因为实际上并没有那么多它的。

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

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

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

这是更好的 - 6502指令集矩阵:

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top