<BTS:71> #5 の続き. 自前コードで CD-ROM2 レジスタの address 0x1ff803.r.6 == 0 であることを期待して停まっていた. address 0x1ff803.r.6:5 は CD drive の IRQ event とその mask があり下記の接続となる. 6280.IRQ2 = (event[1] & mask[1]) | (event[0] & mask[0]); 0x1ff803.r.6:5 は下記のようにしていた. 0x1ff803.r.6:5 = event[1:0]; これを下記に変更するとソフト側の期待値になる. 0x1ff803.r.6:5 = event[1:0] & mask[1:0] bios 外の自前コードで勝手に見ているだけなので影響は少ないと思うが、期待する値に変更した. 変更はしたが、参考になるオープンソースのエミュレータのソースコードも読みづらくてこれがいいのか自信がない.
HuVideo のユナが起動しなくなったのでこの修正は没...
emulator のソースコードを見なおすと address 0x1ff800.w = 8'hxx とすると, event[1:0] = 0 とすると期待通りになるようだ. それはsoftでの変数だと簡単に 0 に設定できるが、このレジスタは MCU が管理しているので MCU へ割り込みをかけてはじめて event[1:0] = 0 とできる. しかし address 0x1ff800.w = 8'hxx は MCU への割り込み条件にしていない. address 0x1ff803.w.6:5 とは別の and 演算 mask を付ければいいが、 mask を 0 にするところがわかっていても 1 にする場所の調査がいる.
#3 の対策は効果がなかった. address 0x1ff803.r.6 == 0 であることの期待は下記の手順であった. - read(6) 発行, 転送先 ADPCM 用 RAM - 読み込み完了後レジスタの操作 - address 0x1ff803.r.6 == 0 を期待 - そのあと CD-ROM2 側が address 0x1ff803.r.6 = 1 とする. 問題のレジスタの確認タイミングは 1->0 になる場所と思っていたが実際には 0->1 であった. ロード時間を落とした上, そのレジスタを設定する MCU の処理に待ち時間をいれることで動作した. この待ち時間は scsi.c の disc_done_cdrom() で転送先が 6280 向け fifo のときはいれていたが、転送先が ADPCM 用RAM の場合もその待ちをいれることにした. この部分は mednafen の pce_fast でも発生する問題.
https://twitter.com/yamada_arthur/status/1056174730342887425 PCE(CDR) コブラⅡ 伝説の男(ハドソン)のタイトル画面で上を押しながらⅡ、左を押しながらⅠ、右を押しながらⅠ、下を押しながらⅡの順に入力するとシナリオ選択などができるメニューが出現します。
まだ不安なところがあるがデバッグメニューのやり方もわかったので終了. 問題が見つかれば復活するかもしれない.