2019-04-14 13:24 — asano
カテゴリー:
先日から製作中のFDCボード、ハードウェアができたらソフトウェアを書かなくてはなりません。FDC絡みのソフトウェア経験はほとんどないのでいろいろ試しながらになります。
ベースとしてROMエミュレータのソフトウェアを使いました。I/O経由でRAMにアクセスしていたところを内蔵RAMに書き換えればメモリのダンプとセット、それからHEXファイルでの入出力が可能になります。
それにFDCレジスタへのアクセス機能(コマンド)を追加します。
FS
Status Register の内容を読み出してHEX表示します。FR
Data Register の内容を読み出してHEX表示します。FA
Abort Register に0xFFを書き込みます。他の値を書き込む必要はないのでパラメータはありません。FW <data>
Data Register にdata(HEX)を書き込みます。FD 0/1
DENSEL信号を切り替えます。FM 0/1
MOTOR信号を切り替えます。FU 0/1
INUSE信号を切り替えます。
試しにSEEKコマンド(0x0F)をFWで書き込んでみます。FSで見るとそれまで0x80だったStatus Registerが0x90に変わりコマンドが受け付けられたことがわかります。
続けてドライブ指定のパラメータ0x03(前回書いたようにドライブは3です)を書き込みます。
さらに目的トラック番号を書き込むとSEEK動作が始まります。STEPにカウンタを接続していればFDCの初期値0から指定トラックに移動するためのパルスが観測できます。
この状態で再度FSを実行すると0x88になっていて、再びコマンド待ちになっていることと、ドライブ3に対してSEEK動作が行われたことがわかります。実際はこの後でCHECK INTERRUPT STATUSコマンドで正常終了したか確認しなくてはなりませんが、とりあえずFDCが動いていることがわかったのでこれ以降は実際にドライブを接続してから見ていくことにします。
ドライブは壊す可能性も無くはないので入手の容易なPC用の3.5インチのもので試すことにします。
実際にドライブを動かすのでSPECIFY2コマンドでステップレート6ms、ヘッドロードの時間は余裕を見て最大に設定しておきます。
RECALIBRATE, SEEKコマンドを実行するとヘッドが動いて音がします。ドライブのカバーを開けて見えるようにしたほうが良いかもしれません。
次は実際にデータを読んでみたいところですが、レジスタへ手動アクセスしている状況ではREAD DATAコマンドは無理です。そこでREAD IDコマンドを試してみることにします。このコマンドは完了後にリザルトステータスを読むだけなので手動でもいけます。
ディスケットを挿入し、FM1と入力してモータを回しておきます。READ IDコマンドはFWで0x4A, 0x03と書き込みます。FSで0xC0が読めたらFRでリザルトステータスを読んでいきます。
最初の3バイトはステータスのSSB0, SSB1. SSB2です。詳細はHD63265のマニュアルを参照してください。
続く4バイトは最初に見つけたセクタのCA(Cylinder Address), HA(Head Address), SA(Sector Address), RL(Record Length)です。NECのμPD765に慣れた人にはC, H, R, Nと言ったほうがわかりやすいかもしれません。回転しているディスクの最初に見つけたセクタなので実行するたびに同じ値になるとは限りません。
普通にフォーマットされたディスクならCAは直前にSEEKしたトラック、HAは0になるはずです。もしコマンドの2バイト目を0x03ではなく0x07にした場合は反対面になるのでHAは1です。
SAはセクタ番号なので0x01~0x1Aあたりに分布するでしょう。RLはセクタサイズでPC-9801系のDISK BASICなら0x01(256バイト), MS-DOSなら0x03(1024バイト), PC系のDOS/Windowsなら0x02(512バイト)のはずです。
ここまで確認できればHD63265のデータセパレータも動作していますから、データ転送部分を何とかすれば内容を読めるはずです。
(つづく)
コメントを追加