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

復活!CP/M ワンボードマイコンでCP/Mを!
CP/MがTK−80互換のワンボードマイコンの上で復活します
ND80ZVとMYCPU80の上でCP/Mが走ります

[第129回]


●ファンクションコール0A(コンソールバッファ入力)その2

前回はCP/M2.2のファンクションコール0Aが「すごい」プログラムなのだ、というお話をいたしました。
そのことを前回は文章を使って説明しました。

今回は、そこのところを、画像に撮りましたので、実際の画面でお見せすることにいたします。
これは修正後のCPM22N.BINをND80ZV上で実行しているところです。
前にも書きましたが、現在お手元にありますND80ZVではここで説明しております通りの動作はいたしません。
Windows側のプログラム(ZB3.EXE)の修正が必要です([第126回]参照)。
ここではその修正版(ZB3N.EXE)を使っています。
いずれRAMディスクのシステムが出来あがりましたら、その時点で供給開始ということにさせていただきますので、今しばらくお待ちください。

ここまで、そのように書いてきましたけれど、中には「それまで待てん。とりあえずここまでの機能でよいからなんとかならんのか」という方もいらっしゃるかもしれません。
ND80ZVをすでにご購入いただいた方で、そのようにご希望される方はメールにてご連絡ください。
折り返しメール添付にてZB3N.EXEをお送りいたします。

さて。
実際にFTST9.COMを実行中の画面です。



[第64回]で作りましたFTST9.COMを実行しています。
最初は普通にabcdef[Enter]と入力しました。
するとその下に入力した通りの文字列abcdefが表示されて、それからコンソールバッファの中味が16進数で表示されました。

次は同じようにabcdefと入力したあとで[Ctrl]+[R]を入力しました。



するとそこに#が表示されて、それから改行されて、もう一度入力された文字列がそのまま表示されたあと、続いて入力ができる状態になります。

ここで注目したいのは、バッファの内容が再表示される時は、画面の左端から表示されるのではなくて、最初に入力を開始したポイントまでカーソルが移動して、そこからバッファの再表示が行なわれていることです。

これは0AH(LF)を使っているのではないかと思ったのですが、実は0AHはその位置でそのまま改行するのではなくて、CR・LF(0D/0A)として動作してしまいます。
つまり0AHを画面に送るとカーソルが左端に移動して、そしてそこで改行が行なわれます(このことについてはまた後で検証いたします)。

すると、上で行なわれている[Ctrl]+[R]の機能は0AHだけでは実現できなくて、ファンクションコール0Aがコールされた時の画面のカーソルポイントをしっかりと記憶している、ということになります。
そして、それを再現しているのです(どうやって?)。

それはともかくとしまして、上の画面の説明の続きです。
バッファの再表示が行なわれたあともそのまま続いてキー入力が行なえますが、ここではひとまず[Enter]を入力しました。

その次も同じようにabcdefと入力しましたが、そのあと今度は[Ctrl]+[U]を入力してみました。



するとさきほどと同じように改行が行なわれましたが、今度はバッファがクリアされるため、バッファ内容は再表示されず、最初からの入力になりました。

下の画面はその続きです。



[Ctrl]+[U]でバッファクリアされたあと、123[Enter]と入力しました。
すると最後に入力した123だけが表示されました。
その下に表示されたバッファのダンプを見てもそのようになっていることが確かめられます。

続いて、またabcdefと入力しました。



今度はここで[Ctrl]+[X]を入力してみます。

[Ctrl]+[X]を入力したあとの画面です。



すると改行は行なわれず、それまで表示されていた文字列がクリアされ、最初の入力に戻りました。
このときバッファもクリアされています。
バッファクリアは実際にバッファにスペースコード(20H)とかヌル(00H)を書き込むのではなくて、ただバッファ先頭(2桁目)の入力文字数カウンタを00クリアするだけです。

むむむ。
これはなかなかに面倒なプログラムではありませぬか。

さらに。
ここに[Ctrl]入力が加わってくるということになりますと。
前回説明しましたように、さらにさらに面倒なことになります。
[Ctrl]入力をした場合に[Ctrl]+[R]や[BS]がどのように反映されるのかを試してみました。

abc[Ctrl]+[Z]de[Ctrl]+[G]456
と入力したあと、[Ctrl]+[R]を入力しました。



改行が行なわれて、バッファの内容が再表示されましたが、そこでは入力したときと同じように[Ctrl]コードがちゃんと ^Z、^G に置き換えられて表示されました。
いやあ。これはすごいことをやっています。

最後に[Enter]を入力しました。
ダンプ表示されたバッファの中味を見ますと、そこには1バイトの[Ctrl]コード1AH
と07Hが書き込まれていました。
再表示するときだけ、1AHを^Zに、そして07Hを^G に置き換えて表示していたのです。
むむ。
脱帽。

今度は[BS]も使ってみました。
先ほどと同じように、
abc[Ctrl]+[Z]de[Ctrl]+[G]456
と入力したあと、[Ctrl]+[R]を入力しました。



再表示されたところ(2行目)で[BS]を3回入力して(456が消去され)、そこでまた[Ctrl]+[R]を入力しました。
abc^Zde^G と再表示されたのですが(3行目)、そこでまた[BS]を入力したため、画面では^Gが消えています。
そこでまた[Ctrl]+[R]を入力しました。
abc^Zde と再表示されたので(4行目)、そこで[Enter]を入力しました。

再表示されたところで[BS]を使ったときも、コンソールバッファ内の[Ctrl]コードと、画面に表示された2桁のCtrl表示は、共に食い違うことなくきれいに削除されています。
バッファ内の[BS]による削除はバッファ先頭2バイト目のカウンタの数値を減らすことによって行なわれます。
上の画面ではバッファカウンタの値が06になっていますから、バッファには現在6文字が入っていることになります。
この場合バッファの7文字目以後は無視されます。

すごい!

本当に感心してしまいますが。
まだまだすごいことになってしまいます。

今度は同じことをTABをまじえておこなってみます。



ab[TAB]c[TAB]dと入力したあと、そこで[Ctrl]+[R]を入力しました。
すると改行が行なわれて、バッファの中味がそのまま表示されました。
TABがちゃんと効いていることがわかります(あ。これだけでは、本当にTABが効いているのかスペースに置き換えられてしまっているのかわかりませんね)。

そこでそのまま[Enter]を入力してみますと。



入力された文字列が再表示されますが、表示されたabとcとの間隔を見れば、TAB入力によってバッファの中味が画面表示と同じようにスペース(20H)で置き換えられるのではなくて、TABコードがそのまま保持されることがわかります。
そのことは同時に行なわれるバッファのダンプを見ても確認できます。
TABを入力した位置にTABコード09H(2箇所)が書き込まれています。

さてそれでは今度はTABに対して[BS]を使ってみることにしましょう。



上と同じように、ab[TAB]c[TAB]dと入力したあと、そこで[Ctrl]+[R]を入力しました。
すると改行が行なわれて、バッファの中味がそのまま表示されました(2行目。ここでは下の説明のように[BS]を2回入力したあとの画面になっています)。

そのあと、[BS]を2回入力しました。
最初の[BS]の入力で’d’が消去されカーソルは’d’が表示されていた位置に移動しましたが、その次の[BS]の入力で、今度は一度に間の空白が全部なくなって、’c’の次の位置にカーソルが移動しました。

ここで注目したいのはTAB表示が行なわれたあと[BS]2回の入力でTABがキャンセルされてバッファの中のTABコードが1つ削除されるとともに、なんと画面のカーソルも、そのTABを入力する直前の位置まで戻ってしまったというところです。

どうするとこんなことができるのでしょう?
これは相当にしつこいプログラムです。
よくぞ、ここまで、面倒なプログラムを書いたものです。

って他人事のように書きましたけれど。
CP/M互換DOSのプログラムも、そういう具合に機能するように書かなければなりません。

いや。まあ。
こういうところは、絶対にそのようにしなくちゃいけないということでもないとも思いますから、「ここは互換性にこだわりません」ということで、機能を省略しちゃってもよろしいのですけれど。

でも。
こういう見事な動きをするプログラムを見せつけられてしまいますと。
闘志がわいてくるじゃありませんか。
ここは、なんとしても避けて通ってはなるまいぞ。
男。一本道でありますよ。

結局。
まるっと1日をつぶして、そのすごい動作をしているのと、同じ動作をするプログラムを書いてしまいましたよ。
結構ホネでしたけれど。
それにつきましては、また次回に説明いたします。

ワンボードマイコンでCP/Mを![第129回]
2012.5.24upload

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