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

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



[第76回]


●INPUT(2)

前回からの続きです。
前回もお見せしたINPUT文のプログラムリストです。



INPUT文のエントリ部分の最初の処理、
02CE CALL QTSTG
で、DEで示されるテキストエリアのアドレスに’または”で囲まれた文字列がある場合にはその文字列を表示したあと3バイト先(02D4)にジャンプします。
文字列ではなかった場合にはその次の命令(JMP IP2)を実行します。
前回は文字列がある場合に、文字列を表示したあとの処理(02D4以後の処理)について説明をしました。

今回は文字列ではなかったときの処理(IP2:)について説明をします。
文字列ではなかったときの処理ですから、そこには変数または配列(以下「変数」と表記します)がなければなりません。
IP1:と同じようにRST 7を実行しますが、このときキャリーフラグが立つとそれは変数がないということですから、WHAT?表示ルーチンにジャンプします。
LDAX D以下は難しい処理です。
このときDEはテキスト行の変数名の次のアドレスを示しています。
ここではその変数名を表示するための処理を行ないます。
LDAX D
MOV C,A
でそのアドレスにあるデータをCレジスタに保存します。
そしてそこに00を書き込みます。
SUB A
STAX D
です。

そのあと
POP D
CALL PRTSTG
で変数名が表示されます。
PRTSTGは[第46回]で説明をしています。
DEで示すメモリの値に対応するASCII文字を表示しDEを+1しながら表示を続けます。
DEで示すメモリの値がAレジスタの値と一致したらリターンします。
POP D

02DB IP2:PUSH D
で、変数を読み込む直前に保存したメモリアドレスをDEに戻します。
このときDEは変数名の先頭アドレスを示しています。
02E2 SUB A
02E3 STAX D
でAレジスタを00にするとともに、変数名の次のアドレスにも00を入れます。
そのようにしたあとPRTSTDをCALLすることで変数名が表示されます。

表示後にCレジスタに保存していたデータをもとに戻します。
02E8 MOV A,C
02E9 DCX D
02EA STAX D
の部分です。

ここからIP3:の処理になります。
02EB IP3:PUSH D
でテキスト行の現在の位置アドレス(変数名の次の位置アドレス)をスタックに保存します。
02EC XCHG
は以下の処理でHLを使うため、HLをDEに一時保存するためです。
このときHLには
02D4 RST 7
で得た変数アドレスが入っています。

02ED LHLD CURRNT
02F0 PUSH H
でCURRNTの値をスタックに保存します。
次の
02F1 LXI H,IP1
02F4 SHLD CURRNT
はここだけを見ても何をやっているのかよくわかりません。
あとでこの意味がわかってきます。
いずれ説明をしますのでここはこのままパスすることにします。

02F7 LXI H,0H
02FA DAD SP
02FB SHLD STKINP
で現在のSP(スタックポインタ)の値をSTKINPに保存します。
そのあと
02FE PUSH D
でHLの値(02EC XCHGでDEに一時保存していた変数のアドレス)をスタックに保存します。
ここまででやっと変数に値を読み込むための準備ができました。

説明の途中ですが、本日は時間がなくなってしまいました。
続きは次回にいたします。

復活!TINY BASIC[第76回]
2020.8.27upload

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