6502 CPU仿真

问题描述 投票:17回答:7

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

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

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

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

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

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

等等

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

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

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

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

我上传了这个来源:

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

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

emulation machine-language 6502
7个回答
12
投票

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


3
投票

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

HEX LEN TIM

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

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


1
投票

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

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


1
投票

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


0
投票

苹果II roms包含了一个反汇编程序,我认为这就是它的名称,并且它会以十分优化的格式显示十六进制操作码和3字符操作码以及操作数。

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

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


0
投票

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

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


0
投票

这样更好 - 6502指令集矩阵:

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

© www.soinside.com 2019 - 2024. All rights reserved.