Gameboy模拟器测试策略?

时间:2011-08-05 08:57:18

标签: unit-testing testing emulation

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

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

使用多个测试用例对每个操作码进行单元测试。问题是有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

2 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:2)

对我而言,最好的想法是你已经提到的那个:

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

我认为这个更有优势:

  • 您将拥有来自优秀模拟器的日志文件
  • 可以更快地评估测试结果
  • 您可以使用多个模拟器
  • 您可以更深入地将内存添加到日志中,并查看两种实现之间的差异。