いままでの傾向に該当しない謎の不具合.
通常であれば転送途中に止まるとかADPCMの制御途中に止まるという CD-ROM2 の機能で止まるのが普通なのに対し、 PCE のビデオ機能だけで不具合が起きる.
もしこのような場合では別のところでCPUが暴走するのが普通なのにスクロールだけがおかしいのはとても不思議.
Mednafen で動作をみたところ CD-ROM の転送速度を速くしても起きないので転送速度が原因の可能性は低い. デバッガでみるところでは描画途中にスクロールレジスタを書き換える処理の割り込みがうまくいっていないのか、2フレーム他院にスクロールスクロールレジスタが書かれているらしい.
レジスタ書き換えのためのスキャンライン割り込みやなぜか直る花火セットの処理を解析する必要があるが、手間が大きいので現状は保留.
SEEK TIMER の実装により改善してしまった.
改善すると思っていなかったので確認をしていなかったが報告を受けてこちらでも確認.
状態は変更するが原因を突き止めていないので再発する可能性がある.
read 時間を調節していたらゲーム開始と同時に無限に command 0xd8 を発行する不具合が発生...
command 0xd8 で seek をしたあと再度 seek をしたあとの処理を変更したので動作がおかしく見えたのが原因.
つまりどちらの状態でも無限に command 0xd8 を発行していたが、無視する処理が入っていたので問題に気づいていなかった.
無視する処理をなくしたのは同級生の起動直後の CDDA の再生がおかしくなることに気づいたため.
どの対処が最適か調査する.
mednafen の pcecd_drive.cpp の DoNEC_PCE_SAPSP() 内部の下記の if に相当する分岐を追加することでドラビアンナイトと同級生の不具合両方が直ることを確認.
if((cdda.CDDAStatus == CDDASTATUS_PLAYING) && (new_read_sec_start == read_sec_start) && (((int64)(monotonic_timestamp - pce_lastsapsp_timestamp) * 1000 / System_Clock) < 190)){
pce_lastsapsp_timestamp = monotonic_timestamp;
SendStatusAndMessage(STATUS_GOOD, 0x00);
CDIRQCallback(PCECD_Drive_IRQ_DATA_TRANSFER_DONE);
return;
}
upergrafx_20181222.pac で直った理由は command_d8 の処理をかなり作り直したときにこの分岐を中途半端にいれていたのでドラビアンナイトが直り、同級生がおかしくなった.
その後同級生がおかしいことに気づき対処を入れたら、ドラビアンナイトがおかしくなった.
command log をみればすぐにこの不具合に気づくはずが、スクロールの不備というところで VDC 制御の調査ばかりしていて調査が難航していた.
はなびセットをとると不具合が一時的に解消するのは、はなびセットの voice を read8 経由で再生しているらしく、その後 command 0xd8 の無限発行が止まる.
該当ステージをクリアし、ステージを開始するとまた command 0xd8 の無限発行が始まる.
CDソフト開発中になぜ気づかないのか不思議なひどいバグ.
この問題は場当たり的対応をいれていましたが、通常のソフトに副作用があることがわかりました.
2つのソフトの原因は無限に command 0xd8 と command 0xd9 (スチームハーツのみ)を発行することです. これを無視する明確な条件が必要です.
改題と状態変更をいたします.