gameboy-emu icon indicating copy to clipboard operation
gameboy-emu copied to clipboard

Galaga & Galaxian 顯示錯誤

Open GGORZ10227216 opened this issue 5 years ago • 1 comments

執行的ROM: Galaga & Galaxian (J) [S].gb 遇到的狀況: 在進入遊戲後,畫面遇到下述異常:

  • Galaga畫面會全白,但是操作仍有反應且聲音正常,戰鬥過程中只能看到移動中的物件

  • Galaxian類似於Galaga,但一開始會看到異常的READY字樣(如下圖所示) Screenshot from 2020-11-25 20-02-21

可能原因推測:

  1. 關於一片白:
  • Galaga & Galaxian為了要突破sprite個數限制,使用了一個特殊技巧,將大部分的物件交由bg顯示,僅有玩家與攻擊中的敵人會將該區域內的bg map清除後改由OAM控制的sprite繪製

  • Galaxian更進一步的加上了ScrollX暫存器的操作,實現快速平移多個物件

  • 僅能看到移動中的物件是因為他們是sprite

透過觀察,可以得知顯示異常的皆為bg相關的圖形,因此可以將bug可能發生的範圍限縮

2.異常的READY字樣:

  • READY是sprite不是bg

  • LCD相關的除錯總離不開對各區域記憶體進行觀察,我們可以透過bgb觀察tile:

    Screenshot from 2020-11-25 20-20-17

  • 我們可以發現顯示錯誤的字母(E A Y)都剛剛好差了一個tile,且剛剛好又出現在正下方,因此可以懷疑OAM的解析出現問題,

    導致讀取到錯誤的tile number和可能觸發了8*16模式

GGORZ10227216 avatar Nov 25 '20 12:11 GGORZ10227216

後來進一步對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並不好處理......

GGORZ10227216 avatar Nov 26 '20 10:11 GGORZ10227216