2011-08-05 55 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