6502 CPU仿真
现在是周末,所以我放松了写一个业余项目,花了整整一周的时间进行编程。
我昨天编写了MOS 6502 CPU仿真器的框架,寄存器,堆栈,内存和所有操作码均已实现。 (链接到下面的源)
我可以在编写的调试器中手动运行一系列操作,但是我想加载NES rom并将程序计数器指向其指令,我认为这是查找有缺陷的操作码的最快方法。
我编写了一个快速的NES rom加载器,并将ROM bank加载到CPU内存中。
问题是我不知道操作码是如何编码的。我知道操作码本身遵循每个操作码一个字节的模式,以唯一地标识操作码,
0 - BRK 1 - ORA (D,X) 2 - COP b
等等
但是我不确定应该在哪里找到opcode参数。它是紧随其后的字节吗?在绝对内存中,我想它可能不是一个字节,而是一个短字节。
有人熟悉此CPU的内存模型吗?
编辑:我意识到这可能是在黑暗中拍摄的,但是我希望这里有一些老派的苹果和准将黑客潜伏在这里。
编辑:谢谢大家的帮助。在执行适当的更改以对齐每个操作之后,CPU可以加载并运行Mario Brothers。它没有做任何事情,而是循环等待启动,但是它是一个好兆头:)
我上传了源代码:
http://www.codeplex.com/Cpu6502/SourceControl/DirectoryView.aspx?SourcePath=&changeSetId=1810
如果有人想知道仿真器的工作原理,那么它很容易遵循。至少没有进行优化,但是再次,我正在模拟一个在2.4ghz机器上以2mhz运行的CPU :)
解决方案
这本书可能会有所帮助:http://www.atariarchives.org/mlb/
另外,尝试检查那里的任何其他6502 aseembler / simulator / debugger,以查看Assembly如何被编码为机器语言。
操作码占用一个字节,而操作数位于以下字节中。例如,在此处检查字节大小列。
如果查看诸如http://www.atarimax.com/jindroush.atari.org/aopc.html之类的引用,则会发现每个操作码的编码均指定为:
HEX LEN TIM
十六进制是1字节操作码。紧随其后的是其参数的LEN字节。查阅参考资料以查看这些参数是什么。 TIM数据对于仿真器很重要,这是该指令执行所需的时钟周期数。我们将需要此信息以使时间正确。
这些值(LEN,TIM)未在操作码本身中编码。我们需要将此数据存储在程序加载器/执行器中。这只是一个很大的查询表。或者,我们可以定义一种迷你语言来对数据和读取器进行编码。
6502手册可在Web上的各种历史站点上找到。他们附带了KIM-1. 也许其中的内容比我们需要了解的要多。
apple II roms包含一个反汇编程序,我认为这就是所谓的反汇编程序,它将以一种很好的格式向我们显示十六进制操作码和3个字符的操作码以及操作数。
因此,鉴于可用内存很少,他们设法将整个6502指令集的3个字符的操作码(总是为0、1或者2)推入一个很小的空间,因为实际上没有那么多。
如果我们可以挖出一个Apple II rom,则可以从那里剪切并粘贴...