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