OTN-1:Mac 800K Disk Format

今ではあまり使われなくなってしまった、Macintoshの2DDのフロッピーディスクのフォーマットについての技術情報です。


(1)公式に確認されている情報

まずはInside Macintosh よりフォーマットの復習から、

この中で8〜12セクタ/トラックというのが技術的にユニークなところです。外周へいくほど1トラック中のセクタ数が増えるようになっています。具体的には次の表のようになります。

トラック番号セクタ数セクタ番号
0-15120-191
16-3111192-367
32-4710368-527
48-639528-671
64-798672-799

参考文献2にはもう少し詳しい情報があります。
トラック番号回転数(rpm)セクタ・シーケンス
0-153940-6-1-7-2-8-3-9-4-10-5-1
16-314290-6-1-7-2-8-3-9-4-10-5
32-474720-5-1-6-2-7-3-8-4-9
48-635250-5-1-6-2-7-3-8-4
64-795900-4-1-5-2-6-3-7

一般の3.5インチのディスクでは、IBMトラックフォーマットに従いデータや同期信号などを配置し、これをFMまたはMFMで変調(channel coding)して媒体に書き込みます。これに対しMac800Kディスクでは、6ビットのデータを8ビットのパルス列に変換して媒体に書き込む、GCR(Group Coded Recording)記録方式が採用されています。

磁気媒体には直流( 例えば0ばかりのデータが長く続く場合)は記録できないので、これをなくす目的でFM,MFM,GCR等のchannel codingが行われるわけです。Macの記録に使われている変換表を次に示します。

6-8変換GCRコード表
6bits data0123456789ABCDEF
00-0F96979A9B9D9E9FA6A7ABACADAEAFB2B3
10-1FB4B5B6B7B9BABBBCBDBEBFCBCDCECFD3
20-2FD6D7D9DADBDCDDDEDFE5E6E7E9EAEBEC
30-3FEDEEEFF2F3F4F5F6F7F9FAFBFCFDFEFF


(2)セクタフォーマット

これより以降は非公式情報です。
Macintoshの400K、800Kディスクフォーマットはこれより以前にApple II で使われていた5インチのディスクフォーマットをベースにしているといわれています。

それから推定したMacのセクタformatは(完全ではありませんが・・・)

連続FF
約42個
D5 AA 96 #t #s #f D9 ?? DE AA 連続FF
約6個
D5 AA AD #sFile Tags
16バイト
データ
684バイト
約3バイト
のCRC?
DE AA先頭に
戻る
というものです。

#t:トラック番号(0-79を6-8変換した値)
#s:セクタ番号(0-11を6-8変換した値)
#f:サイド番号(0の時は96、1の時はD6) 
??:チェック用CRCバイトか?

FMACPROで教えていただいたように、アドレス先導の D5 AA 96, データ先 導の D5 AA AD, アドレス/データ後導の DE AA は APPLE II のそれと全く同じ でした。


   

(3)GCRコーディング

ここからが、このテクニカルノートのハイライトです。

6-8変換表を適用する前にどうやって6ビットの列に切り分けるか?

最も簡単なやり方は6と8の最小公倍数の24ビットごとのデータを取り出し(例えば)MSB側から読み出せばいいわけです。しかしApple II の場合にはビット順を入れ替えていました。Macの場合はさらに複雑で24ビット毎にフィードバックがかかる仕掛けがされています。以下に示すのはこれを解析した結果です。

データ512バイトは3バイトずつ1組になって処理されます。8ビット3個がまとめ て、6ビット4個に変換されるわけです。n番目の組の出力w(n),x(n),y(n),z(n) (6ビット)は、入力a(n),b(n),c(n)(8ビット)単独の関数ではなく、内部変数S(n) (8ビット)、I(n)(16ビット)と入力a(n),b(n),c(n)の関数として表わされます。

内部変数S(n)、I(n)は次のようなアルゴリズムで決まります。

(0) S(0)=0、I(0)=0

(1) S(n-1)、I(n-1)を変数S(8ビット)、変数I(16ビット)にロードする。

(2) Sを1ビット左回転(シフトではない)し、LSBからあふれ出たときはIをイン クリメントする。なお、この結果をS'(n)として出力の計算に使う。

(3) Iにb(n)*8+a(n)の16ビットを加算(arithmetic)する。overflowの時はSをイ ンクリメントする。

(4) Sにc(n)の8ビットを加算(arithmetic)する。

(5) SとIをS(n)、I(n)に保存し次の組(n+1)の処理に使う。

出力w(n),x(n),y(n),z(n)の各ビットは、内部変数S'(n),I(n)と入力a(n),b(n), c(n)の各ビットの排他的論理和として次のように表わせる。
543210
wa7^S'7a6^S'6b7^I7b6^I6c7^I15c6^I14
xa5^S'5a4^S'4a3^S'3a2^S'2a1^S'1a0^S'0
yb5^I5b4^I4b3^I3b2^I2b1^I1b0^I0
z c5^I13c4^I12c3^I11c2^I10c1^I9c0^I8

このw,x,y,zに上で示した6-8変換表が適用され、現実のdisk上の4バイトとなる わけです。
なお、各セクタのデータ512バイトの直前には必ずfile tags 12バイトが置かれ ており、n=0が始まる位置はこのfile tagsの先頭バイトからです。 そして、次のセクタにデータが移動する毎にnも0にリセットされます。


あとがき

このノートは、1996年2月21日から3月1日にかけてNIFTY-ServeのFMACPROの4番会議室で議論した内容を要約し加筆したものです。

ルポ/Mac変換のソフトを模索する過程で、GCRフォーマットを解読する必要が生じ、この成果が生まれました。結果的にはこの情報は変換ソフトに利用できませんでしたが、フォーマットを探る過程でフロッピーディスク一般についての深い知識を習得することができました。

すでに800Kディスクは過去のものとなってしまいましたので、この情報が直ちに役立つことは望めそうもありません。この情報にインスピレーションを得て、なにか別のおもしろいことができるアイデアが生まれるようなら、公開した価値もあるというものですが、いかがでしょうか?


参考文献

  1. Inside Macintosh II, The Disk Driver
  2. 『フロッピ・ディスク装置のすべて』高橋昇司著、CQ出版、ISBN4-7898-3664-9(1989初版)

目次に戻る