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

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

[第400回]


●WordStar(5)終了時のハングアップをクリアしました

せっかくうまく動いてくれたWordStarなのですが[第398回]に書きましたように、どういうわけかZBIOSのプログラムを4バイト分破壊してしまいます。
ちょうどそこはCP/M互換DOSからZB3BASICに戻るためのジャンプ命令が書かれているところなので、ZB3BASICに戻ろうとするとそこでハングアップしてしまいます。
特定のソフトウェアのために、本来は移動しなくてもよいプログラムを移動するというのはいささか面白くないのですけれど、まあそれほど手間のかかる作業でもありませんから、WordStarによって破壊されてしまう4バイトのところに書いてあったジャンプ命令は他のところに移動しました。

そのように変更後にWordStarを実行して、それからCP/M互換DOSに戻り、そこからさらにZB3BASICに戻りましたが、もうハングアップしなくなりました。


これにて一件落着です。
あ。
そういえば。
上の画面に見えておりますように、インターネットからダウンロードさせていただいたWordStar3.3はどういうわけかカレントドライブのドライブ名だけは表示されるのですが、ファイル名は表示されません。
ファイルのセーブやロードは正しく行なわれますから、ディレクトリの読み込みが出来ないということでもないようなのですが、なぜかこうなります。

●WordStar3.3 Manual

WordStar3.3のManual(英文)はこちら(http://bitsavers.trailing-edge.com/pdf/microPro/Wordstar_3.3/Wordstar_3.3_Reference_Manual_1983.pdf)からダウンロードできます。
300ページもあります。


●[Ctrl]+[S]の怪

さて。
とんでもないトラブルのお話です。
当初WordStarがなかなかうまく動作してくれなかった原因のひとつに、キー入力動作の不具合がありました。
悩みながら追求していきましたところ、キー入力のときのオートリピート対策が裏目に出てしまって、それがためにWordStarのキー入力がうまく機能しなかったことがわかりました。
そのことにつきましては[第363回]に書いております。
かなり悪戦苦闘してあれこれ試行錯誤しました結果、そこに行き着きました。
それで、これはもう、オートリピートについては仕方がないのであるがままに受け入れましょうということで、せっかく[第363回]で工夫しましたオートリピートのための対策は反故にしてしまいました。
その結果WordStarは無事動くことになったのですが、さて、そうなりますと、キー入力に関係する部分をしっかりいじくってしまったものですから、せっかく今まで確認してきましたテスト作業をもう一度やって、再確認してみなければちょいと心配です。

そこで[第363回]のテストをもう一度やってみました。
オートリピートの対策を外してしまいましたので、キーを押していても表示が細切れになってしまうのは、それは仕方がありません。
こんな感じです。

Win32APIにGetKeyboardState()など一連のアプリがあってそれを使えばオートリピートが回避できるらしいのでありますが、残念なことにコマンドプロンプトのプログラムではうまく機能してくれません。
Cで唯一使えるkbhit()ではこのオートリピートを回避することはできませんから、これはもうどうしようもありません。

そういうことで、このように切れ切れでみっともないのですけれど、これはもう仕方がありません。
しかし。
問題はその後で発生しました。
[第391回]でテストしましたVFTST0−2を実行しましたところ、[Ctrl]+[S]で一時停止したあと、[Ctrl]+[B]を入力してもブレークできません。
オリジナルのCP/Mでは[Ctrl]+[C]でブレークしますが、[Ctrl]+[C]はZB3BASICでシステムブレークに使っているため、それを使うことができません。
そこで代わりに[Ctrl]+[B]でブレークするようにしてあったはずなのですが、どういうわけかブレークせずに表示が再開されてしまいます。
あれこれいっぱい手直しをしてしまいましたからひょっとしておかしなソースをはめこんでしまったか、と思ってしっかり確認してみたのですが、ファンクション02のプログラムにおかしなところは見当たりません。
ちゃんと[Ctrl]+[S]で一時停止、[Ctrl]+[Q]で表示を再開、[Ctrl]+[B]でブレークするようになっています。
そのほかのキーを入力しても無視することになっています。
しかし。
どのキーを押しても表示が再開されてしまうではありませんか。

うそっ!なぜだっ!

こうなりますと、もう目が血走ってまいります。
Windows側のプログラムにもいっぱい途中にパラメータの出力などをはめこんでデバッグしてみたのですが、謎は深まるばかりです。
むむむ。
面妖な。
こ、これは魔物のしわざに違いない。
うう。
お願いだから、ワタシのパソコンで悪さするのだけは止めてくれませんかねえ。

どうにも納得がいかず、ただ時間だけが無常に過ぎていきます。
お昼ごろからずっとここに釘付けになったまま、はやお日様も西に傾いてしまっています。
結局。
わかったことは、というかわからないことは、どこかわからないところで[Ctrl]+[S]だけがチェックされているらしい、ということです。
それしか他に考えられません。
Windowsの側のプログラムにも、そしてND80ZVの側のプログラムにもそんなわけのわからないところはありません。

さらに追求していきましたところ、ファンクション02で画面表示を行なったあと、「キーの状態をチェックするよりも前に」、[Ctrl]+[S]が受け付けられているらしいことがわかりました。
なぜえ???

あ。あ。あ。
まさか!
でも、ひょっとしたら…!

その、まさか、でありました。

実は。
文字の画面表示にはputc()を使っているのですが、犯人はこいつだったのです。
なんちゅう悪いやっちゃあ。
おかげで貴重な日曜日の半日を費やしてしまったではないかあ。

あ。
私はBorlandC++を使っておりますので、これはコンパイラのせいなのかも知れませんが。
下のソースをコンパイルして、試してみてくださいませ。
[Ctrl]+[S]でポーズして、何か適当なキーを入力すると表示が再開されます。

#include <stdio>
void main(void)
{
        int i;
        while(1){
                for(i=0x21;i<0x5b;i++)putc(i,stdout);
                }
} 

これじゃあどうしようもありません。
ファンクション02で[Ctrl]+[S]を検出するよりも先に、Windowsシステムがそれを検出して横取りなさってしまわれることがわかりましたので、そういうことになりますと[Ctrl]+[S]を使うわけにはいきません。
仕方がありませんから、[Ctrl]+[S]でポーズする代わりに、[Ctrl]+[P]でポーズすることにいたしました。

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

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