-
Notifications
You must be signed in to change notification settings - Fork 0
Log 07
昨天的我真的是太天真了,以為可以直接用別人寫好的單元測試來驗證指令。我確實是有找到一個單元測試框架,裡面也有包含作者自己實作的CPU。根據作者的說法,他自己的CPU有通過最廣為人知的Blargg's test ROMs,這通常是作為Game Boy模擬器開發者完成後的第一個測試套件。然而就在我好不容易串接好他的測試框架後,發現一直測不出結果,我花了好一段時間去看他的程式碼才發現測試框架是有bug的,看來他的測試框架並沒有通過測試呢;再者我觀察了他使用的測資,似乎也不是很全面,總之我不是很想再花時間修改他的專案。至於為什麼我不直接用Blargg的測試套件,因為這東西只有CPU是沒辦法用的,起碼還要再補上一些memory mapping相關的程式碼。
我打算要先試試看boot ROM,現階段與其去追求通過一個完整的測試,先做出一些可見的成果,對後續開發應該能增添更多動力。boot ROM原本就只是開機程序,不是以測試為目的,就算過程中有錯誤其實也很難看出來問題在哪裡;很遺憾我在參數傳遞的過程中確實出了點差錯,但這些錯誤「幸運」地形成了無限迴圈,讓我很快就能找到。在之前撰寫opcode的mapping時,有某些switch cases傳遞了錯誤的函數物件,我想這大概也是編譯期解碼的一個缺點吧,畢竟一開始都是先手寫一個case,同類的指令複製貼上後再去改參數,實在很難避免錯誤。後來實作0xCB前綴指令時,先寫好模板後再用程式產生就沒有發生這個問題(或者只是我還沒發現)。
我還沒有跑完整個boot ROM,不過有幾個值得一提的要點:
Addr_0064:
LD A,($FF00+$44) ; $0064 wait for screen frame
CP $90 ; $0066
JR NZ, Addr_0064 ; $0068這段程式會去嘗試去讀取要顯示在畫面上的資料,由於我們還沒實作PPU(Picture Processing Unit),所以這段記憶體不會有資料。想暫時通過這裡可以先把0xFF44這個位址讀取到的記憶體設定成0x90。
Addr_00E6:
LD A,(DE) ; $00e6
INC DE ; $00e7
CP (HL) ; $00e8 ;compare logo data in cart to DMG rom
JR NZ,$fe ; $00e9 ;if not a match, lock up here這一段則是要檢查卡帶內的某些資料,沒有通過的話就會一直卡在這裡。其實就跟實體掌機沒插卡帶的時候一樣,依然可以開機並且會停留在顯示任天堂Logo的畫面。也就是說接下來必須開始實作一些記憶體相關的基礎設施,這部份會在下一篇說明。