特定の SDcard で特定の address での読み込みで fifo の書き込みより読み込みが足りなくなるらしい. 転送された ROM image の正常なデータ比較すると同じデータが一定時間出ていて、また戻る. (t.bin offset 0x0003e40 から 0x03e98 まで) 足りなくなる「らしい」と書いたのは signal tap で fifo が empty のときに read をしているログがなぜかとれなかったため.
問題の SDCARD の問題のaddressは確認したところ2かしょ. TAI 命令の転送をやめて 6502 の単なる命令のループを使えば2つも回避できたのでこの状態にする. よって転送時間は遅くなった. TAI を使用したまま fifo を深くした場合も回避できた場合と回避できなかった場合両方があった. 回避できなかった場合は signaltap で中身を追いたかったが empty と read の and ではないらしいのでとれなかった. しかしそれ以外でこのような状態が出るのは謎.
CD-ROM data の fifo を深さを 0x800 byte にして、fifo が空になる時間を伸ばしたこと、1 sector 単位で同期をとることで問題の解決を確認. 解決自体は fifo の深さを広げるだけだが、FPGA の資源が足りなかったので無駄な機能やRAMの削減に非常に手間がかかった. 具体的な内容は下記. https://na6ko.hatenadiary.jp/entry/2019/02/26/210529 この話題に関係するところは CD-ROM fifo が CD-DA fifo と統合したので、 fifo に制御についてソースは書き直しになった.
#1 で signaltap で計測できなかったのは fifo の rd 端子の計測ポイントが よくなかったものと思われる. ソース上で fifo の位置を変えたので比較対照できない. 新しいソースで fifo の深さが 0x200 byte の場合に empty のときに rd を 1 にする場所を確認. 深さを 0x800 byte に変えた後に問題が起きないことも確認. メモリーカードに依存するが、そのようなメモリーカードで問題が起きるのは ROM image 読み込みの 0x1ff808.r を TAI 経由で読んだり、転送部分を書き換えたシステムカードの BIOS の 2 条件で問題が発生していたことを確認した.
TAI 命令を利用する場合は割り込みが発生しない問題の根本的対処ができないことが判明. この機能自体を没とする.この機能が原因の転送も廃止. 状態を却下に変更.