フロッピーを使うようになった頃

フロッピーディスクの規格

NEC 初代PC-8801にはフロッピーディスク装置は付属しません。別売りの140KB✕2ドライブが30万円強でした。買えませんでした。しかし、同時にそのうち安いものが出てくるだろうという予測もあったのです。

1年ほどしてPC-80S31という製品が出ました。これが16万円ほど。いまではフロッピーディスクドライブごときにこの値段はありえませんが、当時としてはほぼ半額で手に入るようになったのです。迷わず購入しました。

5インチの2ドライブで、2Dという規格です。2はディスクの両面を使うという意味。Dは倍密度(Double density)です。

フロッピーディスクの規格は、この後改良が進み容量が増えていきます。2面は3面になるわけはありませんが、トラックの数が倍になって2DD(Double density, Double track)となり、さらに記録密度がもう少し上がって2HD(Heigh density, Double track)となっていきます。

日本語表記では2DDが両面倍密度倍トラック、2HDが両面高密度倍トラックと表記されて販売されていました。

最近は、2HDが Heigh Density の略、2DDが Double Density の略と説明している解説も見かけますが、2Dがすでに両面倍密度と呼ばれていて、トラックが倍になって容量が倍になったという歴史の中に私はいましたから、後ろのDは Double track に間違いありません。ただし、2HDが出た頃には倍トラックでないものは見かけなくなっていましたから、倍密か高密かの違いだけしか念頭になく、2HDからは倍トラックということが忘れ去られていったのかもしれません。

当時の5インチの2Dは片面が40トラックで、1トラックあたり16セクタ、1セクタが256バイトでした。もっともこれはOSを兼ねたN88-BASICで扱う場合の仕様であって世の中の5インチの2Dがすべてこうだったのかは知りません。

これで容量は、2✕40✕16✕256=327680バイト。1024バイトを1KBとして320KBです。2✕40✕16✕0.25=320と計算すれば速い。1024をKとしたのは二進法だからでなく、このような計算が簡単になったからですね。

プログラムの保存

初代PC-8801はスイッチオンでBASICのコマンドモードになっていました。命令文に行番号をつけて[Enter]すれば(当時はリターンといっていました→注1)、プログラムとして入力され、行番号がなければインタープリタで直接実行されました。

ディスク操作関係のコマンドはフロッピーディスク上のDisk-BASICで起動した時に使えるようになるという仕組みでした。まだMS-DOSではなく、N88-BASICの拡張でした。

まず画期的に楽になったのはプログラムの保存とロードでした。SAVE, LOAD命令で出来ますから、問題ありません。

シーケンシャルファイル

次がプログラム実行中のデータの読み書きです。最も簡単なのは頭から書き込んで、頭から読み出すシーケンシャルファイルというものです。

画面に文字を出力するPRINT文に、#1または#2をつけてファイルへの出力であることを指定すれば、数値も文字列も文字としてファイルに書き込まれました。文字コードはいわゆるShift_JISです。

もちろん、出力の前にOPEN命令でファイルに名前をつけて#1,#2の番号との対応付けをしておき、出力後はCLOSE命令で書き込みを同期させる必要があります。

読み込むときにはキーボード入力のINPUT文に#1,#2をつけて読み込みます。データの区切りは「,」または改行で、読み込み先の変数が数値の時は「半角スペース」も使えました。

改行と、コンマやスペースの区別は付けられないので、データ数があらかじめわかっていない状態で二次元の行と列で構成されるファイルを読むのは難しい作業になります。

改行マークまで一続きに1行を読むLINEINPUT命令もありましたが、読んだ後にコンマやスペースで区切ってデータを切り分けるのが面倒になります。コンマの位置を調べて部分文字列を取り出す作業を繰り返すことになります。さらに文字列の長さの上限が255バイトまでなので、入りきらなかった時のことも考慮しなければなりません。不自由なものでした。

ランダムアクセスファイル

フロッピーディスク装置がデータを読むときにはヘッドをデータのあるトラックに移動し、必要なセクタが回転してくるのを待って256バイトずつ読みだしていきます。一つ一つの動作を音で確認できるほどゆっくりしたものでした。

ですから、データを蓄積しておいて必要なものを取り出して処理をしたい時に、全部のデータを読みだしてから選択するのでは時間がかかりすぎます。そしてそれはデータがたまるほど深刻になっていきます。

そんな時に使うのがランダムアクセスファイルです。動作のイメージとしては1ページあたり256バイトのノートで、ページ単位に必要なデータだけ任意の順番で読めるというものです。

256バイトに整数、浮動小数点数、文字列の変数を割り当てて設計するのは、ちょうどデータベースのレコードの設計のような感じです。当時は、dBASE II などのデータベース製品が一般化する前で、BASICからデータベースへのクエリが出せるわけでなく全部自前で作っていったと考えてください。ちなみにソートも自前で作るのが当たり前だったのです。

この256という値はフロッピーディスクのセクタの長さに合わせたもので、N88-BASICでは変更はできませんでした。

いまとなってはランダムアクセスファイルは不要か

このランダムアクセスファイルを使い、FATの仕組みを真似てレコードを削除したり挿入したりできるようにして、かなり凝ったプログラムを作りました。最近このプログラムをJavaに書き換える作業をしました。Javaにもランダムアクセスのクラスがありますが、256バイトのデータの区切りは今時のハードウェアの性能からは小さ過ぎて意味がありません。私の作ったプログラムでは実際に使われているファイルには、せいぜい20レコードしかなく、全レコードがバッファに読み込まれているので、そこから256バイトを取り出して使用し、書き戻したりする作業はまったく無駄な苦労をしているといった様相を呈しています。それでも、BASICからJavaへデータの互換性を維持したまま移行することにしたので、このファイルフォーマットを変更しませんでした。

過去のデータを読み出すところからJavaへの移行を始めていったので、バッファから読んでいても無駄をしているわけではないからいいかと思い進めていったのですが、書き込みをする部分で美しく仕上がらず、レコードごとにちまちま書かずに、全データを一度に書いてしまうやり方に変えてしまいたいと何度も思いました。結局うまく動くようにはなったのですが、このままにしておけない気持ちがしています。

もともとの設計時に多数のレコードを入れることを想定して、レコードの挿入・削除ではレコードを移動せずにインデックス上で記録したり、削除で空いたスペースを次の追加で再利用するようにしたり、レコードごとに最終更新日時と更新回数を記録したりと、今考えれば実際の使われ方に対して過剰品質だったような気がします。

ハードウェアの速度や容量が不足していた時にはハードウェア寄りの設計がどうしても必要です。ハードウェアの性能に余裕が出てきて初めてデータ本位のプログラムが可能になるとつくづく感じさせられる作業でした。

注1:リターンキー

PC-8801キーボードの[Enter]にあたるキーには「⏎」と刻印されていました。PC-8001では[RETURN]となっていました。タイプライターでキャリッジを戻すキャリッジリターンから「リターンキー」と呼ばれるようになったのでしょう。ちなみに「⏎」はJISで277Eの文字(第三水準)で、U+23CEです。