2019-04-16 23:16 — asano
カテゴリー:
前回手動でコマンド発行するところまで書きました。
このままでは面倒ですし、何よりデータ転送を伴うコマンドが使えません。
メモリ上にコマンドとパラメータ列を書いておいて自動で送信、リザルトステータスの受信までを行えるようにします。
当初はステータスレジスタを参照しながら送信・受信を自動切換えさせようとしたのですが、なぜか不安定だったのでパラメータやリザルトのバイト数を指定するように変更しています。
これでFDCとのやりとりはできるようになったので、実際にディスクを読んでみることにします。
前回からかなり拡張していて、「80>」はステータスレジスタが0x80であることを表しています。
「cs」はRECALIBRATEコマンドで、ヘッドをトラック0に戻しています。「02/00」はコマンドとパラメータが2バイト・リザルトが0バイトの意味でデバッグ用です。もう消しても良いかな。
「88>」はステータスが0x88に変わって、ドライブ3のヘッド移動を表しています。これはコマンドを送った直後でまだ移動は完了していません。
Enterを空打ちしてプロンプトが「88]」に変わっていますが、これは完了してINTがアサートされたことを示しています。
「cci」はCHECK INTERRUPT STATUSコマンドで、「01/02」の意味は前記のとおり、「23 00」はリザルトステータスです。「23」はドライブ3でTRK0を検出していること、「00」はトラック0を表しています。
「ci」はREAD IDコマンド、現在トラックのヘッド0で実行されます。まだテストなのでヘッドは決め打ちになっています。リザルトが長いですね。先頭の「03 00 00」はドライブ3で正常終了です。続く「00 00 01 02」が最初に発見したID、トラック0のヘッド0は通常フォーマットされていればどのセクタも一緒になります。「01」がセクタ番号で1なのは単なる偶然、何度も実行すれば他の値になることもあります。「02」はセクタ長が512バイトを表しています。
「cr」がREAD DATAコマンド、本来読むべきセクタを指定するのですがパースが面倒なので直前の「ci」コマンドの結果をそのまま使うようになっています。「43 20 20」はドライブ3でデータフィールドにCRCエラー発生を表しています。
FDCにはセクタ分のバッファは無いのでCRCエラーでもデータは転送されています。「d0」でバッファメモリの先頭部分をダンプしてみました。先頭セクタなのでIPLですが、「IO.SYS」「MSDOS.SYS」の名前があってPC-9801系のようですね。
(つづく)
コメントを追加