状態変更
開発途中にも動いたりうごかなかったりしていたので頻度も変更.
再生時間半分割り込みのイベント発生時にマスクが0になっているので、
再生時間半分割り込みが IRQ2 に伝わらなくて 6280 で割り込みが発生せずに内部処理としてフリーズしているのを確認.
再生時間半分割り込みのマスクを頻繁に上げ下げしているのがこのソフトであって顕著に起きると予想. その予想が正しい場合は再生時間半分割り込みのイベントの発生が早すぎることに起因する.
ADPCM 再生時間半分割り込み向けのカウンタは write で += 1, read で -= 1, play で -= 1 となっている. write と read はいいとして play は upergrafx の構造上きれいに同期が取れていないことが原因.
現状のカウンタは MS5205 の接続されている fifo の書込みで更新しているが、play としては fifo の読み込みで更新すべきである. upergrafx の構造上この fifo が dual clock となっているので write 側から read strobe を簡単に読み込むことはできない.
再生完了割り込みに限っては fifo の empty を使う. empty は read, write 側どちらでも各 clock に同期したレジスタが読み込めるので問題になっていない.
4番の予想は外れだったのでこれはなし.
IRQ2 を追うと ADPCM 再生時間半分 → CD READY → CD DONE →ADPCM 再生時間半分のループでまわるはずだが、割り込みマスクの再設定がどこかでうまくいかなくなるらしい.
CD 読み込みの時間と応答処理らへんにテキトーにwaitをいれてみると動いたり動かなかったり非常に不安定.
そのどこかは MAME ではADPCM 再生時間半分割り込みが実装されてないので調査不可能, mednafen は割り込みは動くけど trace がないので調査不可能.
根本的調査にはちゃんと動くエミュレータ+機能豊富なdebuggerを見つける必要がある.
<BTS:26>の修正ではこの問題は改善されていない.
<BTS:54> に関連したのか発生しなくなった.
状態を修正済みに変えて経過を見る.