
第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.