[新連載]復活!TINY BASIC
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
すべてはここからはじまりました。
中日電工も。
40年前を振り返りつつ新連載です。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
[第31回]
●メインループ(3)
今回は[第27回]のメインループの説明の続きです。
下はメインループの後半部分のプログラムです。
前半部分のプログラムで入力バッファに読み込まれた1行の命令行の先頭のASCII文字の行番号が16進数に置き換えられ、同時にその行番号がHLレジスタにも入れられました。
後半部分では入力バッファの1行の命令行をテキストエリアに追加挿入(または削除)する作業が行なわれます。
FNDLNでHLレジスタで示す行番号と一致する行をテキストエリアの中をサーチして確認します。
同じ行番号の行がみつからなかったときはST4:にジャンプします。
まずはHLと一致する行がみつかった場合について考えます。
00FBから下の部分です。
HLと一致する行がみつかったときはテキストエリアにある行を入力バッファにある行で置き換えます。
そのためにまずテキストエリアの行を削除します。
00FDでCALL FNDNXTを実行しています。
FNDNXTは前回説明しました。
FNDNXTを実行するとDEレジスタに次の行の先頭アドレスが入ってリターンしてきます。
次の行が存在しない(つまり新しく入力された行番号が一番大きい)場合にはDEにはTXTUNFの値が入り、キャリーフラグが立ちます。
そのあとメインループの00FFから後ろが実行されます。
00FFのPOP BでBCレジスタには00FBのPUSH Dで保存した値が入ります。
そのとき保存したDEにはCALL FNDLNの結果HLの行番号と同じ行番号の行の先頭アドレスが入っていますから、それがBCの値になります。
そしてDEにはCALL FNDNXTを実行した結果、次の行の先頭アドレスが入ります。
0100のLHLD TXTUNFによってHLにはテキストエリアの最後のデータ+1のアドレスが入ります。
そして0103のCALL MVUPを実行します。
MVUPは[第29回]で説明しました。
MVUPはDEが示すアドレスからHLが示すアドレスの1バイト前のアドレスまでのデータをBCが示すアドレスにコピーします。
BCはCALL FNDLNの結果HLの行番号と同じ行番号の行の先頭アドレスが入っていて、DEにはその次の行の先頭アドレスが入っていますから、そこでCALL MVUPを実行するとBCで示される行が削除されてテキストエリアがその分だけ前に詰められます。
実行後のBCは前詰めされたテキストエリアの終わりのアドレス+1になりますから、それを新しいTXTUNFの値にします(0106〜010A)。
以上の動作はテキストエリアに次の行が存在する場合の動作です。
それでは次の行が存在しない場合(CALL FNDNXTでDEにTXTUNFの値が入ってリターンしてきた場合)はどうなるでしょうか?
MVUPはDE=HLになるとリターンします。
次の行が存在しない場合にはDE=TXTUNFになっていますから、CALL MVUPを実行しても何もしないですぐにリターンしてきます。
この場合BCには削除対象行の先頭アドレスが入ったままです。
それがTXTUNFの新しい値になりますから、結局その場合には何もしないで削除されたことになります。
ここから先はテキストエリアに同じ行番号の行が存在しなかった場合のジャンプ先(ST4:)になります。
つまり同じ行番号の行がみつかった場合はその行をまず削除してからST4:を実行し、同じ行番号の行が存在しなかったときは何もしないでST4:を実行するということになります。
説明が長くなりましたので今回はここまでにします。
次回はST4:について説明をします。
復活!TINY BASIC[第31回]
2020.7.3upload
前へ
次へ
ホームページトップへ戻る