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

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



[第64回]


●EXPR4

今回は式計算プログラムの最下層のサブルーチンEXPR4について説明をします。
下がEXPR4のプログラムリストです。



先頭のEXPR4:でテーブルトップのアドレス(TAB4)−1をHLに入れてEXECにジャンプします。
TAB4は[第22回]で少しだけ説明をしました。
関数のRND、ABS、SIZEのテーブルです。
下にその部分を再掲します。



EXECは[第20回]で説明をしました。
RND、ABS、SIZEの各文字列を検出します。
検出した場合にはそれぞれの処理プログラムにジャンプします。
各関数の処理プログラムについては、もう少し後の回で説明をする予定です。
文字列が検出されなかった場合にはXP40(アドレス040B)にジャンプしてEXPR4の続きを実行します。

XP40:ではRST 7をCALLします。
RST 7は[第13回]で説明をしました。
RST 7は変数名または配列名(以下「変数名」と表記します)を検出してそのアドレスをHLに入れてリターンします。
変数名がみつからなかったときはキャリーフラグがセットされます。
キャリーフラグがセットされたときはXP41:にジャンプします。
変数名がみつかったときはそのアドレス(と次のアドレス)の値をHLに入れたあとリターンします。

XP41:ではTSTNUMをCALLします。
TSTNUMは[第15回]で説明をしました。
TSTNUMはASCII文字で書かれた十進数の数値を16進数2桁に変換してHLレジスタに入れるサブルーチンです。
数値がないときはHLには0が入るとともにBにも0が入れられます。
十進数が検出されたときは、Bには十進数の桁数が入っています。
Bが0でなければ十進数が検出されたことになりますからそこでリターンします。

十進数が検出されなかったときは、次のアドレス041AのPARN:RST 1が実行されます。
RST 1は[第11回][第14回]で説明しました。
DEで示されるメモリアドレスから1バイトのデータを読み込んでそれがスペース(20H)ならスペース以外のコードが出現するまで読み飛ばし、そのようにして読み込んだコードとRST 1の次に置かれたコードとを比較します。
アドレス041Bには’28’があります。
’28’は’(’の文字コードです。
コードが一致した場合にはその次の1バイトを飛ばしてさらにその次のアドレスにジャンプします。
ここで’28’だった場合にはアドレス041DのRST 3が実行されます。
RST 3は[第11回]で少しだけ説明をしました。
RST 3=EXPRです。
EXPRは式計算プログラムの最上位のサブルーチンです(前回参照)。
式を計算した結果の値をHLレジスタに入れてリターンします。
EXPR4は最下位の式計算プログラムですが、そこで最上位の式計算プログラムをCALLしています。
それで本当に大丈夫なのか、とちょっと気になってしまいます。
このあたりのところがTINY BASICプログラムの凄いところです。

RST 1の実行の結果コードが不一致だった場合にはその文字コードの次に置かれた数値の分だけアドレスが進みます。
’28’の次には’05’が置かれています。
不一致だった場合にはその次の5バイトが飛ばされます。
ここではアドレス0422の XP43:にジャンプします。
関数でも変数でも定数でもなくて、’(’で囲った式でもないときはWHAT?が表示されます。

アドレス 041DのRST 3が実行されたあとにはまたRST 1があります。
今度は’)’のチェック(文字コード29のチェック)です。
’)’だった場合には0421のRETに行きます。
そうではなかった場合には0422の XP43:にジャンプします。
終わりの’)’がなかった場合にはWHAT?が表示されます。

復活!TINY BASIC[第64回]
2020.8.13upload

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