【问题标题】:Gameboy emulator testing strategies?Gameboy模拟器测试策略?
【发布时间】:2011-08-05 08:57:17
【问题描述】:

我正在编写一个 gameboy 模拟器,并且正在努力确保正确模拟操作码。某些操作会设置标志寄存器,并且很难跟踪标志是否设置正确,以及设置的位置。

我想编写某种测试框架,但认为值得在这里寻求帮助。目前我看到了几个选项:

使用多个测试用例对每个操作码进行单元测试。问题是有 256 个 8 位操作码和 50+(不记得确切数字)16 位操作码。这需要很长时间才能正确完成。

编写某种日志框架,在每个操作中记录堆栈跟踪并将其与其他已建立的模拟器进行比较。这将很快完成,并且可以相当快速地了解究竟出了什么问题。日志文件看起来有点像这样:

...
PC = 212 Just executed opcode 7c - Register: AF: 5 30 BC: 0 13 HL: 5 ce DE: 1 cd SP: ffad
PC = 213 Just executed opcode 12 - Register: AF: 5 30 BC: 0 13 HL: 5 ce DE: 1 cd SP: ffad
...

缺点是我需要修改另一个模拟器的源以输出相同的形式。并且无法保证操作码是正确的,因为它假定其他模拟器是正确的。

我还应该考虑什么?

如果有帮助,这是我的代码:https://github.com/dbousamra/scalagb

【问题讨论】:

    标签: unit-testing testing emulation


    【解决方案1】:

    您可以使用已经建立的测试 ROM。我会推荐 Blargg 的测试 rom。您可以从这里获取它们:http://gbdev.gg8.se/files/roms/blargg-gb-tests/

    【讨论】:

    • 是的,测试 rom 很棒。但是如何在没有工作 PPU 的情况下使用它们测试 CPU?
    • Blargg 的测试 rom 也会写入 gameboy 的链接端口,因此您可以创建一个仅打印通过链接端口发送的字符的函数。如果您查看自述文件,则测试 rom 的文档记录非常充分:s。
    • 您提供的链接已失效。这是另一个gbdev.gg8.se/files/roms/blargg-gb-tests
    • @BoredT:感谢您指出!我用你更新的链接更新了我的答案。
    【解决方案2】:

    对我来说最好的主意是你已经提到的那个:

    • 使用一个众所周知的现有仿真器,并且您拥有源代码。我们称它为 主模拟器
    • 获取一些可用于测试的 ROM
    • 在已知运行良好的模拟器中测试这些 ROM。
    • 修改主模拟器,使其在运行时为每个执行的操作码生成日志。
    • 在您自己的模拟器中做同样的事情
    • 比较输出

    我觉得这个更有优势:

    • 您将获得来自良好模拟器的日志文件
    • 可以更快地评估测试结果
    • 你可以使用多个模拟器
    • 您可以稍后再深入一些,例如将内存放入日志并查看两种实现之间的差异。

    【讨论】:

    • 我喜欢在特定时间点比较内存映射的想法。
    • 好的,我添加了一些测试来与另一个模拟器 (JavaBoy) 的堆栈跟踪进行比较。效果很好。
    • 与其他模拟器比较的一个问题是很多模拟器不是很准确。我建议改用专用的测试 rom 进行测试。
    • @DominicBou-Samra 我知道这有点晚了(呃...... 5 年?:P)但我可以有一个编辑过的 Javaboy 的编译版本吗?我遇到了和你一样的问题,除了我找不到另一个我可以更改和编译的工作模拟器。 :/ 谢谢!
    • @TheAbelo2 对不起,伙计,我不再有代码 :( 我会在 reddit.com/r/emudev 上提问
    猜你喜欢
    • 2022-01-07
    • 2015-02-04
    • 2013-08-29
    • 1970-01-01
    • 1970-01-01
    • 2012-07-17
    • 1970-01-01
    • 2016-07-29
    • 2013-05-17
    相关资源
    最近更新 更多