DATA文にデータを保存した話

初めて購入したコンピュータ

初めて購入したコンピュータはPC-8801。発売は1981年12月だったそうで、購入時期もそのころです。確か168000円 228000円ほどでした。ディスプレイは専用の物を購入。こちらは6万円台だったと思います。外部記憶装置はなくカセットテープを使います。PC-8001用に販売されていたフロッピーディスク装置を取り付けられましたが、こちらは320KB片面2ドライブで30万円という代物で、高すぎました。ディスプレイをテレビを流用しないで購入したことで十分贅沢をしたという感覚でした。

初期に作ったプログラムは合計と平均を計算するものでした。試験をしたあとに平均を求めるためでした。

電卓では途中でミスをすると最初からやり直しになります。それを何とかしたいという事です。

表計算のソフトウェアなど、まだない時代の話です。

入力した数値が画面に残り、間違えていたら個別に訂正できるようにし、入力桁数を決めてEnterキーを省けるようにしました。100点満点なら普通の点数は2桁です。1桁ならEnterで終わらせるか0を先に加えて入力。100点なら[home]ボタンで一発という具合に設計しました。

データの保存先はDATA文

これができるようになると、せっかく入れたものを保存しておいて、次の試験の成績と足し算したくなります。ここで問題は記憶装置です。プログラムの保存にはカセットテープでも何とかなりますが、データの保存はとても煩わしくなります。頭出しが面倒です。でもそれだけではありません。40人分のデータでもforで回すととても時間がかかります。1データずつ「ピー」と準備のための音が入ります。ファクスなどの信号を聞くと「ピーーキュルキュル...ピー」と聞こえますが、それに似ています。この初めと終わりの「ピー」の時間が思いの外長くて、とても待っていられません。量によっては60分テープに入りきらないなんてことになります。

これは数値を文字列にしてコンマでつなぎ、1つのデータにすることで画期的に早くなりますが、当時のBASICは文字列の長さは256文字まで。とても使い物になりませんでした。

そこで、データはDATA文としてプログラム内に保存することにしました。

DATA文というのは、プログラム内にDATAで始めるコンマ区切りのデータを置いておき、プログラム内から読み出すというものです。

1230 DATA 67,78,89,34,65,34,....

当時のBASICはインタープリタで、起動するとプログラムエディタの状態となり先頭に数字がならんている行でEnterキーを押すとその数値が行番号となってプログラムに格納され、RUNコマンドで実行されるという仕組みでした。

実行中にプログラムを変更することはできません。当然DATA文を加えることはできません。

そこで、データ入力が終わったら画面にデータをコンマ区切りで書いて一旦終了します。エディタ状態になったら、行の先頭に行番号を書いてEnterキーを押します。もちろん行番号は現在の最終番号+10として、最終行に付けます。その後再びRUNをすれば先ほどのデータが取り込まれた状態で作業が続けられるというわけです。

データ保存の自動化

この一旦終了して、最終行番号+10を書き、Enterを押して、RUN これがなかなか面倒臭い。

まず行番号を自動化します。N88-BASICには ON ERROR GOSUB というエラー処理ルーチンを作ることができます。これを利用して最終行に適当なラベルを付け(行番号の代わりにラベルを利用できました)そこにRETURNと書いておきます。私は*EFというラベルを使っていました。

1230 *EF RETURN

そして、GOTO *EF を実行すれば、"RETURN WITHOUT GOSUB" エラーになり、エラーの起こった行番号が ERL 変数に入って、ON ERROR GOSUB で指定した場所に飛んできます。これで現在の最終行番号が得られます。

*EFの行番号が1230とわかったら、画面に次のように書きだして、プログラムを終了します。

1230 DATA 67,78,89,34,65,34,....
1240 *EF RETURN

出力に、"↑"のコードを2つ加えて、終了時にカーソルが1230の上にあるようにするとなおよい。

エディタモードになるので、Enterを2回打って、RUNコマンドを打てば再開です。

PC-8801はF5キーにRUN+Enterが登録されていましたので、これをEnter+Enter+RUN+Enterにプログラム内から書き換えて終了したらF5で再開というところまではできるようになりました。

さらにもう一歩です。N88-BASICにはPEEK,POKEというコマンドがあってアドレスを指定してデータを直接読み書きできました。PEEKでいろんなところをリアルタイムでダンプするプログラムを書いていて、キー入力のバッファを発見していたのです。

これはキューなどと呼ばれているようですが、プログラムを実行中にキー入力があった場合に一旦保存しておき、後から拾うために設けられています。

プログラムの終了間際にここにEnter+Enter+RUN+Enterと書いて終了します。実際には 0D 0D 52 55 4E 0D というデータをPOKEします。コンピュータは終了するとキーボードからの入力を受け入れるようになりますが、その時に入力されたものとして処理され、画面のDATA文がプログラムに追加され、プログラムが再開されるということになります。

めでたし、めでたし。

もちろん、このプログラムは、データごとテープに保存することになります。