BSAVE / SAVEM 前史 #2 [プログラム]
2010/03/18 タイトルを変更しました
この記事は「BSAVE / SAVEM 前史 #1」の続きです。
シーケンシャルファイルだと収納効率が悪いので、ランダムファイルを使用した方法を考えてみます。
PEEK() 関数で読み込んだデータを FIELD 命令を使ってバッファにセットするというのはどうでしょう。
ファイルバッファのサイズは 256 bytes 固定なので、256 個の要素を持つ整数配列を使用してその中に格納するようにします。
1 byte をセットするのにループを2回繰り返すため効率が悪いので、2個のループをまとめてしまいます。
この処理をコアにしてオプションパーツをコテコテと貼り付け、N-BASIC 用の MOUNT / REMOVE 処理を振りかけたモノが以下のプログラムです。
バイナリデータセーブ サンプルプログラム(N-BASIC)
セーブしたいデータ個数分だけループを回し、データバッファが満杯になるとディスクへ書き出しています。
でも、ループ内でやっている事と言えば、メモリ上にあったデータがバッファ内に、そっくりそのままコピーされただけなんですよね。
コピーするだけなら、もっと賢い方法があるんじゃないかという事で、次回に続きます。
つづく
この記事は「BSAVE / SAVEM 前史 #1」の続きです。
シーケンシャルファイルだと収納効率が悪いので、ランダムファイルを使用した方法を考えてみます。
PEEK() 関数で読み込んだデータを FIELD 命令を使ってバッファにセットするというのはどうでしょう。
ファイルバッファのサイズは 256 bytes 固定なので、256 個の要素を持つ整数配列を使用してその中に格納するようにします。
FOR AD!=BA! TO EA! | FOR I=0 TO 255 D$(I)=CHR$(PEEK(AD)) NEXT | FOR I=0 TO 255 LSET B$(I)=D$(I) NEXT PUT #1,RC | NEXT
1 byte をセットするのにループを2回繰り返すため効率が悪いので、2個のループをまとめてしまいます。
FOR AD!=BA! TO EA! | FOR I=0 TO 255 LSET D$(I)=CHR$(PEEK(AD)) NEXT | PUT #1,RC | NEXT
この処理をコアにしてオプションパーツをコテコテと貼り付け、N-BASIC 用の MOUNT / REMOVE 処理を振りかけたモノが以下のプログラムです。
バイナリデータセーブ サンプルプログラム(N-BASIC)
セーブしたいデータ個数分だけループを回し、データバッファが満杯になるとディスクへ書き出しています。
でも、ループ内でやっている事と言えば、メモリ上にあったデータがバッファ内に、そっくりそのままコピーされただけなんですよね。
コピーするだけなら、もっと賢い方法があるんじゃないかという事で、次回に続きます。
つづく
窮すれば通ず、まさにそんな中から生まれてきた工夫ですね。BSAVEをあたりまえのようにサポートしているMSX使いからすれば、頭が下がる思いです。
他にもMSXではBIOSを操作して、バイナリデータを直接出力することもできました。グラフィック性能こそ劣りますが、プログラミングマシンとしてはかなり恵まれていたのだとつくづく思います。
by 本名荒井 (2010-03-17 01:26)
本名荒井さん、コメントありがとうございます。
「窮すれば通ず」と言えば格好良いですが、『バイナリデータを効率良くセーブする方法を探していた』というのが現実です。
当時は画期的なアイデアが出されると、みんなで改良を加えて完成品に仕上げていくことが当たり前に行われていました。
>グラフィック性能こそ劣りますが、プログラミングマシンとしてはかなり恵まれていた
8001 や 8801 と比べるとMSXは完成度がはるかに高いですね。他のマシンにはBIOSの概念さえ無いモノが多かったですから。
by Thunderbolt (2010-03-17 21:18)