Museum

Home

Lab Overview

Retrotechnology Articles

Online Manuals

⇒ fd(4) — NEWS-os 4.1C

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

解説

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

マルチフォーマット

NWS-1200/1400/1700/3200/3400/3700,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インチの各種メディアを使用することができます。 拡張ドライブはNEC製のPC-9800シリーズ用拡張ドライブを使用します。

オートイジェクト

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

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

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

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

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

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

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

フォーマットタイプ

システムには、以下の 13 種類のフォーマットがあらかじめ定義されています。

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

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

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

NEC製の拡張ドライブを使用する際は、背面のドライブ番号切り替えスイッチを 3/4 に設定してください。

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

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

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

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

デバイスファイルマイナー番号タイプtype#備考
[内蔵ドライブ]
rfd00a/fd00a0FD2HD1rfh0a/fh0 も可
rfd01a/fd01a8FD2DD0rfd0a/fd0 も可
rfd02a/fd02a16FD2DDMS93
rfd03a/fd03a24FD2DDMS84
rfd04a/fd04a32FD2DMS95
rfd05a/fd05a40FD2DMS86
rfd06a/fd06a48FD2HDPS7
rfd07a/fd07a56FD2DDOA9
[拡張ドライブ#3]
rfd20a/fd20a128FD2HD10242
rfd21a/fd21a136FD2DDOA9
rfd22a/fd22a144FD2DDMS93
rfd23a/fd23a152FD2DDMS84
rfd24a/fd24a160FD2DMS95
rfd25a/fd25a168FD2DMS86
rfd26a/fd26a176FD1S12811
rfd27a/fd27a184FD2D25612
[拡張ドライブ#4]
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 <news800iop/fdreg.h>NWS-800/900シリーズ
#include <news1800iop/fdreg.h>NWS-1800/1900シリーズ
#include <newsiop/fdreg.h>NWS-3800シリーズ
#include <newshbdev/fdc.h>NWS-1200/1400/1700/3400,PWS-1500/1600
シリーズ

各機種共通の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 の2倍になるものは、このフラグを 1 にセットします。 フラグを 1 にセットしておいて、例えばシリンダ #17 へシークすると、 2DD/2HD フォーマットのシリンダ #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);

エラー

システムコールがエラーで終了した場合、システムコールのリターン値は −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.1C

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