Testing 如何加载nestest ROM?

Testing 如何加载nestest ROM?,testing,rom,6502,nintendo,Testing,Rom,6502,Nintendo,我完成了6502模拟器的编写,准备开始测试它。我找到了带有一些文档的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

我完成了6502模拟器的编写,准备开始测试它。我找到了带有一些文档的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

根据Nick Westgate的评论(即即时社区wiki),加载过程:

现在,您可以从偏移量0x0010开始加载0x4000字节,然后映射 将其作为ROM转换为模拟的$8000-$BFFF和$C000-$FFFF 6502的内存映射

“暂时”假设您将要编写一个NES模拟器,因此有一天将正确解析存储测试的NES相关文件格式,并模拟导致内容镜像的NES特定内存映射方案

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

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

    进一步忠告:

    NES实际上没有使用6502。它使用一个省略十进制模式的克隆-十进制标志根本没有效果。因此,如果您正在模拟6502,那么测试结果可能会有所不同

    有关其他良好6502测试,请参阅:

    • (测试一大堆东西,给你及格或不及格的分数)
    • (稍微麻烦一点;如果某个特定测试失败,只会在某个地方进入无限循环。您需要检查源代码,以找出您遇到的失败);及
    • (一系列单独的测试,最初用于在C64上单独运行,但除了6502之外,不需要任何实现就可以轻松运行,因为它将在PETSCII中提供状态的文本输出,因此您还需要一个快速查找表来将其映射到ASCII)
    我用这三种方法来引导我最新的6502仿真器,再加上一些自行编写的周期测试,这些测试针对的是中断之类的事情,而这些中断是你不希望位于6502地址空间中的代码能够处理的

    我后来发现,我在十进制处理中有一个非常小的偏差——小到足以通过所有这些测试,但不足以通过6502次详尽的比较。我很方便地在橡子BBC社区的档案中找到了一个更好的测试。我选择通过以下方式进行管理:

    • 0x2900
      处加载
      BCDTEST_beeb
      的内容
    • jsr2900h
      写入地址
      0x200
    • 0xffee
      处放置
      RTS
      ,但也要确保您可以捕获该地址
    • 将程序计数器设置为
      0x200
      ,并保持运行,直到其位于
      0x203
    • 然后测试
      0x84
      处的值是否为
      0
      。如果是其他原因,则表示失败

    要获得更多反馈,无论何时电脑转到
    0xffee
    ,都要在A寄存器中输出ASCII字符。

    看起来您需要在加载它。哦,这不叫镜像吗?谢谢您的努力!因此,我加载并运行了nestest,并且我能够记录所有内容,这很好。是的,有一天,当其他组件完全实现后,我将解析iNES头。理光CPU真的有BCD标志吗?我注意到它的nestest测试,这很奇怪,因为nesdevwiki说该标志不应该有任何影响(我认为它甚至不存在)。我不打算实现BCD模式,所以这就是为什么我最初避免了任何测试BCD的测试。我的理解是它有BCD模式,但不尊重它。因此,您可以
    CLD
    /
    SED
    ,如果您
    PHP
    ,您将能够看到差异,但是
    ADC
    SBC
    将始终作为二进制。假设测试完全适用于NES,那么可能包含的测试是您忽略了它?@bartlomiej.n是的,因此在运行以NES为中心的测试时,这是您的荣幸,因为这些是ROM,一旦打开就直接映射到处理器的地址空间。但其他许多测试,包括BBC测试,都是曾经存在于家用电脑磁带或磁盘上的文件。所以他们假设操作系统会将它们加载到已经运行的机器的内存中,然后做操作系统通常做的任何事情来启动它们。6502在通电时确实去了重置向量,但那是很久以前的事了。哦,不,nestest确实是裸机。但6502实际上并不从FFFC开始,它从FFFC(和FFFD)读取一个16位地址,并从该地址指向的任何地方开始。这是一个向量。使用nestest,您必须将其内存放置两次,一次从8000开始,第二次从C000开始。