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

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



[第70回]


●EXPR(3)

今回も前回からの続きです。
下は前回もお見せしたEXPR1のプログラムリストです。



EXPR1:では関係演算子のテーブルを使って文字列を比較し、一致したらその関係演算子を処理するプログラム部分にジャンプします。
各処理プログラムでは先頭でXP18をCALLしています。
[第68回]ではそのように書きました。
そして前回ではXP18について説明をしました。
今回はEXPRプログラムの最後の仕上げです。
関係演算子を処理する各処理プログラムについて見ていくことにします。

最初は関係演算子が’>=’のときに実行されるXP11(アドレス0333)についての説明です。
XP11:の先頭でXP18をCALLしています。
0333 XP11:CALL XP18

そしてXP18でHLとDEを比較した結果キャリーフラグが立っていたらそのままリターンします。
0336 RC
XP18ではHL<DEのときにキャリーフラグが立ちます(前回参照)。
その状態は’>=’の関係ではありませんから「偽」(FALSE)です。
比較演算の結果「偽」だったときはHL=0000にします。
前回の最後のところでXP18:ではリターン前にHLに0000を入れると書きました。
XP18ではメインプログラムでのプログラム処理を短くするために、あらかじめ「偽」のときのHLの値(=0)をセットしてリターンします。
ですから「偽」のときには何もしないでそのままリターンすることになります。

それでは逆に「真」(TRUE)だったときはどうするのでしょうか?
そのときは
0337 MOV L,A
0338 RET
が実行されます。
なんとも見事なものです。
「真」のときはHL=0001にします。
XP18からリターンしたときには、HL=0000、A=01になっています。
それで「偽」だったときはそのまま(HL=0000のまま)リターンするのですが、「真」だったときはLにAを入れてHL=0001にしてからリターンするのです。

それでは次の’#”はどうでしょうか。
関係演算子が’#’のときにはXP12(アドレス0339)が実行されます。
XP18でHLとDEを比較した結果Zフラグが立っていたらそのままリターンします。
XP18ではHL=DEのときにZフラグが立ちます(前回参照)。
その状態は’#’(not equal)の関係ではありませんから「偽」(FALSE)です。
比較演算の結果「偽」だったときはHL=0000にします。
XP18ではHLに0000を入れてリターンします。
ですから「偽」ならそのままリターンします(アドレス033C RZ)。
逆に「真」のときは
033D MOV L,A
033E RET
が実行されます。

関係演算子が’>’のときにはXP13(アドレス033F)が実行されます。
XP18でHLとDEを比較した結果Zフラグが立っていたらそのままリターンします。
XP18ではHL=DEのときにZフラグが立ちます(前回参照)。
その状態は’>’の関係ではありませんから「偽」(FALSE)です。
比較演算の結果「偽」だったときはHL=0000にします。
XP18ではHLに0000を入れてリターンします。
ですから「偽」ならそのままリターンします(アドレス0342 RZ)。
その次の
0343 RC
もそのままでリターンします。
XP18ではHL<DEのときにキャリーフラグが立ちます(前回参照)。
その状態は’>’の関係ではありませんから「偽」(FALSE)です。
ですからそのままリターンします
逆に「真」のときは(上記以外のときは)
0344 MOV L,A
0345 RET
が実行されます。

関係演算子が’=’のときにはXP15(アドレス034E)が実行されます。
XP18でHLとDEを比較した結果Zフラグが立っていなかったらそのままリターンします。
XP18ではHL=DEのときにZフラグが立ちます(前回参照)。
Zフラグが立っていなかったらその状態は’=’の関係ではありませんから「偽」(FALSE)です。
比較演算の結果「偽」だったときはHL=0000にします。
XP18ではHLに0000を入れてリターンします。
ですから「偽」ならそのままリターンします(アドレス0351 RNZ)。
逆に「真」のときは
0352 MOV L,A
0353 RET
が実行されます。

関係演算子が’<=’のときにはXP14(アドレス0346)が実行されます。
今度は今までとはXP18をCALLしたあとの処理が異なっています。
先に
0349 MOV L,A
を実行します。
そのあとで
034A RZ
034B RC
034C MOV L,H
034D RET
を実行します。

先にMOV L,Aを実行しますから今までの処理とは逆に先にHL=0001になります。
そして XP18でHLとDEを比較した結果Zフラグが立っていたらそのままリターンします。
XP18ではHL=DEのときにZフラグが立ちます(前回参照)。
その状態は’<=’の関係ですから「真」(TRUE)です。
比較演算の結果「真」だったときはHL=0001にします。
ですから「真」ならそのままリターンします(アドレス034A RZ)。
その次の
034B RC
もそのままでリターンします。
XP18ではHL<DEのときにキャリーフラグが立ちます(前回参照)。
その状態も’<=’の関係ですから「真」(TRUE)です。
ですからそのままリターンします
逆に「偽」のときは(上記以外のときは)
034C MOV L,H
を実行してHL=0000にしてから
034D RET
が実行されます。

関係演算子が’<’のときにはXP16(アドレス0354)が実行されます。
XP18ではHL<DEのときにキャリーフラグが立ちます(前回参照)。
キャリーフラグが立っていなかったらHL>DEまたはHL=DEですから、その状態は’<’の関係ではありません。
つまり「偽」(FALSE)です。
ですからそのままリターンします
0357 RNC
です。
逆に「真」のときは(HL>DEのときは)
0358 MOV L,A
0359 RET
が実行されます。

復活!TINY BASIC[第70回]
2020.8.20upload

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