━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1GBオーバーのHDDをつなぐ + FDS-120 が繋がっていても BOOT 出来るようにする TNB製作所 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ・はじめに まずはじめに書いておくが、実は 1GByte OVER の BOOT 出来る HDD が手元に ない。BOOT 出来ないが、1.5GByte の NEC DRIVE が手元にある。この HDD が BOOT 出来ない理由も同時に調べたが、こっちはまだ答えは出ていない。今回は これを MAIN に解析を行った。後に、少人数だが普通の HDD でブート出来るこ とも確認して貰っている。 ・問題 正直いって X68 で 1GB 以上の HDD を必要としている人がどれくらいいるの かわからない。だが、HDD の市場がほとんど 1GB 以上のものになってしまって いる。新規に買う時、あるいは使っていたものが壊れてしまい、買い換える時、 1GB 以上のものを買うしかないわけだ。容量的に必要でなくともこれからは X68 にも 1GB 以上の HDD を繋ぐようになる。1GB の HDD でも2万を切っているこ ともある。でかくて困ることはない。X68 でも でかい容量の HDD を使えばいい ではないか。 ところが、ネットでも葉書でも電話でも 1GB OVER のHDD が認識されない、と いう報告がある。逆に使っているが問題無いという人もいた。これはどういうこ となのか。 ・実際繋ぐ 実際に 1GB HDD を X68 に繋いで見るとしよう。X68 付属の Human DISK で起 動する。SHARP FORMAT されていないので認識されない。付属の FORMAT.x でフォ ーマットする。パーティションは1つでいいだろう。そして再度 FD からブート する(今回使用したのは BOOT できん NEC HDD である)。BOOT 後、DRIVE.x を 実行すると C: にハードディスクがある。容量は 1.5GB 。あっている。問題無 い。書き込みも出来る。 今回の NEC HDD はブート出来ない。もしかしたら 1GB OVER の問題は BOOT させようとするとダメ、ということなのか? いや、BOOT でなくてもダメらし い。 幸い(幸いか?)、この 1GB OVER HDD の件に付いてはいろいろ思考錯誤して いた方々も多く、認識されない方法、条件を聞くことができた。それは、パーティ ションの切り方に秘密があった。 それは、パーティションを切る時、最後のパーティションの頭が 1GB 以内に ないとダメ、というものである。例えば 2GB の HDD を3パーティションにしよ うとするとする。図で書くと、 0 0.25G 0.5G 0.75G 1G 1.25G 1.5G 1.75G 2G ┌───┴───────┼───┴───┴───┼───┴───┐ │第1パーティション │第2パーティション │第3パーティション │ └───────────┴───────────┴───────┘ このように切ると認識されなくなる。BOOT も出来ない(らしい)。 0 0.25G 0.5G 0.75G 1G 1.25G 1.5G 1.75G 2G ┌───┴───┼───┴──┬┼───┴───┴───┴───┐ │第1パーティション │第2パーティション│第3パーティション │ └───────┴──────┴────────────────┘ このように最後のパーティション、例の場合は第3パーティションが 1GB よ り前にあれば、この HDD から BOOT も出来、自動に認識される。しかし、もし 10GB の HDD を買ってきても最後のパーティションは 9GB 以上にするしかない…。 しかも Human(DOS)の仕様で1パーティションは 2GB 未満という事になってい る…。 ・起動するまでに パーティションの切り方を注意すれば、1GB OVER の HDD も全体が扱えないが、 とりあえずは使えるようだ。しかし SCSI ボード(CZ-6BS1)のマニュアルを見 ると、1MB 以上 16GB 未満の装置なら使えると書かれている。この記述はパーティ ションに付いては書かれていない。最大 16GB 未満の理由はなにか? その答え を探すために X68 の BOOT の際の SCSI まわりを解析することにした。結果、 重大なミスが見つかったわけだが…。 ・なぜか? まず、1GB が善し悪しの境になる理由を考えてみる。1GB というのは 1MB の 1024倍である。1MB は 1KB の 1024倍である。つまり 1024×1024×1024 = 1073741824 が 1G である。 SCSI の最小アクセス単位はセクタ(ブロックとも呼ばれることもある。SCSI のマニュアルなんかはそう呼んでいる)であり、1セクタが 512byte の機器が ほとんどだ(HDD の場合)。例えば、500MB の HDD なら 500MByte = 500×1024×1024 Byte = 524288000 Byte 524288000 / 1セクタ(512) = 1024000 1024000セクタ存在していることになる(1 byte だけの読み書き、というのは 出来ない)。 では、1GB のセクタは何個か。簡単に計算出来る。 1073741824 / 1セクタ(512) = 2097152 2097152セクタある。この 2097152 を 16進数で書くと $200000 となる。切り のいい数字だ。 話はちょっと変わってパソコンが SCSI-HD のデータを読み込む方法を簡単に 書く。SCSI-IOCS では S_READ を使うわけだが、SCSI-IOCS の中では、SCSI-HDD に対して、下の図のような 6byte になるコマンドブロック(数値の羅列)を送っ ている。このコマンドブロックに、読み込みたいセクタ位置と読み込みたいセク タの数を書き込む。 7 6 5 4 3 2 1 0 bit ┏━┷━┷━┷━┷━┷━┷━┷━┓ 0┃ OP.CODE $08 ┃ ┣━┿━┿━┿━┿━┿━┿━┿━┫ 1┃ LUN | ┃ ┣━┿━┿━┿ ┫ 2┃ 読みたいセクタの位置 ┃ ┣ ┫ 3┃ ┃ ┣━┿━┿━┿━┿━┿━┿━┿━┫ 4┃ 読みたいセクタの数 ┃ ┣━┿━┿━┿━┿━┿━┿━┿━┫ 5┃0|0| コントロール ┃ ┗━┷━┷━┷━┷━┷━┷━┷━┛ OP.CODE $08 というのが Read コマンドを意味する。LUN はとりあえず 0 を 入れておくものと考えておけばいい。例えば、セクタ5から3セクタ分読み込み たいなら、 $0A,$00,$00,$05,$03,$00 という数字の羅列を SCSI-HDD に送る。すると SCSI-HDD はその指定されたセク タから指定分のデータを送り出してくれる。上の図を見ての通り、「読みたいセ クタの位置」は 21bit しかない。この bit 数で表せられるのは、$1FFFFF まで である。これでピンと来たかも人もいるだろう。そう、このコマンドではセクタ $200000 以降のセクタを読むことが出来ない。 実は、もう一つ読み込みコマンドがある。それは 10byte になるコマンドだ。 SCSI-IOCS でいえば S_READEXT である。これは下の図を見ての通り、「読みた いセクタの位置」が 32bit ある。セクタ長が 512byte なら $FFFFFFFF x 512 = 2048GB まで対応出来る。 7 6 5 4 3 2 1 0 bit ┏━┷━┷━┷━┷━┷━┷━┷━┓ 0┃ OP.CODE $28 ┃ ┣━┿━┿━┿━┿━┿━┿━┿━┫ 1┃ LUN | 0 ┃ ┣━┿━┿━┿━┿━┿━┿━┿━┫ 2┃ ┃ ┣ ┫ 3┃ ┃ ┣ 読みたいセクタの位置 ┫ 4┃ ┃ ┣ ┫ 5┃ ┃ ┣━┿━┿━┿━┿━┿━┿━┿━┫ 6┃ 0 ┃ ┣━┿━┿━┿━┿━┿━┿━┿━┫ 7┃ ┃ ┣ 読みたいセクタの数 ┫ 8┃ ┃ ┣━┿━┿━┿━┿━┿━┿━┿━┫ 9┃0|0| コントロール ┃ ┗━┷━┷━┷━┷━┷━┷━┷━┛ ・やはりばぐか? これでわかった人もいるだろう。SHARP の IPL や デバイスドライバは 6byte のコマンドブロックの S_READ を使っているところがあるのだ。そうそう。なぜ 6byte の Read コマンドという範囲の小さい命令があるのか。それは昔はこのコ マンドしかなかったのだ。大容量化に対応するために 10byte の Readコマンド が用意されたのだ。昔の HDD ではこの 10byte の Read コマンドに対応出来な いものものある。 起動時、S_READ で HD の IPL(管理領域)をチェックするのは問題無い。そ れはドライブの頭の方(セクタの若い方)にあるからだ。そしてその後、パーティ ションチェックをするわけだが、1GB 以降にあるパーティションの情報を読みだ そうとする時、なんと S_READ を使ってしまっているのだ。読みたいセクタとは 違うセクタを読み込んでしまい、結果、パーティション情報が壊れている=この ドライブは使えない、となってしまう。 尚、このパーティションチェック以外は、ちゃんと S_READEXT が使える HDD ならそれを使うように書かれていたが…。 ・改善 理由が分かればそこを直すだけだ。幸いなことに、この S_READ を行っている ところは FORMAT.x でフォーマット時に HDD 上に書き込まれているプログラム なのだ。これをメモリに読み込んで実行している。よってこの HDD 上の IPL や デバイスドライバを直せば問題はなくなるのだ。 それが、GOVERHD.x である。この中に新しい IPL とデバイスドライバをイメー ジで持っておりこれを HDD のその場所に書きこんでいる。 そうそう、「最大 16GB 未満」の理由だが、それはパーティション情報に書か れているそのパーティションの開始セクタが 24bit しか記憶出来ないためであ る。セクタ長は 256,512,1024 byte 可能なので、セクタ 1024byte の場合、 $00FFFFFF × 1024 = 17179868160 ≠ 16GB なのである。おそらくパーティション開始を 16GB 未満に置けばもう少し使える と思うが、試しようがないな。 ・しめ 今回は SCSI 関係に付いて深く書かずにイメージでわかるように書いたところ もある(用語など)。その辺も含めて、SCSI 規格に付いてはいずれまとめて書 きたいと思う。 GOVERHD.x の使用は GOVERHD.x に同梱されているドキュメントにある通り無 保証なものである。一応数名の方に試して貰い大丈夫なことは確認しているが、 まだ実績がないことは確かである。個人の責任で使用して欲しい。また、おかし いところや質問があればぜひ連絡して欲しい。出来る限り対処、対応したいと思っ ている。 ・<オマケ>起動出来なくなる機器 ついでに接続するだけで起動出来なくなる機器に付いても調べてみた。今回の NEC HDD のようにその HDD から BOOT 出来ないだけでなく、接続して電源を入 れておくだけで X68 が起動出来なくなる機器のことである(Mach-2 であれば大 丈夫だ)。それが I・O DATA FDS-120 である。SCSI 接続の 3.5inchFDD であり、 3.5inchFDD 不足の X68 USER には絶好の機器なのである。 さて、なぜ起動出来ないのか。電気的な問題ではない。実は、FDS-120 がちゃ んと SCSI 規格通りに対応してくれないからであった。 X68(Human)は BOOT 時、ID 0 から順に 全 SCSI-ID に対して問い合わせを する。その時使う命令、SCSI-IOCS でいえば、S_REQUEST で、3byte だけの Request Sense を要求するのだが(asm でいうところの d3 の値)、この FDS-120 はなぜか 4byte 送りかえそうとする。後で調べてみると 3byte に限らず奇数の 場合+1した数だけ送ろうとしているようだ。X68 の受け取ろうとしている数と、 FDS-120 が送ろうとしている数が違うため、X68 側ではエラーで SCSI のやり取 りを打ち切り次に行こうとする。FDS-120 側では X68 に受け取って貰うまで待 ち続ける。しかも SCSI バスは FDS-120 が占領したままである。よってこれ以 降 SCSI バスは使えない、ファイルは読み込めない、デバドラは登録出来ない。 そこで、今回 1G OVER 対策のため IPL と デバドラを書き替える、というこ とをしたので、ここで FDS-120 の対策もしてみた。非常に単純である。もし、 S_REQUEST で 3byte の転送をしようとしたら、4byte にして実行してしまうだ けである(もちろん読み込みバッファを別で確保して一度そっちに読み込むよう にしている)。 幸い、Human は ID の若い方から順に接続チェックを行うので、若い方の SCSI-HD のデバドラ登録の際に細工をすれば問題無い。ここに上の対策を入れた。 そのため、FDS-120 よりも若い SCSI-ID に GOVERHD.x を実行した HDD を置く 必要があるもの、問題無く BOOT 出来るようになった。 捕捉: 今回制作した GOVERHD.x は今月の道具箱に掲載して います。 捕捉: 060turbo 付属の ROM では FDS-120 が接続されてい てもブート出来るように改善されています。 ひで(TNB製作所) (EOF)