見出し画像

BASICの勘所 - DATA文

BASICを知らない人が古典BASICを読むと、行番号が目障りではあるものの、変数名の後ろに”$”が付いていれば文字列型、”%”なら整数型、そうでなければ実数型であることさえ分かれば、基本的なIF文やFOR文と入出力のPRINT文とINPUT文あたりは想像がつくと思うので、何となく判るくらいには読めるのではないかと思います。もちろんグラフィック命令とかは機種ごとにも違いますし、ハードウェアに依存するような命令はBASICを知っている人であってもマニュアルが無いとどうにもなりませんが。

その中でBASICならではの命令にDATA文があります。これは元々はFORTRANにあるDATA文を意識したものだとは思うのですが、BASICの場合は初期値の設定に限らず、いろいろな使い方をされるのが違いです。FORTRANのDATA文は

DATA A, B, C / 5.0, 12.0. 13.0 /

のように変数に初期値を与えるのに使っていましたが、今のFORTRANでは「時代遅れ」とされている文法ではあります。

FORTRAN

BASICの場合は

10 DIM A(5)
20 FOR I%=0 TO 5
30 READ A(I%)
40 NEXT I%
50 DATA 1.2, 2.5, 3.1, 4.4, 5.8, 6.9

のように書いて、配列の初期値を設定するのにも使えます。プログラムが開始されるとREAD文が実行されるたびに行番号的に最も小さいDATA文の最初の値を読み込んで変数に代入し、次に実行されると次のDATA文の値が読み込まれます。READ文に複数の変数を指定することも出来て、その場合は左から順にDATA文から値が読み込まれます。DATA文もひとつの行に複数の値を書くことが出来ますが、行が別れていても構わなく、その順序だけが意味を持ちます。DATA文は実行されることはなく、その行はスキップされます。もちろんDATA文とDATA文の間に実行される他の行があっても関係ありません。ここまでが古のダートマスBASICから存在する命令です。

ダートマスBASIC

その後のBASICでは、RESTORE文が追加され、途中で読み出すDATA文の位置が変更できるようになりました。RESTOREのみだとプログラム開始時と同じ最も小さい行番号のDATA文の位置に読み出す場所を「戻し」ます。ここに行番号も書けば、その行に読み出す場所を変更します。もちろん行番号の代わりにラベルが使えるようなBASICであれば、ここでラベルを使うことも出来ます。

面白いのがDATA文に書かれる値は型が決まっているのではなく、READ文で変数に代入するときにリテラルとして機能し、適切な型変換が行われて代入されます。ですからDATA文にはいろいろな型の値が混在していても構いません。BASICの配列変数に初期値を与える特別な構文は無いので、DATA文が用意されたのだと思いますが、良く見るプログラムでは、わざわざDATA文を使わずに直接リテラルを使って初期化していることが多いです。

10 DIM A(5)
20 A(0)=1.2
30 A(1)=2.5
40 A(2)=3.1
50 A(3)=4.4
60 A(4)=5.8
70 A(5)=6.9

よく見かけるのがマシン語のバイナリをDATA文の形で用意して、実行時にメモリに書き込んで呼び出すという使い方です。BASICプログラムの中でマシン語を呼び出すときに、わざわざカセットなりディスクなりから別途マシン語を読み込むのが面倒ですし、そのときのメモリの状況によって、いったいどのアドレスに読み込めば良いのかがシステムを良く知らないとわかりません。そこでDATA文でマシン語のコードを書いておいて、これをPOKE命令でメモリに書き込んでも構いませんし、配列変数に読み込んで変数の格納されているアドレスをVARPTR命令などで調べて、そのアドレスをCALL命令で呼び出すなんていう使い方を良くしていました。後者の場合、実際にどのアドレスに読み込まれるかは実行時にならないとわからないので、マシン語は再配置可能(リロケータブル)にする必要があり、ここは68系のCPUに一日の長がありました。

ということで、BASICのコードを読んでいて、変数のアドレスにCALLするようなコードを見つけたら「こういうことをしているのかな?」と思って調べていただければと思います。データ領域にコードを置くなんて気持ち悪いと思うかもしれませんが、この時代はメモリ保護なんてありませんし、BASICがどのようにメモリを使っているかはシステムによって大きく異なり、そのための情報を得る方法も千差万別だったので、これが一番確実という時代もあったということです。BASICインタプリタはいろいろ工夫はされたものの単純な処理にはパフォーマンスが出なかったので、マシン語のサブルーチンを呼び出すことは良くありました。大抵は画面のスクロールであるとかブロック転送のような処理のことが多かったです。もっともコンパイルすると今度は実行時にバイナリを組み立てるようなコードになってしまうので、そのメリットが減ってしまうので、徐々に面倒でも別途マシン語を読み込むように作ることが増えて、この使い方は少なくなっていきましたね。

ヘッダ画像は、以下のものを使わせて頂きました。https://www.irasutoya.com/2015/12/blog-post_610.html

#BASIC #READ #DATA #RESTORE #マシン語

いいなと思ったら応援しよう!