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

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



[第37回]


●NEW,STOP,RUN,GOTO

久し振りに「オリジナル版」TINY BASICのプログラムの説明に戻ります。
これからまたしばらくは「オリジナル版」のプログラムリストを引用しながら説明をしていきます。
その途中でデバッグのためなどで、ときどきは「中日電工版」TINY BASICも使いながら説明をしていきたいと考えています。

今までの回では基本的なサブルーチンや命令テーブル、およびメインプログラムについて説明をしてきました。
これからはいよいよ命令テーブルを参照することで命令が解読された結果それぞれの処理プログラムにジャンプするその処理プログラム(実行プログラム)についての説明に入っていきます。
まず最初は表記のNEW、STOP、RUN、GOTOの各命令処理プログラムです。
このうちNEWとRUNはプログラム命令としては使えず、ダイレクトモードでの実行しかできません。
ダイレクトモード専用の命令としてはそのほかにはLISTがあります(LISTは次の回あたりで説明をするつもりです)。

下はNEW、STOP、RUN、GOTOのプログラムリストです。



NEWはユーザープログラムエリアの情報を初期化してRSTART(アドレス00BA)に戻ります。
STOPは何もしないでRSTARTに戻ります。
RSTARTについては[第27回]で説明をしました。
[第27回]では「RSTARTはTINY BASICがスタートしたときに最初に1度だけ実行される」と書きましたが誤りでした。
今回のプログラムリストにありますように、NEW、STOPの実行後やRUN命令の実行によってユーザープログラムの最終行まで実行されたあとはRSTARTにジャンプします。

NEW、STOP、RUNの先頭にCALL ENDCHKがあります。
ENDCHKはいずれ詳しく説明をします。
この3命令は後ろに何もつけません。
命令の後ろには0Dコードがあるはずです。
ENDCHKは次に0Dコードがあることを確認するサブルーチンです。
0Dコードがあればそのままリターンします。
0D以外のコードをみつけた場合にはエラーメッセージ(WHAT?)を表示したあと必要な処理を行ないます(その部分がちょっと複雑な処理なので、今回は説明を先送りにします)。

NEWコマンドは現在TEXTエリアに入っているユーザプログラムをクリアして、初期状態にします。
実際はメモリエリアの中身をクリアするのではなくてユーザープログラムのエンドアドレスを保持している変数TXTUNFに初期値TXTBGN(1017)を入れることで見かけ上TEXTエリアをクリアしたように見せています。
ですからユーザープログラムは消えたわけではなくて次にTEXTエリアが上書きされるまではそのままの状態で残っています。
なおZB3BASICではNEWコマンドが実行されたときに、そのときのTXTUNFの値を別の変数に保存します。
その後にユーザープログラムを書き込む前ならばHELPコマンドを入力すると保存しておいた値をTXTUNFに戻すことでユーザープログラムを復活させることができます。

STOP:はCALL ENDCHKのあとすぐにRSTARTにジャンプします。
NEW:はTXTUNFにTXTBGNを書き込んだあとそのままSTOP:が実行されるようにプログラムが書かれています。
NEWの場合にはCALL ENDCHKが2回実行されるので1回は無駄作業です。
今まで何回も書いていますようにこれはメモリ対策だと思います。
こうすることでNEW:の終わりにJMP RSTARTを置いた場合に比べて3バイトのメモリが節約できます。

RUN:は最初にCALL ENDCHKを実行したあとDEにTEXTエリアの先頭アドレス(TXTBGN、1017)を入れてその次のRUNNXL:にエントリします。
RUNはTEXTエリアにあるユーザープログラムの命令行を先頭から順に実行していくプログラムです。
行内の命令を解読し実行したあとはこのRUNプログラムに戻って次の命令が実行されます。
その戻り口(エントリーポイント)は行の構成内容(1つの命令だけなのか複数の命令から構成されているのか)によって、または実行される命令の種類などによって3通りに分かれています。

RUN:の次に置かれているRUNNXL:は次の行を実行するときのエントリポイントです。
RUNNXL:の先頭では行番号として0をHLに入れてCALL FNDLPを実行します。
FNDLPは[第28回]で説明したFNDLNの途中のところにエントリします。
FNDLPは現在のTEXTエリアの位置(DEで示すアドレス)から後ろに向かってHLの値(現在の行番号)よりも大きい行番号をサーチするルーチンです。
RUNNXL:はHLに0を入れてFNDLPをCALLしますから現在のDE位置の直後にある行の行番号位置がDEに入ってリターンしてきます。
1行の実行が終ると次の行を実行するために戻ってくるエントリーポイントがRUNNXL:です。
次の行がない、つまりTEXTエリアの終わりまでくるとキャリーフラグが立ちます。
そのときはRSTARTにジャンプします。
TEXTエリアの終わりではない場合には次の RUNTSL:に進みます。

RUNTSL:の処理内容からするとラベル名RUNTSLはRUNSTLの誤記ではないかと思います。
ここでは行の先頭アドレスがCURRNTにセットされます。
そのあと行番号の次の位置のアドレスにDEレジスタを進めます。
そしてRUNSML:に進みます。

RUNSML:は行内の命令を解読して実行するプログラムです。
CHKIOはブレークキーが入力されたかどうかをチェックするサブルーチンです。
CHKIOはいずれ説明をするつもりです。
命令を解読するために命令テーブルアドレスTAB2−1(06BD)をHLに入れてEXECにジャンプします。
EXECは[第20回]で説明をしました。

説明の途中ですが、ちょっと説明が長くなりましたので今回はここまでにします。
次回に続きます。

復活!TINY BASIC[第37回]
2020.7.14upload

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