機械語ファイルなど、バイナリ形式のファイルを BASIC のデータ文に変換し、プログラムに組み込めるようにします。アスキー形式のファイルでも変換できます。
自作した機械語関数などを BASIC で使う場合に使用します。また、画像ファイルなどを BASIC のプログラム・リストに埋め込むこともできます。
BASIC から機械語関数を使用する場合、まずメモリに読み込む必要があります。機械語をメモリに読み込むには 2 つの方法があります。1 つ目は、外部に機械語関数のファイルを用意し、プログラムの実行時にそのファイルをオープンしてメモリに読み込む方法です。もう一つは、あらかじめデータ文としてプログラム・リスト中に機械語関数を用意しておき、プログラムの実行時にメモリに書き込んでいく方法です。このソフトウェアは、後者の方法を用いる場合に使用します。
また、機械語関数以外にも、画像ファイルなど外部のファイルを参照するような場合にはこのソフトウェアを使うことができます。目的のファイルを 16 進数のデータ文としてあらかじめプログラム・リストに組み込んでおき、プログラムの実行時にメモリ上に復元することにより、外部のファイルの場合と同じように使うことができます。
この方法を用いるメリットは、配布するファイルの数を減らせることです。しかし、プログラム・リスト中に使用できる文字に変換するため、ファイルサイズが大きくなってしまいます。
起動後、BASIC のデータ文に変換したいファイル名を入力指定ください。処理が正常に終了すると、j.bas というファイルが作られます。
このファイルは行番号 5000 から始まる BASIC のプログラム・ファイルで、先ほど指定したファイルの内容がデータ文として記述されています。作成された j.bas を、目的のプログラムにマージ(merge 命令)してください。
次のようにして1行ずつ読み込み、チェックサムを計算しながらメモリなどに値を書き込んでいきます。下の例の中で、変数Aの値を利用しているところは適宜書き換えてください。
WHILE A$<>"*":READ A$
S=0:SUM=VAL("&H"+RIGHT$(A$,2)):LC=0
FOR I=0 TO LEN(A$)\2-2
A=VAL("&H"+MID$(A$,I*2+1,2)):S=(S+LC XOR A)AND 255:LC=LC+1
POKE AD,A:AD=AD+1 ' ここで A の値をメモリに書き込むなど利用
NEXT:LN=LN+10
IF S<>SUM THEN PRINT:PRINT"Error in";LN-10:STOP
WEND
BASIC の仕様上、プログラム・リストの長さには上限があります。なので、あまりにもサイズの大きいファイルをプログラム・リストに組み込むことはできません。
このプログラムはもともと、BASIC マガジンへ投稿するプログラムで機械語関数を用いるために作りました。BASIC マガジンでは、紙面に掲載されているプログラムを読者が一から入力していくので、入力ミスなどが起こります。それに対応するため、このプログラムでは、バイナリ・ファイルを 16 進数のデータ文に変換する際に、チェック・サム方式により入力ミスを検出する機構を設けています。
それは、普通のチェック・サム方式を改良したもので、普通のチェック・サム方式なら
DATA "12345" DATA "21345"
の違いを検出できませんが、何文字目のデータかという「位置」の概念を取り入れることにより、検出を可能にしています。具体的には、サム(合計)にその文字の「位置による値」を足し、文字のアスキー値を XOR(排他的論理和)しています(詳しくはソース中の *BOUT というルーチンを見てください)。このことにより、検出精度が格段に向上しています。