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

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



[第57回]


●FORプログラム(2)

前回の続きです。



前回はアドレス0223のSHLD LOPPTのところまで説明をしました。
今回はその続きです。
0226のLXI B,0AHから下はFOR変数と同じ変数名がスタックに保存されている「アクティブ」なFORループ変数と同じかどうかのチェックと、同じ変数名がみつかったときの処理です。
この処理については[第52回]で説明しました。
スタックに保存されるFOR変数領域は10バイトです。
スタックの中を10バイト刻みで「掘り下げて」(DIG)いくためBCに000Aを入れています。
FORプログラムの先頭のところでLOPVARに入れたFOR変数(その識別のために変数のアドレスがLOPVARに入れられます)を読み出してXCHGでDEレジスタに置きます。
MOV H,B
MOV L,B
でHL=0000にします(Bレジスタは00です)。
DAD SP
を実行するとHLには現在のSPの値が入ります。
このときSPで示すメモリアドレスにはPUSHAでスタックに保存したひとつ前のLOPVARの値が入っています。
まずはその値と今回のLOPVARの値(DEに入っています)とを比較して、一致、不一致の判定をします。

ということなのですが。
では、その次の
0230 DB 3EH
は何でしょう?

前後のプログラムとは切り離されたかのようにここにいきなり出現したコード3Eに何の意味があるのでしょうか?
実は最初にこの部分を読んだときには、なぜここにこんなコードが置かれているのか、その意味がわかりませんでした。
しかしここで何をやっているのかを考えていくなかで、「おお、そういうことか」と合点がいきました。
わかってみればなるほど実に巧妙なプログラムです。
普通はこんなプログラムはまず書かないでしょうし、思いつかないと思います。
さすがは往年の熟練プログラマこそかくあるべきか、ともうやたら感心してしまいます。

せっかくですので、ここは次回までの宿題といたしましょう。
ここでコード3Eが使われている意味がわかれば、あなたの技量はもう上級プログラマなみでありましょう。
ここには特別のフェイクとかとんでもないウルトラCとかというようなものは何もありません。
コード3EはMVI A,nのマシン語コードです。
ではなぜ普通にするようにアセンブラニーモニックで
MVI A,n
というように書かなかったのでしょうか?
(もしかすると書けなかった?)

それに。
そもそもここでAレジスタに何かを入れる意味があるのでしょうか?
だって、すぐ下の0232にはMOV A,Mがあるじゃありませんか。
でも。
そのあたりが謎を解くヒントです。

それともうひとつのヒントはFR7:以下に書かれているプログラムです。
ここではスタックに保存された旧FORループのLOPVARの値をDEと比較しています。
FOR変数領域は10バイトありますから、以前の変数領域のLOPVARを探るためにスタックを10バイトずつ掘り下げていきます。
そのときBCレジスタが使われます。
FR7:DAD BC
です。

ああ。
ちょっとヒントを出しすぎてしまいました。
よくおわかりにならないようでしたら、
022E MOV L,B
のあたりから
0240 JNZ FR7
までの部分のフローチャートを書いてみてください。
そして今回の説明をもう一度初めからじっくり読んでみてください。
実に巧妙なプログラムの流れが見えてくることと思います。

復活!TINY BASIC[第57回]
2020.8.5upload

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