2020.7.22
前へ
次へ
ホームページトップへ戻る

[新連載]復活!TINY BASIC
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
すべてはここからはじまりました。
中日電工も。
40年前を振り返りつつ新連載です。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜



[第44回]


●LIST,PRINT

このところの数回はTINY BASICから少し離れたことを書いてきました。
久し振りというほどでもありませんが、本題に復帰です。
[第39回]からの続きということになります。
今回はLISTとPRINTの説明です。
LISTはNEWやRUNと同様ダイレクトコマンドとしてのみ使います。
ユーザープログラムの中では使えません。
PRINTはダイレクト命令としてもプログラムの中の命令としても使えます。
下はLISTとPRINTの解説文とプログラムリストです。



LIST[Enter]と入力するとテキストエリアにあるユーザープログラムの先頭行から最終行までが表示されます。
LIST 行番号[Enter]と入力するとその行番号の行から最終行までが表示されます。
オリジナルのTINY BASICでは長いリストの場合途中で[Ctrl][C]を入力することで表示を打ち切ることができます。
「中日電工版」TINY BASICではそこの部分は未実装ですがちょっと理由があって[Ctrl][C]ではなくて[Ctrl][B]にすることになると考えています。

プログラムの説明です。
LISTプログラムは短いプログラムです。
最初にCALLするTSTNUMは[第15回]で説明をしました。
TSTNUMはASCII文字で書かれた十進数の数値を16進数2桁に変換してHLレジスタに入れるサブルーチンです。
数値がないときはHLには0が入ります。
その次のENDCHKは入力された文に余計な文字がなくて正しく終っているかどうかを確認するサブルーチンです。
ENDCHKはそのうち説明をします。
ここまでのところでLIST 行番号[Enter]かLIST[Enter]かがチェックされます。
LIST 行番号[Enter]ならHLに行番号が入り、LIST[Enter]ならHL=0になります。
その次でCALLしているFNDLNは[第28回][第30回]で説明をしました。
テキストエリアをサーチしてHLで示す行番号に一致する行を探します。
一致する行があればその行の先頭アドレスがDEに入ります。
一致する行がない場合にはそれよりも大きい行番号の行の先頭アドレスがDEに入ります。
それもなくてテキストエリアの終わりになった場合にはキャリーフラグが立ちます。
キャリーフラグが立ったときは処理を終了してRSTARTにジャンプします(アドレス0178 LS1:JC RSTART)。
テキストエリアの終わりではない場合にはPRTLNをCALLします。
PRNLNはプログラム行を1行PRINT(表示)するサブルーチンです。
PRNLNについてはいずれ詳しく説明するつもりです。
次のCALL CHKIOで[Ctrl][C]の入力をチェックします。
ここは上に書きましたように[Ctrl][B]にする予定ですがまだ作業していません。
WindowsとUSB接続して通信をしながら入力チェックをしなければならないのでここは工夫が必要なのです。
次のCALL FNDLPで次の行サーチを行ないます。
FNDLPはFNDLNの途中にエントリするサブルーチンです。
FNDLPとしての説明はしていませんが[第28回][第30回]でFNDLN、FNDNXTについて説明する中で結果的に説明をしています。
FNDLNとFNDLPの違いは前者はテキストエリアの先頭アドレスをDEに入れて、そこから行番号をサーチするのに対して後者は次の行の先頭アドレスがDEに入っている状態でそこから行番号をサーチします。
FNDLPがCALLされるたびにDEのアドレスは進みますが比較元のHLの値は変化せずもとのままです。
ちょっと考えると次の行をサーチするためにHLの値をカウントアップしなければならないように思ってしまいますが、HLの値はもとのままにしておいてもDEの値が進めば次の行がサーチされるというあたりも実に無駄がない熟練者の技といえましょう。
LS1:から後ろのところが最終行まで繰り返し実行されます。

本日は少し長くなってしまいましたので、次のPRINTについては次回に説明することにします。

復活!TINY BASIC[第44回]
2020.7.22upload

前へ
次へ
ホームページトップへ戻る