Open GGORZ10227216 opened 3 years ago
後來進一步對instruction做分析,空白畫面的主因是因為LCDC Status Interrupt(0x48)的行為異常
一般來說,在進入48h中斷之後,應該要跳轉到0x42a,此時的LCD Mode應為0b11,LY==LYC會被檢查 在正確將STAT_LYC_COINC bit設為1之後觸發0x44b的or,另gb->gb_reg.LCDC & LCDC_BG_ENABLE為true
但gameboy_emu在0x42a的時候LCD Mode為0b01,LY==LYC不會被檢查,LCDC Bit 0也就不會被設為1 最終造成bg沒有被繪製(強行取消gb->gb_reg.LCDC & LCDC_BG_ENABLE判斷可以緩解問題,但我想應該會導致其他錯誤)
目前只能推斷是時序問題,但依照過往經驗,這類型的Bug並不好處理......
執行的ROM:
Galaga & Galaxian (J) [S].gb
遇到的狀況: 在進入遊戲後,畫面遇到下述異常:Galaga畫面會全白,但是操作仍有反應且聲音正常,戰鬥過程中只能看到移動中的物件
Galaxian類似於Galaga,但一開始會看到異常的READY字樣(如下圖所示)![Screenshot from 2020-11-25 20-02-21](https://user-images.githubusercontent.com/8469727/100225678-8bdc5680-2f59-11eb-8384-f0e1c012323f.png)
可能原因推測:
Galaga & Galaxian為了要突破sprite個數限制,使用了一個特殊技巧,將大部分的物件交由bg顯示,僅有玩家與攻擊中的敵人會將該區域內的bg map清除後改由OAM控制的sprite繪製
Galaxian更進一步的加上了ScrollX暫存器的操作,實現快速平移多個物件
僅能看到移動中的物件是因為他們是sprite
透過觀察,可以得知顯示異常的皆為bg相關的圖形,因此可以將bug可能發生的範圍限縮
2.異常的READY字樣:
READY是sprite不是bg
LCD相關的除錯總離不開對各區域記憶體進行觀察,我們可以透過bgb觀察tile:
我們可以發現顯示錯誤的字母(E A Y)都剛剛好差了一個tile,且剛剛好又出現在正下方,因此可以懷疑OAM的解析出現問題,
導致讀取到錯誤的tile number和*可能觸發了816模式**