6502 CPU仿真(6502 CPU Emulation)

2019-07-30 02:25发布

今天是周末,所以我通过写一个爱好项目花费整整一周节目放松。

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

我可以手动运行一系列在我写的调试操作,但我想加载一个NES ROM,只是指向其指令程序计数器,我想,这将是发现有缺陷的操作码的最快方式。

我写了一个快速NES ROM加载器和加载ROM银行到CPU的内存。

问题是,我不知道操作码的编码方式。 我知道自己的操作码跟着每一个操作码字节唯一标识操作码的模式,

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

等等

但是我不知道在那里我应该找到操作码的说法。 难道是字节直接下? 在绝对的记忆,我想这可能不是一个字节,但很短的。

是任何人都熟悉这个CPU的内存模型?

编辑:我知道这可能是瞎猜,但我希望有一些老校友苹果电脑,Commodore黑客潜伏在这里。

编辑:感谢您的帮助大家。 我实现了适当的修改之后来使每一个操作的CPU可以加载和运行马里奥兄弟。 它没有做任何事情,但循环等待开始,但它的一个好兆头:)

我上传的来源:

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

如果任何人有没有想过一个仿真器是如何工作的,它很容易跟进。 在至少不优化,但话又说回来,我模拟运行在2.4GHz的机器上2MHz的一个CPU :)

Answer 1:

操作码需要一个字节,操作数在接下来的字节。 退房的字节大小列在这里 ,例如。



Answer 2:

如果你看看喜欢引用http://www.atarimax.com/jindroush.atari.org/aopc.html ,你会看到每个操作码具有编码指定为:

HEX LEN TIM

十六进制是你的1个字节的操作码。 紧随其后的是LEN字节的说法。 咨询参考,看看这些参数是。 该TIM数据是用于模拟器重要的 - 在时钟周期该指令需要执行的次数。 你需要它来获取你的时间正确的。

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



Answer 3:

这本书可以帮助: http://www.atariarchives.org/mlb/

另外,尝试追问其他6502 aseembler /仿真/调试程序在那里看大会如何被编码为机器语言。



Answer 4:

6502本手册是在网络上,在不同的历史遗址。 该KIM-1随他们。 也许更多的他们比你需要知道的。



Answer 5:

苹果II ROM的包括一个dissassembler,我认为这就是它被称为,它会告诉你在一个不错的格式十六进制操作码和3个字符操作码和操作数。

因此,给予很少的内存怎么用,他们设法在操作数字节计数推(始终为0,1或2)整个6502指令集到一个非常小的空间内,3字码,因为真的不是太多。

如果你能挖掘出一个苹果II ROM,你可以剪切和粘贴有...



Answer 6:

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

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



Answer 7:

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

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



文章来源: 6502 CPU Emulation