ウォンツテック

そでやまのーと

再開?

そろそろnchaosを書きたくなって来たので、去年中断していたFDCDriverのネタをメモっとこ。

☆FDCDriver構想

フェーズ1)
・指定論理セクタへの1セクタの読み込みが可能
・指定論理セクタへキーボードから読み込んだ文字列を1セクタ以内で
 書き込み
※とりあえずファイルシステムは考えずに作成
※後にファイルシステムに対応するために関数は汎用的に作成



☆必要関数
・recalibrate
  clynder headを0に持っていく
  ※The floppy disk controller has no way of determining 
  its absolute arm position (cylinder)

・fdc_out (~= sendCommand)
  FDCに対してコマンドを送る
 ※FDC_DATA(0x03f5/0x0375データ・レジスタ)に対してコマンドを送っている 
・waitStatus()
  (inb(FDC_STATUS) & (MASTER | DIRECTION)) != (MASTER | READ_DIRECTION)
  MSRレジスタ(FDC_STATUS 0x03f4/0x0374)から読み込んだデータ(inb(FDC_STATUS))
  の7,6ビット(MASTER 0x80, DIRECTION 0x40)を検査
  MASTER位置が1ならFDCがデータ/コマンド受付可 0なら処理中
  DIRECTION位置が1ならリード方向(FDC→CPU) 0ならライト方向(CPU→FDC)

・fdc_intr_wait(MINIX:f_intr_wait() MONA:waitInterrupt())
  割り込み待ち
  ※FDCコマンド発行後に実行が終了すると割り込みが入ることになっている
・fdc_sence_intr_wait(MINIX:無し? MONA:senseInterrupt())
  SENSE INTERRUPT STATUSコマンド発行後の割り込み待ち
  ※MINIX関数 monaのwaitStatus()とは完全に別機能

・initialize
  DMA初期化、FDC初期化(Specifyコマンド)
・motor(bool)
・motorAutoOff() ※monaには存在するが必要かどうか要検討

・read(byte track, byte head, byte sector)
  読み出し処理
・write(byte track, byte head, byte sector)
  書き込み処理
※monaでは2種類の関数を使用しているが、MINIXではf_transfer関数で両者を表現


・sendCommand
  FDCのデータ・レジスタ(0x03f5/0x0375)に対してコマンドとパラメータを送る
・seek(track)
  目的のtrack位置にシークする


☆DMAC(Direct Memory Access Controller)
※FDC(I/Oマップ 0x03F0〜0x03F5, 0x0370〜0x0375)とは別に必要
I/Oマップ
0x00C0〜0x00DE マスタDMAC (DMAC1/8237A)
0x0000〜0x000F スレーブDMAC (DMAC2/8237A)
※マスタDMACのレジスタが2番地おきになっているのは16ビット転送を実現
 するためにアドレスを1本ずらして配線しているため

・outp8(a, b); I/O a番地に 値bを送信
・Master Clearの実行
 outp8(0xda, 0x00);
 delay(1);
 outp8(0x0d, 0x00);
 delay(1);

 delay(n) := for(int i=0;i