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

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



[第84回]


●GETLN

GETLNはINPUT文で変数に値を入力するところでCALLされる行入力サブルーチンです。
オリジナルのTINY BASICではキーボードから直接入力するのではなくてキーボードとプリンタが一体となった装置からRS232Cを通して入力される仕組みになっていたようです。
GETLNはその装置のキーボードのハード仕様に直接結びついているため、そのプログラム内容を解析しても今となっては役に立ちそうにありません。
GETLNについてはINPUT文のプログラムの説明のところで「説明するかどうか迷っています」というようなことを書きました([第77回])。
「中日電工版」TINY BASICではそこのところはWindowsマシンとUSBで接続して、USB経由でキー入力データを入力するように考えています。
「中日電工版」TINY BASICのGETLNはとりあえずキー入力ができるというだけの暫定的な機能しかありません。
そこのところはいずれもう少し使い易いものにしたいと考えています。
それはともかくとして、そういうことでGETLNのプログラムはオリジナルのままでは余り使えない内容になっています。
それをそのまま説明することに意味があるか?と迷っていたのですが、まあしかし、利用できない機能だとしても、そのようなプログラムについても理解しておくことは全くの無駄とまではいえないだろうと思い直しました。
ですのでオリジナル版のGETLNについてもざっと説明をしておくことにします。

GETLNは最初にAレジスタの値を文字コードとして出力装置に送ります。
そのあとはキーボードから一文字ずつ読み込んで、それが特殊コードかどうかをチェックしたあと、入力バッファに書き込みます。
下はGETLNのプログラムリストです。



RST 2は[第11回]で説明しました。
Aレジスタのデータ(文字コード)を出力装置に送ります。
オリジナルのTINY BASICでは出力装置としてプリンタが想定されていたようですが、「中日電工版」ではAレジスタの値がASCIIコードとして認識されてそれに対応する文字がWindows画面に表示されます。
GETLNの場合このプログラム位置にあるRST 2の役割としては、入力を促すプロンプトマークを表示するために使われます。
そのあとDEレジスタに入力バッファの先頭アドレス(オリジナルでは139D)をセットします。
そしてGL1:でCHKIOをCALLします。
CHKIOもまだ説明をしていません。
CHKIOこそが入力装置からRS232C経由で文字コードを1文字読み込む最も最下層のサブルーチンです。
とりあえずは1文字分の文字コードを読み込むサブルーチンと考えてください。
Zフラグが立っていたら入力なしということで再入力します(0501 JZ GL1)。
その次の
0504 CPI 7FH
0506 JZ GL3
ですが、7FHはおそらく[Back Space]または[Delete]コードと思われます。
右のコメントでは
DELETE LAST CHRACTER?
と書いてあります。
最後に入力した1文字を削除する、と解釈できます。
そのときにはGL3にジャンプします。

GL3:ではEレジスタがバッファトップ(=9D)かどうかをまず確認します。
バッファトップだったときにはGL4に行きます。
GL4:では改行しそれまでの入力データを捨てて再入力するためGETLNにジャンプします。
このときにはプロンプトマークとして5EHがAレジスタに入れられます。
右のコメントでは5EHはUP−ARROWと書いてありますが、Windowsのキーコードでは[^]キーのコードです。 

GL3:の続きのところに戻ります。
Eの値がバッファトップではなかったときはDEの値を−1して、文字コードが”5C”の文字を表示したあとGL1:に戻ります。
WindowsのJISキーボードではコード5Cは[¥]キーです。
英字環境ではバックスラッシュ(\)になります。
オリジナルのTINY BASICでは直前に入力した文字を取り消したことを示すマークとしてバックスラッシュ(\)が使われるようです。
以上でアドレス0504のCPI 7FHで入力データが7FHのときの処理について説明をしました。

7FHではなかった場合にはアドレス0509以下が実行されます。
0509 RST 2
で入力コードを出力装置にエコーバックします。
そのあと入力コードが0Aまたは00のときは、バッファには入れずにGL1:に戻ります。
入力コードが7DのときはGL4にジャンプします。
GL4:は上で説明しました。
それまでに入力した1行分のデータを捨てて再入力するためにGETLNに行きます。
コード7Dは1行削除(破棄)のためのコードとして使われているようです。

入力コードが7Dではなかったときはアドレス0518以下が実行されます。
0518 STAX D
0519 INX D
で入力コードをバッファに入れた後バッファアドレスを+1します。
入力コードが0Dの場合にはそこでメインルーチンにリターンします。
0DではなかったときはEレジスタがバッファエンド(=DD)かどうかを確認します。
バッファエンドではない場合にはGL1:に戻って入力を続けます。
バッファエンドだったときはその下のGL3:以下が実行されます。
GL3:はバッファトップかどうかの確認ですからそれは無駄作業です。
おそらく0529へのジャンプ命令を省いて3バイトを稼ぐためだろうと考えられます。
バッファエンドのときには最後に入力した文字が無効にされたあと、再入力のためGL1:に戻ります(この場合には0Dコードの入力を要求していることになると思います)。

復活!TINY BASIC[第84回]
2020.9.8upload

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