↓ ↑ページトップへ
表示調整
閉じる
挿絵表示切替ボタン
▼配色
▼行間
▼文字サイズ
▼メニューバー
×閉じる

ブックマークに追加しました

設定
0/400
設定を保存しました
エラーが発生しました
※文字以内
ブックマークを解除しました。

エラーが発生しました。

エラーの原因がわからない場合はヘルプセンターをご確認ください。

PR
4/4

第三章 『 RBFという迷宮』《 OS-9のディスクを読む 》

【OS-9のディスクを読む】


SWI2を実装すると、OS-9のプログラムが少しずつ動き始めた。

これは面白い。画面に文字が出る。プログラムが終了する。

簡単なものなら、それなりに動く。

ところが、当然のように次の問題が出る。ファイルである。

OS-9のプログラムは、ファイルを開こうとする。

「そんなもの、Windowsのファイルを開けばいいじゃないか」

最初はそう思った。

実際、それでもよいのである。現にそうしてみた。

WindowsのディレクトリをOS-9のディレクトリのように見せて、openされたらWindowsのファイルを開く。


簡単なプログラムなら、それで動く。

しかし、私が使いたいものは、そこにはない。

昔のOS-9のディスクの中にある。


OS-9のコマンド群、マイクロウエアのCコンパイラ。アセンブラ。

いろいろな、ソースファイル。

せっかく昔のディスクをイメージ化したのだから、そのまま使いたい。

もちろんエディタもある。まあ、これは最新のものを使いたい。

OS9のファイルシステムで書かれた、RBFイメージファイルを読まなければならないのだ。


1 RBFって何?

読者のために解説しておこう。

OS-9を使っていたころは、RBFなんて意識していなかった。ディスクを入れて、

dir

と打てばファイルが出る。

chd

でディレクトリを変える。

copy

でコピーする。それだけである。


RBFとは、Random Block File Manager。

OS-9のディスクファイルシステムを担当しているプログラムである。

使っている側からすれば、そんなものを知らなくてもよい。

ところが、今度は自力でその中身を読まなければならない。


手元には富士通の青い本であるOS-9のマニュアル群や、秀和の解説書、日本で出版されたありとあらゆるOS-9関連書籍があったりする。

意外と構造の載っている本は少ない。


LSN0。

File Descriptor。

Bitmap。

Directory Entry。


そうそう、こうだった。

思い出してくる。

そして、昔の資料を今読むと、当時とは読み方が違う。とりあえず、イメージファイルをダンプしながら確認である。


【 2 まずLSN0を読む】

RBFディスクの最初には、LSN0がある。

Logical Sector Number 0。

名前の通り、論理セクタ0番である。

FMシリーズの場合、星光電子が最初FM-8移植した版はそのままだったが、富士通版はトラックがオフセットしてあるので、CoCo版とは違うのである。

MS-DOSやF-BASICのFATとは違う。ここにディスク全体の情報が入っている。

ディスクサイズ。クラスタサイズ。Bitmap。Root DirectoryのFile Descriptor。その他いろいろ。

つまり、「このディスクはどういうディスクですよ」という名札みたいなものだ。ファイルダンプソフトで、イメージファイルを眺める。そして、ソフトでまず、ここを読む。バイト列を表示する。資料と見比べながら読む。Windwosには他人の作ったツールもあるが、昔F-BASICで作ったツールもあったので、やり方が思い出される。

ここがTotal Sectorだったな、ここがRoot FDだったな、などと懐かしく思い出される。Root DirectoryのFile Descriptorが分かれば、そこを読む。すると、そのディレクトリのデータがどこにあるか書いてある。そこへ行く。するとDirectory Entryが出てくる。ファイル名と、そのファイルのFile Descriptorの番号がある。そのFile Descriptorへ行けば、ファイルサイズやデータの場所が分かる。なるほど。ちゃんと筋が通っている。この構造、40年も前のファイルシステムだが、なかなかよく出来ている。



【3 ところが、フロッピーは素直じゃない 】


ここで一つ問題がある。

OS-9から見ると、ディスクは、LSN0、LSN1、LSN2……と、きれいに並んでいる。しかし実際のフロッピーディスクはそうではない。

Cylinder、Head、Sector、そしてセクタサイズ。

さらにFM-11のディスクは、これが少し変わっているものがある。最初のトラックだけ構成が違うのだ。片面単密。128バイトセクタがあったりする。その後は256バイト。26セクタ。昔は電電フォーマットと呼んでいた5インチ2HDである、8インチの2Dディスクに合わせているから、今の感覚で見ると変なものだ。しかし当時は普通だったのである。

先に、ディスク吸出しツールを作っていたのだが、FM-Rで読むソフトを作っていたMiyazaki氏のソース、F-BIOSを利用したものだが、これを真似して、PC98のBIOSを利用し作り直したPC-9821用のツールがある。

FM-TOWNS時代のHi-Cで書いたものがあるのだが、これは動かない。

5インチ2HDのドライブがついているのは、PC286や98DOである。DOS-Extenderが使えない。古いコンパイラーで使い方のわかっている、PowerCで書いた。ラージモデル、懐かしいね。


それで、PC-9821で吸い出したRAWイメージを見ながら、「これは、どこがLSN0なんだ?」というところから始める。

世の中には、D88もある。それのネーム変更版のD77もある。こちらのツールが主なのだが、これはまたの機会にすることにして。とりあえずイメージファイル、RAWファイルだ。


【4 ファイル名が変だぞ】

Root Directoryが読めるようになって、「よし、dirを出してみよう」と思った。ところが、ファイル名が変である。頭は合うのだが、文字の表示がバグる。何だか覚えがあるぞ、これは。資料を見ると、ああ、そうだったOS-9のファイル名はC言語みたいな0終端ではないのだ。最後の文字のbit7を立てるのである。だから、OS-9では、7ビット文字しかファイル名に使えないのである。

これはOS-9の最大の欠点だった。最後の文字のビット7を立てておくのである。

ダンプイメージを見て思い出す。作ったのはアメリカ人だからね、終端用の0を1バイト使うより、最後の文字の最上位ビットを使い、1バイト読んでマイナスなら終わりにしていた。これは、マイクロソフトBASICの予約語であるコマンドなどもそうしている。

また、使えない文字も結構ある。リストアップすると、小文字の!#$%+-・<=>@¥である。これを忘れると、幽霊ファイルが出来てしまう。

昔は、そういう時代だった。SIFT-JISで2バイトを使い、UNICODEで32ビット文字が使える現代とは大違いだ。

だから、直す。Signed char が負になるまで読み出し、終端文字として、$7Fでマスクして表示するのだ。

なおしてから、もう一度dir。今度は、

CMDS SYS DEFS SRC Window2 StartUp

と出た。

「おおっ!」ついに昔のOS-9ディスクのディレクトリがWindows上に出た。これは、うれしい。ただのバイナリイメージだったものが、急に昔のディスクに戻った感じだ。


【 5 File Descriptorというやつ 】

OS-9では、Directory Entryにファイルの全情報が入っているわけではない。

そこにはファイル名と、File Descriptorの場所がある。

File Descriptorには、属性 所有者 日時 ファイルサイズ そしてデータのセグメント情報 が入っている。


今のファイルシステムで言えば、inodeに近い。ファイルのデータは、必ずしも連続していない。何セクタかの塊がいくつもある。そのため、File DescriptorのSegment Listを順番に読んでいく必要がある。昔は「面倒だなあ」と思った。でも、よく考えるとよく出来ている。ディスクが断片化しても、ファイルを複数の場所に置ける。当たり前のことだが、8ビット時代のDISK-BASICでもちゃんとやっている。

OS-9は、UNIXライクOSなのだ。


【 6 まずは読むだけにしよう 】

ここで一つ方針を決めた。「最初は書かない。」読むだけ。古いディスクには、もう二度と手に入らないものが入っている。下手なプログラムで壊したくない。幸い、イメージファイルならコピーはいくらでも作れるがうっかりすると壊してしまう。

まず、dir ができる。ファイルをopenできる。readできる。seekできる。closeできる。そこまで作る。これだけでも、かなり使えるのだ。

昔、G-EDITAVでDISKBASICのコンパクト版を作った時を思い出した。


Windows上からOS-9ディスクを見ることができる。OS-9の実行モジュールを読み込むこともできる。そういうツールを作ったのだが、それを発展させたものが、このプログラムである。つまり、昔のディスクから昔のプログラムを読み込んで、Windows上の6809エミュレーターで実行できるのだ。

MIYAZAKI氏のFM-11シミュレーターでOS-9を動かし、マイクロウエアCで即席のファイルリード表示プログラムを作ったり、ファイルDUMPプログラムを作ったりして、そのバイナリーを持ってくる。

動く!やったね!読める読める!

FM-11シミュレーターがあるのはとても助かる。

こうやって、ネオマンハッタン 略してNMHシステムが形になってきた。


【 7 外へ出したい】

元々、「中のファイルをWindowsへ出したい」という目的のために作ったプログラムに、実行ソフトをくっつけたものであるから、Windows上で動いているこのNMHに「copyout」コマンドを作った。

システムが直接にRBFのファイルを読み出すのだ。Segment Listをたどる。データを読む。そして、Windows側へ普通のファイルとして保存する。これができると世界が広がった。

OS-9のソースファイルをVisual Studioやエディタで読める。バイナリを逆アセンブルできる。

バイナリをAI君に渡すと、6809コードとして読んで解説してくれる、ディスアセンブラになる。これは有りがたい。比較できる。検索できる。むかし、インタラクティブという言葉が流行ったが、そのものなのである。そうして、それまでディスクの中に閉じ込められていた40年前のファイルが、現代のPCへ出てきた。これが大きかった。

もう忘却の彼方に沈んでいたものが、ディスクがよみがえる。特にソースファイルである。確か作ったはずだ、というものが出てくる。読んでみると、若い日に自分で書いたものなら、大体覚えている。が、忘れていて、おお!こんなことしていたんだというものも出てくる。

グラフィックエディターのソースコードなどは、Cで書いた後、アセンブラで最適化して、縮めているが、この原版からGeditTownsを作っているから、GUIもあって、面白い。FM-TOWNSに移植したときのことを思いだしたり、これはSmall-Cのライブラリーを修正して利用していたんだなあなどとおもいだした。このゲームは会社の同僚のY氏がDOHCで書いた物がベースだな、とか見て分かる。面白い。自分で作ったFM音源のミュージックエディターなんかもある。


【 8 今度は戻したい 】

人間は欲張りである。取り出せたら、戻したくなる。Windows側で修正する。

再アセンブルしたい。再コンパイルしたい。

コピペは通るけど、エミュレーター上のエディターは遅いので取りこぼす。

やはり、きちんとOS-9イメージファイルに戻したい。戻すと最低限FM-11シミュレーターでコンパイルできたりする。

と言うわけで実装するのが、【copyin】である。


しかし、これは怖い。読むだけなら間違えてもディスクは壊れない。書くとなると違う。破壊する可能性が大である。


空きセクタを探す。

Bitmapを書き換える。

File Descriptorを作る。

Segment Listを書く。

Directory Entryを追加する。


既存ファイルならどうする?上書きする?

サイズが大きくなったら?

小さくなったら?

途中で失敗したら?

ひとつ間違えると、ファイル一個では済まない。


ディスク全体の管理構造を壊す可能性がある。

「これは慎重にやろう」

となった。


まずコピーしたイメージで試す。

壊してもいい。

壊れたら、またコピーする。

今はストレージが大きい。

昔ならディスクイメージ一枚を何十個も保存するなんて考えなかった。

今なら、いくらでもできる。

これは本当にありがたい。


【 9 mountしてみる 】

NEO MANHATTAN側では、RBFイメージを、

mount /d0 disk.img

のようにして使いたい。

OS-9プログラムから見れば、

/d0

である。

Windowsのどこにあるファイルなのかは知らなくていい。

これは大事だ。

昔のOS-9プログラムは、

/nd0

/nd1

/h0

/h1

などを前提にしている。


Windowsの、

C:\xxxx\yyyy\disk.img

なんてものを見せたくない。

OS-9側はOS-9らしく。

Windows側はWindowsらしく。

その間をNEO MANHATTANがつなぐ。

この考え方は、後でCP/MにもF-BASICにも効いてくる。

---

【10 CHDとCHXが違うんだった 】

RBFを使い始めると、OS-9特有のところが次々に出てくる。

たとえばCHDとCHX。

データ用のカレントディレクトリ。

実行ファイル用のカレントディレクトリ。

別である。

長年WindowsやMS-DOSの感覚でいると、

「カレントディレクトリは一つだろう」

と思ってしまう。

ところがOS-9は違う。


昔は普通に使っていたのに、作る側に回ると忘れている。

「ああ、そうだった!」

ということが何度もあった。

PWDはデータ側。

実行側を見るなら別。

こういう細かいところを適当にすると、昔のプログラムが妙な動きをする。

だから結局、当時の仕様に戻って調べる。


本を読む。

直した実機で試すのも良いが、もっと便利な、M氏のFM-11シミュレータで試す。


【 11 本物のOS-9ならどうする?】

ここでM氏のFM-11シミュレーターが非常に便利になる。

NEO MANHATTANは、OS-9そのものを起動しているわけではない。

Windows上でOS-9のサービスを再現している。

だから、何か変な動きをしたとき、

「NEO MANHATTANのバグなのか」

「OS-9本来の仕様なのか」

分からないことがある。


そんな時は、このFM-11AD2+を起動する。

こちらでは本物のOS-9が動いている。しかし、これにはまだマンハッタンシステムはシミュレートされていないのが残念だ。(この時はそうであった、今はほぼ完ぺきにシミュレートされている。)

同じディスクイメージがマウントできる、同じコマンドを打つ。比べる。これは強い。仕様書を読むだけでは分からないものも、実際に動かすと一発で分かる。

「なるほど、本物もこうなるのか」

ならNEO MANHATTANもそれに合わせる。

「いや、本物は違うぞ」

なら、こちらのバグだ。だんだんこのFM-11シミュレーターが、**動く仕様書**のようになってきた。


【12 ディスクが読めると、昔が近くなる 】

RBFを読めるようになると、昔のOS-9環境が急に近くなった。

単なるディスクイメージではない。

dirできる。

ファイルを開ける。

ソースを読む。

モジュールをロードできる。

Windowsへ取り出せる。

戻すことも考えられる。

40年前のディスクが、現代の開発環境の一部になっていく。

これは、ちょっと感動する。

保存とは違う。

使えるのである。

そして、使い始めると、昔の記憶がどんどん戻ってくる。

「このコマンド、こう使ったな」

「このディレクトリ構成、覚えてる」

「このファイル名、懐かしい」

その中にはManhattan関係のものもある。

pCPM。

pOS9。

ApIf。

ApDv。

昔は、ただ使っていた。

今度は中身を見る。

逆アセンブルする。

AI君にも読ませる。

そして、

「これ、今なら作り直せるんじゃないか」

と思い始める。


【 13 読むだけでは終わらなかった】

RBFは読めるようになった。しかし、当然それで終わらない。書き込み。

rename。delete。新しいファイルの作成。ディレクトリ。モジュールロード。

mount。

そして、実際のOS-9プログラムを動かしていると、「そんな使い方するのか!」というものが次々に出てくる。

最低減コンパイラーが動くと作られる中間ファイルを読み書きできなければならない。RBFの6809コードのドライバーを流用することも考えたが、そうするとものすごく複雑な感じになりそうである。

というわけで、OS-9相当部分をCで書くのである。しかし、ファイルネーム関係で、後になってたった一つのrename処理が、文字列の終端を0とみなすプログラムが混ざっていて、ファイル名の終端後に古い文字を残していた、なんていう、とんでもない問題まで出てくることになる。

その時はまだ知らない。ただ、「だいぶRBFのコードが出来た」くらいに思っていた。RBFは、まだまだ奥が深かった。


しかし、その前に。

このRBFの動きを確認するために、何度も使うことになる「もう一台のFM-11」の話をしておきたい。

1999年頃からM氏が作り続けてきた、

FM-11AD2+。

63C09仕様。

その上では、

OS-9そのものが動く。

そして、このシミュレータの存在が、

NEO MANHATTANの開発を何度も助けることになる。


# 幕間IIへ

## 『もう一台のFM-11――1999年から続くFM-11AD2+シミュレーター』


評価をするにはログインしてください。
ブックマークに追加
ブックマーク機能を使うにはログインしてください。
― 新着の感想 ―
このエピソードに感想はまだ書かれていません。
感想一覧
+注意+

特に記載なき場合、掲載されている作品はすべてフィクションであり実在の人物・団体等とは一切関係ありません。
特に記載なき場合、掲載されている作品の著作権は作者にあります(一部作品除く)。
作者以外の方による作品の引用を超える無断転載は禁止しており、行った場合、著作権法の違反となります。