如何加载nestest ROM?

时间:2017-10-29 08:04:56

标签: testing rom 6502 nintendo

我完成了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

1 个答案:

答案 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特定内存映射方案内容。

忽略帖子中的评论之前你应该“在每个周期”[登录]你的电脑(和注册)“,以及该帖子及其后的含义;他的意思是:

  1. 在获取第一个操作码字节之前,制作程序计数器和其他寄存器的内部记录;
  2. 读取最后一个操作数字节后,记录您在步骤(1)中存储的所有值以及完整指令及其反汇编。
  3. 如果您已经简化了模拟器中的内容以原子方式读取和执行每个操作,然后按照您应该花费的周期数跳过时间,那么您可以省略临时存储。我怀疑生成示例日志的作者已经实现了这样的仿真。关键线索将是由操作码索引的switch表,该表以某种方式不是协程,和/或指令长度的查找表。

    进一步的建议:

    NES实际上并不使用6502.它使用省略十进制模式的克隆 - 十进制标志根本没有效果。因此,如果您要模拟6502,那么预计测试结果会有所不同。

    对于其他优秀的6502测试,请参阅:

    • AllSuiteA(测试一大堆事情并给你通过或失败);
    • Klaus Dormann's tests(稍微麻烦一点;如果特定的测试失败,只会在某个地方进入无限循环。你需要检查来源以找出你得到的失败);和
    • Wolfgang Lorenz's tests(一大堆单独的测试,最初是为了在C64上单独运行但是很容易在没有任何实现超出6502的情况下运行,除了它将在PETSCII中提供状态的文本输出,所以你还需要一个快速查找表来将其映射到ASCII)。

    我使用了所有这三个来引导我最近的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字符。