このエントリーをはてなブックマークに追加
スポンサーリンク

ディスクBIOS

ディスクBIOS

BIOSでフロッピーディスクを操作する必要はほとんどありません。なぜなら、BIOSでフロッピーディスクを操作するためには、ディスクの種類(2DD、2HD(1.21、1.25、1.44)によって依存してしまうし、データーをファイル単位では扱えないからです。

BIOSでフロッピーディスクを読み書きしなければならない場合は、以下の場合ぐらいかと思われます。
・OSそのものを作りたい場合
・コピープロテクトなど直接ディスクに対して操作を行いたい場合
・ディスクイメージの吸い出しソフトを作りたい場合
・IBM標準フォーマットのデーターをどうしても読まないといけない時

IBM標準フォーマットは、オフコンや汎用機で使われるフォーマット形式ですが、MS-DOSやWindowsでは読み出しができないため、どうしてもこの形式のフロッピーのデーターを吸出したい場合にはBIOSを使うしかない、なんて話は詳しく知りません。なぜなら、私はオフコンというものを見たことがありません。

フロッピーディスクの構造

BIOSでフロッピーディスクを扱うためには、まずはフロッピーディスクの構造を理解する必要があります。8ビット機時代からパソコンを使っていた人は 誰もが一度はコピープロテクトの解析などをしていて 詳しい人が多いと思われますが、現在は既にDOS/VやWindowsからパソコンを使い始めた人の方が多いと思われますので、フロッピーディスクの構造から説明します。

ただし、これは独自研究ですので間違った事を言ってる箇所があるかもしれません。正確な知識が欲しい方はググって他のサイトも調べた方が良いと思います。ここでは、あくまでBIOSでフロッピーを読み書きする場合に最低限必要な知識のみ説明します。

フロッピーディスクには、8インチ、5インチ、3.5インチなどがあります。8インチと5インチは紙、3.5インチはプラスチックのケースに入っていますが、いずれも中には黒い磁器で情報を記録した円盤が入っています。外側からトラック0、トラック1、トラック2…という風にトラックに分かれています。


ここで「トラック」とは陸上トラックを思い出してもらえばわかると思います。

つまり、レコードやロールケーキのような渦状ではなく、木の年輪やバームクーヘンのように同心円がいくつも重なっている状態になっています。陸上トラックは正確には円じゃないんですけど、とにかく陸上トラックの1つのコースに該当するものを「トラック」と呼びます。

さらに、このトラックがセクタという部屋に分かれています。


「フロッピーは円なのに、どこがセクタ0なのか?」という疑問が出ると思いますが、これはフロッピーには内側に穴(インデックスホール)が開いていて、センサーがインデックスホールを感知した時にヘッドをがある場所がセクタ00という事になっています。

また、フロッピーディスクのうち、2D、2DD、2HDのように2がつく形式は両面形式といって、裏表の両面にデーターを記録する方式です。この場合、裏と表で同じトラック番号が存在してしまうのですが、これをヘッド番号で区別します。




フロッピーは裏と表だけだから良いのですが、ハードディスクは鉄の円盤(スプラッタ)が複数枚入ってますので、それぞれスプラッタごとに表/裏にヘッドがついています。



というように、BIOSでハードディスクをじかに扱うと、搭載されているハードディスクのスプラッタ数に依存するプログラムになってしまいます。ハードディスクは本来、IDEやSCSI等の規格が合致すればどんなものでも使えなければならないので、ハードディスクのBIOS経由でのアクセスはOSに任せた方が良いでしょう。まあ、OSそのものを開発したいというのであれば話は別ですが。

フロッピーディスクの種類

フロッピーディスクの種類には、大きさの違い、密度の違い、フォーマットの違い、等(注1)があります。

大きさの違い
8インチディスク(標準フロッピー)、5インチディスク(ミニフロッピー)(注2)、3.5インチディスク(マイクロフロッピー)があります。今は8インチどころか5インチもほとんど見かけません。かろうじて3.5インチはまだ専用ワープロ等の需要があるため販売されているようですが。

8インチと5インチは紙に、3.5インチは円盤がプラスチックケースに入っています。PC-8801/PC-9801シリーズ全盛期は5インチがほとんどで、3.5インチは富士通FM-77シリーズや一部小型のPC-9801のみ搭載されていたのですが、ノートパソコン(DynaBook、98Noteなど)が世に広まった頃から一気に3.5インチが主流になり、その後5インチ搭載機種は一部のデスクトップのみになってしまいました。

ラップトップのJ-3100は最初から3.5インチが標準で使われていました。


密度の違い
2D、2DD、2HDがあります。(いや、もちろん2EDとか2TDとか他にもあるのですが) 2Dと2DDはトラックの数が違うだけで、メディアも2Dよりも2DDの方が出荷時チェックが厳しいだけですが、2HDは2DDよりもさらに高密度で書き込むため、メディア自体が別です。5インチは2DDと2HDは見た目がまったく同じですが、3.5インチは右下に穴が開いています。もちろん、穴の違いだけではなく円盤の磁性体の密度も異なります。

2HDディスクのフォーマットの違い
これがとってもやっかいです。交流の周波数に60Hzと50Hzがあったり、レール幅が狭軌や標準軌があるのと並び、日本3大やっかいの1つです(うそ)。同じ2HDのフロッピーでも3.5インチのものについては、各メーカーでフォーマット形式や書き込み密度に違いがあるのです。

IBM PC/ATでは8インチ、5インチ、3.5インチで書き込みのセクタ割りや密度が異なっていたのですが、これを日本のメーカーではNECは8インチ、東芝は5インチの形式を3.5インチに採用したのでややこしくなりました。

1.25 (77トラック 1024×8セクタ )
IBM PC/ATでは8インチフロッピーに採用されたフォーマット形式で、PC-9801では5インチや3.5インチでもこの形式が採用されました。この形式では78、79、80トラックは使いません。というのも、8インチフロッピーというのは外側と内側でトラックの1周の長さが著しく異なり、内側の3トラックは1周が短くなりすぎて使えなかったのでした。

1.21 (80トラック 512×15セクタ)
IBM PC/ATでは5インチ2HDに採用された形式で、J-3100は3.5インチでもこの形式が採用されました。なので、J-3100用のソフトというと標準でこの形式になっているし、東芝DOS3.1でフォーマットするとこの形式でフォーマットされます。この形式のことを「2HC」と呼ぶ場合もあります

1.44 (80トラック 512×18セクタ)
IBM PC/ATで3.5インチHDで採用された形式で、DOS/V機が主流になってからは2HDのフロッピーはほぼこの形式になりました。もちろん、現在のWindows機でもこの形式です。

ここで問題なのは、1.21/1.25はセクタ割りが異なるだけで密度は同じなので良いのですが、1.44でフォーマットするためには1.21/1.25よりも高密度で書き込まねばならないため、ヘッドの読み書きの密度も切り替えなければならないという事です。

つまり、
・2DD
・2HDの1.21/1.25MBフォーマット
・2HDの1.44フォーマット

はそれぞれ書き込む密度が異なるという事です。この3種類の密度で書き込めるフロッピーディスク装置を「3モードFD」と呼びます。
コラム IBM標準フォーマット (77トラック 256×26セクタ)

オフコンやメインフレームで使われていたフォーマットで、8インチ2D、5インチ2HD、3.5インチ2HDのディスクを、トラック0のみ128×26で、残りのトラック1〜76を256×26セクタでフォーマットした形式です。

IBM社のパソコンであるDOS/Vの1.44フォーマットとは互換性が全くなく、通常パソコンでは読むことができません。BIOSを使って直接セクタリードするか、そのようにして作られたツールを使うしかありません。さらに、IBM標準フォーマットを5インチや3.5インチで採用したのは日本のみで、パソコンでいうところの1.44MBの密度で書き込む仕様ではありません。そのため、書き込まれる密度はJ-3100でかつて使われていた1.21MBフォーマットと同じですので、たとえ専用のソフトを作る/使うにしても、3.5インチのIBM標準フォーマットのフロッピーを読むためには、1.21MBフォーマットの読み込めるドライブが必要です。

東芝ではTPシリーズから3.5インチドライブが採用され、 それまで5インチ搭載のTOSBAC Qシリーズの資産の継承用に、TPシリーズ用外付け5インチドライブというのが用意されました。 しかし、残念ながら東芝ではこれをパソコン用のフロッピーにコンバートするツールが用意さませんでした。 それに、たとえサードパーティ製のツールを用いてIBM標準フォーマットのフロッピーをパソコンで読み込む事ができたとしても、 オフコンではそのほとんどがEBCDICコードを採用しており、 パソコンで使うためにはシフトJISやUTF-8に変換しなければならないという問題もありました。 したがって、東芝のオフコンの資産をパソコンでリプレースするためには、残念ながらプリントアウトして手で入れなおした方がよっぽど早いというのが現状のようです。
(注1) ここでは、片面/両面の違いは扱いません。
(注2) 正確には5.25インチですが、ここでは5インチに統一します。

3モードFD

J-3100シリーズでは、一部の上位機種を除きVGA対応のDynaBookV386やJ-3100ZS/ZD/ZXシリーズより前の機種では、2モードFD(720KB、1.21MB)でした。また、3モードFDは東芝日英DOS5.0、東芝DOS5.0/V、東芝DOS6.2/V、東芝Windows3.1で使えましたが、他社のOS(IBM PC-DOSやDR-DOS)では3モードFDは対象がい(東芝ダイヤル3100担当者:談)だそうです。

したがって、DynaBookV386やJ-3100ZS/ZD/ZXより前の機種では上位機種を除き1.44フォーマットは読み書き/フォーマットはできませんし、VGA搭載機種に東芝以外のDOS/Vを入れた場合に、1.21/1.25の読み書き/フォーマットはサポート外です(できるかもしれませんが)。

一般的に3モードFDというのは、元々IBM PC/ATにはないもので、各ドライブメーカーでそれぞれで作られたものです。そのため、ドライブのメーカーによってコントロール方法が異なります。東芝機では東芝製ドライブのみ使われており、東芝ブランドのDOS/VやWindows3.1では東芝製ドライブのドライバーのみが入っています。したがって、他者のOS(IBM PC-DOSやDR DOS)では3モードがサポート対象外なのです。

手持ちの資料が古い(94年版)ので、1.21MBがどのモデルまでサポートされたかは不明です。最低でも手持ちのBREZZA(初期モデル)ではサポートされていました。

フロッピーディスク対応機種
機種 720KB 1.21MB 1.44MB
DynaBookV486A
EZ486
J-3100GT-VX
J-3100GT-XD
J-3100GT-XS
J-3100PV (Vモデル、Jモデル)
SysmtemVX
SV566・560・466
DynaNote
DynaBookV486C
DynaBookV486E
DynaBookV486
DynaBookEZ (無印)
DynaBookV386
DynaBook386
DynaBook286
DynaBook (SS001/SS002/SS02E)
J-3100ZS/ZD/ZX
J-3300
J-3100SGX
J-3100SGT
J-3100GXS
J-3100GT-SX
J-3100GX
J-3100GL
J-3100GT
J-3100SL
J-3100GT
J-3100B
※入力ミスの可能性もありますので、正式なデーターについてはメーカーにお問い合わせください。教えてくれるかどうかわかりませんが・・・

ディスク割り込み

拡張INT13H非対応
ディスク割り込みは、必要なパラメーターをレジスタやメモリにセットした後、 INT13Hを発行します。なお、このOOh!Dynaは東芝J-3100シリーズに関する資料ですので、他社のPC/AT機および東芝のJ-3100PV2以降の機種では当てはまらない場合があります。DCGA専用のファンクションについては「このファンションはDCGA専用です」と注釈を入れています。

手持ちの資料が古く(1994年版)拡張INT13Hに対応しておりません。そのため、古いシステムの解析など、どうしても古い機種用の資料が必要な場合のみご利用ください。これから作る場合は、BIOSではなくOS割り込みをご利用ください。

ドライブ番号
フロッピーディスクとハードディスク(やハードRAM)では異なり、OS割り込みのような連番にはなりません。ドライブ番号の最上位ビットが立っているとハードディスク(やハードRAM)で、最上位ビットが立ってないとフロッピーディスクという事になります。

フロッピー1台目・・・00H
フロッピー2台目・・・01H
ハードディスク1台目・・・80H
ハードディスク2台目・・・81H

フロッピーディスクはケーブルの先が1台目、中間が2台目、ハードディスクはプライマリーマスター、セカンダリーマスター、プライマリースレーブ、セカンダリースレーブの順で割り当てられると思われますが、残念ながら実験した事がないので未確認です。申し訳ありません。

FDDパラメーター
INT13Hがフロッピーにアクセスするために必要なテーブルです。INT 1EHの割り込みベクタアドレスに格納されています。
オフセット ビット
7 6 5 4 3 2 1 0
+0 ステップレートタイム ヘッドアローンドタイム
+1 ヘッドロードタイム、 DMAモード
+2 モーターオフタイム (*55msec)
+3 セクタ長
+4 1トラックあたりのセクタ数
+5 ギャップ長
+6 データー長
+7 フォーマット時のギャップ長
+8 フォーマット時のデーターパターン
+9 ヘッドセッティングタイム(msec)
+10 モーターオンタイム(*125msec)
+11 最大トラック番号
+12 転送レート
セクタ長(2ビット)
 00: 128バイト
 01: 256バイト
 10: 512バイト
 11: 1024バイト

HDDパラメーター
HDDパラメーターは、割り込みベクタアドレスINT 41Hにマスター、INT 46Hにスレーブのディスクのパラメーターが格納されます。という事は、この割り込みでサポートされるハードディスクは2台までで、E-IDE(とかUltraATAとかSATA)には対応していません。E-IDE以降は拡張INT13Hを使いますが、手持ちの資料が古い(1994年版)ので、ここでは無印IDEのみ扱います。
+0 +1
+2
+3+4
+5+6
+7
+8
+9
+10
+11
+12+13
+14
+15
総シリンダ数
ヘッド数

ライト補償開始シリンダ

制御バイト



ヘッド退避シリンダ
1トラックあたりのセクタ数
ECCバイト数
ハードRAM
直訳すると硬いランダムアクセスメモリー・・・って、それじゃ意味がわからないですね。要するに、ハードディスクの円盤の代わりにRAMを使うのでハードRAM、という和製英語です。

この頃にも「RAMディスク」という、メモリーをハードディスク代わりにする技術はあったのですが、電源を切ると内容が失われてしまったので、一時ファイルの保存用ぐらいにしか使えませんでした。ハードRAMはバッテリーで内容が保存されているので、バッテリーが切れるまでは内容は保たれます。とはいえ現在のSSDドライブと違い、ッテリーがなくなると内容が失われます。

ハードRAMに対しては、コントローラーリセットは行われずステータスリードしてもエラーは返りません。ただし、ハードディスクに対するプログラムがそのまま流用できるように、エラーにはならないようになっています。

AH=00H コントローラーリセット
入力 出力
AH 00H
DL ドライブ番号
AH ステータス
CF=1ならエラー
フロッピーディスクコントローラー、ハードディスクコントローラーをリセットします。ハードディスクの場合はHDDパラメーターがセットされます。ハードRAMではエラーにはなりませんが、何もしません。ステータスについては、AH=01のところで説明します。

AH=01H ステータスリード
入力 出力
AH 01H
DL ドライブ番号
AH ステータス
CF=1ならエラー
最後に実行した処理のエラーステータスを読みます。ハードRAMの場合はエラーは発生せずAH=00が返ります。
ステータス 発生箇所 意味
FFH HDD 有効な操作に失敗した
E0H HDD 不良HDD
CCH HDD 選択したHDDが書き込みに失敗した
BBH HDD 未定義エラー
AAH HDD ドライブ動作不可
80H FDD/HDD タイムアウト
40H FDD/HDD シークエラー
20H FDD/HDD フロッピーディスク/ハードディスクコントローラーに障害が生じた
11H HDD 訂正可能なECCエラー
10H FDD/HDD CRCエラー/訂正不可能なECCエラー
0BH HDD 不良トラック検出
0AH HDD 不良セクタ検出
09H FDD/HDD 64KB以上のDMA転送を行おうとした
08H FDD DMAオーバーラン
07H HDD ドライブの初期化ができない
06H FDD メディアが交換された
05H HDD リセットの失敗
04H FDD/HDD セクタが見つからない
03H FDD ライトプロテクトされたフロッピーに書き込もうとした
02H FDD/HDD アドレスマークが見つからない
01H FDD/HDD 不正なコマンド
00H FDD/HDD エラーなし
AH=02H シーク&リード
フロッピーディスク
入力 出力
AH 02H
AL 読み出すセクタ数
CH トラック番号
CL セクタ番号
DH ヘッド番号
DL ドライブ番号
ES:BX バッファアドレス
AH エラーステータス
AL 読み出したセクタ数
CF=1でエラー

ハードディスク
入力 出力
AH 02H
AL 読み出すセクタ数
CH シリンダ番号の下位8ビット
CL シリンダ番号の上位2ビット/セクタ番号
DH ヘッド番号
DL ドライブ番号
ES:BX バッファアドレス
AH エラーステータス
AL 読み出したセクタ数
CF=1でエラー
フロッピーディスクとハードディスクで若干違うのは、ハードディスクはシリンダ番号が1バイトでは足りないため、CXレジスタの10ビットが割り当てられます。逆に言えば10ビットしか割り当てられてません。それが「8.4GBの壁」を生み出す要員ともなっています。


また、BIOSではヘッド番号として8ビット取ってあるのですが、IDEの規格ではヘッド番号に4ビットしか扱えないため、結果IDEのディスクを拡張INT13H非対応のBIOSで扱うと、504MBまでしか扱えません。これが「504MBの壁」です。

ハードRAMの場合、容量が4MB以下のものはFDD、4MBを超えるものはHDDとして扱います。

AH=03H シーク&ライト
フロッピーディスク
入力 出力
AH 03H
AL 書き込むすセクタ数
CH トラック番号
CL セクタ番号
DH ヘッド番号
DL ドライブ番号
ES:BX バッファアドレス
AH エラーステータス
AL 書き込めたセクタ数
CF=1でエラー

ハードディスク
入力 出力
AH 02H
AL 書き込むセクタ数
CH シリンダ番号の下位8ビット
CL シリンダ番号の上位2ビット/セクタ番号
DH ヘッド番号
DL ドライブ番号
ES:BX バッファアドレス
AH エラーステータス
AL 書き込めたセクタ数
CF=1でエラー
読み込み/書き込みの違いがあるだけで、パラメーターは読み込みと同じです。
AH=04H シーク&リード&ベリファイ
フロッピーディスク
入力 出力
AH 04H
AL 読み出すセクタ数
CH トラック番号
CL セクタ番号
DH ヘッド番号
DL ドライブ番号
ES:BX バッファアドレス
AH エラーステータス
AL 読み出したセクタ数
CF=1でエラー

ハードディスク
入力 出力
AH 04H
AL 読み出すセクタ数
CH シリンダ番号の下位8ビット
CL シリンダ番号の上位2ビット/セクタ番号
DH ヘッド番号
DL ドライブ番号
ES:BX バッファアドレス
AH エラーステータス
AL 読み出したセクタ数
CF=1でエラー
読み込んだ後にベリファイを行う以外は、AH=02Hと同じです。
AH=05H シーク&フォーマット
フロッピーディスク
入力 出力
AH 05H
CH トラック番号
DH ヘッド番号
DL ドライブ番号
ES:BX フォーマット情報の格納アドレス
AH エラーステータス
CF=1でエラー
フォーマット情報
 +0 トラック番号
 +1 ヘッド番号
 +2 セクタ番号
 +3 データー長
    00H 128
    01H 256
    02H 512
    03H 1024
この書式のデーターを、セクタ数分用意します。

フロッピーディスクをフォーマットする前に、事前にAH=17セットメディア/ドライブか、AH=18セットメディアタイプのいずれかを実行しておく必要があります。

ハードディスク
入力 出力
AH 05H
CH シリンダ番号の下位8ビット
CL シリンダ番号の上位2ビット
DH ヘッド番号
DL ドライブ番号
ES:BX フォーマット情報の格納アドレス
AH エラーステータス
CF=1でエラー
フォーマット情報
 +0 00H良セクタ 80H不良セクタ
 +1 セクタ番号
ハードディスクに対しては、あくまで論理フォーマット(つまり、良セクタ・不良セクタのマークおよび、セクタ番号の割り振り)を行うためのものであり、セクタ長は指定できません。

PC/AT互換機用のハードディスクは出荷時に512セクタでローレベルフォーマット済であり、PC-9801のようにローレベルフォーマットをする必要はありません。また、PC/AT互換機のハードディスクのセクタ長は512と決まっており、BIOSでローレベルフォーマットはサポートされていません。
AH=08H リードドライブタイプパラメーター
フロッピーディスク
入力 出力
AH 08H
DL ドライブ番号
AH エラーステータス
CF=1でエラー
AL=00H
BH=00H
BL ドライブタイプ
 01H 5インチ2D
 02H 5インチ2HD
 03H 3.5インチ2DD
 04H 3.5インチ2HD

CH 最大トラック番号
CL トラックあたりの最大セクタ番号
DH 最大ヘッド番号
DL 使用可能ドライブ数
ES:DI FDDパラメーターテーブルアドレス
3.5インチ2HDのタイプ(1.21か1.44)は判別できません。3モードFDの切替については別途東芝製ドライバが必要になります。(後述)

ハードディスク
入力 出力
AH 08H
DL ドライブ番号
AH エラーステータス
CF=1でエラー
CH 最大シリンダ番号の下位8ビット
CL 最大シリンダ番号の上位2ビット/シリンダあたりの最大セクタ番号(下位6ビット)
DH 最大ヘッド番号
DL 使用可能ドライブ数
使用可能ドライブ数にハードRAMも含まれます。ハードRAMはハードディスクとして扱ってください。
AH=09H ドライブパラメーターセット HDD専用
入力 出力
AH 09H
DL ドライブ番号
AH ステータス
CF=1ならエラー
AH=0AH シーク&リード LONG HDD専用
入力 出力
AH 0AH
ES:BX バッファアドレス
CH シリンダ番号の下位8ビット
CL シリンダ番号の上位2ビット/セクタ番号
DH ヘッド番号
DL ドライブ番号
AH ステータス
CF=1ならエラー
このファンクションはハードディスク専用です。また、DCGA専用です。AH=02Hとはデーターの後にECCコードを格納する所が違います。そのため、バッファは1セクタ当たりECCコード分だけ4バイト多く(つまり516バイト) 確保しなければなりません。
AH=0BH シーク&ライト LONG HDD専用
入力 出力
AH 0BH
ES:BX バッファアドレス
CH シリンダ番号の下位8ビット
CL シリンダ番号の上位2ビット/セクタ番号
DH ヘッド番号
DL ドライブ番号
AH ステータス
CF=1ならエラー
このファンクションはハードディスク専用です。また、DCGA専用です。AH=03Hとはデーターの後にECCコードを格納する所が違います。そのため、バッファは1セクタ当たりECCコード分だけ4バイト多く(つまり516バイト) 確保しなければなりません。
AH=0CH シーク HDD専用
入力 出力
AH 0CH
ES:BX バッファアドレス
CH シリンダ番号の下位8ビット
CL シリンダ番号の上位2ビット
DH ヘッド番号
DL ドライブ番号
AH ステータス
CF=1ならエラー
このファンクションはハードディスク専用です。ハードディスクの指定のヘッドを指定位置にシークします。
AH=0DH HDCリセット HDD専用
入力 出力
AH 0DH
DL ドライブ番号
AH ステータス
CF=1ならエラー
このファンクションはハードディスク専用です。

AH=10H テストドライブレディ HDD専用
入力 出力
AH 10H
DL ドライブ番号
AH ステータス
CF=1ならエラー
このファンクションはハードディスク専用です。また、DCGA専用です。HDDがパワーオン時の安定動作中に入ったかどうか、シークが完了したかどうか確認する時に使います。
AH=11H ヘッド退避 HDD専用
入力 出力
AH 11H
DL ドライブ番号
AH ステータス
CF=1ならエラー
このファンクションはハードディスク専用です。
AH=14H 自己診断 HDD専用
入力 出力
AH 14H
DL ドライブ番号
AH ステータス
CF=1ならエラー
このファンクションはハードディスク専用です。また、DCGA専用です。ハードディスクのセルフテストを実行し、結果をAHレジスタに返します。
AH=15H リードドライブタイプ
入力 出力
AH 15H
DL ドライブ番号
AH ドライブタイプ
 00H ドライブなし
 01H FDD メディアチェンジ検出機能なし 2D
 02H FDD メディアチェンジ検出機能あり 2DD/2HD
 03H HDD
 70H ハードRAM
CX:DX セクタ総数(HDD、ハードRAMの場合のみ)
AHにドライブタイプが返ります。HDDかハードRAMの場合は、CX:DXレジスタにセクタ総数が32ビットで返します。
AH=16H リードディスクチェンジ FDD専用
入力 出力
AH 16H
DL ドライブ番号
AH ステータス
 00H 入れ替えられてない
 01H ドライブ番号が無効
 06H 入れ替えられた
 80H メディアが入ってない
 
CF=1なら入れ替えられたまたはエラー
このファンクションはFDD専用です。フロッピーディスクが入れ替えられたかどうかをチェックします。
AH=17H セットメディアドライブ FDD専用
入力 出力
AH 17H
AL モード
DL ドライブ番号
AH ステータス
 00H 入れ替えられてない
 01H ドライブ番号が無効
 06H 入れ替えられた
 80H メディアが入ってない
 
CF=1なら入れ替えられたまたはエラー
このファンクションはFDD専用です。また、DCGA専用です。AH=05Hでフォーマットする前に、メディアが交換されたかどうかをチェックします。もし、メディアが交換されていた場合(CF=1、AH=06H)は、このファンクションを再度実行する必要があります。

ALレジスタにはモードをセットしますが、ドライブが2D、2DD、2DD/2HDによってセットする値が異なります。
 ・2Dドライブの場合:01H
 ・2DDドライブの場合:2DDなら01H、2Dなら02H
 ・2DD/2HDドライブの場合: 2DDなら01H、2Dなら02H、2HDなら03H

このファンクションはDCGA専用なので、VGA対応にするのであればAH=18Hを使用する必要があります。
AH=18H セットメディアドライブ FDD専用
入力 出力
AH 18H
CH 最大トラック番号
CL 最大セクタ番号
DL ドライブ番号
AH エラーコード
CF=1ならエラー
ES:DI パラメーターテーブルのアドレス
このファンクションはFDD専用です。こちらはVGAモードでも使う事ができます。AH=05Hフォーマットの前に実行する必要があります。パラメーターテーブルについては、この節の最初の方に書いてあります。もし、メディアが交換されていた場合(CF=1、AH=06H)は、このファンクションを再度実行する必要があります。
AH=70H セットドライブモード FDD専用
入力 出力
AH 70H
AL モード
 01H 2DD/2HD(1.21MB)
 02H 2HD(1.44MB)
BX 0000H
DL ドライブ番号
AH エラーコード
CF=1ならエラー
BX 1234H
このファンクションはFDD専用です。 このファンクションはDCGA専用で、日英DOS5.0の日本語モード専用です。

3モードFDを、1.44MBモードにするか、1.21MB(または720KB)モードにするかを指定します。

このファンクションが使える環境は限られますので、まずはBXレジスタに0000Hをセットしておき、INT 70Hをコールした後BXレジスタをチェックしてください。1234Hがセットされていない場合は、このファンクションがサポートされていません。といいますのも、もともとDOS/Vには「3モードFD」という概念がなく、3.5インチ2HDは1.44MBしか想定されていないためです。

ただし、東芝DOS5.0/Vや東芝DOS6.2/VにはFD12.SYSという3モードFDを使用可能にするドライバがあり、それを組み込む事でこのファンクションが使用可能になります。このドライバは東芝製ドライブ専用ですので、おそらく他社製DOS/V機では使えないと思われます。

DOS割り込み

BIOSを使ったディスクのリード/ライトは、ハードディスクのスプラッタ数やヘッド数に依存するだけでなく、存在するドライブ番号もアプリ側でチェックしなければならず、あまりにも手間がかかりすぎます。そこでOS割り込みのセクタリード/ライト機能を使う方法を紹介します。これなら、ドライブ番号はOSが認識しているドライブレターに相当する値をセットするだけですし、セクタ番号もトラックやシリンダやヘッドに関係なく連番で指定できるため、ハードへの依存性の低いアプリになります。

ただし、MS-DOS割り込みを使った方法では16bitFATにしか対応しておらず、扱えるHDDのサイズは最大でも2GBになります。また、Windows環境下で実行すると、大抵はウイスル扱いされて強制停止させられてしまうと思います。さらに、ディスクをセクタ単位で読み書きするのは非常に危険で、最悪ハードディスクの中身が全部パーという事態にもなりかねません。できる限りこれらのファンクションは使わない方が良いです。

アブソリュートディスクリード INT 25H
入力 出力
AL 装置番号(0=A、1=B、2=C …)
CX 読み込むセクタ数
DX 論理セクタ番号
DS:BX バッファアドレス
CF=1ならエラー
AL エラーコード
 00H 書込み禁止
 02H ドライブの準備ができてない
 04H データーエラー
 06H シークエラー
 08H セクタが見つからない
 0AH 書き込みができない
 0CH その他のエラー
ディスクからセクタ単位でデーターをDS:BXで指定したアドレスに読み込みます。セクタ番号はトラックやシリンダやヘッドを気にする必要がなく、OSが認識している順に0から連番が順に割り当てられます。これを論理セクタ番号といいます。

ただし、この方法ではセクタ番号が16bit幅しかないため、512×65535 = 32MBまでしかアクセスする事ができません。そこで、DOSの5.0以降では、32MB以上のパーティションにアクセスするために以下の方法が用意されています。
入力 出力
AL 装置番号(0=A、1=B、2=C …)
CX -1
DS:BX パラメータアドレス
 +0+1+2+3 セクタ番号
 +4+5 セクタ数
 +6+7+8+9 バッファアドレス 
CF=1ならエラー
AL エラーコード
 01H 無効なパラメーター
 02H その他のエラー
 03H 書込み禁止
 04H セクタが見つからない
 06H シークエラー
 08H DMAオーバーラン
 10H CRCエラー
 20H コントローラーエラー
 40H シークエラー
 80H 接続機構が応答障害
CXレジスタに-1をセットする事で、32MB以上のパーティション対応の読み方をするという意味になります。この方法ではセクタ番号が32ビットまで拡張されたため、理論的には2TBまで扱えます。ただし、MS-DOSは16bit FATしか対応していないため、「2GBの壁」の制約もあります。

この方法を使うとDOSのバージョンに依存してしまうため、プログラムの頭でDOSのバージョンもチェックしておいた方がいいと思います。
;   DOSのバージョンチェック
		MOV	AH,30H
		INT	21H
		CMP	AL,5
		JAE	KARENT

		MOV	AH,09H
		MOV	DX,OFFSET MES4
		INT	21H
		JMP	OWARI
INT 25H、INT 26Hともに割り込みから戻ってきたときに、元のフラグレジスタは割り込み内部でPUSHされたまま戻ってきます。割り込みから戻ったときにPOPFしてしまうとCF=1でエラーかどうかの判定ができないので、使ってないレジスタにPOPするか、SPを+2してスタックポインターを元に戻さなければなりません。

以下の例では、エラーチェックをせずにAXレジスタにPOPしていますが、これだとエラーコードがわからなくなるのであまり良くないです。
;------------ セクタリード
SREAD		=	$

		MOV	AX,CS
		MOV	[BSEG],AX
		MOV	SI,OFFSET BUFF
		MOV	[BOFF],SI

		MOV	AL,[DRNO]
		MOV	BX,OFFSET PACKET
		MOV	CX,-1
		INT	25H
		POP	AX

PACKET		DD	0
		DW	1
BOFF		DW	0
BSEG		DW	0
アブソリュートディスクライト INT 26H
入力 出力
AL 装置番号(0=A、1=B、2=C …)
CX 書き込むセクタ数
DX 論理セクタ番号
DS:BX バッファアドレス
CF=1ならエラー
AL エラーコード
 00H 書込み禁止
 02H ドライブの準備ができてない
 04H データーエラー
 06H シークエラー
 08H セクタが見つからない
 0AH 書き込みができない
 0CH その他のエラー
読み込みと書き込みの違いだけで、ほとんどINT 25Hと同じです。リードと同様、32MB以上のパーティションに対応するために、DOS5.0以上では以下の方法が用意されています。
入力 出力
AL 装置番号(0=A、1=B、2=C …)
CX -1
DS:BX パラメータアドレス
 +0+1+2+3 セクタ番号
 +4+5 セクタ数
 +6+7+8+9 バッファアドレス 
CF=1ならエラー
AL エラーコード
 01H 無効なパラメーター
 02H その他のエラー
 03H 書込み禁止
 04H セクタが見つからない
 06H シークエラー
 08H DMAオーバーラン
 10H CRCエラー
 20H コントローラーエラー
 40H シークエラー
 80H 接続機構が応答障害
;------------ セクタライト
		MOV	AL,[DRNO]
		MOV	BX,OFFSET PACKET
		MOV	CX,-1
		INT	26H
		POP	AX

PACKET		DD	0
		DW	1
BOFF		DW	0
BSEG		DW	0

DOS割り込みにしても、BIOSコールにしても、設計段階では十分に余裕を持って設計したつもりだったのでしょう。しかし、ハードディスクの容量はOSやBIOSの設計者の想像をはるかに超えたスピードで進化してしまい、ツギハギで規格を追加したため、いたるところに容量の壁ができてしまいました。

32MBの壁
MS-DOS 3.1ではセクタ番号を16ビットで管理していたため、1パーティションあたり最大のセクタ数が65535になってしまいました。そのため、1パーティションあたり32MBまでしか扱えません。そこで、DOS5.0以降では(注:東芝で4.0はなかったので割愛します)セクタ番号が32ビットに拡張され、理論的には2TBまで使用できるようになりました。(ただしDOSは2GBの壁の制約も受けます)

504MBの壁
拡張INT13Hに対応していないBIOSでは、シリンダ番号が10ビットしか割り当てられてません。また、BIOSではヘッド番号として8ビット取ってあるのですが、IDEの規格ではヘッド番号に4ビットしか扱えないため、結果としてIDEのディスクを拡張INT13H非対応のBIOSで扱うと、504MBまでしか扱えなくなります。

2GBの壁
E-IDEを使う事によって「ヘッド番号が4ビットしかない」という制約はなくなりますが、それとは別にMS-DOSでは16bit FATしか対応していないため、1パーティションの最大サイズは2GBになります。この制約は32bit FATが採用されたWindows95 OSR2の登場まで続きました。

8.4GBの壁
E-IDEを使い、32bit FATを使っても、INT 13Hで扱うシリンダ番号が10ビットしかないため、どうしてもハードディスク1台で扱える最大サイズが8.4GBになってしまいます。この制約を破るためには、拡張INT 13H対応のマザーボードを使うしかありません。ただし、BIOSアップデートを行う事によって拡張INT 13H対応になる場合もあります。

137GBの壁
E-IDEでは当初論理セクタ番号(LBA)は28ビット幅でした。そのため137GBまでしか使えませんでした。そこで、LBAを48ビットまで拡張したドライブがMaxtor社から発売され、現在(2011年)もこの方式が主流になっています。これで理論上128ペタバイトまでの容量を作る事ができます。

137GB以上のハードディスクを扱うためにはBIOSやOSが対応していなければなりません。OSはWindows2000はSP3、WindowsXPはSP1以降を当てることで対応するようになります。VISTAやWindows7では標準で対応しています。BIOSの方はアップデートで対応できるものもあります。

参考文献
『J-3100解析ハンドブック』 1989年 土屋勝著 ナツメ社
『DOS/Vテクニカル・リファレンス・マニュアル』 1993年 芦達剛著 ソフトバンク
『J-3100シリーズ・テクニカルマニュアル』 1994年 南部武彦著 ソフトバンク
『ATOK読本』 1994年 山田祥平 ジャストシステム
『東芝パソコンハンドブック94年版』 平成6年3月1日
スポンサーリンク