Closed kigh-ota closed 3 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)
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()
putSpritePixelsForScanlineInViewportToBufferを速攻returnすると下のような表示になった。
この海藻 (と以後、呼称する) は現状2つのみ表示される。 速攻returnでは上記の通り0なためは、これはspliteで実装されてそう。
この画面では海藻が4つ出るのが正しい。 現状2つのみということは、このsplite実装がミスしていそう。
4つの海藻のうち2つはshock lobsterの文字の後ろ側に表示されていて、これが表示されていない。 backgroundより裏側のspliterが表示されてなさそう。
drawBackgroundForScanlineInViewportをコメントアウトしたら海藻が4つ表示された。 透明色が考慮されてない? bg -> window -> spliteという描画の順番がおかしい? たしか描画の順番はサボっていた気がする。
これでタイトル画面だけは表示が正しくなりそう https://github.com/sacchie/gbem/commit/fc961fb28a3cf13e96e09172dd21422e5d87c6b4
その後の画面はまだ直ってない
BG/Window/Spriteの描画ON/OFFをトグルするデバッグ機能とかあると良いかも
2024-04-02
左上のspriteと右下のspriteが変わっている。 正解によるとこれは同一のものになるべき。
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に侵入した?
winを非表示にしてbgとspriteだけ表示にしたもの。 Highが正しい位置に出ている。これはbgで描画されたもの。
winとbgでタイルの取り違えが起きてる?
2024/4/23
.waitVRAM
を読んでて気付いた
StatusRasterTable
に、割り込みパラメータのLYC
の値が入ってそう。その値は vectors.asm:124 の STAT handler で触ってそう(詳細はわからない)LY=LYCの比較とSTAT interruptを実装したところ、改善が見られた:
メモ ループ中で何回に1回drawScanlineすべきか?の概算
次はgetCycleCountを実装して描画結果が変わるか確認。
今回: Opのcycle countを真面目に実装したが見た目は変わらなかった
次回: https://github.com/Baekalfen/PyBoy/blob/master/pyboy/core/lcd.py#L134 あたりを参考に、LCDのrenderingにPPU Modeなどを考慮してちゃんと実装する
次回: state.ppuMode から STAT register や OAM アクセス制限 を実装する
startの下に線が出るようになっていた。
今回: STAT register の対応をした
次回: STAT interrupts (mode 0~2)、 OAM アクセス制限 を実装する
STAT interrupts 残り実装しても変わらず
https://github.com/mattcurrie/dmg-acid2 を久しぶりに通してみる
いくつかFailure Exampleに当てはまるが、まず
Eye displayed instead of right chin Window internal line counter
を直す
↓
結果、改善したように見える
TODO
dmg-acid2 test rom
この対応はすべてforEachSpritePixelForScanlineInViewportToBuffer
の内部実装を変えるだけで済んだ。
つまりforEachSpritePixelForScanlineInViewportToBuffer
の切り方がよかったということのはず。
https://hh.gbdev.io/game/shock-lobster