gpt4 book ai didi

testing - 如何加载嵌套 ROM?

转载 作者:行者123 更新时间:2023-11-28 20:04:34 39 4
gpt4 key购买 nike

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

最佳答案

根据 Nick Westgate 的评论(因此是即时社区 wiki),加载过程 is a bit more complicated than you might naively guess :

For now, you can load 0x4000 bytes starting at offset 0x0010, and map that as ROM into both $8000-$BFFF and $C000-$FFFF of the emulated 6502's memory map.

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

忽略之前帖子中的评论,您应该“在每个周期[记录]您的 PC(和注册)”,以及该帖子及以后的相同含义;他的意思是:

  1. 在获取第一个操作码字节之前,对程序计数器和其他寄存器进行内部记录;
  2. 读取最终操作数字节后,记录您在步骤 (1) 中存储的所有值以及完整指令及其反汇编。

如果您已简化模拟器中的内容以原子方式读取和执行每个操作,然后提前跳过您本应花费的周期数,那么您可能可以省略临时存储。我怀疑生成样本日志的作者已经实现了这样的模拟。关键线索将是一个由操作码索引的 switch 表,它在某种程度上不是协程,和/或指令长度的查找表。

进一步的建议:

NES 实际上并没有使用 6502。它使用了一个省略了十进制模式的克隆——十进制标志根本没有作用。因此,如果您正在仿真 6502,预计测试结果会有所不同。

对于其他好的 6502 测试,请参见:

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

我使用所有这三个来引导我最新的 6502 仿真器,加上一些自己编写的逐周期测试,用于测试诸如中断之类的事情,您不希望位于 6502 地址空间内的代码能够处理。

我后来发现我在小数处理上有一个非常小的偏差——小到足以通过所有这些测试,但不足以通过详尽的 6502 比较。我在 Acorn BBC 社区的存档中方便地找到了一个更好的测试 attached to this post .我选择通过以下方式运行:

  • 0x2900 加载 BCDTEST_beeb 的内容;
  • JSR 2900h写入地址0x200
  • 0xffee 处放置一个 RTS,同时确保您可以捕获该地址;
  • 将程序计数器设置为0x200并继续运行直到它位于0x203
  • 然后测试 0x84 处的值是否为 0。如果是其他情况,则表示失败。

为了获得更多反馈,每当 PC 转到 0xffee 时,输出 A 寄存器中的 ASCII 字符。

关于testing - 如何加载嵌套 ROM?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46998060/

39 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com