我完成了6502仿真器的编写,我已准备好开始测试了。我发现nestest ROM有一些文档,但我不确定,加载ROM的正确方法是什么。作者说,模拟器应该从0xC000开始,当我加载ROM时它包含0,所以我一定做错了。
所以现在我的加载程序看起来像这样:
clear memory
set PC to 0x8000
open the file
skip first 16 bytes (iNES header)
load the rest of the file into RAM (starting at 0x8000)
set PC to 0xC000
答案 0 :(得分:2)
根据Nick Westgate的评论(因此即时社区维基),加载程序is a bit more complicated than you might naively guess:
现在,您可以从偏移量0x0010开始加载0x4000字节并映射 作为ROM进入模拟的$ 8000- $ BFFF和$ C000- $ FFFF 6502的记忆图。
'for now'假定您要编写NES模拟器,因此有一天会正确解析存储测试的NES相关文件格式,并模拟导致镜像的NES特定内存映射方案内容。
忽略帖子中的评论之前你应该“在每个周期”[登录]你的电脑(和注册)“,以及该帖子及其后的含义;他的意思是:
如果您已经简化了模拟器中的内容以原子方式读取和执行每个操作,然后按照您应该花费的周期数跳过时间,那么您可以省略临时存储。我怀疑生成示例日志的作者已经实现了这样的仿真。关键线索将是由操作码索引的switch
表,该表以某种方式不是协程,和/或指令长度的查找表。
进一步的建议:
NES实际上并不使用6502.它使用省略十进制模式的克隆 - 十进制标志根本没有效果。因此,如果您要模拟6502,那么预计测试结果会有所不同。
对于其他优秀的6502测试,请参阅:
我使用了所有这三个来引导我最近的6502仿真器,再加上一些自编写的逐周期测试,用于中断,你不会期望6502的地址空间内的代码能够处理
我后来发现我在十进制处理方面有一个非常小的偏差 - 小到足以通过所有这些测试,但不足以通过详尽的6502比较。我很方便地在档案attached to this post内的Acorn BBC社区找到了一个更好的测试。我选择通过以下方式运行:
BCDTEST_beeb
; 0x2900
的内容
JSR 2900h
写入地址0x200
; RTS
放在0xffee
,但也请确保您可以抓住该地址; 0x200
并继续运行,直到它位于0x203
; 0x84
的值是0
。如果是别的,则表示失败。要获得更多反馈,只要PC进入0xffee
,就会在A寄存器中输出ASCII字符。