<!DOCTYPE HTML PUBLIC "HTML 3.0">
<!-- IBM HomePage Builder for Windows  version 1.2.2 -->
<!-- Sun Nov 24 19:04:57 1996 -->

<HTML>
<HEAD>
<TITLE>第5部</TITLE>

</HEAD>


<BODY>
<CENTER>
<H1 align="center">第5部</H1>

<HR>
ディスクシステムの内部
</CENTER>

<P align="center">
<IMG src="dtd5.gif" width="263" height="353"><P>
<BR>
<PRE>
<A name="BM1s"></A>　　　第１章　ディスク


<A name="BM1_1"></A>　　　　１．１　フロッピーディスク

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


<A name="BM1_2"></A>　　　　１．２　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となっています。


<A name="BM1_3"></A>　　　　１．３　ハードディスク

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


<A name="BM2s"></A>　　　第２章　DOSカーネル

<A name="BM2_1"></A>　　　　２．１　DOSカーネル

<A name="BM2_1_1"></A>　　　　　１　DOSカーネルの役割

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


<A name="BM2_1_2"></A>　　　　　２　DOSカーネルのバージョン

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


<A name="BM2_2"></A>　　　　２．２　DOS1カーネル

<A name="BM2_2_1"></A>　　　　　１　メモリマップ

　ディスクのない状態では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


<A name="BM2_2_2"></A>　　　　　２　ドライブワークエリア

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

　初期化時にF1C9H〜F37FHを00Hで埋めた後、F1C9H〜F236Hに7397H〜7404Hのデータが
転送されます。
F1C9H　サブルーチン　文字列出力
F1D9H　サブルーチン　
F1E2H　サブルーチン
F1E8H　サブルーチン
F1F4H　
F1F7H　システム定義デバイス名
F1FFH　&quot;NUL &quot;
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　ページ１が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


<A name="BM2_2_3"></A>　　　　　３　内部解析資料

　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　&quot;AUTOEXECBAS&quot;
5B27H　'RUN&quot;AUTOEXEC.BAS&quot;'の文字列
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　改行


<A name="BM3s"></A>　　　第３章　ディスクドライバ

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


<A name="BM3_1"></A>　　　　３．１　ディスクドライバ

<A name="BM3_1_1"></A>　　　　　１　ディスクドライバ

　ディスクドライバはその名の通りディスクドライブを駆動するためのソフトウェア
で、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生産のために別のメーカーと内容が同じである場
合や、経緯はわかりませんが明らかに同じと思われるプログラムを使っている場合が
あります。


<A name="BM3_1_2"></A>　　　　　２　ディスクドライバ用ワークエリア

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


<A name="BM3_1_3"></A>　　　　　３　ディスクドライバの提供するルーチン

　ディスクドライバの提供するルーチンについて解説します。まずは、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を参照して下さい。


<A name="BM3_2"></A>　　　　３．２　ディスクドライバのタイプ

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


<A name="BM3_2_1"></A>　　　　　１　DOSカーネルのタイプ

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


<A name="BM3_2_2"></A>　　　　　２　ディスクドライバのタイプ

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


<A name="BM3_3"></A>　　　　３．３　ディスクドライバ資料

<A name="BM3_3_1"></A>　　　　　１　タイプ別資料の読み方

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

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

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

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

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

　　MOTOR_OFF_ENTRY　　　(略)MTROFF
　　OEMSTATEMENT　　　　 (略)OEMSTA

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

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

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

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


<A name="BM3_3_2"></A>　　　　　２　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,　 フォーマットデータを展開するエリア


<A name="BM3_3_3"></A>　　　　　３　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,　リード用バッファ


<A name="BM3_3_4"></A>　　　　　４　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　物理ドライブの数


<A name="BM3_3_5"></A>　　　　　５　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,　リード用バッファ


<A name="BM3_3_6"></A>　　　　　６　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


<A name="BM3_3_7"></A>　　　　　７　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モーター停止


<A name="BM3_3_8"></A>　　　　　８　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信号


<A name="BM3_3_9"></A>　　　　　９　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信号の反転


<A name="BM3_3_10"></A>　　　　　１０　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信号の反転


<A name="BM3_3_11"></A>　　　　　１１　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&lt;-SCSI)


<A name="BM4s"></A>　　　第４章　FDC

<A name="BM4_1"></A>　　　　４．１　FDC

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


<A name="BM4_2"></A>　　　　４．２　μPD765系

<A name="BM4_2_1"></A>　　　　　１　μPD765

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


<A name="BM4_2_2"></A>　　　　　２　レジスタ

　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からデータを受け
　　　　　　　　　　　　　　　　取れる。


<A name="BM4_2_3"></A>　　　　　３　ドライブコントロール

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


<A name="BM4_2_4"></A>　　　　　４　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にリセットを掛けることもできます。


<A name="BM4_2_5"></A>　　　　　５　リザルトステータス

　リザルトフェーズで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信号の状態


<A name="BM4_2_6"></A>　　　　　６　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


<A name="BM4_2_7"></A>　　　　　７　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


<A name="BM4_3"></A>　　　　４．３　MB8876系

<A name="BM4_3_1"></A>　　　　　１　MB8876

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


<A name="BM4_3_2"></A>　　　　　２　レジスタ

　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　　　ドライブが動作可能状態でないことを示します。


<A name="BM4_3_3"></A>　　　　　３　ドライブコントロール

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

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


<A name="BM4_3_4"></A>　　　　　４　FDCのコントロール

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


<A name="BM4_3_5"></A>　　　　　５　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/


<A name="BM4_3_6"></A>　　　　　６　フォーマットのデータ

　ディスクのフォーマットにはライトトラックコマンドを使います。ライトトラック
コマンドではトラック上のデータをほぼそのまま書き込んでいくことになります。こ
こでは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　トラックの終わりまで(ドライブの回転誤差で長さは変わります。)


<A name="BM4_3_7"></A>　　　　　７　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レジスタでわかる


<A name="BM4_4"></A>　　　　４．４　トラックフォーマット

　トラック上に記録されているデータのフォーマットを説明します。
　2DDディスクでは、ディスクの片面には80本のトラックがあり、それぞれのトラック
に8〜9セクタのデータを記録しています。1トラックの容量は6250バイトです。
6250(バイト)*80(トラック)*2(面)=1000000(バイト)で、2DDディスクの容量が1MBと
なっています。実際に記録される容量がこれよりも少ないのは、トラック上には実際
のデータ以外にもいろいろ記録されているからです。ところで6250バイトというのは
標準値です。トラックにデータを書き込む速度は一定なのですが、ディスクの回転は
機種によって誤差があったり、同じマシンでも微妙に回転変動が生じているので、1ト
ラックに書き込みできる容量はその時々で変化します。ですから、トラック容量は最
悪で6250バイトを中心に±2%程度の誤差が出る可能性を見込んでおかなければなりま
せん。
　トラックは、プリアンブル部、セクタ部、ポストアンブル部の3つの領域で構成され
ます。
　プリアンブル部はトラックの先頭、つまりインデックス信号の検出される位置から
存在します。この部分はトラックの先頭にある&quot;余白&quot;です。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　　　(変化する)
</PRE>
<HR>
<P>
※個人的以外の使用および無断転載を禁止します。
<P>
Copyright(C) 1996 by ASCAT All rights reserved.
<P>
<A href="../index.htm">ホームページに戻る</A>
 
<A href="tgdindex.htm">目次に戻る</A>

</BODY>

</HTML>
