[新連載]復活!TINY BASIC
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
すべてはここからはじまりました。
中日電工も。
40年前を振り返りつつ新連載です。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
[第21回]
●コマンドの解読(2)
前回の最後のところで以下のように書きました。
テーブルの最後の’STOP’まで照合を進めても不一致だった場合にはどうなるでしょうか?
実はその場合にはテーブルの一番最後0700に置かれた831Dが示すアドレス031Dにジャンプします。
どうしてそうなるのか、上の説明をよく読んでいただいて、プログラムの流れを追っていけばそうなることが理解できるはずです。
ここは次回までの宿題ということにいたしましょう。
ということで、今回はその答えです。
下は前回お見せしたコマンドテーブルの最後のところです。
そして下は前回お見せしたコマンド解読部分のリストです。
今回もこのリストを見ながら説明をすることにいたします。
テーブルの最後の’STOP’まで照合を進めても一致しなかったということは、最後の文字列’STOP’のどこかで不一致になったということのはずですからそのときは0749以後の処理が実行されます。
このときHLの値は’STOP’の文字列の途中のアドレスのはずですからMの値は文字コードになります。
7FHよりも小さいですからCMP Mの結果はキャリーフラグは立ちません。
ですからアドレス0750(EX2:)の処理が実行されます。
EX2:ではテーブル文字列の残りのスキップが行なわれます。
HLの値が06FEまで進んで’81’とのCMP Mが行なわれるとそこでキャリーフラグが立ちます。
0755のINX Hが実行されてHL=06FFになったところでEX0:に戻ってテーブルとの照合が続けられます。
しかしもうテーブルデータは残っていません。
0744でもう一度INX Hが実行されHL=0700になります。
そこで0745のCMP Mが行なわれます。
このときAレジスタには入力バッファかTEXTエリアにある検索対象の文字列の先頭文字が入っています。
Mは0700の値’83’です。
当然不一致ですからまた074CのCMP Mのところまで進みます。
すると。
Aレジスタには0749で7FHが入っていて、Mには’83’が入っていますからCMP Mの結果はキャリーが立ちます。
なので074DのJC EX5が実行されることになります。
EX5:は前回説明しました。
HLとHL+1に入っている値を正しいアドレスに補正して(最上位ビットを’0’にして)そのアドレスにジャンプします。
確かに。
アドレス031Dにジャンプすることになります。
なんだかわかったようなわからないような流れですが、テーブルデータの最後まで不一致のときはテーブルの最後に書いてあるアドレスにちゃんとジャンプするようになっています。
うまく考えたものだと本当に感心してしまいます。
復活!TINY BASIC[第21回]
2020.6.15upload
前へ
次へ
ホームページトップへ戻る