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

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



[第61回]


●NEXTプログラム(2)

前回はNEXTプログラムの説明の途中で終ってしまいました。
今回はその続きです。



前回はアドレス0273のJMP NX0まで説明をしました。
今回は、アドレス0268のRST 4を実行した結果、DE(NEXT変数名のアドレス)とHL(FOR変数名のアドレス)が一致したときにジャンプするNX3:以後について説明をします。
ここからがなかなかにわかりにくい処理プログラムです。
NX3:に来たときにHLにはFOR変数名のアドレスが入っています。
MOV E,M
INX H
MOV D,M
でDEに変数の値を入れます。
LHLD LOPINC
PUSH H
でSTEPの値をHLに入れた後、それをスタックに保存しておきます。
MOV A,H
XRA D
は何をやっているのかわかりにくいところです。
ここはHLとDEの符号(正か負か)を判定しています。
H、Dの最上位ビットが0のときは正、1のときは負です。
そのXORを計算して結果が負ならばHとDは異符号です。
結果が正なら同符号です。
この結果は0281 JM NX4で参照されます。
次のMOV A,Dは0284のXRA Hで使うためです。
この辺りのプログラムは熟練者の技です。
実に見事だなあと感心してしまいます。

0280 DAD D
で変数の値にSTEPを加算します(結果はHLに入ります)。
その次の
JM NX4
はDAD Dの結果ではありません。
上で書きましたように、HLとDEが異符号のときにNX4にジャンプします。
次の
XRA H
JM NX5
は何をやっているのでしょうか。
このときAレジスタには027FのMOV A,DによってDの値が入っています。
0284 XRA Hを実行する時点で、その上のJM NX4をスルーしたわけですから、HLとDEは同符号です。
そしてDAD Dで加算を行なった結果の値HLと加算前のDEの符号をXRA Hでチェックした結果、もしも負になったとすれば、それは加算前と加算後で符号が反転したことを意味しています。
実はこれは加算でオーバーフローが起きたことを示しているのですが、ここではオーバーフローでエラーを表示するのではなくて
0285 JM NX5
でNEXTを抜けています。

NX5:では027C PUSH Hと025E PUSH Dでスタックに保存したHLとDEをもとに戻すため
POP H
POP D
を実行したあと
NXT2:CALL POPA
RST 6
を実行します。
NXT2:については後ほど説明をします。

0284 XRA H
を実行した結果、負ではなかった場合はオーバーフローせずに正しく加算できたわけですからそのまますぐ下のNX4:を実行します。
アドレス0281のJM NX4からもNX4へのジャンプが行なわれます。
この場合はDEとHLの符号が異なる場合の加算なので(つまり減算なので)オーバーフローのチェックは不要でそのままNX4にジャンプします。

NX4:に来たときには、HLに加算後の値が入っています。

NX4:XCHG
LHLD LOPVAR
MOV M,E
INX H
MOV M,D

加算後の値がDEに移されたあとLOPVARの値がHLに読み込まれます。
LOPVARにはFOR変数のアドレスが入っています。
HLとHL+1で示すアドレスのメモリはFOR変数です。
そのFOR変数に加算後の値が入れられます。

ここまでの作業でやっとFOR変数の値にSTEPの値が加算され、その結果がFOR変数に入れられました。
ここから下の部分では新たにFOR変数に入れられた値と’TO’の値とが比較されます。
その部分もちょっとわかりにくいところですので、それについては次回に説明することにします。

復活!TINY BASIC[第61回]
2020.8.10upload

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