6502 CPU仿真

时间:2008-09-21 18:50:06

标签: emulation machine-language 6502

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

我昨天写了一个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:)

7 个答案:

答案 0 :(得分:12)

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

答案 1 :(得分:3)

如果查看http://www.atarimax.com/jindroush.atari.org/aopc.html之类的引用,您会看到每个操作码的编码指定为:

HEX LEN TIM

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

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

答案 2 :(得分:1)

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

另外,尝试检查那里的任何其他6502汇编器/模拟器/调试器,看看Assembly如何编码为机器语言。

答案 3 :(得分:1)

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

答案 4 :(得分:0)

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

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

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

答案 5 :(得分:0)

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

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

答案 6 :(得分:0)