Museum

Home

Lab Overview

Retrotechnology Articles

Online Manuals

⇒ fd(4) — NEWS-os 4.2.1R

Media Vault

Software Library

Restoration Projects

Artifacts Sought

Related Articles

format(8)

newfs(8)

tar(1)

FD(4)  —  NEWS-OS Programmer’s Manual

名称

fd − NEWS フロッピーディスクインターフェース

形式

controller fc0 at iop0 priority 7
controller fc0 at hb0  priority 20
disk fd0 at fc0 drive 0
disk fd1 at fc0 drive 1
disk fd2 at fc0 drive 2
disk fd3 at fc0 drive 3 controller fc0 at ap0  priority 34
controller fc1 at ap0  priority 34
disk fd0 at fc0 drive 0
disk fd1 at fc1 drive 1
disk fd2 at fc1 drive 2
disk fd3 at fc1 drive 3

解説

fd デバイスドライバを用いて、 内蔵 3.5 インチマイクロフロッピーディスク および拡張フロッピーディスク (対応機種のみ) を使うことができます。 内蔵ドライブは、両面倍密度倍トラック (2DD)、 両面高密度倍トラック (2HD) の、ソフトセクタマイクロフロッピーディスクを 使用することができます。 加えて、NWS-3100/5000 シリーズでは、両面超高密度倍トラック (2ED) のフロッピー ディスクを使うことができます。 デバイスファイル名の先頭が "r" のものは、raw デバイス (メジャー番号 5)、 そうでないものはブロックデバイス (メジャー番号 1) です。

マルチフォーマット

NWS-1200/1400/1700/3100/3200/3400/3700/5000,PWS-1500/1600 シリーズでは、 メディアにアクセスする フォーマットを変えることができる、マルチフォーマット機能がサポート されています。 1 ユニットにつき、マイナー番号の異なる 8 つのデバイスが与えられており、 それぞれに対するフォーマットを自由に設定できます。 すなわち、デバイス名を変えるだけで、1 ユニットにつき 8 種類の 異なったフォーマットでメディアにアクセスできます。 NWS-800/900/1800/1900/3800 シリーズではこの機能はサポートされていません。

拡張ドライブ

NWS-1400/1700/3400/3700,PWS-1500/1600 シリーズでは、 外部に拡張ドライブを接続して、 3.5 インチ / 5.25 インチ / 8 インチの各種メディアを使用することができます。 NWS-5000 シリーズでは拡張フロッピーディスクインターフェースボードを用いて 外部に拡張ディスクを接続することができます。 拡張ドライブは NEC 製の PC-9800 シリーズ用拡張ドライブを使用します。

オートイジェクト

NWS-1200/3100/3200/3400/3700/3800/5000 シリーズでは、 メディアのイジェクト操作をソフト的に 制御することにより、デバイスを open 中にメディアが取り出されるのを 防止しています(内蔵ドライブのみ)。 ioctl を発行しておくと、デバイスを open している最後の プロセスが close を実行したときにメディアがイジェクトされます。 これを eject on close と呼びます。

メディア容量自動判別機能

NWS-3100/5000 シリーズでは、フロッピーディスクドライブにセットされた メディアの容量を自動判別し、その容量に応じたフォーマットで デバイスにアクセスする機能があります(内蔵ドライブのみ)。 フォーマットタイプ番号 13 の FD2ED は、別名として FDAUTO が割り当てられており、 この機能を指定するために使われます。 FDAUTO が指定されたスペシャルファイルは、ドライブにセットされている メディアによって、FD2DD/FD2HD/FD2ED のいずれかのフォーマットとして アクセスされます。

マルチフォーマットでない機種について

マルチフォーマットをサポートしない機種では、次に示す 2 種類のフォーマットを スペシャルデバイスのマイナー番号を変えることにより、 切り替えて使用できます。

デバイスマイナー番号タイプbytess#h#c#形式容量記録
rfh0a,fh00FD2HD51218280E/I1440KBMFM
rfd0a,fd08FD2DD5129280E/I720KBMFM

bytes…セクタ長, s#…セクタ数, h#…ヘッド (サイド) 数
c#…シリンダ数, E/I…ECMA/ISO

マルチフォーマット対応機種について

マルチフォーマット対応機種では、あらかじめ定義済みのフォーマットタイプを 指定して使うことが出来ます。 定義されてないフォーマットについては、ioctl で FDC に与えるパラメータを 設定することにより使用可能です。 また、1 ユニットにつきマイナー番号の異なる 8 つのデバイスが与えられており、 それらには初期値として、次に述べるフォーマットタイプのうちいずれかが セットされています。

フォーマットタイプ

システムには、 NWS-1200/1400/1700/3200/3400/3700,PWS-1500/1600 シリーズでは 13 種類、 NWS-3100/5000 シリーズでは 14 種類のフォーマットがあらかじめ定義されています。

type#タイプbytess#h#c#形式容量記録rpmSW
0FD2DD5129280E/I720KBMFM - 640KB
1FD2HD51218280E/I1440KBMFM300
2FD2HD102410248277IBM1232KBMFM3601MB
3FD2DDMS95129280IBM720KBMFM - 640KB
4FD2DDMS85128280IBM640KBMFM - 640KB
5FD2DMS95129240IBM360KBMFM - 640KB
6FD2DMS85128240IBM320KBMFM - 640KB
7FD2HDPS51218280IBM1440KBMFM300
8FD2HCAT51215280IBM1200KBMFM3601MB
9FD2DDOA10245277IBM770KBMFM - 640KB
10FD2DDOA025616277IBM616KBMFM - 640KB
11FD1S12812826177IBM250KBFM3601MB
12FD2D25625626277IBM1001KBMFM3601MB
∗13FD2ED(FDAUTO)51236280E/I2880KBMFM-

rpm…3.5 インチメディアを2HDで使う場合のドライブ回転数
SW…拡張ドライブ背面の密度切り替えスイッチ位置

ご注意
3.5 インチの 2HD フォーマットには、ドライブの回転数が 300rpm のものと、 360rpm のものの 2 種類があります。内蔵ドライブは 300rpm で、NEC 製の 拡張ドライブは 360rpm です。 300rpm のドライブで 360rpm のフォーマットを使うことは出来ません。 同様に 360rpm のドライブで 300rpm のフォーマットは扱えません。 上記の表に従って適切なドライブを選択してください。

NWS-1200/1400/1700/3200/3400/3700,PWS-1500/1600 シリーズで NEC製の拡張ドライブを使用する際は、背面のドライブ番号切り替えスイッチを 3/4 に設定してください。
NWS-5000 シリーズで NEC製の拡張ドライブを使用する際は、背面のドライブ番号切り替えスイッチを システムのコンフィギュレーションに合わせて設定してください。

内蔵の 3.5 インチドライブは、 ハードウェア的に両面倍密度フロッピーディスク (2D) への 書き込みは保証していません。

セクタ長が 512byte より長いフォーマットを設定した場合、 ブロックデバイスに対するリクエストは正常に動作しません。 また raw デバイスでは、lseek 時にセクタ長境界のリクエストを 出してください。 セクタ長を 512byte より短く設定した場合も、lseek は 512byte 境界で 行ってください。

type# 13 は NWS-3100/5000 シリーズでのみ定義されています。

スペシャルデバイスとフォーマットタイプ初期値

各デバイスには次に示すフォーマットタイプが初期値として与えられています。

デバイスファイルマイナー番号タイプtype#備考
[内蔵ドライブ]
(NWS-1200/1400/1700/3200/3400/3700,PWS-1500/1600 シリーズ)
rfd00a/fd00a0FD2HD1rfh0a/fh0 も可
(NWS-3100/5000 シリーズ)
rfd00a/fd00a0FDAUTO13メディア容量自動判別
 rfd01a/fd01a8FD2DD0rfd0a/fd0 も可
rfd02a/fd02a16FD2DDMS93
rfd03a/fd03a24FD2DDMS84
rfd04a/fd04a32FD2DMS95
rfd05a/fd05a40FD2DMS86
rfd06a/fd06a48FD2HDPS7
rfd07a/fd07a56FD2DDOA9
 [拡張ドライブ] (NWS-5000 シリーズのみ)
rfd10a/fd10a64FD2HD10242
rfd11a/fd11a72FD2DDOA9
rfd12a/fd12a80FD2DDMS93
rfd13a/fd13a88FD2DDMS84
rfd14a/fd14a96FD2DMS95
rfd15a/fd15a104FD2DMS86
rfd16a/fd16a112FD1S12811
rfd17a/fd17a120FD2D25612
 [拡張ドライブ]
rfd20a/fd20a128FD2HD10242
rfd21a/fd21a136FD2DDOA9
rfd22a/fd22a144FD2DDMS93
rfd23a/fd23a152FD2DDMS84
rfd24a/fd24a160FD2DMS95
rfd25a/fd25a168FD2DMS86
rfd26a/fd26a176FD1S12811
rfd27a/fd27a184FD2D25612
 rfd30a/fd30a192FD2HD10242
rfd31a/fd31a200FD2DDOA9
rfd32a/fd32a208FD2DDMS93
rfd33a/fd33a216FD2DDMS84
rfd34a/fd34a224FD2DMS95
rfd35a/fd35a232FD2DMS86
rfd36a/fd36a240FD1S12811
rfd37a/fd37a248FD2D25612

特殊なフォーマットのディスクについて

トラックごとにフォーマットが変わるようなディスクを取り扱う場合は、 raw デバイスを使うことをお奨めします。 ブロックデバイスでは、バッファキャッシュの関係でシステムコールの リクエストどおりのアクセスが行われないため、予期せぬエラーを おこすことにつながりかねないからです。

raw デバイスで open しておいて、アクセスしたいターゲットブロックの フォーマットに設定します。そして、全ディスクがそのフォーマットで あると仮定した lseek を行った後、read/write を行ってください。

一例として、IBM フォーマット 8 インチディスクのアクセスは以下のように 行います。

cyl#track#sec#フォーマットアクセス方法
001-26FD1S128lseek(0byte),read(128 ∗ 26 bytes)
011-26FD2D256lseek(256 ∗ 26 byte),read(256 ∗ 26 bytes)

ライトプロテクトチェック

fd デバイスドライバでは、オープン時に ライトプロテクトチェックを行っているので、 ライトプロテクトノッチがライトプロテクト状態になっているメディアに 対して、ライトオープンはできません。

IOCTL

ioctl のコマンドについて解説します。なおヘッダファイルは、 次のものをインクルードしてください。

#include <newsiop/fdreg.h>NWS-800/900/1800/1900/3800シリーズ
#include <newshbdev/fdc.h>NWS-1200/1400/1700/3200/3400/3700,
PWS-1500/1600 シリーズ
#include <newsapbus/fdc.h>NWS-3100/5000 シリーズ

各機種共通のIOCTL

以下の ioctl は各機種共通に用いることが出来ます。

FDIOCFORMAT
指定したトラックのフォーマットを行う ioctl です。

int track;
ioctl(fd, FDIOCFORMAT, &track);

マルチフォーマットサポートのための IOCTL

以下の ioctl は、 マルチフォーマットをサポートする機種でのみ用いることができます。

FDIOCSET

FDIOCGET
FDC のパラメータのセット (FDIOCSET) /問い合わせ (FDIOCGET) を行います。 sx2 フラグを 1 にすると 1 cylinder 置きにシークが行われます。 3.5/5.25 インチの 2D のディスクのように、 シリンダ間隔が 2DD/2HD/2ED の2倍になるものは、このフラグを 1 にセットします。 フラグを 1 にセットしておいて、例えばシリンダ #17 へシークすると、 2DD/2HD/2ED フォーマットのシリンダ #34 に相当する位置まで、 ヘッドのシークが行われます。 なお一般的に、2DD/2HD 対応のドライブ (大容量ドライブと呼ぶ) で 2D のメディアを取り扱う場合、 2D専用ドライブで書き込んだデータは大容量ドライブで読めますが、 その逆は保証されませんのでご注意ください。 ご注意
NEWS 内蔵のユニット (ユニット番号 0) に対して EXT_VFO モードは指定できません。 8 インチのドライブユニットに対して、 77 以上のシリンダ数を指定しないでください。

FDCparam fdcp;
ioctl(fd, FDIOCSET, &fdcp);
ioctl(fd, FDIOCGET, &fdcp);
 typedefstructFDCparam {
intnsect;/∗ # sectors/track ∗/
intntrak;/∗ # tracks/cylinder ∗/
intncyl;/∗ # cylinders ∗/
intnbytes;/∗ # bytes/sector (fd_length) ∗/
 intn;/∗ sector length code (fd_n) ∗/
intgsl;/∗ GSL ∗/
intgpl;/∗ GPL ∗/
intmf;/∗ mfm mode (1=MFM, 0=FM) ∗/
 intninterl;/∗ interleave (fd_interleave) ∗/
 inttrspd;/∗ transfer speed ∗/
intfomt;/∗ format (ECMA_ISO, IBM) ∗/
intvfomode;/∗ VFO mode (ext=1/int=0) ∗/
 intsrt;/∗ SRT ∗/
inthut;/∗ HUT ∗/
inthlt;/∗ HLT ∗/
intsx2;/∗ seek doublly flag ∗/
int  widd;/∗ write-id data ∗/
} FDCparam;
 #define MFM 1
#define FM 0
 #define IBM 0
#define ECMA_ISO 1
 #define EXT_VFO 1
#define INT_VFO 0

FDIOCSELECT
定義済みフォーマットタイプの中から 1 つを選択し、 それに従って、FDC のパラメータをセットします。

int type;
ioctl(fd, FDIOCSELECT, &type);

type にはフォーマットタイプ番号を指定します。

FDIOCRESTORETYPE
フロッピーディスクのフォーマットタイプを初期設定値に戻します。

ioctl(fd, FDIOCRESTORETYPE, 0);

FDIOCREADID
FDC の READID コマンドとほぼ同等です。 まず指定シリンダまでシークを行ってから、READID を実行します。 シークは、sx2 フラグとは無関係に、 通常のステップ (2DD/2HD のステップ) で行われます。 シーク先のシリンダで、最初に読めたセクタの c、h、r、n の値が、 結果としてセットされます。 リターン値としては、読めた場合 0、読めなかった場合負の値が返されます。 上述のようにシークが通常ステップで行われるため、 0 以外の偶数シリンダを読んでみた結果から、2DD か 2D かを判別できます。 指定した cylinder とリターン値の res_c の間には、 それぞれ以下のような関係が成り立ちます。

2DDcylinder == res_c
2Dcylinder == res_c ∗ 2

FDCid fdcid;
ioctl(fd, FDIOCREADID, &fdcid);
 typedef structFDCid {
intcylinder;/∗ physical cylinder # ∗/
int head;/∗ head ∗/
intres_c;/∗ result: cylinder ∗/
intres_h;/∗ result: head ∗/
intres_r;/∗ result: sector ∗/
intres_n;/∗ result: rec length code ∗/
} FDCid;

オートイジェクトサポートのための IOCTL

次に述べる ioctl は、オートイジェクトタイプの内蔵ドライブをもつ機種にのみ 用いることができます。

MTIOCTOP
内蔵ドライブを eject on close に設定します。

#include <sys/mtio.h>
struct mtop mt;
mt.mt_op = MTOFFL;
ioctl(fd, MTIOCTOP, &mt);

メディア容量自動判別機能のための IOCTL

NWS-3100/5000 シリーズで、ドライブにセットされたメディアの ID 番号を 得るために用いられます。 メディアの ID 番号は以下のように割り当てられています。

メディアID 番号
  2ED   0
  2HD   1
  2DD   2

FDIOCGETMID
ドライブにセットされたメディアの ID 番号を得ます。

int mid;
ioctl(fd, FDIOCGETMID, &mid);

エラー

システムコールがエラーで終了した場合、 システムコールのリターン値は −1となり、 その時のエラーコードに以下のような値が返されます。

#include <sys/errno.h>
extern int errno;

[ENXIO] open 時に指定したスペシャルデバイスが存在しない。

[EIO] ドライブが READY でない (モーターが回らない、メディアが入ってない)。

[EACCES] ライトプロテクトされているメディアにライトしようとした。
ライトプロテクトされているメディアをライトオープンしようとした。

[EINVAL] 指定したデバイスのフォーマットパラメータがセットされてない。
ioctl の引数の値が不適当である。

[EFAULT] シークに失敗した。
指定したセクタが読み/書きできなかった。

なお、EFAULT、EACCES および EIO は Read/Write/Format などの 実行時に発生した場合、 システムログファイルにエラーメッセージを出力します。

関連ファイル

/dev/fh0/dev/rfh0a
/dev/fd0/dev/rfd0a
/dev/fd[0−3][0−7]a/dev/rfd[0−3][0−7]a

関連事項

format(8), newfs(8), tar(1)

注意事項

マウントしてあるフロッピーディスクを取り出すときは、必ず umount(8) コマンドを実行した後で行ってください。

NEWS-OSRelease 4.2.1R

Typewritten Software • bear@typewritten.org • Edmonds, WA 98026