2011-08-05 56 views
4

我正在写一个gameboy模拟器,并努力确保opcode正确地模拟。某些操作会设置标志寄存器,并且可能很难追踪标志设置是否正确以及在哪里。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

回答

2

对我来说,最好的办法是,你已经提到的一个:

  • 利用现有的模拟器,是众所周知的,你的源代码。让我们把它主模拟器
  • 采取一些ROM,你可以用它来测试
  • 测试这些ROM中已知可正常工作的模拟器。
  • 修改主模拟器所以它正在运行针对其执行每个操作码而产生的日志。
  • 做同样在自己的模拟器
  • 比较输出

我觉得这其中有多种优势:

  • ,你会从一个良好的模拟器有日志文件
  • 的测试结果的可评估更快
  • 你可以使用一个以上的模拟器
  • 之后,你可以更深入地将内存放到日志中,并查看两个实现之间的差异。
+0

我喜欢在某些时间点比较内存映射的想法。 –

+0

好吧我已经添加了一些测试来比较另一个模拟器(JavaBoy)的堆栈跟踪。效果很好。 –

+0

与其他仿真器相比,一个问题是很多仿真器不是很准确。我建议用专用的测试ROM进行测试。 – nijoakim

7

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

+0

是啊测试ROM是伟大的但你怎么测试你的CPU与他们,没有一个工作的PPU ? –

+2

Blargg的测试ROM也会写入到gameboy的链接端口,所以你可以创建一个函数来打印通过链接端口发送的字符,如果你签出自述文件,测试ROM有很好的记录: – nijoakim

+0

你的链接这是另一个http://gbdev.gg8.se/files/roms/blargg-gb-tests/ – BoredT