Disksystem の対応
この手の ROM dumper で diskimage を dump できるのかをようやく挑戦した. カードエッジの CPU(2A03) IRQ# を MCU の外部割り込み端子とをこの目的のために接続してありようやく動作確認した. 結果は数日で diskimage を dump できるまでになった. いまは解析資料が豊富にあるからとても助かる. nesdev wiki のひと、そこに貼ってあったリンクの方々、ありがとうございます.
GAP 区間と RAM アダプタ
RAM adapter からデータを取る場合に特有な問題は GAP 区間に read/write にするレジスタを有効化し、正味のデータの区間が終わった後はそのレジスタを無効化する必要がある. これをやらないと次の正味のデータ区間の中身がデタラメになってしまう. この制約をクリアするにはハードにより近い MCU で効率的に行う必要があり、PC からスクリプト経由で随時命令を送ることが困難である.
この制限のせいか、エミュレータのFDSファイルは正味のデータのみで、正味のデータでも末尾のCRCは捨てている.
実装途中はこの仕様を理解していなかったのでデタラメにレジスタを有効にしていたもので、1度のシーケンシャルアクセスで正味のデータが1区間だけ見えるということになった. ただ GAP とか ブロック開始符号が見えたので、試せば正味以外のデータ区間も見ることができるのではないだろうか.
でもディスクドライブのコネクタに直接つなぐような機材は実在して安く手に入るし、そっちでは完璧なデータが効率よく見えるのはわかりきっている.
ディスク末尾のデータ
FDS ファイルは正味のデータだけを1面 65500 bytes と定義されているがファイル(ブロック)を増やせば GAP 区間は増えて正味のデータ区間は減る. この矛盾を理解できていないので、ディスク末尾はどこまで読めばいいのかよくわからない.
そのせいなのか、私の作った dumper では末尾に配置されるセーブデータが dump できていないとか起動しないというソフトが1つずつ見つかった. 逆に言うとそれ以外はほとんど問題がないらしい.
MCU の話
外部割り込み自体はあっさり認識したものの、 DMA の CTRLB と EVSYS のあたりがまたうまく行かずに RAM アダプタからの IRQ をトリガに動かすということに苦労した.
GAP 区間では待ち時間の対応を入れるためにタイマのソースコードを書き直した. DMAのつなぎ合わせで待ち時間 2 clock だけのタイマを大量に利用しているとかでタイマが足りなくなっているため、必要応じて切り替えを多用することにした. これは実はかなりキツイので実装の見直しを考えた方がいい.
例えばアクセスランプの点滅にタイマを確保していたのだが、これもやめたほうがいい. 10から60Hzの点滅にタイマを使うぐらいなら割り込みのたびにソフトでIOを ON.OFF したほうがいいと思う.
ソフトウェア面では先述のディスク制御特有の処理のために C で実装したので ROM の空きが 10% を切ってしまった. ほかは RAM 管理を静的に確保するのに限界をとても感じているので動的に確保するようにしたい. 今回のせいで C++ ではないのにヘッダファイルが200行にもなってしまった巨大な struct を分離する必要が出てきた.