ベーシックマスターのソフトウェア(3)続々カセットテープ

BASICMASTER, 昔のパソコン

カセットテープルーチン(2)の続き。今回も BASICMASTERの300bps カセットルーチンについて調べてみる。

カセットフォーマットの詳細は BASICMASTER/documents/tape_format.md at main · zu2/BASICMASTER を参照のこと。

L2 BASICのテープ形式

モニタで書いたデータと BASICでSAVEしたテープデータは形式が異なる。モニタでは連続したアドレスを1つのファイルに格納しているが、BASICでは複数のファイルに分割されている。

BASICのソースコードをLISTし、256バイト以下の単位で、1ファイルとして保存する。複数のファイルをまとめて1つのプログラムデータとして処理している。

だから ブロック番号 01 が何度も表示されるし、BASICとしての番号は別に(’-'の後に)表示されている。

この方法は極めて遅くなるのだが、ソースコードを分割保存しているので MERGE処理ができる。

BASIC MASTER Jr. の 1200bps Tutbo ROMでは、分割処理を止めてベタデータとして保存しているので、高速だがMERGEができない。

L2 BASICのSAVE/LOAD方法

SAVE時は LISTコマンドと同様の処理を行った結果を $0600-$06FFのバッファに書き込み、そこを .S($10:アドレス可変ブロック)として保存している。

LOAD時は $0600- に読み込まれたソースプログラムを、あたかもキーボードから入力されたかのように処理している。

このおかげでMERGEが行える。LOADはMERGE前にNEWを行なっているだけだ。

余談だが、SAVE時はLIST同様に、短縮形は展開された形で格納される。展開した結果、1行のサイズが256バイトを超えるとERROR 2になる。こんなプログラムを書く人はいないと思うけど。



LOAD中にBREAKをかけて、どのようなデータが処理されているか見てみよう。




$0600- から素直にソースコードが入っている。行番号 10が、"20 20 20 31 10″ になっていて先頭に空白が入っていたり、20行のように " LET " が入っているのは実に無駄である。
(Tiny Galaxyのプログラムは19行、308バイトしかないのに、LETが19回76バイトを占めている。1/4弱がLETだ)

画面も狭いことだし、LIST処理を変更して LETや “THEN GO TO" のような省略可能な部分は省略して表示するようにすれば、少しは使いやすくなったろうに。



SAVEの最後は $0600-$0601 に$FFFFを書き、2バイトのブロックを保存している。LOAD時はこの2バイト($FFFF)を確認してBASICとしての最終ブロック処理を行なっている。



モニタデータのLOAD

BASICインタプリタのLOADコマンドは、BASICだけではなくモニタで保存したデータも読めるようになっている。

機械語プログラム(.B)を読んだときは、そのプログラムを読み込んだ後に 入力待ちに戻る。この処理は$C1AD(L2II,Jr)、$C151(L2)にある。





L2 BASICと機械語の一括LOAD

L2 BASICからLOADを行ったときは、以下のどちらかが成立すれば、読み込みは終了する。

  • BASICソース(.S)の最終ブロックを読み込んだとき
  • バイナリファイル(.B)を読み込んだとき

SAVEするときに、$0600-$0601の内容をチェックし、もし $FFFF であれば、同名の機械語プログラム(.B)をSAVEするようにすれば、両者の一括SAVE,LOADが行える。

L2 BASICは SAVEの際に BYTOUTルーチン($0031)を呼び出すので、ここをhookして チェックとSAVEを行えば良い。

この手法は私がBMUG 0号で発表したはずだが、資料が残っていない。後にBMUGで使われていたユーティリティ(SAVE-HELPER-4) に取り入れられた。

L2 BASICのオートスタート

L2 BASICからLOADを行うとき、ブロック読み込みサブルーチンBYTOUT($0031)を呼ぶが、この時の SPの値は一定($05B7)である。
(L2 BASICインタプリタはメモリ容量に関わらず、$05BFをSPの初期値として使うため)

BASICと機械語の一括SAVEを行うときに、$05B8,$05B9 に RUNコマンドのアドレスを書き込んで SAVEすれば、 LOAD後に自動実行が行える。

離れたバイナリブロックのSAVE

BASICMASTERのモニタでは、バイナリプログラムは連続した領域にある必要がある。上記の一括SAVEとオートスタートは両立できない。

前回の記事で書いたように、カセットテープのセーブフォーマットでは バイナリファイル($01)のアドレスは連続している必要はない。

1回のLOADで BASICと機械語サブルーチンをLOADし、そのまま自動実行を行うことは原理的には可能だ。

問題は不連続なアドレスをSAVEする方法で、普通のやり方ではうまくいかない。

単にBASICを自動実行をするだけにして、機械語サブルーチンはBASICプログラムから別途読み込むのが現実的であろう。