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

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



[第62回]


●NEXTプログラム(3)

前回はFOR変数にSTEPの値を加算して、その結果の値をFOR変数に入れるところまでを説明しました。
今回はその続きです。



前回はアドレス028EのMOV M,Dまで説明をしました。
ここまでのところでDEには加算後の新しいFOR変数の値が入っています。
ここから下のところでは新しいFOR変数の値とFOR上限値との比較処理が行なわれます。
028F LHLD LOPLMT
でHLに’TO’の値が入ります。
次の
POP PSW

027C PUSH H
でスタックに保存したHレジスタの値をAレジスタに入れるためです。
ORA A
を実行することでSTEP値の正負をチェックしています。
JP NX1
STEPの値が正のときはそのままNX1にジャンプします。
負のときは
XCHG
でHLとDEを入れ替えます。
HLには’TO’の値、DEには加算後の変数値が入っていますからSTEPの値が正なら単純にHLとDEを比較してHL<DEならNEXTを抜けます。
STEPの値が負ならば’TO’の値はFORで設定した時点での変数の値よりも小さいはずですから、HLとDEを入れ替えたうえでHLとDEを比較してHL<DEならNEXTを抜けることになります。
それがXCHGの意味です。

アドレス0298 NX1:CALL CKHLDE
でHLとDEの大小を比較します。
CKHLDEは[第48回]で説明をしました。
HL<DEのときキャリーフラグがセットされます。
CALL CKHLDEを実行してキャリーフラグが立ったらFOR NEXTループを抜けるためにNX2にジャンプします。
POP Dは025EのPUSH Dをもとに戻すためです。
NX2:ではこれでFOR NEXTループは終わりなのでCALL POPAでひとつ前のFOR変数領域をスタックから戻したあと、RST 6でNEXT文の次の処理を行ないます。
RST 6は[第12回]で少しだけ説明をしました。
RST 6でCALLされているFINについては[第23回]で説明をしていますので参照願います。

CALL CKHLDEを実行してキャリーフラグが立たなかったらまだFOR NEXTループは続きますからFOR文の次の文に戻ってFORループを繰り返し実行します。
LHLD LOPLN
SHLD CURRNT
LHLD LOPPT
XCHG
でFOR文の行アドレスをCURRNTに戻し、FOR文の次のアドレス(LOPPTに入っています)をDEレジスタに入れたあとRST 6を実行します。

これでやっとFOR命令とNEXT命令の説明が終りました。

復活!TINY BASIC[第62回]
2020.8.11upload

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