这是周末,所以我通过写一个爱好项目来度过整周的编程.
我昨天编写了一个MOS 6502 CPU仿真器的框架,实现了寄存器,堆栈,内存和所有操作码.(链接到下面的来源)
我可以在我编写的调试器中手动运行一系列操作,但是我想加载一个NES rom并按指令指向程序计数器,我认为这是找到有缺陷的操作码的最快方法.
我写了一个快速的NES rom加载程序并将ROM库加载到CPU内存中.
问题是我不知道操作码是如何编码的.我知道操作码本身遵循每个操作码一个字节的模式,该模式唯一地标识操作码,
0 - BRK
1 - ORA (D,X)
2 - COP b
Run Code Online (Sandbox Code Playgroud)
等等
但是我不确定我应该在哪里找到操作码参数.是直接跟随的字节吗?在绝对记忆中,我想它可能不是一个字节而是一个短.
有人熟悉这个CPU的内存模型吗?
编辑:我意识到这可能是在黑暗中拍摄,但我希望有一些老学校的苹果和Commodore黑客潜伏在这里.
编辑:感谢大家的帮助.在我实施适当的更改以对齐每个操作后,CPU可以加载并运行Mario Brothers.除了循环等待Start之外它什么也没做,但它是一个好兆头:)
我上传了这个来源:
http://www.codeplex.com/Cpu6502/SourceControl/DirectoryView.aspx?SourcePath=&changeSetId=1810
如果有人想知道模拟器是如何工作的,那么它很容易理解.至少没有优化,但是再次,我在2.4ghz机器上模拟一个以2mhz运行的CPU :)
我必须用C#构建一个模拟器.该模拟器应该能够运行具有可配置CPU速度和有限RAM大小的第二个线程,例如144MHz和50MB.
当然我知道模拟器永远不会像真正的硬件一样准确.但我试着获得几乎相似的表现.
目前我正在考虑创建一个我将不时停止/休眠的线程.根据所需的CPU速度,模拟器应调整此线程的休眠时间,从而模拟不同的CPU频率.为了测量实现的速度我虽然使用PerformanceCounters.但是使用这种方法我遇到的问题是我不知道如何限制线程可以使用的RAM大小.
你对如何实现这样的模拟器有什么想法吗?
提前致谢!!