Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Galaga & Galaxian 顯示錯誤 #3

Open
GGORZ10227216 opened this issue Nov 25, 2020 · 1 comment
Open

Galaga & Galaxian 顯示錯誤 #3

GGORZ10227216 opened this issue Nov 25, 2020 · 1 comment

Comments

@GGORZ10227216
Copy link

GGORZ10227216 commented Nov 25, 2020

執行的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
Copy link
Author

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant