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

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



[第71回]


●’REM’と’IF’

TINY BASICの説明を続けてきましたが、残すところもあとわずかとなってきました。
もうひとがんばりです。
今回はREM文とIF文です。
REM文はコメント文です。
なんとそのREM文がIF文に合体しています。
以下の解説文を読めば「なるほど」と初めて合点がいくのですが、いやあこういう発想はなかなか出てくるものではありませんね。



’REM’はその後ろになんでも書くことができますが、その行はTINY BASICによって無視されます。
TINY BASICは’REM’を’IF’文で条件式の結果が「偽」(FALSE)であったときに似た扱いをします。
なるほど。
そういうことなのですね。

’IF’に続けて条件として式(EXPR)を記述します。
さらに続けて1または複数の命令を記述します(その命令には別の’IF’も含みます)。
複数の命令を記述する場合は各命令の間をセミコロン(;)で区切ります。
TINY BASICでは’THEN’は使いません。
IF文ではIFに続く式を計算してその結果の値が0ではなかったときはIF文に続く命令を実行します。
もし式の値が0なら(同じ行の中で)IF文の後ろにある命令は全て無視され、その次の行が実行されます。

下は’REM’と’IF’のプログラムです。
たったこれだけの短いプログラムです。



ここではまた独特のテクニックが使われています。
02B0 REM:LXI H,0H
でHLレジスタに0000をセットします。
それはわかるのですが、そのあとの
02B3 DB 3E
はなんでしょう?

思い出しました。
これは[第58回]で説明した使い方と同じです。
これはその後ろに置かれた
02B4 IFF:RST 3
をパスするためのダミー命令です。
コード3EはMVI A,nのマシン語コードです。
MVI A,nは2バイトの命令なので、3Eに続く1バイトがMVI Aのオペランドと解釈されます。
つまり
02B3 3E
02B4 DF

02B3 3EDF MOV A,DF
と解釈され実行されます。
結果的に
02B4のRST 3は無視されて次の
02B5 MOV A,H
以下が実行されます。
MVI A,DF
の次に
MOV A,H
がすぐに実行されることから、MVI A,DFがダミーとして使われていることがわかります。

’REM’のときはHLレジスタに0000を入れてここに来ますから、そのあとは
02BA CALL FNDSKP
が実行されることになります。
FNDSKPは[第28回]でFL2:の説明のところで動作を説明しています。
DEで示されるテキスト行の現在のアドレスからその行の終わりのエンドコード(0D)までを読み飛ばすためのサブルーチンです。
FNDSKPの実行後はDEは次の行の先頭アドレスを示します。
そこがテキストプログラムの終わりだったときはキャリーフラグが立ちます。
キャリーフラグが立たなかったときは
02BD JNC RUNTSL
が実行されRUNTSLにジャンプします。
キャリーが立ったときは
02C0 JMP RSTART
が実行されRSTARTにジャンプします。
RUNTSLは[第37回]で説明をしました。
行の先頭から実行するプログラムです。
RSTARTは[第27回]で説明しました。
テキストプログラムの実行を終ってTINY BASICシステムの先頭に戻って入力スタンバイの状態になります。

以上は’REM’プログラムの説明として書いてきましたが、英文の解説にもあるように、そのプログラムはIF文で式の値が0(HL=0000)だったときのプログラムをそのまま実行していることになります。
ということで’REM’プログラムの説明が’IF’プログラムの半分の説明を兼ねていることになります。

以下は’REM’としては説明されなかった’IF’プログラムの説明です。
IFプログラムの先頭ではRST 3が実行されます。

02B4 IFF:RST 3

RST 3は[第68回]から説明してきましたEXPR計算プログラムです。
式を計算してその値をHLに入れます。
その次の
02B5 MOV A,H
02B6 ORA L
02B7 JNZ RUNSML
のところではHLの値を確認してHLが0ではなかったらRUNSMLにジャンプします。
RUNSMLは[第37回]で説明しました。
RUNSMLは行内の命令を解読して実行するプログラムです。

HLが0だったときは
02BA CALL FNDSKP
以下を実行します。
この部分は上のところで’REM’プログラムの説明として書きました。

復活!TINY BASIC[第71回]
2020.8.21upload

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