Gameboy模拟器测试策略?

Dom*_*mra 4 testing unit-testing emulation

我正在编写一个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
...
Run Code Online (Sandbox Code Playgroud)

缺点是我需要修改另一个模拟器的源以输出相同的表单.并且不能保证操作码是正确的,因为它假定其他仿真器是.

我还应该考虑什么?

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

nij*_*kim 7

你可以使用已经建立的测试roms.我会推荐Blargg的测试roms.你可以从这里得到它们:http://gbdev.gg8.se/files/roms/blargg-gb-tests/.

  • Blargg的测试roms也会写入gameboy的链接端口,因此您可以创建一个只打印通过链接端口发送的字符的函数.如果您查看自述文件,测试roms就会有很好的文档记录:s. (2认同)

gyu*_*isc 2

对我来说最好的想法是你已经提到的:

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

我认为这个有更多的优点:

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