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

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



[第30回]


●FNDNXT

前々回、前回でFNDLNとMVUP、MVDOWNについて説明しました。
メインループではもうひとつサブルーチンをCALLしているのですが、まだ説明していませんでした。
メインループでCALL FNDLNを実行したあとでCALLしているFNDNXTです。



FNDNXTは、実は[第28回]のFNDLNの中にあります。



アドレス0554にFNDNXT:があります。
メインルーチンのところでCALL FNDLNを実行した結果、
1)HLレジスタの値と同じ行番号がみつからなかったときはJNZ ST4が実行されます。
2)同じ行番号の行がみつかったときにはCALL FNDNXTが実行されます。

入力行と同じ行番号の行がすでにある場合にはすでにある行を削除してから新しい入力行を挿入します。
その削除対象の行の先頭アドレスはFNDLNを実行した結果DEレジスタに入っています。
FNDNXTはその行を削除するために、その次の行の先頭アドレスをみつけてDEレジスタに入れるサブルーチンです。
DEレジスタはCALL FNDNXTを実行する前にPUSH Dで保存しておきます。
その状態でFNDNXTを実行します。
INX Dを2回実行するので行番号の2バイトがパスされます。
そこから行の終わりの0DコードがみつかるまでDEを+1しながらサーチしていきます。
0DコードがみつかったらさらにINX Dを実行します。
これでDEの値は次の行の先頭のアドレスになります。

ほんとうはここでリターンしてしまってもよいのですが、FNDNXTはFNDLNの一部を利用しているためここですぐにはリターンできません。
FNDNXTとしてはこのあとは無駄作業なのですが仕方がありません。
こうすることでメモリを節約しています。
このあとFL1にジャンプします。
そこではDEとTXTUNFの比較が行なわれます。
TXTUNFにはテキストエリアの最後のデータ+1のアドレスが入っています。
その値をHLに入れたうえでDCX Hを実行して、それからRST 4を実行します。
RST 4はHLとDEを比較するサブルーチンです。
HL<DEなら実は次の行はなくてDE=TXTUNFになります。
そこでRCが実行されます。

そうではなかった場合には次の行の行番号がHLレジスタと比較されます。
実はFNDNXTが実行されたということは上の方に書いた2)の場合だったのですから、前の行の行番号がHLと一致しています。
ですから当然次の行の行番号はそれよりも大きな値です。
0549のSUB L、054DのSBB Hの結果はキャリーフラグは立ちません。
DEレジスタに次の行の先頭アドレスが入ってリターンします。

これでやっとメインループの説明の続きに入れます。
ですけれど本日はちょっと時間がありません。
メインループの説明の続きは次回書くことにします。

復活!TINY BASIC[第30回]
2020.7.2upload

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