第5部


ディスクシステムの内部


   第1章 ディスク


    1.1 フロッピーディスク

 フロッピーディスクは、磁性体を塗った円盤状のフィルムにデータを記録するもの
で、ディスクという名前の付いている物としては最も一般的な物です。様々なフォー
マットの物がありますが、MSXでは現在3.5インチ2DDフォーマットの物が主流になって
います。
 2DDでは、メディアIDはF9H、1セクタ512バイトで1クラスタが2セクタつまり1024バ
イトです。総セクタ数は1440です。
 2DDディスクで"2"はディスクの両面を使用していることを示します。それぞれの面
をサイドといって、番号を付けてサイド0、サイド1といいます。1つのサイドには、同
心円状のトラックがディスクの外側から内側に向かって80本あります。トラックを表
裏で一組にしてシリンダと呼びます。片面ディスクでは、1シリンダ=1トラック、両面
ディスクでは1シリンダ=2トラックになります。シリンダは外側から内側に向かって0
〜79の番号がふってあります。トラックは両面ディスクでは80*2で160トラックあり、
トラック番号は、(シリンダ番号)*(面の数)+(サイド番号)で表され、トラック0〜159
があります。それぞれのトラックには9セクタフォーマットの場合は9つのセクタがあ
り、ディスク全体では、9(セクタ)*160(トラック)=1440(セクタ)となります。


    1.2 RAMディスク

 MSX-DOS2で、RAMディスクができました。RAMディスクはDOS上ではRAMDISKコマンド
によって作成され、物理ドライブ名は常にH:となります。アクセスが非常に高速なの
で、フロッピーディスクからRAMディスクにプログラム等をコピーすると快適な操作が
できます。
 RAMディスクはマッパRAMに取られます。ですから、マッパRAMに空きがないとRAMディ
スクを確保することはできません。
 RAMディスクのフォーマットは、1セクタが512バイトです。容量が2MBまでの時、1ク
ラスタが1セクタとなっています。ですから、1クラスタは512バイトとなります。容量
が2MB以上になると1クラスタは1024バイトとなります。
 RAMディスクのメディアIDはFFHとなっています。


    1.3 ハードディスク

 ハードディスクは、フロッピーディスクと同じように、磁性体を塗った円盤にデー
タを記録します。フロッピーよりもアクセスが高速で、容量も大きくなっています。
 MSXでは、アスキーから発売されているHDインターフェイスを利用することによって
ハードディスクを使用できます。
 ハードディスクのクラスタは領域の大きさによって1KBから64KBまで変化します。


   第2章 DOSカーネル

    2.1 DOSカーネル

     1 DOSカーネルの役割

 DOSカーネルとは、DOSの中核をなすプログラムのことで、DISK ROMの内部に存在し
ています。DISK ROMの内部には、DOSカーネル、Disk BASIC、ディスクドライバが一緒
に入っています。
 DOSカーネルは、ディスクアクセスの全てに渡って、ユーザープログラムとディスク
ドライバの橋渡しをしており、統一的なディスク操作環境をユーザーに提供します。
ユーザーはディスクアクセスの際に直接I/Oポートやディスクドライバにアクセスする
ことはなく、かならずDOSのファンクションコールを利用してディスクにアクセスしま
す。


     2 DOSカーネルのバージョン

 DOSカーネルには大きく分けて、DOS1カーネルとDOS2カーネルの2種類があります。
DOS2カーネルは基本的にはDOS1の上位互換なので利用方法等はどちらも変わりません
が、内部的には大きく異なっています。
 またDOS1、DOS2のそれぞれのカーネルの中でも幾つかのバージョンが存在していま
す。バグの修正や、機能追加によってそれぞれ少しづつ変わっています。DOS2では
「MSX-DOSのバージョン番号の獲得」ファンクションコール(6FH)でカーネルのバージョ
ンを知ることができます。DOS1ではバージョンを知ることはできません。


    2.2 DOS1カーネル

     1 メモリマップ

 ディスクのない状態ではF380HからがシステムワークエリアでF37FHまでをユーザー
が使うことができました。ディスクが接続されると、まずディスクシステムのために
F1C9Hまでがワークエリアとして確保されます。つづいて、各DISK ROMが自分で使う
ワークエリアを確保します。ここで確保されるワークエリアの大きさは、ディスクド
ライバによって異なるのでメーカーが違うとアドレスも変わってきます。DPBがDISK
ROMごとに15H*ドライブ数分確保されます。ディスクドライバ用ワークエリアとDPBが
すべてのDISK ROMについて確保されます。次にDOSのセクタバッファが3*全てのディス
クドライブで最も大きいセクタサイズのワークエリアが確保されます。続いてFAT用の
エリアが確保されます。それぞれのFATはそのドライブのデフォルトのDPBをもとに、
セクタサイズ*FATのセクタ数+1バイト確保されます。先頭の1バイトはメモリ上のFAT
とディスク上のFATが一致しているかのフラグです。まだディスクから読み出されてい
ない時FFH、メモリ上のFATを変更してまだディスクに書き込んでいない時1、メモリ上
のFATとディスク上のFATが一致している時0になります。
 DOSの場合、ディスク用のワークエリアはここまでですが、Disk BASICの場合さらに
Disk BASICが使うFCBと、BLOAD、BSAVEのためのルーチンのエリアが確保されます。
BASICからDOSに入った場合でも、このエリアは開放されません。
 DOS1で、通常ディスクインターフェース1つで2ドライブ(シミュレーション)のシス
テムの場合、ディスクのワークエリアの先頭(HIMSAV)はDF9DH-(そのインターフェース
のディスクドライバのワークエリアサイズ)となります。

 ディスクを接続した環境でのメモリマップ

BASICが使用するエリア    (BLDCHK+1/F378H) BLOAD,BSAVEルーチン  19Hバイト
               (FCBBASE/F353H) FCBエントリ  25H*(FILMAX)バイト

FATエリア          (HIMSAV/F349H)  ドライブB FAT管理バイト
                       ドライブB FAT
                       ドライブA FAT管理バイト
                       ドライブA FAT
バッファ           (DIRBUF/F351H)  DOSディレクトリ用セクタバッファ
               (BUFFER/F34FH)  DOS汎用セクタバッファ
               (SECBUF/F34DH)  ドライバ用セクタバッファ
1番目のカートリッジのワーク (DPBLIST/F357H) ドライブA DPB
               (DPBLIST/F355H) ドライブB DPB
                       ディスクドライバ用ワークエリア
ディスク用ワークエリア    F1C9H
システムワークエリア     F380H


     2 ドライブワークエリア

 ディスクドライブが接続されている状態ではシステムワークエリアのほかにF1C9H〜
F37FHにディスク用のワークエリアが確保されます。その内容はほぼ未公開ですが解析
によってわかった部分を紹介します。この内容はDOS2では変更になっている場合があ
ります。
 後半には、システムワークエリア内でDOSがアクセスするワークエリアを紹介します。

 初期化時にF1C9H〜F37FHを00Hで埋めた後、F1C9H〜F236Hに7397H〜7404Hのデータが
転送されます。
F1C9H サブルーチン 文字列出力
F1D9H サブルーチン 
F1E2H サブルーチン
F1E8H サブルーチン
F1F4H 
F1F7H システム定義デバイス名
F1FFH "NUL "
F216H,1
F221H,2
F223H,2
F22CH,1 閏年のチェックのフラグ 1CH:閏年ではない 1DH:閏年
F237H,1 CTRLキーチェック
F23BH,1 プリンタ出力のフラグ 0:無 1:有
F23CH,1
F23DH,2 DTAアドレス システムコール1AHで設定される
F23FH,2
F241H,1
F243H,2
F245H,1
F246H,1
F247H,1 デフォルトドライブ番号
F248H,3 日付の保存 (日、月、年の順)
F24CH,2
F24EH,1
○フックエリア(アドレスの後にコール元アドレスを表示)
F24FH,3 625FH H.PROMPT 2ドライブシミュレーションメッセージ表示
F252H,3 41F4H
F255H,3 425AH
F258H,3 42BCH
F25BH,3 4317H
F25EH,3 4348H
F261H,3 440EH ドライブ番号処理
F264H,3 4471H
F267H,3 44DBH
F26AH,3 4553H/4555H DPBアドレスを得る
F26DH,3 45CFH
F270H,3 46C5H ディスクリード
F273H,3 470AH 
F276H,3 4748H
F279H,3 4755H ディスクライト
F27CH,3 4916H HLBC=DE*BC
F27FH,3 4932H
F282H,3 4989H 
F285H,3 49B1H 
F288H,3 4A36H
F28BH,3 4A46H
F28EH,3 4B56H
F291H,3 4BE2H 
F294H,3 4C22H
F297H,3 4C97H
F29AH,3 4D05H 
F29DH,3 4D8CH
F2A0H,3 4E48H 
F2A3H,3 4EDBH 
F2A6H,3 4F12H
F2A9H,3 4F9EH 
F2ACH,3 5104H 
F2AFH,3 53A8H CTRLコードのチェック
F2B2H,3 5496H
F2B5H,3 5523H CLOCKの年の処理

F2B8H,1
F2C4H,1
F2DCH,1
F2DDH,1
F2DEH,1
F2DFH,1
F2E0H,1
F2E1H,1 ドライブ番号
F2E2H,2
F2E4H,2
F2E6H,2
F2E8H,2
F2EAH,2
F2ECH,2
F2EEH,2
F2EEH,1
F2FFH,1 リード/ライトのフラグ?
F300H,2
F304H,2 SPの保存
F306H,1 システムコール時のリターンパラメータに関するフラグ
        0でなければLD HL,BAの後RET
F307H,2 次のエントリの検索のためのFCBのアドレス保存
F30CH,1
F30DH,1 RAWFLG 0以外ならベリファイを行う
F30EH,1 日付表示のフォーマットタイプ
F304H,4 MAINROMの0034Hからの値
F323H,2 DISKVE ディスクエラー処理ルーチンへのポインタのポインタ
F325H,2 BREAKV CTRL-C処理ルーチンへのポインタのポインタ
F327H,5 F372H フック  LD A,1AH:RET
F32CH,5 F375H フック  RET
F331H,5 F37DH フック BASICのファンクションコール 56D3H/マスターカートリッジへ
F336H,1 入力されたキーがあれば0FFH、F337Hにキャラクタ
F337H,1 入力されたキーのバッファ
        CTRL-STOPが押されるとF336HとF337Hに03H
F338H,1 CLOCK-ICの有無 0H:無し FFH:有り
F339H,2 フォーマットでのスタックポインタの保存
F33BH,2
F33FH,1 システム立ちあげ時にはCTRLキーが押されていれば2
     ドライブ番号の保存
F340H,1 0ならパワーON直後
F341H,1 RAMAD0 ページ0のRAMのスロット番号
F342H,1 RAMAD1 ページ1のRAMのスロット番号
F343H,1 RAMAD2 ページ2のRAMのスロット番号
F344H,1 RAMAD3 ページ3のRAMのスロット番号
F345H,1
F346H,1
F347H,1 論理ドライブの数
F348H,1 MASTERS マスターカートリッジのスロット番号
F349H,2 HIMSAV DOSカーネルの動作に必要なエリアの底のポインタ
F34BH,2
F34DH,2 SECBUF ドライバ用セクタバッファのアドレス
F34FH,2 BUFFER DOS汎用セクタバッファのアドレス
F351H,2 DIRBUF DOSディレクトリ用セクタバッファのアドレス
F353H,2 FCBBASE Disk BASICのFCBエリアのアドレス
F355H,16 DPBLIST 各ドライブのDPBのポインタ
○ジャンプテーブル
F365H,3 基本スロット選択レジスタを読む IN A,(0A8H)
F368H,3 ページ1がRAMになる
F368H,3 ページ1切り換え
F36BH,3 F1C9H/F1D9H/F1E2H/F1F0H
F36EH,3 
F371H,3 JP 0F327H
F374H,3 JP 0F32CH
F377H,3 BLDCHK Disk BASICのBLOAD、BSAVEルーチンへのジャンプ
F37AH,3 
F37DH,3 Disk BASICのファンクションコールエントリ JP 0F331H
○システムワークエリア
F4D9H,1
F55BH,1
F568H,17
F674H,2 STKTOP BASICがスタックとして使用する番地
F6ABH,2 セクタバッファの最大サイズ。初期化の時に使用される
FB21H,8 各ディスクインターフェイスの管理する論理ドライブの数とそのディスクイ
     ンターフェイスのスロット番号。ただし空いたテーブルには0が入ります
          1番目のカートリッジ 論理ドライブの数
             :       スロット番号
             :          :
          4番目のカートリッジ 論理ドライブの数
                     スロット番号
FB29H,12 各ディスクインターフェイスカートリッジ毎の割り込みアドレス保存
          1番目のカートリッジが保存する割り込みルーチン スロット番号
             :                    アドレス
             :                     :
          4番目のカートリッジが保存する割り込みルーチン スロット番号
                                 アドレス
FC48H,2 BOTTOM 実装したRAMの最低番地MSX2以降8000H
FC4AH,2 HIMEM 利用可能なメモリの上位番地
FD99H,1 DISKID
        初期化の際に使用される
        FFH RAMが16KB未満/SHIFT立ち上げ
○フックエリア(マスタースロット内のジャンプ先を表示)
FDEFH,5 6B96H H.DSKO
FDF9H,5 6F20H H.NAME
FDFEH,5 6F00H H.KILL
FE08H,5 707BH H.COPY
FE12H,5 7061H H.DSKF
FE17H,5 6B75H H.DSKI
FE21H,5 6CD7H H.LSET
FE26H,5 6CD6H H.RSET
FE2BH,5 6C49H H.FIEL
FE30H,5 6DAFH H.MKI$
FE35H,5 6DB2H H.MKS$
FE3AH,5 6DB5H H.MKD$
FE3FH,5 6DD7H H.CVI
FE44H,5 6DDAH H.CVS
FE49H,5 6DDDH H.CVD
FE4EH,5 66A4H H.GETP
FE58H,5 66B3H H.NOFO
FE5DH,5 66FCH H.NULO
FE62H,5 68D0H H.NTFL
FE71H,5 690EH H.BINS
FE76H,5 6939H H.BINL
FE7BH,5 6E88H H.FILE
FE80H,5 6BDAH H.DGET
FE85H,5 688EH H.FILO
FE8AH,5 6819H H.INDS
FE99H,5 700DH H.LOC
FE9EH,5 7009H H.LOF
FEA3H,5 6E70H H.EOF
FEADH,5 6875H H.BAKU
FEB2H,5 7323H H.PARD
FEB7H,5 737CH H.NODE
FEBCH,5 H.POSD INC SP:INC SP:JP 6F1DH
FED5H,5 H.LOPD
FEFDH,5 71D3H H.ERRP
FFA7H,5 6055H H.PHYD PHYDIO 
FFACH,5 606BH H.FORM FORMAT


     3 内部解析資料

 DOS1カーネル解析結果を紹介します。

●ディスクドライバ ジャンプテーブル
4010H DSKIO
4013H DSKCHG
4016H GETDPB
4019H CHOICE
401CH DSKFMT
401FH MOTOR_OFF_ENTRY
●DOSカーネル ジャンプテーブル
4022H BASICコールドスタート (JP 5B3AH)
4025H フォーマット (SCF:JP 60B1H)
4029H モーターストップ (JP 620DH)
402CH 空き 00H
402DH GETSLT スロット番号を得る (JP 5FB3H)
●基本ルーチン群
4030H HLにF34BHの内容をセット
4034H Ctrl-STOPキー判定とキー入力
4078H キー入力
408FH CHPUT(00A2H/MAIN)をコール
409BH CHGET(00A5H/MAIN)をコール
40A7H ファンクションコール00H/BASICウォームスタート
    MAIN-ROMの409BHをコール
40ABH MAIN-ROMの(IX)をインタースロットコール
    戻り値 IX コールするアドレス
40B8H CLOCK-ICの存在を調べる
    戻り値 あれば(F338H)にFFH
      24時計、アラームOFFにセットされる
4115H CLOCK-ICに年月日を書き込む
4130H CLOCK-ICの秒以前のリセット
4142H CLOCK-ICのレジスタEからにD、C、Bの順に書き込む
414EH CLOCK-ICのカウントを開始する
4159H CLOCK-ICのブロック0を選択しカウントを停止する
4160H CLOCK-ICのレジスタEからにHの値をBCDに変換して書き込む
4179H CLOCK-ICから日付と時間を読み込む
41ADH CLOCK-ICのレジスタ(E-1)(E-2)を2進数にしてAに入れる
41C1H MSX-DOS Ver2.2の文字列
●ファンクションコール処理ルーチン
41EFH ファンクションコール0CH バージョン番号を得る
    戻り値 BA 0022H
436CH ファンクションコール13H
4392H ファンクションコール17H
4427H デフォルトドライブ番号処理
4462H ファンクションコール0FH
4555H DPBのアドレスを得る
4916H HLBC=DE*BC
576FH ディスクシステムのINITルーチン
5897H H.RUNCからジャンプしてくるルーチン
5B1BH "AUTOEXECBAS"
5B27H 'RUN"AUTOEXEC.BAS"'の文字列
5B3AH BASICコールドスタート
5C6EH フックをセット
5C96H フックのデータ 〜5D23H
5EC8H ワークエリアを確保する
    メモリが不足したときは、メッセージを表示して停止
5ECCH メモリ不足の表示をして停止
5EE8H ワークエリアを確保
    設定 HL バイト数
5F86H インラインパラメータで文字列を表示
5F8CH 文字列を表示
    設定 HL 文字列の先頭番地(文字列は00Hで終わる)
5FB3H スロット番号を得る
    戻り値 A スロット番号
5FC2H GETWRK SLTWRK(FD09H〜)の内容を得る
    戻り値 HL=IX SLTWRKの値
5FCDH SLTWRKのそのスロットに対応する番地を得る
    戻り値  HL SLTWRKの番地
5FE7H EXPTBLのそのスロットに対応する番地を得る
    戻り値 HL EXPTBLの番地
5FF1H BC=A HL=HL+A
5FF6H 各インターフェイスのタイマ割り込み処理をセットする
    設定  HL タイマ割り込みルーチンの番地
6027H ディスクドライバの割り込み処理後に保存してあったフックへ処理を渡す
6055H PHYDIO
6067H
6086H 論理ドライブ番号からそのドライブを管理するインターフェイスのスロットと
    インターフェイス内のドライブ番号を得る
    入力   A ドライブ番号
    出力   IYH スロット番号
         A インターフェイス内のドライブ番号
609AH ドライブ(A 0..7)のメモリ上のFATを無効にする
60B0H FORMAT(BIOS)
60B1H フォーマット(4025H)
6166H キーバッファをクリアして1文字入力
6174H メッセージ表示してキー入力待ち、アボートあり
62C6H 文字を出力して改行
62C9H 改行


   第3章 ディスクドライバ

 MSXではディスクドライブのインターフェイスは統一されていないため、ディスクド
ライバの内容は各機種によって異なっています。そのため、ディスクドライブに対し
て直接操作をすることは禁止され、またたとえしようと思ってもI/Oポートなどの情報
は公開されていません。ここでは、独自の調査によりそれらの情報を紹介します。


    3.1 ディスクドライバ

     1 ディスクドライバ

 ディスクドライバはその名の通りディスクドライブを駆動するためのソフトウェア
で、DOSとFDC及びディスクドライブの間の橋渡しをしています。普通、ディスクをア
クセスするときはMSX-DOSのシステムコールを利用するわけですが、MSX-DOSは最終的
なディスクアクセスの段階でディスクドライバに処理を渡します。ディスクドライバ
はDOSの下で最も末端の処理を行うものです。DOSカーネルのレベルではFDCやドライブ
に対して直接アクセスすることはありません。
 ディスクドライバと呼ばれるプログラムには、ドライブの初期化、セクタ単位での
ディスク入出力、フォーマット、DPBデータの提供などの機能があります。
 ディスクドライバはDISK ROM内にあり、DOSカーネルと一緒にDISK ROMに書き込まれ
ています。ディスクインターフェイスが2つ以上ある場合、すなわちDISK ROMが2つ以
上ある場合には当然ディスクドライバも複数あり、それぞれが自分の属するインター
フェイスに接続されているドライブを管理します。
 ディスクドライバはDISK ROMの7405H〜7FFFHにあります。ドライバが提供するルー
チンは仕様で決められています。4010H〜4021Hにディスクドライバにジャンプするジ
ャンプテーブルがあり、DOSはここをコールしています。というのは、ドライバが複数
ある場合のためにDOSは論理ドライブ番号をもとにそれぞれのドライバを呼び出すよう
になっているためです。そのほか、ディスクドライバ内にはドライブの初期化などの
ルーチンがあります。しかし、こちらはジャンプテーブルを介すことなく、DISK ROM
内の初期化ルーチンから直接呼び出されます。初期化はそれぞれのDISK ROMによって
行われるからです。ディスクドライバの割り込みルーチンもジャンプテーブルを介さ
ず呼び出されますが、これは初期化の際にワークエリアに記録されたアドレスを利用
しています。
 ディスクドライバのプログラムは当然メーカーまたは機種によって内容が異なって
いるわけですが、基本的な部分はメーカーが異なっていても共通点が多数あります。
それでも末端のI/O関係ではメーカーが異なればハードウェアが異なるためかなり変わ
らざるを得ません。例外としてはOEM生産のために別のメーカーと内容が同じである場
合や、経緯はわかりませんが明らかに同じと思われるプログラムを使っている場合が
あります。


     2 ディスクドライバ用ワークエリア

 インターフェイスが管理するドライブの数やドライブの状態などを保存するために、
ディスクドライバ毎にワークエリアが確保されています。ドライバが必要とするワー
クエリアのサイズと内容はドライバによって異なりますから、ワークエリアは仕様に
よって固定されているのではなく、各ドライバがフリーエリアから確保しています。
よってそのアドレスはシステムの構成によって変化することがあります。
 ディスクドライバ用ワークエリアはシステムの初期化の際に確保され、以後固定さ
れます。ワークエリアは各ドライバごとに確保され、その先頭アドレスはSLTWRK
(FD09H〜)のそのDISK ROMの存在するスロットに対応する場所に記録されています。
この先頭アドレスを得るためには多少なりとも複雑な処理が必要となりますがDISK
ROMが表に出ている状況では、内部ルーチンGETWRK(5FC2H)が利用できます(DOS2上では
不可)。
 ワークエリアの内容はドライバによって異なります。ですからこのワークエリアを
直接参照することは、使用機種を特定しないかぎりできません。


     3 ディスクドライバの提供するルーチン

 ディスクドライバの提供するルーチンについて解説します。まずは、4010H〜4021H
のジャンプテーブルから呼び出されるルーチン、続いて初期化ルーチンから直接呼び
出されるルーチンを解説します。
 このジャンプテーブルから呼び出されるルーチンはBIOSと同様に仕様が取り決めら
れているので、直接コールしても平気なはずです(ただし未公開、保証はない)。ただ
し、ディスクドライバを直接コールするためには論理ドライブ番号から、そのドライ
ブを管理するディスクドライバのスロットとインターフェイス毎の論理ドライブ番号
を割り出す必要があり、面倒な手順が必要になります。独自のDOSを作成する場合な
ど、ディスクドライバを直接コールすることによって、論理的なフォーマットレベル
ではオリジナルフォーマットを使用することも可能な訳です。しかし可能な限りは使
わない方が良いでしょう。

●DSKIO(4010H)
   設定 A ドライブ番号(0〜)
      Cy 0ならリード、1ならライト
      B リード/ライトするセクタの数(1〜255)
      C メディアID
      DE 先頭セクタの論理セクタ番号(0〜)
      HL 転送アドレス
  戻り値 エラーならCy=1さらにAにエラーコードBに読み残したセクタ数
       エラーコード    0 Write protected
                2 Not ready
                4 Data (CRC) error
                6 Seek error
                8 Record not found
                10 Write fault
                12 Other errors
 レジスタ AF,BC,DE,HL,IX,IY

 ディスクをセクタ単位で読み書きします。ディスクドライバ内ルーチンであるため、
ドライブ番号は0〜1である必要があります。当然、あるドライブにアクセスしようと
する時はそのドライブを管理するディスクドライバのスロットのルーチンを呼ばなけ
ればなりません。2ドライブシミュレーション機能はディスクドライバが管理するた
め、このルーチンにおいてもその機能は有効です。

●DSKCHG(4013H)
   設定 A ドライブ番号
      B 0
      C メディアID
      HL DPBのアドレス
  戻り値 成功 Cy=0
         B ステータス
          1    ディスクが入れ替えられた
          0    不明
          -1(FFH) 入れ替えられていない
      失敗 Cy=1
         A エラーコード(DSKIOと同じ)
 レジスタ AF,BC,DE,HL,IX,IY

 ディスクの入れ替えが発生したかどうかを調べて返します。インターフェイスがディ
スクの入れ替えを判別できないシステムではディスクの入れ替えを、ディスクアクセ
ス後に一定時間をカウントすることで行うものもあります。
 システムはディスクの入れ替えが発生すると、FATの先頭バイトを読み、それによっ
てDPBをセットし直します。

●GETDPB(4016H)
   設定 A ドライブ番号
      B メディアID(FATの先頭の値)
      C メディアID
      HL DPBの先頭アドレス
  戻り値 DPBの1バイト目および最後の2バイトを除いた18バイトにデータをセット
 レジスタ AF,BC,DE,HL,IX,IY

 メディアIDから実際のDPBをセットします。

●CHOICE(4019H)
   設定 なし
  戻り値 HL メッセージ文字列の先頭アドレス。メッセージは00Hで終わる
        ただし、メッセージがない場合(フォーマットのサポートが1種類)HL=0
 レジスタ すべて

●DSKFMT(401CH)
   設定 A フォーマットのタイプ(1〜9)
        ただし、その意味するところはドライバによって異なる
        フォーマットのサポートが1種類のみのドライバでは意味はない
      D ドライブ番号(0〜)
      HL フォーマット時に使うワークエリアの先頭アドレス
      BC ワークエリアのサイズ
  戻り値 成功 Cy=0
      失敗 Cy=1さらにAにエラーコード
       エラーコード    0 Write protected
                2 Not ready 
                4 Data (CRC) error
                6 Seek error
                8 Record not found 
                10 Write fault
                12 Bad parameter
                14 Insufficient memory
                16 Other errors
 レジスタ すべて

 ディスクを物理的にフォーマットし、またFATとディレクトリを設定します。
 このルーチンは内部でメッセージを表示することはありません。

●(MOTOR_OFF_ENTRY)(401FH) (公開)
   設定 なし
  戻り値 なし
 レジスタ ?

 ドライブを停止します。
 このエントリーは後になって追加されたため初期のドライブではない場合がありま
す。その場合このアドレスは00Hになっていますので、このルーチンをコールする場合
は必ずこのアドレスが00Hでないことを確かめてその存在を確認します。

●INIHRD
   設定 なし
  戻り値 なし
 レジスタ AF,BC,DE,HL,IX,IY

 システム初期化時にそのインターフェイスROMに処理が渡ってすぐにハードウェアの
初期化を行います。このルーチンが呼ばれる時点ではまだディスクワークエリアは確
保されていません。
 このルーチンは初期化ルーチンから直接呼ばれるため、アドレスはドライバによっ
て異なります。

●DRIVES
   設定 Z=0 2ドライブにする(1ドライブなら2ドライブシミュレーションを行う)
  戻り値 L 接続されているドライブの数
 レジスタ F,HL,IX,IY

 システム初期化時に、ドライバの処理するドライブ数をシステムに返します。この
ルーチンが呼ばれる時にはディスクワークエリアが設定されています。
 このルーチンは初期化ルーチンから直接呼ばれるため、アドレスはドライバによっ
て異なります。

●INIENV
   設定 なし
  戻り値 なし
 レジスタ AF,BC,DE,HL,IX,IY

 システム初期化時に、ドライバ用ワークエリアの初期化、タイマ割り込みの設定な
どを行います。
 このルーチンは初期化ルーチンから直接呼ばれるため、アドレスはドライバによっ
て異なります。

●OEMSTATEMENT
 BASICのステートメントを拡張します。Disk BASICが自分の拡張ステートメントか
どうか調べてからディスクドライバのこのルーチンに処理が渡ります。
 レジスタ等の設定についてはMSX2テクニカルハンドブックP329を参照して下さい。


    3.2 ディスクドライバのタイプ

 ここからそれぞれの機種のディスクドライバなどについて話をして行く上での便利
のために各々のディスクドライバやDOSカーネルに呼称を割り当てます。これらの名称
は独自のもので世間一般に通用するものではありません。しかしながらこれらのデー
タを利用する際には、混乱を避けるためにも本書に準拠した表記を使用することをお
勧めします。


     1 DOSカーネルのタイプ

 DOSカーネルは機種による大きな違いはありません。しかし、細部の手直しが入って
いたり、INITなどのルーチン内のドライブ固有パラメータがある部分で異なっている
場合があります。カーネルはドライブ固有パラメータを除けばいくつかのバージョン
に分類できます。そこで、バージョン毎に番号を付けてタイプ1などと呼びます。
 (現在、全部で幾つのバージョンがあるのか不明なので、タイプの番号は確認された
順に付けています。よって、番号の大小とバージョンの新旧は一致しません。)


     2 ディスクドライバのタイプ

 ディスクドライバは各機種のハードウェアの差異を吸収する部分ですので、メーカー
が違えば異なるのはもちろん、同じメーカーでも機種が変わると内容が変わる場合が
あります。しかし、同一シリーズ内ではI/Oポートの変更はほとんど無く、ルーチンの
手直しである場合がほとんどです。
 ディスクドライバはあるシリーズ内ではほとんど同じ物であることが多いため、似
ているものをまとめて系統と呼びます。メーカーごとに系統ができているのが普通で
すから、メーカーの名前を付けて区別します。系統は、ほぼそのディスクドライブの
I/OポートとFDCの種別を表すと言っていいでしょう。
 系統が同じであっても、ディスクドライバの細部が同じとは限りませんし、時には
I/Oポートが変わっている場合さえあります。そこで、そういった違いを含めてディス
クドライバのタイプと呼び、系統名+番号で表します。また、タイプ名は略してアル
ファベット2字+数字で表す場合があります。


    3.3 ディスクドライバ資料

     1 タイプ別資料の読み方

 ここからそれぞれのディスクドライバの資料を収録しますが、表記を簡便にするた
め細部については省略してある場合があります。それぞれの項目の内容の説明はここ
でまとめて紹介しますので資料を見る前に一度目を通して下さい。なお、資料は独自
の解析によるもので、すべてのデータが判明しているわけではありませんので注意し
てください。

●タイプ名および該当機種
 タイプ名は前節で紹介したディスクドライバのタイプ名です。括弧内は略記です。
 また、タイプ名に続いて、そのタイプに属する機種の機種名およびDISK ROMのスロッ
ト番号を示します。

●各種データ
 FDC       使用しているFDCのタイプです。括弧内は具体的なFDCの名称です。
 ワークエリア長 ディスクドライバが確保するワークエリアのサイズです。
 フォーマット用ワークエリア長
  フォーマット時にディスクドライバが最低限必要とするワークエリアのサイズで
  す。フォーマットルーチンをコールするときにこれ以上のメモリが確保できない
  とエラーを返します。
 対応メディア
  ディスクドライバがサポートしているメディアです。メディアIDと、フォーマッ
  ト可能な場合は、フォーマットで指定する番号とメディアタイプの関係を示しま
  す。

●特徴 そのドライブに関して、特に説明すべき点を解説します。

●ドライバ内サブルーチンアドレス
 どのディスクドライバでも共通に存在するルーチンの先頭アドレスを示します。
 詳しくは3.1.3ディスクドライバの提供するルーチンを参照してください。
 なお次のような略記をしています。

  MOTOR_OFF_ENTRY   (略)MTROFF
  OEMSTATEMENT     (略)OEMSTA

●ディスクドライバ関係定数
 ディスクドライバに関する定数の内、カーネルの初期化ルーチン部分に含まれてい
るデータを示します。
 MYSIZE  ドライバ用ワークエリアのサイズです。
 SECLEN  そのドライバがサポートするメディアのうち最大のセクタサイズです。
 DEFDPB  FATのサイズが最大のメディアのDPBデータのアドレスです。

●I/Oポート
 FDC及びディスクドライブのI/Oポートを説明します。
 ここで説明するI/OポートはZ80のI/Oポートを使用していません。DISK ROMのスロッ
ト上のメモリ空間にマップされています。そのスロットに切り替えてから該当アドレ
スをアクセスします。

●ワークエリア
 ディスクドライバ用ワークエリアの内容について説明します。
 アドレス表示はすべてワークエリアの先頭アドレスからのオフセット値です。

●フォーマット用ワークエリア
 フォーマット時にディスクドライバが使用するワークエリアについて説明します。
アドレス表示はすべてワークエリアの先頭アドレスからのオフセット値です。ワーク
エリアのアドレスはフォーマットルーチンを呼び出すプログラムが指定します。


     2 National

●タイプ名および該当機種
  タイプ名    メーカー  機種名   スロット
 National1  NA1 National  FS-4600
 National2  NA2       FS-5500F1/2 3-3
                FS-4700F   3-3

●各種データ
  FDC       ワークエリア長  フォーマット用ワークエリア長
 8876系(MB8877A)   10バイト         6KB

 対応メディア       F8H〜FFH   1:FCH 2:FDH 3:F8H 4:F9H

●特徴
 このシステムは、メディアの交換をハード的に検出できないため、一定時間アクセ
スが無いとメディアが交換されたと見なします。時間の測定は、タイマ割り込みで処
理されます。また、ドライブの停止もタイマ割り込みで一定時間後に行われます。
 モータースイッチは、ドライブセレクト信号に無関係に両ドライブに対して有効で
す。ドライブセレクト信号は、1でそのドライブが有効になり、アクセスランプはドラ
イブセレクト信号に連動します。FDCのREADY入力は常に1のようです。
 独自の拡張ステートメントが存在し、CALL VERIFY ON/OFFでベリファイの有無を設
定できます。これはDOSの同名コマンドと同じ働きをします。

●ドライバ内サブルーチンアドレス
    DSKIO DSKCHG GETDPB CHOICE DSKFMT MTROFF OEMSTA INIHRD DRIVES INIENV
 NA1  7495H 7868H 78A8H 78C3H 7BB9H 77E5H 7919H 77D9H 7806H 7830H
 NA2  7495H 785AH 789AH 78B5H 7BBFH 77D7H 790BH 77C6H 77F8H 7822H

●ディスクドライバ内定数
    MYSIZE SECLEN DEFDPB
 NA1-2 000AH 0200H 7416H

●I/Oポート
 BFB8H〜BFBCHにもマップされています。

 7FB8H R/W ステータスレジスタ/コマンドレジスタ
 7FB9H R/W トラックレジスタ
 7FBAH R/W セクタレジスタ
 7FBBH R/W データレジスタ
 7FBCH R  FDCステータス   / IRQ /-DRQ / - / - / - / - / - / - /
    W  FDコントロール  / 0 / 0 / 0 / 0 / MOT /SIDE / D1 / D0 /

  IRQ FDCのIRQ出力         -DRQ FDCのDRQ出力の反転
  MOT 1でモーター作動        SIDE サイドセレクト
  D1  ドライブセレクト1       D0  ドライブセレクト0

●ワークエリア
+00H,1 モーターの状態(00H:停止 01H〜FEH:待機 FFH:作動)
    待機状態のときはタイマ割り込みで値が減じられ0になるとモーターを止める
+01H,1 ドライブ0のメディア交換判定用タイマー
    タイマ割り込みで値が減じられ0になるとメディアが交換されたと見なす
+02H,1 ドライブ1のメディア交換判定用タイマー
+03H,1 最後にアクセスした物理ドライブ(FDCが現在トラック番号を保持する)
+04H,1 ドライブ1を選択時、ドライブ0のトラック番号を保存する
+05H,1 ドライブ0を選択時、ドライブ1のトラック番号を保存する
+06H,1 2ドライブシミュレーション時、現在の仮想ドライブ番号
+07H,1 内部で使用する。ベリファイかどうかのフラグ
+08H,1 内部で使用する。シーク後にウェイトを入れるかどうか
+09H,1 物理ドライブの数。1なら2ドライブシミュレーションが有効
●フォーマット用ワークエリア
+00H,2 ブートセクタ用データの格納アドレス
+02H,1 メディアID
+03H,2 セクタの数
+05H,2 トラックデータを展開するワークエリアのアドレス(+20H)
+07H,1 ドライブの状態に関する情報
+08H,1 エラー発生時のリトライ回数
+09H,1 物理ドライブ番号
+20H,  フォーマットデータを展開するエリア


     3 Panasonic

●タイプ名および該当機種
  タイプ名    メーカー  機種名   スロット
 Panasonic 1 PA1 Panasonic  FS-FD1A   (拡張ドライブ)
 Panasonic 2 PA2       FS-A1F    3-2
 Panasonic 3 PA3       FS-A1FX   3-2
                FS-A1WX   3-2
                FS-A1WSX   3-2
 Panasonic 4 PA4       FS-A1ST   3-2
 Panasonic 5 PA5       FS-A1ST   3-2
                FS-A1GT   3-2
 Panasonic 6 PA6       FS-A1ST   3-2

●各種データ
  FDC       ワークエリア長  フォーマット用ワークエリア長
 765系(TC8566AF)   26バイト         5KB

 対応メディア       F8H〜FFH   1:F8H 2:F9H

●特徴
 FDCには東芝のTC8566AFを使っています。TC8566AFは本来のFDC部分に加えてドライ
ブコントロール用の周辺回路までをまとめたチップで、ドライブコントロール用の拡
張レジスタを2本持っています。
 FS-A1STでは生産時期によってROMバージョンの異なる物が3タイプ以上はあることが
判明しています。
 A1ST以降、DOS2を本体内に搭載していますが、DOS2の場合とDOS1の場合でディスク
ドライバが違います。DOS2でのディスクドライバはメディアの交換の検出等の機能も
持っています。また、ST以降I/Oアドレスも変更されました。

●ドライバ内サブルーチンアドレス(PA4〜PA5はDOS1時)
    DSKIO DSKCHG GETDPB CHOICE DSKFMT MTROFF OEMSTA INIHRD DRIVES INIENV
 PA1  7495H 7809H 7848H 7863H 7C81H 7770H 78A0H 7733H 77A1H 77CCH
 PA2  7495H 77E4H 7823H 783EH 7C5CH 774CH 787BH 772AH 7783H 77AAH
 PA3  7495H 77F3H 7833H 784EH 7C80H 775AH 788BH 7738H 7792H 77B9H
 PA4  7495H 77CAH 780AH 7825H 7C57H 7746H 7862H 7724H 777AH 77A1H
 PA5  7495H 77CBH 780BH 7826H 7C58H 7747H 7863H 7725H 777BH 77A2H
 PA6  7495H 77CAH 780AH 7825H 7C57H 7746H 7862H 7724H 777AH 77A1H

●ディスクドライバ内定数
    MYSIZE SECLEN DEFDPB
 PA1-6 001AH 0200H 7416H

●I/Oポート
 FDCはTC8566AFを使用しており、TC8566AFの拡張レジスタをドライブコントロールの
ために使用しています。I/OのアドレスがPA1〜PA3とPA4〜PA5では異なります。
 I/Oは同じスロットのBFF8H〜BFFBH(PA1〜PA3)、BFF1H〜BFF5H(PA4〜PA5)にもそれぞ
れ同じ内容がマップされています。PA4〜PA5では、メディアの交換検出用のI/Oポート
が新設されています。

 (PA1〜PA3)
 7FF8H W  FDC拡張レジスタ0 / 0 / 0 /MEN1 /MEN0 / 0 /-FRST/ 0 / DSA /
 7FF9H W  FDC拡張レジスタ1 / 0 / 0 / C4E / C4 /SBME / SBM / TCE /FDCTC/
 7FFAH R  ステータスレジスタ
 7FFBH R/W データレジスタ

 (PA4〜PA5)
 7FF1H R  FDDステータス   / - / - / MC1 / MC0 / - / - / - / - /
 7FF2H W  FDC拡張レジスタ0 / 0 / 0 /MEN1 /MEN0 / 0 /-FRST/ 0 / DSA /
 7FF3H W  FDC拡張レジスタ1 / 0 / 0 / C4E / C4 /SBME / SBM / TCE /FDCTC/
 7FF4H R  ステータスレジスタ
 7FF5H R/W データレジスタ

  MEN1,MEN0   モーターイネーブル1/0 モーターを1でON
  -FRST     FDCリセット信号の反転 0を書き込むとリセット
  DSA      ドライブセレクト 0でドライブ0
  C4E      C4への書き込みを有効にする
  C4      強制READY ドライブがNOT READY時でもFDCの入力はREADYにする
  SBME     SBMへの書き込みを有効にする
  SBM      スタンバイモード 0の時はスタンバイ状態にはならない
  TCE      FDCTCへの書き込みを有効にする
  FDCTC     TC(ターミナルカウント)
  MC1,MC0    メディア交換の検出用

●ワークエリア
+00H,1 モーターの状態(00H:OFF FFH:ON)
+01H,1 メディアが有効か。ドライブ0
+02H,1          ドライブ1
+03H,1 2ドライブシミュレーション時の現在のドライブ番号(0〜1)
+04H,1
+05H,1 リード/ライト別のフラグ(b0)
+06H,1 モーターの状態(I/O書き込み用データ)
+07H,1 物理ドライブ数(0:1ドライブ 1:2ドライブ)
+08H,1
+09H,1
+0AH,9 FDCコマンド用バッファ
+13H,7 リザルトステータス用バッファ

●フォーマット用ワークエリア
+00H,2 ブートセクタ用データのアドレス
+02H,1 メディアID
+03H,2 セクタ数
+05H,2
+07H,1 論理ドライブ番号
+08H,1 物理ドライブ番号
+09H,1 フォーマットタイプ-1
+0AH,1
+0BH,36 フォーマットパラメータ用バッファ(4バイト*9セクタ分)
+2FH,
+39H,  FDCコマンド用バッファ
+200H, リード用バッファ


     4 SONY

●タイプ名および該当機種
  タイプ名    メーカー  機種名   スロット
 SONY 1    SO1 SONY    HB-F900
 SONY 2    SO2       HBD-F1   (拡張ドライブ)
                HB-F1XD
                HB-F1XDmkII
                HB-F1XDJ
                HB-F1XV
        SO3
 SONY 4    SO4       FS-FD1   (拡張ドライブ)

●各種データ
  FDC       ワークエリア長  フォーマット用ワークエリア長
 8876系(TMS2793)   9バイト        使用しません

 対応メディア       F8H〜FBH   1:F8H 2:F9H

●特徴
 ドライブはI/Oポートを切り替えてからも約4秒間動作し続け、その後自動的に停止し
ます。このドライバはフォーマット時にユーザーのワークエリアを使用しません。
 FS-FD1(SO4)はPanasonicブランドですが、ソニーによるOEM生産品です。フォーマッ
ト時のメッセージがSONYのものとは違います。
 SO2のディスクドライバには2DD8セクタの時のパラメータが誤っているというバグが
発見されています。そのパラメータを修正したものがSO3です。

●ドライバ内サブルーチンアドレス
    DSKIO DSKCHG GETDPB CHOICE DSKFMT MTROFF OEMSTA INIHRD DRIVES INIENV
 SO1  7512H 751EH 7521H 7524H 7527H 752DH 752AH 7515H 7518H 751BH
 SO2-3 751EH 78BAH 7943H 795DH 79A1H 7DE2H 7DE0H 7827H 7867H 78A7H
 SO4  751EH 78BAH 7943H 795DH 79A0H 7DE2H 7DE0H 7827H 7867H 78A7H

●ディスクドライバ内定数
    MYSIZE SECLEN DEFDPB
 SO1  0009H 0200H 74DBH
 SO2-4 0009H 0200H 74E7H

●I/Oポート

 7FF8H R  ステータスレジスタ
    W  コマンドレジスタ
 7FF9H R/W トラックレジスタ
 7FFAH R/W セクタレジスタ
 7FFBH R/W データレジスタ
 7FFCH R  FDDステータス1  / - / - / - / - / - / TM / IU /SIDE /
    W  FDDコントロール1 / 0 / 0 / 0 / 0 / 0 / 0 / 0 /SIDE /
 7FFDH R  FDDステータス2  / MOT / - / - / - / - / TM / IUC / DS /
    W  FDDコントロール2 / MOT / 0 / 0 / 0 / 0 / TE / IUC / DS /
 7FFFH R  FDCステータス   /-DRQ /-IRQ / - / - / - / - / - / - /

  TM  ディスクチェンジチェックタイマー
  TE  タイマーイネーブル
  IU  IN USE信号の状態
  IUC  IN USE信号制御とタイマーセット
  SIDE サイドセレクト
  DS  ドライブセレクト
  MOT  モーターの状態 0を書き込んでもモーターはしばらく作動し続け、その間
             はこのビットを読むと1が読み出されます。
  -DRQ FDCのDRQ信号の反転      -IRQ FDCのIRQ信号の反転
●ワークエリア
+00H,1
+01H,1
+02H,1
+03H,1 FDCが現在トラック番号を保持しているドライブの番号
+04H,1 ドライブ1を選択時、ドライブ0のトラック番号
+05H,1 ドライブ0を選択時、ドライブ1のトラック番号
+06H,1 2ドライブシミュレーション時、現在の仮想ドライブ番号
+07H,1
+08H,1 物理ドライブの数


     5 SANYO

●タイプ名および該当機種
  タイプ名    メーカー  機種名   スロット
 SANYO 1   SA1 SANYO    PHC-70FD   3-2
                PHC-70FD2  3-2

●各種データ
  FDC       ワークエリア長  フォーマット用ワークエリア長
 765系(TC8566AF)   26バイト         5KB

 対応メディア       F8H〜FFH   1:F8H 2:F9H

●特徴
 この機種はPanasonicの機種とI/Oポートが同じです。ディスクドライバのプログラ
ムも同じなのですが、メッセージを書き換えたり、ルーチンどうしの順番を入れ替え
たりしてあり、一見違うように見えます。
 FDCには東芝のTC8566AFを使っています。TC8566AFは本来のFDC部分に加えてドライ
ブコントロール用の周辺回路までをまとめたチップで、ドライブコントロール用の拡
張レジスタを2本持っています。

●ドライバ内サブルーチンアドレス
    DSKIO DSKCHG GETDPB CHOICE DSKFMT MTROFF OEMSTA INIHRD DRIVES INIENV
 SA1  77F5H 7B63H 7BA3H 7BBEH 7405H 7ABAH 7BFBH 7A98H 7B02H 7B29H

●ディスクドライバ内定数
    MYSIZE SECLEN DEFDPB
 SA1  001AH 0200H 7776H

●I/Oポート

 7FF8H W  FDC拡張レジスタ0 / 0 / 0 /MEN1 /MEN0 / 0 /-FRST/ 0 / DSA /
 7FF9H W  FDC拡張レジスタ1 / 0 / 0 / C4E / C4 /SBME / SBM / TCE /FDCTC/
 7FFAH R  ステータスレジスタ
 7FFBH R/W データレジスタ

  MEN1,MEN0   モーターイネーブル1/0 1でON
  -FRST     FDCリセット信号の反転 0を書き込むとリセット
  DSA      ドライブセレクト 0でドライブ0
  C4E      C4への書き込みを有効にする
  C4      強制READY ドライブがNOT READY時でもFDCにはREADYが入力される
  SBME     SBMへの書き込みを有効にする
  SBM      スタンバイモード 0の時はスタンバイ状態にはならない
  TCE      FDCTCへの書き込みを有効にする
  FDCTC     TC(ターミナルカウント)

●ワークエリア
+00H,1 モーターの状態(00H:OFF FFH:ON)
+01H,1 メディアが有効か。ドライブ0
+02H,1          ドライブ1
+03H,1 2ドライブシミュレーション時の現在のドライブ番号(0〜1)
+04H,1
+05H,1 リード/ライト別のフラグ(b0)
+06H,1 モーターの状態(I/O書き込み用データ)
+07H,1 物理ドライブ数(0:1ドライブ 1:2ドライブ)
+08H,1
+09H,1
+0AH,9 FDCコマンド用バッファ
+13H,7 リザルトステータス用バッファ

●フォーマット用ワークエリア
+00H,2 ブートセクタ用データのアドレス
+02H,1 メディアID
+03H,2 セクタ数
+05H,2
+07H,1 論理ドライブ番号
+08H,1 物理ドライブ番号
+09H,1 フォーマットタイプ-1
+0AH,1
+0BH,36 フォーマットパラメータ用バッファ(4バイト*9セクタ分)
+2FH,
+39H,  FDCコマンド用バッファ
+200H, リード用バッファ


     6 Victor

●タイプ名および該当機種
  タイプ名    メーカー  機種名   スロット
 Victor 1   VI1 Victor   HC-90
                HC-95

●各種データ
  FDC       ワークエリア長  フォーマット用ワークエリア長
 8876系        8バイト         80Hバイト

 対応メディア       F8H〜FFH   1:F8H 2:F9H

●特徴
 このHC-90とHC-95はZ80の上位互換CPUであるHD64180を搭載したMSX2で、HD64180を
使用するモードではZ80よりも高速動作するという機能がありました。その影響で、
ディスクドライバにはウェイト調整のようなプログラムが組み込んであります。また
HD64180ではZ80にはない独自の拡張命令が存在し、ディスクドライバ内部でも使われ
ています。

●ドライバ内サブルーチンアドレス
    DSKIO DSKCHG GETDPB CHOICE DSKFMT MTROFF OEMSTA INIHRD DRIVES INIENV
 VI1  7495H 7A5DH 7A9CH 7AB7H 7AF3H 7997H 7F24H 7979H 79D4H 7A21H

●ディスクドライバ内定数
    MYSIZE SECLEN DEFDPB
 VI1  0008H 0200H 7416H

●I/Oポート

 7FF8H R  ステータスレジスタ
    W  コマンドレジスタ
 7FF9H R/W トラックレジスタ
 7FFAH R/W セクタレジスタ
 7FFBH R/W データレジスタ
 7FFCH R  コントロール1   / IRQ / DRQ / - / - /SIDE / DS / - / - /
    W           /   /   /   /-MOT /SIDE / DS / M1 / M0 /
 7FFDH R  コントロール2   / ? / CPU / - / - / - / - / - / - /

  IRQ  FDCのIRQ信号         DRQ  FDCのDRQ信号
  -MOT ドライブのモーター(0でON)
  SIDE サイドセレクト
  DS  ドライブセレクト
  CPU  HD64180モードだと1


     7 TOSHIBA

●タイプ名および該当機種
  タイプ名    メーカー  機種名   スロット
 TOSHIBA 1  TO1 TOSHIBA   HX-34

●各種データ
  FDC       ワークエリア長  フォーマット用ワークエリア長
 8876系       10バイト        使用しません

 対応メディア       F8H〜FCH   1:F8H 2:F9H

●ドライバ内サブルーチンアドレス
    DSKIO DSKCHG GETDPB CHOICE DSKFMT MTROFF OEMSTA INIHRD DRIVES INIENV
 TO1  753FH 7936H 79B7H 79D6H 7A0FH 7D4EH 74E8H 74EAH 7511H 752FH

●ディスクドライバ内定数
    MYSIZE SECLEN DEFDPB
 TO1  000AH 0200H 7469H

●I/Oポート

 7FF0H R  ステータスレジスタ
    W  コマンドレジスタ
 7FF1H R/W トラックレジスタ
 7FF2H R/W セクタレジスタ
 7FF3H R/W データレジスタ
 7FF4H R/W FDコントロール1 /   /   /   /   /   /   / MOT /SIDE /
 7FF5H R/W FDコントロール2 /   /   /   /   /   /   /   / D /
 7FF6H R/W FDコントロール3 /   /   /   /   /   /   /   / -DC /
 7FF7H R  FDCステータス  /-DRQ / IRQ / - / - / - / - / - / - /

  MOT 1でモーターON
  SIDE サイドセレクト信号
  -DRQ FDCのDRQ信号の反転
  IRQ FDCのIRQ信号
  D  ドライブセレクト
  -DC ディスクチェンジ信号の反転

●ワークエリア
+00H,1 0:ドライブ0モーター停止
+01H,1 0:ドライブ1モーター停止


     8 CANON

●タイプ名および該当機種
  タイプ名    メーカー  機種名   スロット
 CANON 1   CA1 CANON    V-30F    3-1

●各種データ
  FDC       ワークエリア長  フォーマット用ワークエリア長
 8876系       7バイト        使用しません

 対応メディア       F8H〜FBH   1:F8H 2:F9H

●ドライバ内サブルーチンアドレス
    DSKIO DSKCHG GETDPB CHOICE DSKFMT MTROFF OEMSTA INIHRD DRIVES INIENV
 CA1  744DH 77ABH 7816H 7842H 7BC1H 7748H 782DH 7728H 776BH 77A0H

●ディスクドライバ内定数
    MYSIZE SECLEN DEFDPB
 CA1  0007H 0200H 7416H

●I/Oポート
 7FF0H R  ステータスレジスタ
    W  コマンドレジスタ
 7FF1H R/W トラックレジスタ
 7FF2H R/W セクタレジスタ
 7FF3H R/W データレジスタ
 7FF4H R/W          /   /   /   /   /   /   / MOT /SIDE /
 7FF5H R/W
 7FF6H R/W
 7FF7H R  FDCステータス  /-DRQ / IRQ / - / - / - / - / - / - /

  MOT 1でモーターON
  SIDE サイドセレクト信号
  -DRQ FDCのDRQ信号の反転
  IRQ FDCのIRQ信号


     9 MITSUBISHI

●タイプ名および該当機種
  タイプ名    メーカー  機種名   スロット
 MITSUBISHI 1 MI1 MITSUBISHI ML-G30

●各種データ
  FDC       ワークエリア長  フォーマット用ワークエリア長
 8876系        8バイト        15バイト

 対応メディア       F8H〜FFH   1:F8H 2:F9H

●ドライバ内サブルーチンアドレス
    DSKIO DSKCHG GETDPB CHOICE DSKFMT MTROFF OEMSTA INIHRD DRIVES INIENV
 MI1  7495H 783FH 787EH 7899H 78DEH 779AH 7CF8H 7789H 77D6H 780AH

●ディスクドライバ内定数
    MYSIZE SECLEN DEFDPB
 MI1  0008H 0200H 7416H

●I/Oポート

 7FF8H R  ステータスレジスタ
    W  コマンドレジスタ
 7FF9H R/W トラックレジスタ
 7FFAH R/W セクタレジスタ
 7FFBH R/W データレジスタ
 7FFCH R  FDDステータス1  / - / - / - / - / - / - / - /SIDE /
    W  FDDコントロール1 / 0 / 0 / 0 / 0 / 0 / 0 / 0 /SIDE /
 7FFDH R  FDDステータス2  / MOT / - / - / - / - / - / IUC / DS /
    W  FDDコントロール2 / MOT / 0 / 0 / 0 / 0 / 0 / IUC / DS /
 7FFFH R  FDCステータス   /-DRQ /-IRQ / - / - / - / - / - / - /

  IUC  IN USE信号制御とタイマーセット
  SIDE サイドセレクト
  DS  ドライブセレクト
  MOT  モーターの状態 0を書き込んでもモーターはしばらく作動し続け、その間
             はこのビットを読むと1が読み出されます。
  -DRQ FDCのDRQ信号の反転
  -IRQ FDCのIRQ信号の反転


     10 YAMAHA

●タイプ名および該当機種
  タイプ名    メーカー  機種名   スロット
 YAMAHA 1   YA1 YAMAHA   FD-05    (拡張ドライブ)

●各種データ
  FDC       ワークエリア長  フォーマット用ワークエリア長
 8876系       10バイト        6KB

 対応メディア       F8H〜F9H   1:F9H 2:F8H

●ドライバ内サブルーチンアドレス
    DSKIO DSKCHG GETDPB CHOICE DSKFMT MTROFF OEMSTA INIHRD DRIVES INIENV
 YA1  74F1H 7865H 78A4H 78E4H 7911H 77D0H 7C14H 77BFH 77F0H 7832H

●ディスクドライバ内定数
    MYSIZE SECLEN DEFDPB
 YA1  000AH 0200H 74D5H

●I/Oポート

 7FF8H R  ステータスレジスタ
    W  コマンドレジスタ
 7FF9H R/W トラックレジスタ
 7FFAH R/W セクタレジスタ
 7FFBH R/W データレジスタ
 7FFCH R  FDDステータス1  / - / - / - / - / - / - / - /SIDE /
    W  FDDコントロール1 / 0 / 0 / 0 / 0 / 0 / 0 / 0 /SIDE /
 7FFDH R  FDDステータス2  / MOT / - / - / - / - / - / IUC / DS /
    W  FDDコントロール2 / MOT / ? / ? / ? / ? / ? / IUC / DS /
 7FFEH W  FDDコントロール3 / ? / ? / ? / ? / ? / ? / ? / ? /
 7FFFH R  FDCステータス   /-DRQ /-IRQ / TE / - / - / - / - / - /

  TE  タイマーイネーブル
  IUC  IN USE信号制御とタイマーセット
  SIDE サイドセレクト
  DS  ドライブセレクト
  MOT  モーターの状態 0を書き込んでもモーターはしばらく作動し続け、その間
             はこのビットを読むと1が読み出されます。
  -DRQ FDCのDRQ信号の反転
  -IRQ FDCのIRQ信号の反転


     11 ASCII

●タイプ名および該当機種
  タイプ名    メーカー  機種名
 ASCII 1   AS1 ASCII    HDインターフェイス

●各種データ
 ワークエリア長
   34バイト

●ドライバ内サブルーチンアドレス
    DSKIO DSKCHG GETDPB CHOICE DSKFMT MTROFF OEMSTA INIHRD DRIVES INIENV
 AS1  74A8H 7994H 79ACH 7A61H 7A6FH 7949H 7B26H 7717H 77F6H 78E7H

●ディスクドライバ内定数
    MYSIZE SECLEN DEFDPB
 AS1  0022H 0200H 7495H

●I/Oポート
 BFFCH〜BFFDHにもマップされています。

 7FFC R/W データポート
 7FFD W  コマンドポート
      ビット0 予約済み(通常は0を書き込む)
      ビット1 予約済み(通常は0を書き込む)
      ビット2 ATTENTION(1ならTRUE)
      ビット3 SELECT(1ならTRUE)
    R  ステータスポート
      ビット0 REQ(1ならTRUE)
      ビット2 ATTENTION(1ならTRUE)
      ビット3 SELECT(1ならTRUE)
      ビット4 BUSY(0ならBUSY)
      ビット5 MSG(0ならMESSAGE)
      ビット6 COMMAND/DATA(0ならCOMMAND)
      ビット7 INPUT/OUTPUT(0ならHOST<-SCSI)


   第4章 FDC

    4.1 FDC

 CPUがフロッピーディスクにアクセスする時にCPUとディスクドライブの間を結んで
いるのがFDC(フロッピーディスクコントローラ)です。MSXではFDCの種類やFDCとのI/O
レベルでのインターフェイスは定められていないため、同じ3.5インチ2DDのドライブ
を使っている機種でもFDCやI/Oポート等は異なっています。
 FDCには代表的な2つの系列があり、765系、8876系などと呼ばれています。


    4.2 μPD765系

     1 μPD765

 μPD765というFDCは1978年に日本電気が開発したFDCです。現在、この系統のFDCが
主流になっています。4台までのFDDを接続することを想定した設計になっていて、ド
ライブコントロールがしやすくなっていることや、トラックフォーマットのデータを
内蔵していてホストの負担が軽くなっていることなどの特徴があります。
 μPD765の後に、いくつもの改良品が出されており、また各社からセカンドソースが
供給されています。これらのFDCをまとめてμPD765ファミリとか単に765系とかいいま
す。


     2 レジスタ

 765系のFDCはステータスレジスタとデータレジスタの2本のレジスタを持っていま
す。 データレジスタは、8ビットのレジスタで、FDCへのコマンドの転送やデータの
読み出しと書き込みに使用します。
 ステータスレジスタはその名の通りFDCの状態を示しています。FDCとCPUの間でデー
タ転送をする際にはステータスレジスタを見ながらデータ転送をすることになります。
 ステータスレジスタは8ビットのレジスタで各ビットがそれぞれ意味を持っていま
す。各ビットの意味は下に示します。ステータスレジスタは読み込み専用で書き込み
は禁止となっています。

 ステータスレジスタの内容
    名称       略称  機能
 b0 FD0 Busy      D0B ドライブ0がSeekコマンドによるシークを実行中で
                あるか、シーク終了の割り込み要求を保留中である。
 b1 FD1 Busy      D1B ドライブ1について、D0Bと同じ。
 b2 FD2 Busy      D2B ドライブ2について、D0Bと同じ。
 b3 FD3 Busy      D3B ドライブ3について、D0Bと同じ。
 b4 FDC Busy      CB  FDCがコマンド・リザルトの各フェーズか、リード/
                ライトコマンドのエグゼキューションフェーズを実
                行中である。このビットがセットされているときは
                他のコマンドは受け付けられない。
 b5 Non-DMA Mode    NDM FDCがNon-DMAモードでデータ転送中であり、メイン
                システムに対してサービスを要求している。0に変
                化する時はエグゼキューションフェーズの終了です。
 b6 Data Input/Output  DIO データレジスタの転送方向を示す。
                0:メインシステムからFDC
                1:FDCからメインシステム
 b7 Request for Master RQM メインシステムに対するデータ転送要求。
                DIO=0のとき
                メインシステムがデータレジスタにデータをセッ
                トしたとき0に、FDCがそのデータを引き取ると1に
                なる。つまり、1になったらFDCにデータを転送で
                きる。
                DIO=1のとき
                FDCがデータレジスタにデータをセットしたとき1
                に、メインシステムがそのデータを受け取ると0に
                なる。つまり、1になったらFDCからデータを受け
                取れる。


     3 ドライブコントロール

 FDC自体にはドライブのモーターをコントロールするなどの機能はないので、これら
はFDCとは別に外部回路があります。外部回路は機種によって異なります。
 外部回路のコントロールのためにFDCのレジスタの他にいくつかのI/Oポートを使用
します。


     4 FDCのコントロール

 FDCにある動作をさせる場合には、FDCはコマンドという形でシステムの要求を実行
します。コマンドの実行は3つの段階にわけて行われ、そのそれぞれをフェーズと言い
ます。FDCにコマンドを実行させるにはFDCに対してコマンドを送ります。これをコマ
ンドフェーズといいます。そして、データを転送するのがエグゼキューションフェー
ズです。コマンドが終了すると、FDCが実行の成否などをホストに知らせます。これが
リザルトフェーズです。どのフェーズにおいても、コマンドやデータの転送はステー
タスレジスタを見ながらデータレジスタを介しておこなわれます。
 コマンド実行の手順を説明します。
 まず、コマンドフェーズでは、FDCがBusyでないことを確認してから実行させたいコ
マンドとパラメータ(合計1〜9バイト)をFDCに転送します。転送の前には、必ずステー
タスレジスタを読んでFDCがデータ転送の準備ができているかを確認します。
 次は、エグゼキューションフェーズです。ここでは実際のデータを転送します。こ
こでいう実際のデータとは、セクタの内容やフォーマットの際にシステムが指定する
データ等です。エグゼキューションフェーズではコマンドの種類により、FDCからシス
テムにデータ転送をする場合、システムからFDCにデータ転送をする場合があります。
コマンドによっては転送すべきデータがないので、エグゼキューションフェーズがあ
りません。
 コマンドが終了するとリザルトフェーズでFDCが実行結果をシステムに知らせます。
リザルトフェーズでは1〜7バイトのデータをCPUが受け取ります。コマンドによっては
リザルトフェーズのないものもあります。
 FDCのコマンド実行は以上の3つのフェーズで完了します。
 FDCのRESET入力を1にすることでFDCにリセットを掛けることもできます。


     5 リザルトステータス

 リザルトフェーズでFDCから返されるデータにリザルトステータスがあります。リザ
ルトステータスはFDC内部にリザルトステータスレジスタという4本のレジスタがあり、
コマンドによって異なりますがこのうちのいくつかが返されます。
 リザルトステータスレジスタの内容を以下に説明します。

 リザルトステータスレジスタ0 (ST0)
    名称      略称  機能
 b0 Unit Select0   US0 INT要求時のデバイス番号を返す。
 b1 Unit Select1   US1    〃
 b2 Head Address   HD  INT要求時のヘッドの状態
              Sense Interrupt Status実行時は常に0 
 b3 Not Ready    NR  指定したデバイスがReady状態でない時セットする。
 b4 Equipment Check EC  デバイスからFault信号を受け取った時、または
              RecalibrateコマンドでTrack0信号が一定時間内に検出
              できなかった時にセットする。
 b5 Seek End     SE  Seek又はRecalibrateコマンドによるシーク動作が正常
              終了または異常終了したことを示す。
 b6 Interrupt Code  IC  INT要求が何によるかを示す。
 b7   〃         b7 b6 00:コマンドの正常終了(NT)
                  01:コマンドの異常終了(AT)
                  10:起動したコマンドがInvalidだったため、
                    マンドを実行しなかったことを示す。(IC)
                  11:デバイスに状態遷移があったことを示す(AI)
 リザルトステータスレジスタ1 (ST1)
    名称      略称  機能
 b0 Missing Address MA (1)IDをアクセスするコマンドでインデックスパルスを
   Mark         2回検出するまでにIDAMが見つからない時セットする。
              (2)IDAMが見つかったあと、DAM又はDDAMが見つからない
              とセットする。この時、ST2のMDビットもセットする。
 b1 Not Writable   NW ライト系コマンドで、ライトプロテクト信号を検出した。
 b2 No Data     ND (1)次の5種類のコマンド実行時にID情報で指定したセク
              タがトラック上で検出できないとセットする。
              Read Data/Read Deleted Data/Write Data
              Write Deleted Data/Scan
              (2)Read IDコマンド実行トラック上にCRCエラーのない
              IDが見つからないとセットする。
              (3)Read Diagnosticコマンド実行時、セクタIDと指定ID
              の内容が一致しないとセットする。
 b3  ---         0
 b4 Over Run     OR データ転送時にメインシステムのサービスが規定時間内
              に行われないとセットする。
 b5 Data Error    DE ディスク上のIDまたはデータのCRCエラーを検出した(Read
              IDを除く)。ID、データの区別はST2のDDビットによる。
 b6  ---         0
 b7 End of Cylinder EN EOTで指定した最終セクタを越えてリード/ライトを続
              ようとした時セットする。

 リザルトステータスレジスタ2 (ST2)
    名称      略称  機能
 b0 Missing Address MD ST1のMAビットの(2)の時セットされる。
   Mark in Data Field
 b1 Bad Cylinder   BC ST1のNDビットに付帯してIDのCバイトが一致せずFFHで
              あるとセットする。(Read Diagnosticを除く)
 b2 Scan Not     SN Scanコマンドで最終セクタまで条件を満足しないとセッ
   Satisfied      トする。
 b3 Scan Equal Hit  SH ScanコマンドでEqual条件を満足するとセットする。
 b4 No Cylinder   NC ST1のNDビットに付帯してIDのCバイトが一致しないでFFH
              でもない時セットする。(Read Diagnosticを除く)
 b5 Data Error in  DD データのCRCエラーを検出するとセットする。
   Data Field
 b6 Control Mark   CM Read Data、Read Diagnostic、Scanコマンド実行時にDDAM
              を検出した時、またはRead Deleted Data実行時にDAMを
              検出した時にセットする。
 b7  ---         0

 リザルトステータスレジスタ3 (ST3)
    名称      略称  機能
 b0 Unit Select0   US0 デバイスへのUnit Select0信号の状態
 b1 Unit Select1   US1 デバイスへのUnit Select1信号の状態
 b2 Head Address   HD デバイスへのSide Select信号の状態
 b3 Two Side     TS デバイスからのTwo Side信号の状態
 b4 Track0      T0 デバイスからのTrack0信号の状態
 b5 Ready      RY デバイスからのReady信号の状態
 b6 Write Protected WP デバイスからのWrite Protected信号の状態
 b7 Fault      FT デバイスからのFault信号の状態


     6 FDCのコマンド

 FDCのコマンドについて説明します。普通使用することのないと思われるコマンドに
ついては説明を簡略化してあります。また、通常のMSXでの使用を前提に記述してあり
ますので、他の用途に使用する場合は参考文献などを参照して下さい。

 765のコマンド説明で使われる略称
 MT   Multitrack  マルチトラック操作(両面のトラックを続けてアクセス)を指
            定します。
 MF   MFM Mode   1でMFMモード、0でFMモードを指定します。FMモードは単密
            度ディスクの書き込みで使用される書き込み方式です。
 SK   Skip     DDAMをスキップすることを指定します。
 HD   Head     ヘッド番号を指定します。
 US1,US0 Unit Select  ドライブ番号を指定します。
 EOT   End of Track トラック上の最終セクタを指定します。
 GPL   Gap Length  VFO SYNCを除いたGAP3の長さを指定します。

●Read Data
 セクタのリードです。コマンドで指定したID情報(C、H、R、N)により、セクタのデー
タを読み取ります。
 HDはヘッドの選択です。0でSIDE0になります。US1/US0はドライブの指定です。MSX
では2ドライブまでしかシステムがサポートしませんので、US1は常に0になります。
MT=0、MF=1、SK=0、EOT=9、GSL=54H、DTL=0と指定して下さい。(2DD/1DDディスクのア
クセスはこれで問題ありません。)
 セクタの読み出しは連続して行うことができます(マルチセクタ機能)。TC(ターミナ
ルカウント)信号をFDCに入力することによってRead Dataコマンドは終了します。マル
チセクタ機能はRead Deleted Data、Write Data、Write Deleted Dataコマンドにそれ
ぞれ同様です。
 目的のセクタがインデックス信号を2回検出するまでに発見できないときは異常終了
します。

  R/W          DATA
  C   W  1 /MT /MF /SK / 0 / 0 / 1 / 1 / 0 /
       2 / - / - / - / - / - /HD /US1/US0/
       3         C
       4         H
       5         R
       6         N
       7         EOT
       8         GPL
       9         DTL
  E   R  -       転送データ
  R   R  1         ST0
       2         ST1
       3         ST2
       4         C          実行終了セクタのID情報
       5         H
       6         R
       7         N

●Read Deleted Data
 Deleted Dataとはなにか戸惑うかも知れませんが、単に読み込むセクタのDAMがDDAM
になっただけで、それ以外は通常のセクタのリードと変わりません。普通使われること
はありません。

  R/W          DATA
  C   W  1 /MT /MF /SK / 0 / 1 / 1 / 0 / 0 /
       2-9     Read Dataと同じ
  E   R  -       転送データ
  R   R 1-7     Read Dataと同じ

●Write Data
 セクタのライトです。パラメータの説明はRead Dataを参照して下さい。

  R/W          DATA
  C   W  1 /MT /MF / 0 / 0 / 0 / 1 / 0 / 1 /
       2 / - / - / - / - / - /HD /US1/US0/
       3         C
       4         H
       5         R
       6         N
       7         EOT
       8         GPL
       9         DTL
  E   W  -       転送データ
  R   R  1         ST0
       2         ST1
       3         ST2
       4         C
       5         H
       6         R
       7         N

●Write Deleted Data
 Deleted Dataのライトです。パラメータはRead Dataを参照して下さい。

  R/W          DATA
  C   W  1 /MT /MF / 0 / 0 / 1 / 0 / 0 / 1 /
       2-9     Write Dataと同じ
  E   W  -       転送データ
  R   R 1-7     Write Dataと同じ

●Read ID
 トラック上にあるセクタのIDだけを読み取ります。コマンドを実行してから一番始
めに見つかったセクタのID情報をリザルトフェーズで返します。エラーでないIDがイ
ンデックスマークを2回検出するまで見つからない場合は、ST1のNDビットをセットし
て異常終了します。エラーでないIDが見つからずさらにIDアドレスマークが1回も検出
されなかった時には、NDビットの代わりにST1のMAバイトをセットして異常終了します。

  R/W          DATA
  C   W  1 / 0 /MF / 0 / 0 / 1 / 0 / 1 / 0 /
       2 / - / - / - / - / - /HD /US1/US0/
  E   -  -      データ転送はない
  R   R  1         ST0
       2         ST1
       3         ST2
       4         C          読み取ったID情報
       5         H
       6         R
       7         N

●Write ID
 トラックをフォーマットします。Nでセクタ長を、SCで作成するセクタの数を指定し
ます。セクタの内容はDで指定した値で埋められます。GPLはギャップ長ですが、通常
は54Hを指定します。
 エグゼキューションフェーズでは、セクタ毎にCHRNの4バイトのデータをFDCに転送
します。つまり、4*SCバイトのデータを転送することになります。

  R/W          DATA
  C   W  1 / 0 /MF / 0 / 0 / 1 / 1 / 0 / 1 /
       2 / - / - / - / - / - /HD /US1/US0/
       3         N
       4         SC
       5         GPL
       6         D
  E   W  -     セクタ数分のID情報
  R   R  1         ST0
       2         ST1
       3         ST2
       4         C
       5         H
       6         R
       7         N

●Read Diagnostic
 セクタリードなのですが、たとえCRCエラーが発生しても、セクタのIDと指定したID
情報が異なっていても読み取り、セクタのIDで指定されるセクタ長は無視され、コマ
ンドで指定したセクタ長分のデータが、EOTで指定したセクタ分読み込まれます。

  R/W          DATA
  C   W  1 / 0 /MF / 0 / 0 / 0 / 0 / 1 / 0 /
       2-9     Read Dataと同じ
  E   R  -       転送データ
  R   R 1-7     Read Dataと同じ

●Scan Equal
 これと、Scan Low or Equal、Scan Low or Equalはディスク上のセクタの内容とCPU
から送るデータを比較します。通常使用されません。

  R/W          DATA
  C   W  1 /MT /MF /SK / 1 / 0 / 0 / 0 / 1 /
       2-8     Read Dataと同じ
       9         STP
  E   W  -       転送データ
  R   R 1-7     Read Dataと同じ

●Scan Low or Equal

  R/W          DATA
  C   W  1 /MT /MF /SK / 1 / 1 / 0 / 0 / 1 /
       2-9     Scan Equalと同じ
  E   W  -       転送データ
  R   R 1-7     Read Dataと同じ

●Scan Low or Equal

  R/W          DATA
  C   W  1 /MT /MF /SK / 1 / 1 / 1 / 0 / 1 /
       2-9     Scan Equalと同じ
  E   W  -       転送データ
  R   R 1-7     Read Dataと同じ

●Seek
 シーク(ヘッドを目的のシリンダに移動すること)を行います。NCNでシリンダ番号を
指定します。
 SeekコマンドはコマンドフェーズではFDC Busy状態ですが、エグゼキューション
フェーズではNon-Busy状態なので、他のドライブに対してSeek、Recalibrateコマンド
を実行させることができます。ただし、どれかのドライブがBusy状態の時はFDCにリー
ド/ライト系のコマンドを実行させてはいけません。

  R/W          DATA
  C   W  1 / 0 / 0 / 0 / 0 / 1 / 1 / 1 / 1 /
       2 / - / - / - / - / - / - /US1/US0/
       3         NCN
  E   -  -

●Recalibrate
 ヘッドをシリンダ0(ドライブのTrack0信号が検出される)までシークします。
 RecalibrateコマンドはBusyかどうかの状態についてSeekと同様です。

  R/W          DATA
  C   W  1 / 0 / 0 / 0 / 0 / 0 / 1 / 1 / 1 /
       2 / - / - / - / - / - / - /US1/US0/
  E   -  -

●Sense Interrupt Status
 SeekまたはRecalibrateコマンドによるシーク動作終了時のリザルトステータスを返
します。PCNはシーク動作終了時のシリンダ番号を示します。

  R/W          DATA
  C   W  1 / 0 / 0 / 0 / 0 / 1 / 0 / 0 / 0 /
  R   R  1         ST0
       2         PCN

●Sense Device Status
 FDCへ入力されるデバイス信号の状態を返します。

  R/W          DATA
  C   W  1 / 0 / 0 / 0 / 0 / 0 / 1 / 0 / 0 /
       2 / - / - / - / - / - /HD /US1/US0/
  R   R  1         ST3

●Specify
 FDCの各種時間用タイマ及びFDCの動作モードの初期値をFDCにセットします。
 SRT(Step Rate Time)は、シーク動作時にドライブに送るSTEP信号の間隔時間を指定
します。2ms単位で2〜32msを指定できます。(0:32ms・・・15:2ms)
 HUT(Head Unloaded Time)=1、HLT(Head Load Time)=1を指定します。
 ND(Non DMA Mode)はCPUとFDCの間のデータ転送方式を指定します。MSXではDMA転送
がサポートされないため、通常1を指定します。(0:DMAモード、1:Non DMAモード)

  R/W          DATA
  C   W  1 / 0 / 0 / 0 / 0 / 0 / 0 / 1 / 1 /
       2 /   SRT   /   HUT   /
       3 /      HLT       /ND /

●Invalid
 定義されていないコマンドが与えられた時、またはSense Interrupt Statusコマン
ドが実行された時シーク系コマンドによるINT要求が発生していない場合です。

  R/W          DATA
  C   W  1      その他のコード
  R   R  1         ST0


     7 FDCアクセスの例

 765系でのFDCアクセスの例を示します。

 STREG ステータスレジスタ
 DTREG データレジスタ

●FDCへのコマンド書き込み
 HLレジスタの示すアドレスからにコマンドデータ列、Bにコマンドのバイト数がある
とします。

WRTCOM: LD   DE,07D0H    ;タイマ
                ;(一定時間以内にBUSY=0にならなければ異常終了)
WRTCO1: LD   A,(STREG)    ;BUSY=0になるのを待つ
    AND   10H
    JR   Z,WRTCO2    ;NON BUSYになったらコマンド書き込みへ
    DEC   DE       ;タイマカウントダウン
    LD   A,D
    OR   E
    JR   NZ,WRTCO1
    SCF           ;異常終了
    RET

WRTCO2: LD   A,(STREG)    ;DIO=0,RQM=1になるのを待つ
    AND   0C0H
    CP   80H
    JR   NZ,WRTCO2
    LD   A,(HL)     ;コマンドデータ
    LD   (DTREG),A    ;データレジスタに書き込む
    INC   HL
    DJNZ  WRTCO2     ;コマンドのバイト数分繰り返す
    XOR   A        ;正常終了
    RET

●リザルトステータスの受け取り
 HLにリザルトステータスを格納するバッファのアドレスがあるとします。

GETRES: LD   A,(STREG)    ;ステータスレジスタを見る
    ADD   A,A
    JR   NC,GETRES    ;RQM=1になるのを待つ
    RET   P        ;DIO=0ならリザルトフェーズは終了
    LD   A,(DTREG)    ;データレジスタから読む
    LD   (HL),A     ;バッファに格納
    INC   HL
    JR   GETRES

●CPUからFDCへのデータ転送(ライトデータなど)
 HLレジスタに転送するデータの先頭アドレスがあるとします。

CPTOFD: LD   BC,STREG
    LD   DE,DTREG
CPTOF1: LD   A,(BC)
    ADD   A,A
    JP   NC,CPTOF1    ;RQM=1を待つ
    ADD   A,A
    RET   P        ;NDM=0になったら終了
    LD   A,(HL)     ;データ転送します
    LD   (DE),A
    INC   HL
    JP   CPTOF1

●SEEKコマンド
 Cレジスタにヘッドを移動するシリンダの番号があるとします。

SEEK:  LD   HL,COMBUF    ;コマンドバッファ
    PUSH  HL
    POP   IX
    LD   (IX+00H),0FH  ;SEEKコマンド
    LD   (IX+01H),00H  ;ドライブ指定
    LD   (IX+02H),C   ;シリンダ番号
    LD   B,03H      ;コマンドのバイト数
    CALL  WRTCOM     ;コマンド書き込み

    LD   HL,COMBUF
    LD   (HL),08H    ;SENSE INTERRUPT STARUSコマンド
SEEK1: LD   B,01H
    CALL  COMWRT     ;コマンド書き込み
    LD   HL,RESBUF    ;リザルトステータス用バッファ
    CALL  GETRES     ;リザルトステータス読み込み
    LD   A,(RESBUF)   ;ST0のSEビットが1になる(シーク終了)のを待つ
    BIT   5,A
    JR   Z,SEEK1
    AND   0C0H      ;正常終了か調べる
    RET   Z        ;正常終了
    SCF           ;異常終了
    RET

●WRITE DATAコマンド

WRTDAT: LD   HL,COMBUF
    PUSH  HL
    POP   IX
    LD   (IX+00H),45H  ;WRITE DATAコマンド
    LD   (IX+01H),00H  ;ドライブ、サイド
    LD   (IX+02H),00H  ;C
    LD   (IX+03H),00H  ;H
    LD   (IX+04H),01H  ;R
    LD   (IX+05H),02H  ;N
    LD   B,9
    CALL  WRTCOM     ;コマンド書き込み
    RET   C
    LD   HL,DATA     ;データ
    CALL  CPTOFD     ;データ転送
    CALL  TC       ;FDCにターミナルカウントを送るサブルーチン
    LD   HL,RESBUF
    CALL  GETRES     ;リザルトステータス受け取り
    LD   A,(RESBUF)   ;正常に終了したか調べる
    AND   0C0H
    RET   Z
    SCF
    RET


    4.3 MB8876系

     1 MB8876

 MB8876系のFDCはウェスタンデジタル社が開発したFD1791をもとに発展したもので、
MB8876は富士通の開発した製品です。もともと、片面、ドライブ1台用として設計され
ているため、レジスタ構成がシンプルである反面、2台以上のドライブを接続すると余
計な手間がかかります。
 FD1791の方が本家にあたるのでFD1791ファミリと呼ばれることもあります。


     2 レジスタ

 8876系のFDCは外部からアクセスできるレジスタを5本持っています。
 コマンドレジスタは書き込み専用の8ビットレジスタで、FDCにコマンドを実行させ
る時にコマンドを書き込みます。
 ステータスレジスタは読み込み専用の8ビットレジスタで、FDCの状態等を表します。
ステータスレジスタはコマンドレジスタと同じアドレスでアクセスします。
 データレジスタは、データ転送のために使用される8ビットレジスタです。
 トラックレジスタはディスクのヘッドの位置を示す8ビットレジスタです。
 セクタレジスタはセクタアクセス時にセクタ番号を指定する8ビットレジスタです。
 ステータスレジスタは各ビットがそれぞれ意味を持っています。各ビットの意味は
下に示します。ステータスレジスタの各ビットの意味はコマンドによって変化します。

 ステータスレジスタの内容

  コマンド   STR7  STR6  STR5  STR4  STR3  STR2  STR1  STR0

 TYPE すべての NOT   WRITE  HEAD  SEEK  CRC
  I  コマンド READY PROTECT ENGAGED ERROR  ERROR TRACK00 INDEX  BUSY

 TYPE リード  NOT       RECORD RECORD CRC   LOST  DATA
  II  データ READY   0   TYPE N.FOUND ERROR  DATA  REQUEST BUSY

    ライト  NOT   WRITE  WRITE  RECORD CRC   LOST  DATA
     データ READY PROTECT FAULT N.FOUND ERROR  DATA  REQUEST BUSY

 TYPE リード  NOT           RECORD CRC   LOST  DATA
 III アドレス READY   0    0  N.FOUND ERROR  DATA  REQUEST BUSY

    リード  NOT                   LOST  DATA
    トラック READY   0    0    0    0   DATA  REQUEST BUSY
 
    ライト  NOT   WRITE  WRITE          LOST  DATA
    トラック READY PROTECT FAULT   0    0   DATA  REQUEST BUSY

 TYPE コマンド
  IV  実行中  (今まで実行していたコマンドのステータスと同じ意味)   0

    コマンド NOT   WRITE  HEAD        
      なし READY PROTECT ENGAGED  0    0  TRACK00 INDEX   0

 マスタリセット   (TYPE Iコマンドに準ずる)


 TYPE Iコマンド
STR0 BUSY      FDCがコマンド実行中であることを表します。
STR1 INDEX     インデックスホールを検出したことを示します。
STR2 TRACK00    ヘッドがトラック0の上にあることを示します。
STR3 CRC ERROR   IDフィールド読み出しの時にエラーがあったことを示します。
STR4 SEEK ERROR   ベリファイ動作が成功しなかったことを示します。
STR5 HEAD ENGAGED  ヘッドがメディアに押し付けられていることを示します。
STR6 WRITE PROTECT ディスクへの書き込みが禁止されていることを示します。
STR7 NOT READY   ドライブが動作可能状態でないことを示します。

 TYPE II/IIIコマンド
STR0 BUSY      FDCがコマンド実行中であることを表します。
STR1 DATA REQUEST  FDCがデータレジスタの読み出しまたは書き込みを要求している
          ことを表します。
STR2 LOST DATA   データレジスタの読み出しまたは書き込みが所定の時間内に行
          われなかったことを表します。
STR3 CRC ERROR   IDフィールドまたはデータフィールドの読み出しの時にエラー
          があったことを示します。
STR4 RECORD NOT   正しく読み出せ、指定されたIDをもつIDフィールドがなかった
   FOUND     ことを示します。
STR5 RECORD TYPE  DAMがDDAMだった時にセットされます。
  /WRITE FAULT  書き込み動作が打ち切られたことを示します。
STR6 WRITE PROTECT ディスクへの書き込みが禁止されていることを示します。
STR7 NOT READY   ドライブが動作可能状態でないことを示します。


     3 ドライブコントロール

 FDC自体にはドライブのモーターをコントロールするなどの機能はないので、これら
はFDCとは別に外部回路があります。外部回路は機種によって異なる場合があります。
 これら外部回路のコントロールのためにFDCのレジスタの他にいくつかのI/Oポート
を使用します。
 その他にFDCから出ている信号のうち良く利用される物を説明します。

DRQ DATA REQUEST データレジスタへの書き込みまたは読み出し請求です。
IRQ INTERRUPT   コマンドの終了、打ち切り及びタイプIVコマンドの指定によって
   REQUEST   発生する出力信号です。
-MR MASTER RESET マスタリセットです。-MR=0で全ての動作を停止します。


     4 FDCのコントロール

 FDCにある動作をさせるには、FDCのコマンドレジスタにコマンドを送ります。
 コマンドは11種類あり、タイプIからタイプIVに大別されます。タイプIVコマンドを
除いてコマンドが実行中にはコマンドを書き込むことはできません。
 FDCはコマンドレジスタにコマンドが書き込まれるとコマンドの実行を開始するの
で、コマンドの実行に必要なパラメータはコマンドを書き込む前に他のレジスタに書
き込んでおく必要があります。
 FDCのマスタリセット端子(MR)によってFDCにリセットを掛けることができます。こ
の時内部のレジスタは次のようにプリセットされます。コマンドレジスタ=03H、ステー
タスレジスタ=(以前のステータスを保持)、データレジスタとトラックレジスタは不確
定、セクタレジスタ=01H。マスタリセットが解除された時点でFDCはリストアコマンド
を実行します。


     5 FDCのコマンド

 FDCのコマンドについて説明します。普通使用することのないと思われるコマンドに
ついては説明を簡略化してあります。また、通常のMSXでの使用を前提に記述してあり
ますので、他の用途に使用する場合は参考文献などを参照して下さい。

 TYPE Iコマンド
●リストア
 トラック0へヘッドを移動します。
 r1/r0はステップレートフラグ(ヘッドを1トラックずつ移動する時間間隔)でドライ
ブに適した値を指定します。値が大きいほど間隔が長くなります。hはヘッドロードフ
ラグで実行開始時にヘッドをメディアにつける(h=1)か離すか(h=0)を指定しますが、
ヘッドロード/アンロード機構がない場合が多いので、1を指定して問題ありません。
Vはトラック照合フラグです。V=1ではヘッド移動後にディスク上のIDフィールドとト
ラックレジスタの値を比較します。IDフィールドが見つからなかったり、値が違った
りすると、ステータスレジスタのSEEK ERRORビットをセットします。

 コマンド / 0 / 0 / 0 / 0 / h / V / r1/ r0/

●シーク
 データレジスタで指定したシリンダにヘッドを移動します。
 シークするシリンダの番号をデータレジスタにセットしておきます。

 コマンド / 0 / 0 / 0 / 1 / h / V / r1/ r0/

●ステップ
 ヘッドを1トラック移動します。
 uはトラックレジスタ更新フラグで、1だとヘッドを移動すると同時にトラックレジ
スタも更新します。

 コマンド / 0 / 0 / 1 / u / h / V / r1/ r0/

●ステップイン
 ヘッドを1トラック内側に移動します。

 コマンド / 0 / 1 / 0 / u / h / V / r1/ r0/

●ステップアウト
 ヘッドを1トラック外側に移動します。

 コマンド / 0 / 1 / 1 / u / h / V / r1/ r0/

 TYPE IIコマンド
●リードデータ
 セクタを読み込みます。
 対象とするセクタのセクタ番号とトラック番号をセクタレジスタとトラックレジス
タにセットしておかなければなりません。データ転送はデータレジスタを介して行わ
れます。オプションでサイド番号をチェックすることができます。リード/ライトの
バイト数はIDフィールドを読んだ時にIDのセクタ長指定バイトによって決定されます。
 Cは比較フラグで、1にするとサイド番号の比較を行います。その時はS(サイドフラ
グ)にサイド番号を指定します。サイド番号のLSBとSを比較します。
 他はm(マルチレコードフラグ)=0、E(ディレイフラグ)=0とすれば問題ありません。

 コマンド / 1 / 0 / 0 / m / S / E / C / 0 /

●ライトデータ
 セクタの書き込みです。セクタの指定などに関してはリードデータを見て下さい。
 a0はアドレスマークフラグで、1の時はDAMの代わりにDDAMを書き込みます。

 コマンド / 1/ 0 / 1 / m / S / E / C / a0/
 TYPE IIIコマンド
●リードアドレス
 コマンドを指定してから最初に発見したIDの情報をデータレジスタを介してCPUに返
します。返されるデータはIDの4バイトとIDCRC2バイトの計6バイトです。

 コマンド / 1 / 1 / 0 / 0 / 0 / E / 0 / 0 /

●リードトラック
 インデックス信号を検出してから1トラックのデータを読み込みます。データの同期
はインデックスマーク、IDアドレスマーク、データアドレスマークで行われます。

 コマンド / 1 / 1 / 1 / 0 / 0 / E / 0 / 0 /

●ライトトラック
 1トラック分のデータをディスクに書き込みます。フォーマットのために、F5H、F6H、
F7Hの3種類のデータはそのまま書き込まれずに特殊なデータとしてディスクに書き込
まれます。
 F5H 実際にはA1Hをミッシングクロックで書き込みます。
 F6H 実際にはC2Hをミッシングクロックで書き込みます。
 F7H 実際には内部で計算されたCRC2バイトを書き込みます。

 コマンド / 1 / 1 / 1 / 1 / 0 / E / 0 / 0 /

 TYPE IVコマンド
●フォースインタラプト
 このコマンドはいつでもコマンドレジスタに書き込み実行することができます。他
のコマンドが実行中だとそのコマンドは打ち切られ、フォースインタラプトコマンド
が実行されます。
 フォースインタラプトコマンドが実行されると、指定の条件でIRQが発生します。
I0〜I3はIRQの発生条件を指定します。

 I0=1 READY入力の立ち上りでIRQ発生
 I1=1 READY入力の立ち下りでIRQ発生
 I2=1 各インデックスパルスでIRQ発生
 I3=1 無条件でただちにIRQ発生

 コマンド / 1 / 1 / 0 / 1 / I3/ I2/ I1/ I0/


     6 フォーマットのデータ

 ディスクのフォーマットにはライトトラックコマンドを使います。ライトトラック
コマンドではトラック上のデータをほぼそのまま書き込んでいくことになります。こ
こでは2DDのディスクでの標準的なデータを示します。標準的な長さは1トラック6250
バイトとなりますが、実際にはドライブの回転変動などで±2%までの誤差が出る可能
性があります。
 セクタ部はセクタ数分(9回)繰り返します。
 フォーマットでは、アドレスマークをミッシングクロックという特殊な形式で書き
込まなければなりません。そのためにF5H〜F7Hのデータを使います。これらはFDCに
よって特殊な扱いを受けます。詳しくはライトトラックコマンドの説明を見てくださ
い。


 フォーマットのデータ

 データ バイト数 内容
  4EH   80
  00H   12
  F6H   3
  FCH   1  インデックスマーク
  4EH   50
セクタ部  (セクタ数分繰り返す)
  00H   12
  F5H   3
  FEH   1
シリンダ番号 1  (C:0〜4FH)
 サイド番号 1  (H:0〜1)
 セクタ番号 1  (R:1〜9)
 セクタ長  1  (N:2)
  F7H   1  ID CRC
  4EH   22
  00H   12
  F5H   3
  FBH   1  データマーク
  4EH  512  セクタの内容
  F7H   1  DATA CRC
  4EH   84
(ここまでセクタ部)
  4EH トラックの終わりまで(ドライブの回転誤差で長さは変わります。)


     7 FDCアクセスの例

 8876系でのFDCアクセスの例を示します。

 CMREG コマンドレジスタ
 STREG ステータスレジスタ(=CMREG)
 TRREG トラックレジスタ
 SCREG セクタレジスタ
 DTREG データレジスタ
 FDCST FDCからのDRQ、IRQ信号(b7:IRQ b6:-DRQとする)

●CPUからFDCへのデータ転送(ライトデータなど)
 HLレジスタに、転送するデータのアドレスがあるとします。

CPTOFD: LD   BC,FDCST
    LD   DE,DTREG
CPTOF1: LD   A,(BC)     ;DRQ、IRQの状態を読む
    ADD   A,A
    RET   C        ;IRQがセットされたので終了
    JP   M,CPTOF1    ;DRQがまだセットされていない
    LD   A,(HL)     ;メモリから読んで
    LD   (DE),A     ;データレジスタに書く
    INC   HL
    JP   CPTOF1

●FDCからCPUへのデータ転送(リードデータなど)
 HLレジスタに、データを転送するアドレスがあるとします。

FDTOCP: LD   BC,FDCST
    LD   DE,DTREG
FDTOC1: LD   A,(BC)     ;DRQ、IRQの状態を読む
    ADD   A,A
    RET   C        ;IRQがセットされたので終了
    JP   M,FDTOC1    ;DRQがまだセットされていない
    LD   A,(DE)     ;データレジスタから読んで
    LD   (HL),A     ;メモリに書く
    INC   HL
    JP   FDTOC1

●シーク
 Bにシークするシリンダ番号が入っているとします。

SEEK:  LD   A,B       ;シリンダ番号をデータレジスタにセット
    LD   (DTREG),A
    EX   (SP),HL     ;ウェイトを入れる
    EX   (SP),HL
    LD   A,11H      ;シークコマンド
    LD   (CMREG),A
    EX   (SP),HL
    EX   (SP),HL
SEEK1: LD   A,(STREG)    ;BUSY=0になるのを待つ
    RRA
    JR   C,SEEK1

●ライトデータ
 トラックレジスタにシリンダ番号、セクタレジスタにセクタ番号がセットされてい
るとします。

RDDATA: LD   A,0A0H     ;ライトデータコマンドを書き込む
    LD   (CMREG),A
    LD   HL,DATA     ;データのアドレス
    CALL  CPTOFD
    LD   B,70H
RDDAT1: EX   (SP),HL
    EX   (SP),HL
    DJNZ  RDDAT1
    LD   A,(STREG)    ;ステータスレジスタを読む
    AND   0FCH
    RET           ;成功ならZ=1
                ;Z=0はエラーが発生
                ;   エラーの種類はAレジスタでわかる


    4.4 トラックフォーマット

 トラック上に記録されているデータのフォーマットを説明します。
 2DDディスクでは、ディスクの片面には80本のトラックがあり、それぞれのトラック
に8〜9セクタのデータを記録しています。1トラックの容量は6250バイトです。
6250(バイト)*80(トラック)*2(面)=1000000(バイト)で、2DDディスクの容量が1MBと
なっています。実際に記録される容量がこれよりも少ないのは、トラック上には実際
のデータ以外にもいろいろ記録されているからです。ところで6250バイトというのは
標準値です。トラックにデータを書き込む速度は一定なのですが、ディスクの回転は
機種によって誤差があったり、同じマシンでも微妙に回転変動が生じているので、1ト
ラックに書き込みできる容量はその時々で変化します。ですから、トラック容量は最
悪で6250バイトを中心に±2%程度の誤差が出る可能性を見込んでおかなければなりま
せん。
 トラックは、プリアンブル部、セクタ部、ポストアンブル部の3つの領域で構成され
ます。
 プリアンブル部はトラックの先頭、つまりインデックス信号の検出される位置から
存在します。この部分はトラックの先頭にある"余白"です。IAM(インデックスアドレ
スマーク)はトラックの先頭を示します。SYNCはIAMの読み取りのため同期を取るとき
に必要な部分です。実際にはSYNCとIAMの先頭の3バイトのデータによって同期が取ら
れます。IAMの始めの3バイトはミッシングクロックという特殊な形式でディスクに記
録されています。GAPはデータとデータの間の余白です。回転変動等による影響を避け
るためにもGAPが必要です。
 セクタ部はID部とデータ部に分かれています。
 ID部は個別のセクタを示すもので、セクタごとに存在します。IDAM(IDアドレスマー
ク)は、セクタのIDフィールドの始まりを示します。IDはC、H、R、Nの4つのデータで
構成されます。それぞれ、シリンダ番号、ヘッド番号、レコード番号、データ長を示
します。2DD9セクタフォーマットではCは0から79、Hは0〜1、Rは1〜9、Nは2です。Nは
セクタの長さで、0:128バイト、1:256バイト、2:512バイト、3:1024バイト・・・、で
すが、その上限はFDCによって異なる場合があります。N=3までは、どのFDCでも使用で
きます。4以上の場合FDCによって扱いが異なる場合があるので注意が必要です。
 データ部は、実際のデータが記録される部分です。DAM(データアドレスマーク)が
データ部の始まりを示します。DAMの代わりにDDAM(デリーテッドアドレスマーク)も使
用することができます。DAMとDDAMの違いは単にアドレスマークの値が違うというだけ
です。DAMが通常使用されます。DDAMで始まるセクタをどう処理するかはFDC、ディス
クドライバによって異なります。
 IDAMとDAM(DDAM)の始めの3バイトはIAMの場合と同様、ミッシングクロックで書き込
まれています。SYNCとIDAM、DAM、DDAMで読み取りデータの同期を取ります。
 CRCは記録されたデータを読んだ時に、正しくデータを読み込めたか(またはデータ
が正しく記録されたか)を調べるためのもので、チェックサムのようなものと考えると
理解しやすいと思います。ID部とデータ部のそれぞれに存在し、それぞれIDCRC、
DATACRCと呼ばれます。データの読み込み時にCRCエラーが発生すると、FDCはそれをシ
ステムに知らせます。
 GAP3の長さはデータ長によって異なることがあります。N=2では54Hバイトです。
 ポストアンブル部はトラックの最後の余白です。この部分の長さはデータ部の長さ
によって変わりますし、またドライブの回転変動によっても変わります。

  トラックの構成
            名称  データ バイト数
 プリアンブル部    GAP0   4EH   80
            SYNC   00H   12
            IAM   C2H    3    (ミッシングクロック)
                 FCH    1
            GAP1   4EH   50
 セクタ部  ID部   SYNC   00H   12    セクタ部がセクタ数分繰り返す
            IDAM   A1H    3    (ミッシングクロック)
                 FEH    1
            C     C    1
            H     H    1
            R     R    1
            N     N    1
            CRC   CRC    2
            GAP2   4EH   22
       データ部 SYNC   00H   12
            DAM/DDAM A1H    3    (ミッシングクロック)
                 FBH/F8H  1
            データ  ---   (ID部のNによって決まる)
            CRC   CRC    2
            GAP3   4EH   (データ長によって変化する)
 ポストアンブル部   GAP4   4EH   (変化する)

※個人的以外の使用および無断転載を禁止します。

Copyright(C) 1996 by ASCAT All rights reserved.

ホームページに戻る 目次に戻る