2017-10-29 130 views
0

我寫完了我的6502模擬器,我準備開始測試它。我發現了帶有一些文檔的ROM,但我不確定,加載ROM的正確方式是什麼。作者說,模擬器應該從0xC000開始,當我加載ROM時,它包含0,所以我必須做錯了什麼。如何加載最新的ROM?

所以現在我的加載過程看起來是這樣的:

clear memory 
set PC to 0x8000 
open the file 
skip first 16 bytes (iNES header) 
load the rest of the file into RAM (starting at 0x8000) 
set PC to 0xC000 
+1

看起來你需要在[0x8000和0xC000](https://github.com/PyAndy/Py3NES/issues/1)上加載它。 –

+0

哦,這不是所謂的鏡像嗎? –

回答

2

按照尼克梅龍鎮的評論(因此即時羣體維基),加載過程is a bit more complicated than you might naively guess

現在,你可以從偏移量0x0010開始加載0x4000字節,並且將 作爲ROM加載到仿真的 6502的存儲器映射的$ 8000- $ BFFF和$ C000- $ FFFF中。

'現在'假設你要編寫一個NES模擬器,因此有一天會正確解析測試存儲在NES相關的文件格式並模擬NES特定的內存映射方案到內容的鏡像。

在此之前,您應該忽略註釋,您應該「在每個週期」[登錄]您的PC(並註冊)「,以及在該帖子之後的含義;他的意思是:

  1. 取出第一個操作碼字節之前,做一個程序計數器和其他寄存器的內部記錄;
  2. 在讀完最終操作數字節後,記錄您在步驟(1)中存儲的所有值加上完整指令及其反彙編。

如果您已經簡化了模擬器中的內容,以原子方式讀取和執行每個操作,然後將時間提前跳過應花費的週期數,那麼您可能會忽略臨時存儲。我懷疑生成示例日誌的作者已經實現了這種模擬。關鍵線索將是由操作碼索引的switch表,它不以某種方式作爲協程和/或指令長度的查找表。

更多建議:

的NES實際上並不使用6502它採用省略了小數模式的克隆 - 十進制標誌也沒有效果。所以如果你正在模擬一個6502,期望測試結果在那裏變化。

對於其他好6502周的測試,請參閱:

  • AllSuiteA(測試一大堆的東西,給你一個及格或不及格);
  • Klaus Dormann's tests(稍微有點麻煩;如果某個特定的測試失敗,它會在某個地方簡單地進入一個無限循環),你需要檢查源代碼來找出你的失敗。和
  • Wolfgang Lorenz's tests(一大堆單獨的測試,最初是爲了在C64上單獨運行,但很容易在沒有任何實現超過6502的情況下運行,除此之外它將提供PETSCII中的狀態文本輸出,所以你也可以需要一個快速查找表來將其映射到ASCII)。

我用這三種方法來引導我最近的6502仿真器,再加上一些自行編寫的循環週期測試,例如中斷,你不希望代碼位於6502的地址空間內能夠處理。

我後來發現,我在十進制處理方面有一個很小的偏差 - 小到足以通過所有這些測試,但不足以通過詳盡的6502比較。我在Acorn BBC社區發現了一個更好的測試,在檔案attached to this post內。我選擇通過:

  • 加載BCDTEST_beeb的內容在0x2900;
  • JSR 2900h地址0x200;
  • RTS置於0xffee,但也確保你可以捕獲該地址;
  • 將程序計數器設置爲0x200並繼續運行,直到它在0x203;
  • 然後測試0x84的值是0。如果是別的東西,則表示失敗。

想要獲得更多反饋,任何時候PC進入0xffee,都要在A寄存器中輸出ASCII字符。

+0

感謝您的努力!所以我得到了最新的加載和運行,我可以記錄一切,所以這很好。是的,有一天我會解析iNES頭,一旦其他組件完全實施。 –

+0

理光CPU實際上是否有BCD標誌?我注意到它的最新測試,這很奇怪,因爲nesdev wiki說旗子不應該有任何效果(我認爲它甚至不存在)。我不打算實施BCD模式,所以我最初避免了任何測試BCD的測試。 –

+0

我的理解是它有它,但並不尊重它。所以你可以使用'CLD' /'SED',如果你使用'PHP',你可以看到差異,但'ADC'和'SBC'將總是作爲二進制。假設測試完全適合NES,可能包含的測試是你忽略了它? – Tommy