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

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



[第74回]


●FNDSKP

前回からの続きです。
私はてっきりFNDSKPは行の終わりまで(0Dコードがみつかるまで)DEレジスタの値を進ませるだけのプログラムだと早合点してしまいました。
DEレジスタにはテキストプログラムの現在解読中の位置アドレスが入っています。
しかしFNDSKPはもう少し複雑な処理をやっているようです。
FNDSKPのプログラムリストは[第30回]でお見せしています。
FNDSKPはそこで説明しましたFNDNXTの中にあります。



FNDSKPはDEレジスタが示すアドレスのメモリ内容をチェックして0DコードがみつかるまでDEを+1していきます。
そこだけをみればDEが示すアドレスを行の終わりまで進めるだけの動作なのですが。
よく見ると0Dがみつかったあと、そこでリターンするのではなくて、FL1(アドレス0540)にジャンプしています。
0540〜0547ではDEのアドレスがテキストエンド(TXTUNF)の値を超えたかどうかをチェックしています。
RST 4は[第12回]で説明しました。
HLとDEを比較します。
HL<DEのときはキャリーフラグが立ちます。
上のプログラムの場合キャリーフラグが立ったということはDEの値がテキストエンドを越えたということですからそこでリターンするのは納得できます(アドレス0547 RC)。

しかしまだ続きがあります。
0548から後ろの部分です。
この時点でDEは次の行の先頭のアドレスになっています。
次の行の先頭にはその行の行番号(16進数2桁)があります。
その行番号とHLの値とを比較しています。
えっ?
HLの値と比較?
で。
HLよりも小さかったときはFL2にジャンプして次の行の終わりまでサーチします???
うーん。
こんなことをやっているなんて思ってもみませんでした。

HLに行番号を入れて、その行番号がみつかるか、その行番号を越えるまでスキップするという「行番号サーチ」の一部としてFNDSKPが組み込まれているようです。
HLと一致する行番号がみつかったときはZフラグが立ちます。
みつからなくてテキストエリアの終わりまで行ってしまったときはキャリーフラグが立ちます。
HLよりも大きい行番号がみつかったらDEはその行の先頭のアドレスになります。
行番号がHLよりも小さいときはFL2:にジャンプしてサーチを続けます。

そういうことだったのでした。
それでやっと合点がいきました。
下は前回お見せしたデバッグ中の画面です。



アドレス833FでブレークしたときにHLの値は801Eになっています。
801Eは負数なので行番号としては間違いなのですがそれは行番号として取りうる最大値7FFFよりも大きいのでHLにこんな値が入っていたらテキストエリアの最後までいってしまいます。
FNDSKPで次の行の先頭までスキップしたところでリターンするにはHL=0000にしておく必要があったのでした。
オリジナルのTINY BASICではREM文のプログラムの先頭でHL=0000にしていますが([第71回]参照)、私はそれは次のIF文の処理で「偽」の条件を満たすためだと考えていました。
勿論それはその通りなのですが、そのほかにFNDSKPを目的どおりに実行させるためにもHL=0000が必要だったのでした。

ということで最終的に下のようにプログラムを変更しました。



やっと。
一件落着、です。

復活!TINY BASIC[第74回]
2020.8.25upload

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