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

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



[第77回]


●INPUT(3)

前回からの続きです。



前回は
02FE PUSH D
でHLの値(02EC XCHGでDEに一時保存していた変数のアドレス)をスタックに保存するところまでを説明しました。
今回はその続きです。
02FF MVI A,3AH
0301 CALL GETLN
でBUFFERに入力データを読み込みます。
GETLNはまだ説明していません。
キーボードからデータを入力するプログラムなのですが、RS232C経由でデータを送受信することが前提のプログラムで、当時のハードウェアに依存しています。
その動作をそのまま説明するのもいかがなものかと思案しています。
もちろん中日電工版TINY BASICでもそのままでは使えません。
今のところはとりあえずデータの入力ができるだけのプログラムに改変していますが最終的には入力文字の訂正などの機能を含めた変更が必要になると考えています。
ですのでGETLNについてはAレジスタに入れた文字コードをASCII文字として表示したあとキーボードから0Dコードが入力されるまでの入力データをBUFFERエリアに入力してリターンするだけのサブルーチンと考えてください。

0304 LXI D,BUFFER
0307 RST 3
で入力データを解読します。
RST 3は[第11回]で説明をしています。
EXPR(式計算)プログラムです。
式を計算して結果をHLレジスタに入れてリターンします。

ところで。
その後にNOPが3バイト使われています。
右のコメントにはCAN BE ’CALL ENDCHK’とあります。
うむむ。
これは何かのおまじないか?
さては裏技か?
最初はこの意味がわからずにちょっと悩みました。
あれこれ推理したり、試してみたりするうちに、多分こういうことではないか、と思いついたことがあります。
それについてはまたのちほど書くことにいたします。
ここはNOPですのでとりあえずは何も考えないでそのまま素直に3バイト分をスルーします。

030B POP D
030C XCHG
030D MOV M,E
030E INX H
030F MOV M,D
のところは
02FE PUSH D
でスタックに保存した変数のアドレスをそのままDEレジスタに戻したあと
XCHG
でHLとDEを入れ替えます。
入れ替えたあとはHLは変数のアドレス、DEはINPUTで入力された値になります。
入力された値を変数のアドレスに書き込みます。
これで変数に値が入力されました。

その後の処理です。
0310 POP H
0311 SHLD CURRNT
でスタックに保存しておいたCURRNTの値をもとに戻します。
0314 POP D

02EB PUSH D
でスタックに保存していたテキスト行の位置アドレスをDEに戻すためです。
0315 IP4:POP PSW

IP1:PUSH Dでスタックに最初に保存しておいた変数の表示前のテキスト行の位置アドレスを破棄します。
このPUSH Dは入力エラーがあったときに再度変数名を表示して再入力をするために保存している位置アドレスですが、入力が正常に行なわれたことでアドレスを次に進める(現在のDEを有効にする)ために破棄します。
なおIP4:は
02D5 JC IR4
からも来ています。
’または”で囲んだ文字列の後ろに変数がなかったときはPRINT文と同じ機能になって、それで1つの項目の処理が終了したことになるため、その場合にもIP4:以下同様の流れになります。

0316 RST 1
で’,’のチェックをします。
’,’があればそれはINPUT文での項目間のセパレータですからその次の項目の処理をするためIP1:に戻って繰り返します。
’,’がなければRST 6でエンドチェック処理を行ないます。

ここまででINPUTプログラムについての説明はほぼ終りました。
まだINPERRとNOP 3回のところが残っていますが、それは次回以降にて説明の予定です。

復活!TINY BASIC[第77回]
2020.8.28upload

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