现在是周末,所以我通过写一个业余项目来放松整个星期的编程。
昨天我编写了一个MOS 6502 CPU仿真器的框架,实现了寄存器、堆栈、内存和所有操作码。(链接到下面的源)
我可以在我编写的调试器中手动运行一系列操作,但是我想加载一个NES rom并将程序计数器指向它的指令,我认为这将是找到有缺陷操作码的最快方法。
我编写了一个快速的NES加载程序,并将rom库加载到CPU内存中。
问题是我不知道操作码是如何编码的。我知道操作码本身遵循一种模式,每个操作码一个字节,唯一地标识操作码,
0 - BRK
1 - ORA (D,X)
2 - COP b等
然而,我不知道我应该在哪里找到操作码参数。是直接跟在后面的字节吗?在绝对内存中,我想它可能不是一个字节,而是一个短字节。
有人熟悉这个CPU的内存模型吗?
编辑:我意识到,这可能是在黑暗中拍摄,但我希望有一些老苹果和商品黑客潜伏在这里。
编辑:谢谢大家的帮助。在我实现了适当的更改以对齐每个操作之后,CPU可以加载并运行Mario。除了循环等待开始,它什么也不做,但这是一个好迹象:)
我上传了消息来源:
https://archive.codeplex.com/?p=cpu6502
如果有人想知道仿真器是如何工作的,那么它很容易跟踪。至少没有经过优化,但我还是在模拟2.4ghz机器上以2 2mhz运行的CPU :)
发布于 2008-09-21 18:59:56
操作码为一个字节,操作数为以下字节。例如,查看字节大小列这里。
发布于 2008-09-21 19:03:49
如果您查看像http://www.atarimax.com/jindroush.atari.org/aopc.html这样的引用,您将看到每个操作码都有一个指定为:
HEX LEN TIMHEX是你的1字节操作码.紧随其后的是它的参数的LEN字节。请参阅参考资料,看看这些论点是什么。TIM数据对于仿真器很重要--这是指令执行所需的时钟周期的数目。你将需要这个来使你的时间正确。
这些值(LEN,TIM)不是在操作码本身中编码的。您需要将这些数据存储在程序加载程序/执行程序中。只是一张大的查表。或者可以定义一种迷你语言来编码数据和读取器。
发布于 2008-09-21 18:57:54
这本书也许会有帮助:http://www.atariarchives.org/mlb/
另外,试着检查其他任何6502实例/模拟器/调试器,看看程序集是如何被编码成机器语言的。
https://stackoverflow.com/questions/111700
复制相似问题