ベーシックマスターのソフトウェア(3)続々カセットテープ
カセットテープルーチン(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プログラムから別途読み込むのが現実的であろう。







ディスカッション
コメント一覧
まだ、コメントがありません