since 2007.8 by K-ichi

すぐ書くつもりが、ありえないNMIタスクが発生してしまった。3号炉では、また煙が立ち昇ったという。FDD工作自体も実は割り込みだったのだが……
ともかく、本編の完成までの顛末や、失敗例などを書き連ねてみる。


まずはドライブ選び。
右の写真、一番上が内蔵されていたもの。

古いPCを漁ってもよかったが、単体で購入した記憶があったのでそれを探す。Panasonic製JU-257A073Hと、TEAC製FD-235HGを発見。前者はメモ書きが見当たらないが、RY/DCなどのジャンパもある。おそらく「たんせい」あたりで、MSX対応を謳っていたのを購入したのだと思われる。後者は、地元のパソコン屋で前世紀末に購入とあった。こちらはジャンパレスのPC専用品。

とりあえず、ジャンパ設定で何とかなりそうなJU-257を載せてみようと思ったが、コネクタ位置が反対になっていた。TOP VIEWでお尻を見ると左側に主コネクタ。これではマイク入力にぶつかってしまうため使えない。

PC専用のTEAC品を使うことにし、この際なので、PC用FDDには手を加えず、そのまま使ってしまおうと考えた。

左の写真は、TEACのドライブのフロントベゼルを外したところ。
薄い上蓋を外すと、ベゼル4隅の爪がよく見える。イジェクトボタンもカバー状で、引っ掛けてあるだけなので簡単に外れてしまう。このボタンカバーは使用する。


MSXにFDDをつなぐ時に問題になるREADY信号。これはどんな信号か、Web情報やFDDのデータシート(TEAC/Y-E DATA)などを当たってみた。以下に関わりのありそうな信号を列挙する。

太字が信号名、入出力の別はMSX側から見たもの、続く文字列はこの記事で使う略記。
FDDインターフェースは全て負論理だが、ここでは特にオーバーラインは付けない。

READY/入力/RDY…………ディスクが読み書き可能な状態を表す。MOTOR ONの後500ms以内に出る。
DISK CHANGE/入力/DC…………電源投入後、およびディスクイジェクト状態で即アクティブになる。ディスクが入った状態でSTEPを受けると、その前縁でインアクティブになる。
MOTOR ON/出力/MTO…………FDDのモータを起動させる。この信号だけはDRIVE SELECTに依存しない。
STEP/出力/STEP…………ヘッドをシークさせる。
DRIVE SELECT/出力/DS…………ドライブにアクセス対象であることを知らせる。MOTOR ON以外の信号は、自らに向けられたこの信号がアクティブなときだけ有効・動作となる。
INDEX/入力/IDX…………ディスク1回転ごとにパルスを発生する。2DD通常動作時(300rpm)で、パルス幅1ms~8ms、200ms±1.5%間隔。レベルではなくパルスの前縁で処理せよとの記述がある。


ざっと見ると、RDYとDCは相反する信号。DCに多少手を加えれば作り出せそうな感じがする。ただ、STEPを受けないとインアクティブになってくれない。STEPはヘッド移動に絡むため、下手に生成しては問題が起こりそう。

Web情報を漁っていると、MZユーザのページでIDXから作っているという記述を発見。あらためてデータシートを眺めると、MTO後にIDXが出たところでRDYとすれば良さそう。IDXは単なる回転情報ではなく、安定した回転になってドライブがREADY状態にならないと出力されない、とある。つまり、通常は、MTOが出てIDXが出たらRDYを出し、MTOがインアクティブになったら切ればいい。

おとなしく使う分にはこれで良いが、途中でイジェクトしたときには、それも検出したい。DCはイジェクトに即反応するので、この前縁を使えば良さそう。ということで、ロジックICのHC74、HC14などを使って作ったのが左の回路。

残念ながら、これは使い物にならなかった。
起動直後やフロッピ挿入直後は、必ずDevice I/Oエラーになる。2度目からは、問題なく使える。強制的にディスクイジェクトすると、ちゃんとすぐ反応する。もう一度アクセスするとエラー。さらにアクセスを試みると正常。

1度目だけエラーになる原因は、DCもDSに依存するためだった。イジェクト状態でDCの波形を見ると、29μsアクティブ+29μsインアクティブ+2μsアクティブ+約2msインアクティブ、というパターンを繰り返していた。FDCがDS操作をすることによって、不必要な立ち上がりエッジができてしまい、RDYを安定させられないでいた。

DSが出ているときだけDCをチェックしてやれば良さそうだが、あまり回路を大きくしたくないので、このタイプは断念した。


ここで思い出したのが、かつてのMODチップ。ドライブからのプロテクト信号を真似る(?)ことで正規ソフトに見せかける。処理内容的にも速度的にも、PICにうってつけのカテゴリ。
ざっと構想を練ると、ほとんど部品が要らなくなりそうなので、コレでいくことにした。

PICは手持ちの12F675を使う。
FDDインターフェースは、負論理、オープンコレクタで、150Ω以上でプルアップ、と決められている。最低33mAのシンクが必要だが、実際には1kΩのプルアップが標準になっている。PICは、ソース、シンクとも24mAあるので、実働上問題ない。また、3ステート出力なので、オープンコレクタ風出力もできる。オープンコレクタのバスなので、プルアップしないと'H'レベルが取れない場合があるが、PICにはプルアップも内蔵されている。マイコンが動作するにはクロックが必要だが、12F675には4MHz±1%のクロック源が内蔵されており、外部には不要。
実に至れり尽くせりのハードウェア。

プログラムは、本編にあるように、MTOとIDXを監視し、RDYを作り出す、というもの。DCによるイジェクト検出も行いたかったが、DSの状態はFDC依存であり、FDCにも系統があるため、汎用性に自信がもてない。それ以外の方法で検出することにした。

データシートを眺めていると、IDXは正常な回転において200ms間隔(360rpm=1.2MB 2HD時を除く)でパルスを出す、とある。つまりこの間隔を外れたら、異常事態であり、イジェクトとみなせるのではないか、と考えた。0.2秒のタイムラグなら、人間には瞬時と感じる。幸いマイコンなので、比較的正確に時間は測れる。

結果的には、これも失敗だった。
アクセスしているがDOSが立ち上がらない。FILESしてみると、成功したり失敗したり、半分成功したり。

このプログラムでは、誤差を見込んで195msほど待ってから、10msほどの間IDXの検出をし、再び195ms……という手法を採った。動作が不安定なので、誤差揺らぎがもっと大きいのかもしれないと考え、IDX検出を20msほどまで伸ばしてみた。結果は散々で、成功する回数の方が少なくなってしまった。原因はわからずじまい。

少々倦んでしまったが、立ち返って考えてみれば、RDYはGND直結でも使える信号。明らかにおかしいときだけ自動的に切れてくれればいい。
基本的に全ての信号はDSに依存するため、FDCの為すがまま。DCにせよIDXにせよ、いつ消えても文句は言えない。あまり肩肘張らずに、ゆったり構えることにした。

結局成功したのは、MTOがアクティブの間、0.5ms毎に2000回(≒1s)IDXをチェックする方法。その間1度もIDXが出ていなかったら異常、イジェクト、もしくはFDCがアクセスしてない状態であろう、と判断することにした。


PICで作れば、柔軟性をもたせつつハードウェアは簡易にできる。ただ、PICライタなど開発環境は、どこにでもあるわけではない。そこで、汎用のロジックICを使った回路も試してみた。

考え方としては、PIC版を踏襲する。一定期間コトが起きなければ終了……これはリトリガラブル・ワンショットそのもの。HC123や4528、4538あたりが考えられるが、個人的になじみのある4538を使うことにした。ちなみに共立電子では、4538BよりHC4538の方が安く買える(@¥99-)

まず、各信号はプルアップする。自分が信号を取れればいいので、1kΩでも100kΩでもよい。本体側のプルアップ抵抗は外から見えないようで、プルアップしないとIDXが拾えなかった。
回路動作としては、4538の半分を使い、MTOが'L'の間のIDXの立下りを検出する。検出した時点でRDYをアクティブに。時定数は1秒(HC4538では0.7秒)とする。MTOの立ち上がり時は通常IDX='H'であり、このエッジも拾われてしまうので、残り半分でMTOの立ち上がりからリセット信号を生成。MTO立ち上がりでRDYは即インアクティブになるようにした。
接続はICソケットを使い、PICと挿し替えて動作確認した。

コンデンサはフィルムの0.33μFの3並列とした。かなり存在感がある。
4538Bはt=CR、HC4538はt=0.7CR。HC4538を使ったので、PIC版より多少時定数が短くなるが、特に問題はなかった。
リセット信号を作る側に、時定数用のコンデンサがないが、これはIC内部の数pFで十分なため省略してある。
HC4538であれば4mAのシンク能力がある。おそらくプルアップは1kΩ程度であり、オープンコレクタバスなので、真面目にトランジスタで組まず直結でも問題は起こらないと思われる。


できてしまえばそう難しい回路でもないのだが、Web上に見当たらないのは何故だろう。まだ見えぬ問題を抱えているのかもしれない。

PIC版には、空きピンがまだある。DCとDS、STEPを監視すれば、より確度が高められそうな気もする。いつかモチベーションが上がったら試してみよう。

0 件のコメント:

コメントを投稿

※ コメントは管理者の確認後に表示されます

関連記事


この記事へのリンク by 関連記事、被リンク記事をリストアップする」記事
Related Posts Plugin for WordPress, Blogger...

ブログ アーカイブ