2020/09/16
FT245RL用BASICリスト移動ユーティリティー、その2
前回の続きになります。・下のURL使い、BASICリストの移動アルゴリズムを簡単に
説明します。尚、中間言語の先頭アドレスは $790 とします。
https://imgur.com/a/AKF2Piz
尚、ソースも併せて御覧下さい、上はイメージです。
PCで保管してる「F-BASIC 中間言語」ファイルを変数領域
(メモリ)に読み込みます。FM-7 に展開してる時は $790
から格納されてましたがPCのメモリに読み込んだ時は、先頭
位置は 0x0000 ですので「cur_pos」は「0x0000」です。
また「cur_idx」はFM-7上の「0x790」で先頭アドレスです。
先頭2バイトには次のリストの(FM-7上での)先頭アドレスが
格納されてます。しかしPCのメモリ上では次のアドレス位置は
計算しなければ判りません。そこで下のように計算します。
list_len = next_idx - cur_idx;
この計算により、次のリストまでの距離が判りますので
next_pos = cur_pos + list_len;
と計算してPCの変数領域(メモリ)の絶対位置が判ります。
リスト構造ですので、記入されてない部分はテーブルと
考えてください。テーブルを完成した後にリンクポインタの
再設定をしても良いのですけど、この時点で「cur_pos」の
位置で示されたPCの変数領域は使わないので移動後のFM-7の
環境に合わせた先頭アドレスをPCの変数領域に設定します。
移動後のリンクポインタの計算式は下です。
tmp_adr = next_idx + offset;
次に下の行を一段上に移動することによりアルゴリズムは、
この繰り返しになり、C言語ソースでは下のループ部分です。
do { } while(0 != next_idx);
このユーティリティーのメイン機能です。恐らく FM-7 でも
リンクポインタの再設定では同様なアルゴリズムでないかと
考えます。もっともFM-7では6809のマシン語でしょうけど
ソースがC言語であれば他機種でも利用可能ではと。
・ユーティリティーの使い方
C言語のソースの2行目のようにターミナルから起動します。
./FBASIC_MOVE20200914 FT245TST0790088D.BAS
因みに1行目はコンパイル方法です。C言語のソースの他に
サンプル用の「FT245TST0790088D.BAS」もアップロード
します。起動すれば各自の環境に合わせた、(FM-7の)
中間言語の先頭アドレスを入力して下さい。メッセージは
「テキスト先頭番地を入力してください」と出力します。
中間言語の先頭アドレスは FM-7 の $33、$34 で確認
して下さい。サンプル用の「0790088D」の意味は、この
ファイルでは先頭4文字 0790 は中間言語の先頭アドレスを
示し、末尾4文字 088D は単純変数の先頭アドレスを示して
ます。ユーティリティー実行後に単純変数の先頭アドレスを
出力します。 変更後のファイルをFM-7 に転送した後には
$35、$36 に単純変数の先頭アドレスを設定して下さい。
また、「F-BASIC 中間言語」のデータを FM-7 から PCに
転送する際は容量が16の倍数になるように端数を切り上げる
注意をお願いします。 Windows用のドライバの都合上で、
そのような仕様になりました。尚、変更したファイルを更に
変更しないで下さい。中間言語の先頭アドレスをサンプル
ファイルは下のように決めてます。
#define TOP_INDX 0X0790
この辺りはPCへの転送時の環境に影響されますので、各自の
環境で「#define」値は変更して下さい。尚、サンプルの
BASICコードは「行 90」でエラーが出ますが修正方法は
判りません。(BASICは忘れましたが調べる気もないので)
C言語のソース「FBASIC_MOVE20200914.c」とサンブル
BASICコード「FT245TST0790088D.BAS」の存在場所
https://onedrive.live.com/?authkey=%21Aln7kHlkHDL28EE&id=6357DCB7DCA88133%21113&cid=6357DCB7DCA88133
今回の内容についての質問は掲示板で判る範囲で応えるように
しますが判らない時は、素直に「判りません」と応えますので
気を悪くしないで下さい。
<内容を2020/09/20(日)に一部変更しました。>
変更した部分は「単純変数の先頭アドレス」を計算で求め、
出力したことです。リストのリンクポインタを変更するので
あれば、単純変数の先頭アドレスまで求めないと使い勝手が
悪いです。終端は「0x0000」で、この終端のアドレスは
終端直前のリストのリンクポインタで判ります。
変更後の単純変数の先頭アドレスは下の計算で判ります。
「変更前の終端アドレス」+ 2 + 「offset」
「offset」はC言語のソースで変更前と後のオフセット値と
して求めた数値です。補助記憶装置としてデーターレコーダー
しか使ってない時は単純変数の先頭アドレスは $35、$36 で
管理してることは既に説明してますが、このアドレスは
「終端アドレス」+ 2 です。
尚、今回アップロードしたC言語のソースではファイルは
変更せず、変更時のリンクポインタをシミュレートする
仕様です。ファイルを変更するのであればコメントに示す
ようにリターン(return 0)の機能を無効にして下さい。