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

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



[第59回]


●FORプログラム(4)

前回の続きです。



前回はアドレス0243から後ろの部分の説明を残したまま終ってしまいました。
0243から後ろのプログラムは、現在のLOPVARとスタックに退避されている以前のLOPVARが同じであった場合の処理プログラムです。
TINY BASICでは現在のLOPVAR(FORの変数)とスタックに退避されている以前のLOPVARの値が同じであった場合には、みつかった以前のFOR変数領域をスタックから除去してしまいます。
以下は0243以降のプログラムの説明です。
XCHGでHLの値をDEに移し換えます。
HLには削除対象のFOR変数領域が退避されているスタックのアドレスが入っています。
そこから10バイトが削除する対象領域です。
その先頭アドレスがDEに入ります。
その次の
LXI H,0H
DAD SP
MOV B,H
MOV C,L
までのところでSPの値がBCに入れられます。
その次の
LXI H,0AH
DAD D
でHLにはDEが示すスタックのアドレスの+10バイト先のアドレスが入ります。
削除する範囲はDEが示すアドレスからHLが示すアドレスの1バイト手前のアドレスまでです。
ただ削除するだけではなくて
そこでMVDOWNをCALLします。
MVDOWNは[第29回]で説明しました。
MVDOWNはちょっとわかりにくいプログラムです。
DEレジスタが示すアドレス−1からBCレジスタが示すアドレスまでのデータをHLレジスタが示すアドレス−1にコピーします。
1バイト転送(実際はコピー)するごとにHLとDEの値は−1されます。
DE=BCになったら処理終了です。
MVDOWNを実行したあとSPHLでSPにHLの値が入れられます。
これは図で説明したほうがよさそうですね。



左がMVDOWNを実行する前で右が実行後です。
実行前には現在のSPの値がBCレジスタに入っています。
DEレジスタにはスタックから削除するFOR変数領域の先頭アドレスが入っています。
HLレジスタにはDEレジスタの値に10バイトを加算した値が入っています。
DEが示すスタックのメモリアドレスからHLの値−1が示すメモリアドレスまでの間の領域(B)が削除されます。

FOR文を解読する過程で同じ変数名がすでに使われていることがわかったときに上のようにしてスタックから古いほうの変数領域を削除したとしても、結局はFOR〜NEXTの変数が食い違うために途中のどこかでエラーが発生してしまいます。
これは[第53回]でNEXTの説明のところでも書いたことなのですが、どうせエラーになるのなら、同じ変数名が使われていることがわかった段階ですぐにエラー表示をしてしまうほうがよいように思えます。
TINY BASICの作者がここでなぜこのような面倒なことをしているのか、その意図が私にはよくわかりません。

復活!TINY BASIC[第59回]
2020.8.8upload

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