sacchie / gbem

0 stars 0 forks source link

本格的なROMを動かす #21

Closed kigh-ota closed 3 months ago

kigh-ota commented 9 months ago

https://hh.gbdev.io/game/shock-lobster

kigh-ota commented 9 months ago

Cartridge Type = $03 | MBC1+RAM+BATTERY ROM size = $00: 32 KiB 2 (no banking) RAM size = $02 | 8 KiB | 1 bank

TODO: https://gbdev.io/pandocs/MBC1.html

cartridgeType: 0x3, romSize: 0x0, ramSize: 0x2)
Exception in thread "main" java.lang.RuntimeException: Invalid address: 0x2000
    at State$memory$1.set8(State.kt:285)
    at cpu.RunKt.run(run.kt:422)
    at MainKt.loop(main.kt:32)
    at MainKt.main(main.kt:84)
kigh-ota commented 8 months ago

2024/3/12

色々やって、haltでストップしている。画面は真っ白

-------------------------------------------- 0x1e5a: OpLdFromIoPort(d=0x48)
-------------------------------------------- 0x1e5c: OpSraR8(r=D)
-------------------------------------------- 0x1e5e: OpRrA()
-------------------------------------------- 0x1e5f: OpSraR8(r=D)
-------------------------------------------- 0x1e61: OpRrA()
-------------------------------------------- 0x1e62: OpPushR16(r=AF)
-------------------------------------------- 0x1e63: OpPushR16(r=BC)
-------------------------------------------- 0x1e64: OpRstN8(n=N_08)
------------------------------------------- 0x8: OpLdR8D8(r=A, d=0x1)
------------------------------------------- 0xa: OpLdToIoPort(d=0x94)
------------------------------------------- 0xc: OpHalt()
hmaeta commented 7 months ago

ここで止まったように見える: https://github.com/tbsp/shock-lobster/blob/600c8e332881277304c3b0b593d9eeb11d6a8b60/src/vectors.asm#L27-L32

hmaeta commented 7 months ago

putSpritePixelsForScanlineInViewportToBufferを速攻returnすると下のような表示になった。 image

この海藻 (と以後、呼称する) は現状2つのみ表示される。 速攻returnでは上記の通り0なためは、これはspliteで実装されてそう。

この画面では海藻が4つ出るのが正しい。 現状2つのみということは、このsplite実装がミスしていそう。

4つの海藻のうち2つはshock lobsterの文字の後ろ側に表示されていて、これが表示されていない。 backgroundより裏側のspliterが表示されてなさそう。

drawBackgroundForScanlineInViewportをコメントアウトしたら海藻が4つ表示された。 透明色が考慮されてない? bg -> window -> spliteという描画の順番がおかしい? たしか描画の順番はサボっていた気がする。

kigh-ota commented 7 months ago

https://github.com/tbsp/shock-lobster/blob/master/src/room_title/room_title.asm#L386 海藻で合ってるらしい

kigh-ota commented 7 months ago

これでタイトル画面だけは表示が正しくなりそう https://github.com/sacchie/gbem/commit/fc961fb28a3cf13e96e09172dd21422e5d87c6b4

その後の画面はまだ直ってない

kigh-ota commented 7 months ago

BG/Window/Spriteの描画ON/OFFをトグルするデバッグ機能とかあると良いかも

kigh-ota commented 7 months ago

2024-04-02

Screenshot 2024-04-02 at 20 05 14
hmaeta commented 7 months ago

左上のspriteと右下のspriteが変わっている。 正解によるとこれは同一のものになるべき。 image

OamDataを見たところ、titleIdは一致している。

0 OAM data: OamData(yPosition=39, xPosition=16, tileId=25, attributes=0)
1 OAM data: OamData(yPosition=47, xPosition=24, tileId=25, attributes=96)
2 OAM data: OamData(yPosition=127, xPosition=136, tileId=26, attributes=16)

26が「A」のタイルなので、25をflipしようとして26に侵入した?

hmaeta commented 7 months ago

image

winを非表示にしてbgとspriteだけ表示にしたもの。 Highが正しい位置に出ている。これはbgで描画されたもの。

winとbgでタイルの取り違えが起きてる?

kigh-ota commented 6 months ago
Screenshot 2024-04-23 at 18 29 54
kigh-ota commented 6 months ago

2024/4/23

TODO

わかったこと

hmaeta commented 6 months ago

LY=LYCの比較とSTAT interruptを実装したところ、改善が見られた: image

kigh-ota commented 6 months ago

メモ ループ中で何回に1回drawScanlineすべきか?の概算

hmaeta commented 6 months ago

次はgetCycleCountを実装して描画結果が変わるか確認。

kigh-ota commented 6 months ago

今回: Opのcycle countを真面目に実装したが見た目は変わらなかった

次回: https://github.com/Baekalfen/PyBoy/blob/master/pyboy/core/lcd.py#L134 あたりを参考に、LCDのrenderingにPPU Modeなどを考慮してちゃんと実装する

kigh-ota commented 5 months ago

次回: state.ppuMode から STAT register や OAM アクセス制限 を実装する

hmaeta commented 5 months ago

startの下に線が出るようになっていた。

image

hmaeta commented 5 months ago

今回: STAT register の対応をした

次回: STAT interrupts (mode 0~2)、 OAM アクセス制限 を実装する

kigh-ota commented 4 months ago

STAT interrupts 残り実装しても変わらず

https://github.com/mattcurrie/dmg-acid2 を久しぶりに通してみる

スクリーンショット 2024-07-09 18 42 52

いくつかFailure Exampleに当てはまるが、まず

Eye displayed instead of right chin Window internal line counter

を直す

結果、改善したように見える

スクリーンショット 2024-07-09 19 27 19 スクリーンショット 2024-07-09 19 29 19 スクリーンショット 2024-07-09 19 29 53
kigh-ota commented 4 months ago

TODO

hmaeta commented 3 months ago

dmg-acid2 test rom

この対応はすべてforEachSpritePixelForScanlineInViewportToBufferの内部実装を変えるだけで済んだ。 つまりforEachSpritePixelForScanlineInViewportToBufferの切り方がよかったということのはず。