復活!CP/M ワンボードマイコンでCP/Mを!
CP/MがTK−80互換のワンボードマイコンの上で復活します
ND80ZVとMYCPU80の上でCP/Mが走ります!
[第123回]
●前回のテストの続きがありました
前回、「ファンクションコール01(コンソール入力)など、試すまでもないこと」と思いながら念の為に試して見ましたら、エコーされていないことがわかってしまいました。
そこでエコーされるようにBDOSプログラムを修正し、ついでにCTRL入力についてもエコー表示するように直しました。
その後ちゃんと表示できるようになったことを確認して、前回は無事に終わったのでありますが。
やっぱり試してみるものです、と書いておきながら、実は余りしっかりとは試しておりませんでした。
本日になりましてから、さて次は何をチェックしましょうか、と思いながらHPトップの更新履歴を眺めていましたら。
[第40回]の ●いろいろなキーを入力してみました というタイトルが目につきました。
ふむ。
そんなことをやっておったのか。
どれどれ。
なるほど。
むむ。
これも念の為、同じように入力してみねばなるまいな。
で。
その通りに入力してみましたら。
ふむう?
違っておるではないか?
上の画像は、ブラウザで[第40回]を開いておいて、その上でMSDOSプロンプト(コマンドプロンプト)を開いて、FTEST1を実行しているところです。
[第40回]と同じキーを入力したのですが、表示が異なっているところがあります。
CTRL入力でエコーが表示されているのは、そのようにプログラムしましたから、それは問題ではありません。
あ。
いや。
結果的に、そのCTRL入力での表示のされ方に問題がありました。
たとえば、CTRL+I(コード09H)はTABコードと同じになります。
左の画面ではTABがきいていますが、右の画面ではTABはきいていません。
また、CTRL+J(コード0AH)はLFコードと同じになります。
左の画面では改行後に=0Aが表示されていますが、右の画面では改行は行なわれていません。
もうひとつ、CTRL+M(コード0DH)はCRコードと同じになります。
左の画面では1桁目から=0Dが表示されていますが、右の画面では?が残ったまま=0Dが表示されています。
なおCTRL+H(コード08H)はBSコードと同じになりますが、どちらの画面もBSは行なわれていません。
BSについては後ほど書くことにいたします。
実はTABについては考えていませんでした。
これを見ますとCP/MのCONINではちゃんとTABも利くようになっていたのですね。
これはなんとかしなければなりません。
しかし、CRやLFは意外でした。
それは当然そのようにプログラムしてあるつもりだったのですが、働いていませんですねえ。
前回のCONINのソースリストを見ましたら、これじゃあだめだわ、ということに気が付きました。
全面的に書き直しです。
やれやれ。
はい。
直しましたよ。
もう一度トライです。
今度はうまくいきましたでしょう。
CTRL入力については、前回とは考えを変えました。
前回は、CTRL入力もエコーしていたのですが、その部分は外しました。
それはやっぱりシステムが関与することではなくて、ユーザーが必要に応じてすべきことだと思ったからです。
ファンクションコール01Hでは、CTRL入力はエコーしないでスルーします。
コードそのものは入力されますから、ユーザーが表示したいと思えば好きなように表示することができます。
CTRL+D(本来はCTRL+C)入力によるシステムブレイク時のみ、右の画面の下の方に表示されているように、システムの機能としてエコーするようにしました。
コード09HのTABはちゃんと働くようになりました。
CP/M2.2のTAMは、8カラムごと(0、8、16…)に移動します。
それからコード0AHのLFも働いています。
改行後に=0Aが表示されるようになりました。
コード0DH(CTRL+Mを2回入力しています)のCRも働いています。
1桁目に戻って=0Dが表示されています。
●BS(Back Space)について
さて、コード08H(BS)ですが、これは左の画面でも機能していませんでした。
しかし、今回の右の画面では、1桁前に戻って=08が表示されています。
そうなのです。
バックスペースも働くようになったのです。
実はTABもBSもND80ZVのZB3BASICではちょっと扱うのが難しかったのです。
ND80ZVのUSB通信のための決まりごととして、コード00〜0Cは、特殊な制御用にリザーブしてしまっていましたから、そこを直さない限り、CP/M側からBIOS経由で、08や09を送っても、パソコン側でそれをBSやTABとして働かせることはできない仕組みになっていたのです。
ただCP/M2.2のソースプログラムを見ますと、CP/Mもそこのところは承知していたらしく、CP/Mプログラム内部でクリアしていたように読み取れます。
しかし、ソースプログラムのそのあたりはなんだかめちゃめちゃこみいっていて、よくわかりませんでした。
なんとかいじくって、下のように#を表示させて、1行下に再表示させることはできるようになりましたので、とりあえずはそのようにして使っておりました。
そのBSも、今回のオリジナルDOSに対する修正作業によって、さきほどお見せしましたように、ちゃんと機能するようにしてしまいました。
もっともさきほどの画面では1文字バックですから、本当に働いているかどうかよくわからんぞ、と言われてしまうかもしれません。
そこでBSが働いている様子をもう少しわかるような画面でお見せすることにいたします。
ftest1と入力するつもりで、ftst1と入力してしまいました。
’e’が抜けています。
そこで、BSキーを使います。
ほら、ここまで戻りました。
そこから正しく入力します。
[Enter]を押して、正しく実行が開始されました。
BSはキー入力された文字だけを取り消すのではありません。
このように、A>の表示に、abcdeと入力して。
そこでBSキーを使います。
ほら。
A>まで消してしまいました。
どのようなプログラムを書くとこんなことができるのでしょうか?
ちょっと考えてみてください。
とにかくもともとのBSの機能は働きません。
BSキーを押すと、そのキーコード08Hはキー入力データとして得られます。
しかし何もおこりません。
何かをして(つまり何かを画面に表示して)やらなければなりません。
CP/Mシステムですから、キー入力はCONIN、画面表示はCONOUTを使います。
CONINで08は入力できますが、CONOUTで08を出力することはできません(ND80ZVシステムではそれは拒否されます)。
あー、わかった。[←]キーを使うんでしょう。
違います。
キー入力としては[BS]キーを使っています。
でも、でも、それじゃあ[←]キーのコードを画面に出力するってえのは?
だめです。
ええー。
無理だよ、そんなの。
できるわけ、ないじゃないの。
それとも、なにかずるい手があるんでしょお。
そんなの、ありません。
ひとつだけ、ヒントを差し上げます。
BSの機能を実現するためには、通常の文字表示のほかにはCRのみが必要です。
次回、必見です。
ワンボードマイコンでCP/Mを![第123回]
2012.5.17upload
前へ
次へ
ホームページトップへ戻る