2012年06月08日

ディスク関連(8)

 外付けドライブが異常に遅いのは、データ転送時の問題のようでした。
 でもまだ遅い...

 というわけで、速度を比較してみました。
 比較用に、Bookwormさんに作ってもらった速度計測用のプログラムを一部修正して使いました。


 フロッピーからの読み出しですが、P66内蔵ドライブだと以下のような流れになります。

1)CPUから、モータONのコマンドを出す
  ↓
2)モータON
  ↓
3)CPUから、μPD765Aに SEEK コマンドを発行
  ↓
4)μPD765A は、FDDに対して、目的のシリンダ(≒トラック番号)にヘッドを動かすように指示する
  ↓
5)CPUから、μPD765Aに SEEK コマンドの実行結果を聞く(SENSE INTERRUPT STATUSコマンド発行)
  ↓
6)μPD765A が、実行結果を報告する
  ↓
7)CPUから、μPD765Aに 目的のセクタの読み出しを指示する(READ DATA コマンドを発行)
  ↓
8)μPD765A は、FDD から入力される「フロッピーのデータ」から、目的のセクタを探す
  ↓
9)μPD765A は、リード用バッファに対して、目的のセクタのデータを書き出す
  ↓
10)書き出しが完了したら、FDINT を出力してCPUに通知する
  ↓
11)CPUは、リード用バッファに入っているデータをメインメモリに転送する

 となります。

 最初の1)2)は、実機では時間がかなり掛かりますが、FPGA版では無視です。
 3)〜6)も、実機では時間が掛かりますが、FPGA版では一瞬です。

 また、1)〜6)は、連続で同一シリンダ(トラック)を読む場合では、この時間は無視できます。


 速度測定プログラムで測定したのは、7)〜11)の時間になります。

 元のプログラムや、ROM内ルーチンでは、途中に割り込み禁止が入っていたのですが、これは外しました。
 (割り込み禁止が入っている理由ですが、μPD765A の仕様で、何μS までに処理を完了させなければならないとかいうのがあるみたいです)


 で、測定した結果です。

 ・実機

  手で何度も測定した場合、100〜270ms ぐらいと数字がばらけます。
  BASIC でループさせた場合、106〜112ms になりました。

  また、セクタ番号を1と16をやってみましたが、傾向は同じでした。


 ・実機の考察

  手で測定した時に数字がばらけるのは、その時のヘッドの位置と読みたい場所の関係が毎回違うからだと思われます。

  たまたま、ヘッドと読みたい場所が近い場合は時間が短く、遠い場合は時間が長いようです。
  BASIC でループさせた場合は、この距離が一定になるから、数字がばらけなかったようです。


  ヘッドと読みたい場所が最悪の時の時間は、ディスクが1周する時間と同じですので、

  1/ 300rpm = 1/(300/60) = 200ms

  で、ディスクの場所により、0〜200ms の時間待たされる事になります。
  (300rpmは、もしかしたら600rpmかも)


  実測値と比較すると、リードするのに100ms、読み出すのを待っている時間0〜200ms で大体合っているような感じです。



 ・FPGA版

  構造上、セクタ番号で掛かる時間が違うようになっています
  セクタ1が一番速く、セクタ16が一番遅くなります。

  セクタ1で、56〜60ms、セクタ16で140〜154msでした。


  遅いのは遅いんですが、実機と比べると速いので、ヨシとする事にします。



posted by えすび at 00:05| Comment(0) | P6解析:CPU周り | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前: [必須入力]

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。