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

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



[第28回]


●FNDLN

下は前回説明しましたメインループの前半の部分です。



前回は説明の最後のところで次のように書いてそこで終りました。
00EFと00F0のPUSH B、PUSH DでBCレジスタ(入力行の終わり+1のアドレス)とDEレジスタ(入力行の先頭のアドレス)がスタックに保存されます。
さらにC−Eの結果もPUSH PSWによって保存されます。
C−Eの結果は入力行の長さ(バイト数)です。
そのあとCALL FNDLNが実行されることになるのですが、説明が長くなってしまいましたので今回はここまでで終ります。

今回は順序として、FNDLNについて説明をします。
下はFNDLNサブルーチンのプログラムリストです。



FNDLNはテキストエリアの中をサーチしてHLレジスタに入っている行番号と同じ番号の行があるかどうかをチェックします。
FNDLNの最初のところでHレジスタの値の正負をチェックしています。
前回のところでFNDLNがCALLされた時点でHLレジスタには0000ではない数が入っているのですが、それを行番号とするにはまだ足りません。
TINY BASICでは行番号は16ビットの数(0〜32767)と定義しています。
32767は16進数では7FFFです。
16ビットの数を符号付の数と考えたとき8000〜FFFFは負数になります。
その範囲の数はTINY BASICでは行番号としては扱いません。
HLの値の正負はHのみ見ればわかります。
MOV A,HのあとORA Aを実行すればその正負によってS(サイン)フラグが立ちます。
値が負のときは行番号ではありませんからHOWメッセージ表示ルーチンにジャンプします。

HLが正であった場合には行番号のサーチが行なわれます。
最初にDEレジスタにはテキストエリアの先頭アドレス(TXTBGN)が入れられます。
チェックが進む過程でDEレジスタの値はテキストエリアの終わりに向かって進んでいきます。
TXTUNFにはテキストエリアにセーブされているユーザプログラムの終わりのアドレス+1が入っています。
そこでDEレジスタの値がユーザプログラムの終わりを越えたかどうかを最初に確認します(0541〜0547)。
終わりを越えたら行番号サーチを終了してリターンします(キャリーフラグが立ちます)。
その場合には該当する行番号がみつからなかったことになります(メインプログラムではキャリーフラグが立っていることでそのことがわかります)。
RST 4はHLとDEを比較するサブルーチンです([第12回]参照)。
以上が0547のRCまでの動作です。

0548のLDAX Dから0550のJC FL2まででテキストエリアの行番号とHLレジスタの値の比較が行なわれます。
行の先頭には行番号の下位桁が置かれています。
その値とLレジスタとを比較して結果をBレジスタに一時保存します。
次に上位桁とHとを比較します。
このときSUB Lの結果ボローが発生していたときはそれを演算に加えるためSUB HではなくてSBB Hを使います。
SBB Hを実行した結果キャリー(ボロー)が発生したときはテキストエリアの現在位置の行番号がHLレジスタの行番号よりも小さいということになりますから、さらにDEのアドレスを先に進めます(JC FL2)。
キャリーが立たなかったときはテキストエリアの現在位置の行番号がHLレジスタの行番号を越えたかそれと等しいことになります。
DEはその位置の行番号の上位桁を示していますからDCX Dを実行します。
その結果HLの行番号よりも大きいか等しい行の先頭アドレスがDEにセットされます。
最後にORA Bを実行してリターンします。
Aレジスタには上位桁の減算結果が入っています。
Bレジスタには下位桁の減算結果が保存されていますから、AもBも0の場合には(行番号が一致した場合には)ORA Bを実行した結果Zフラグが立ちます。

FL2:はテキストエリアの行番号サーチを次の行に進めるための処理です。
054EでJC FL2が実行された時点でDEレジスタには行番号の上位桁位置のアドレスが入っています。
この行を最後まで飛ばして次の行の先頭位置までDEレジスタの値を進めます。
やっていることは簡単です。
その行の終わりには0Dコードがあります。
そこまで1バイトずつ確認しながらDEを+1していきます。
0DコードがみつかったらさらにDEを+1すると、DEは次の行の先頭のアドレスを示しています。
そしてFL1:に戻って次の行の行番号とHLレジスタの行番号の比較を続けます。

FNDLNからリターンしたとき、Zフラグが立っていたら行番号が一致する行がみつかったことを示しています。
DEレジスタにはその行の先頭位置のアドレスが入っています。
キャリーフラグが立っていたら、HLの値よりも大きいか等しい行番号がみつからなかったことを示しています(HLが示す行番号が一番大きい)。
そのときDEレジスタはTXTUNFの値になります。
Zフラグもキャリーフラグも立っていなかったら、HLで示す行番号よりも大きい行番号の行がみつかったことを示しています。
このときDEレジスタにはみつかったHLレジスタの値よりも大きい行番号の行の先頭アドレスが入ります。

やっとFNDLNの説明が終りました。
ちょっと長くなってしまいましたので本日はここまでにします。
次回に続きます。

復活!TINY BASIC[第28回]
2020.6.30upload

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