標準TTLだけ(!)でCPUをつくろう!(組立てキットです!)
(ホントは74HC、CMOSなんだけど…)
[第577回]

●XPの画面表示のゴミ対策(前回の続きです)

前回、WindowsXPのコマンドプロンプトのプロパティを開いて、画面バッファのサイズ(高さ、H)を25(行)にすることで、改行実行時にゴミが表示されてしまう不具合を回避することができます、と書きました。

Z80BASICを簡単に起動して使うためには、コマンドプロンプトのショートカットをデスクトップ画面に作成して、その作業ディレクトリをZ80BASIC・リモートプログラムを置いたフォルダにしていただくことになりますから、そのショートカットに対してだけ、画面バッファの高さサイズを25行に設定しても、その設定はそれ以外には一切影響を与えません。

アプリケーションによっては、そのための設定がシステム全体に影響してしまって、せっかく自分が使い易いように苦労して設定した環境が変わってしまい、しかもそのアプリケーションを削除しても、設定だけは残ってしまって、イライラさせられることがよくあります。

しかし前回説明しました画面バッファの高さの設定変更は、Z80BASIC・リモートプログラムを置いたフォルダへのショートカットに対してだけ有効ですから、設定を変更しても、その他のシステムに影響を及ぼすことはありません。
最初の一回だけちょっと変更していただくだけですから、この方法が一番いい、と思います。

●設定を変更しないで、なんとかできないものか?

それでいいのですけれど、ちょっと不満が残る、のですよねえ。
なんとなく、面白くない。

確かに、設定を変更して画面バッファの高さサイズを25行にしてしまえば、問題はありません。
しかし、そのように変更が可能であるということを知らなかったためとはいいながら、せっかくそのための対策を用意したのですよ。
もうあと1歩。
最後の80字目だけがクリアできないで残ってしまう、という欠陥について、それを直すことなく、その部分を全部除去してしまうなんて。
いや。
それは、ちょっと、おもしろくないなあ。

せっかく一所懸命改良しようとしてあれこれ考えていたのに、
「あ。キミ。それ、もう考えなくていいよ。そこ。全面削除に決まったから」
って、突然言われてしまったみたいで。
ほんと、おもしろくないなあ。

こういうところが、性格がしつこい、といいますか、諦めが悪いといいますか、どーしようもないところがありまして。
で、あきらめきれずに、しつこく考えた結果、画面サイズを変更することなしに、80字目のゴミをクリアする方法を思いついてしまいました。

問題になっていたのは、こういうことでした。
DOSの画面表示のルールとして、行の最後の80桁目に文字を表示すると、その文字の表示後にカーソルは1行下の1桁目に移動します。
もし、いまカーソルが画面の最下行にあったとして、その最下行の最終桁、80桁目に文字を表示すると、その場合には画面全体が1行上にスクロールして、新しく現れた最下行の1桁目にカーソルが移動します。

Windoes98の場合には、DOSプロンプトに画面バッファの機能はありませんから、画面の最下行で改行を実行するか、最下行の80桁目に文字を表示させると、画面全体が1行上にスクロールして、最下行にはつねに80桁全部がクリアされた行が現れます。

WindowsXPでも普通に画面表示を行っている分には、いま表示されている画面の最下行で改行を実行するか、最下行の80桁目に文字を表示させると、画面全体が1行上にスクロールして、最下行にはつねに80桁全部がクリアされた行が現れます。

ところがWindowsXPでは、カーソルをプログラムで移動する命令、gotoxy()などを使って、画面バッファと画面の表示位置の関係を変更させてしまったあとで、今表示されている画面の最下行で改行を実行するか、最下行の80桁目に文字を表示させると、画面全体が1行上にスクロールして、最下行に画面バッファに残っている以前の表示行が表示されてしまいます。

そこで、そのような場合には、画面の最下行をクリアするために、1行分の空白を表示させたあとで、カーソルポイントを画面の最下行の左端(1桁目)に置くように考えたのです。

ところが、さきほど説明しましたように、画面の最下行をクリアするために80桁の空白を表示させると、最後の80桁目に空白を表示したあとで、カーソルがもう1行下の1桁目に行ってしまうために、画面がもう1行余分にスクロールしてしまいます。
ですから、画面の最下行の80桁目は、クリアしたくてもクリアできません。

というのが、前回までの対策の問題点でした。
画面バッファなんてものがあるために、そういうことになってしまうのです。
しかし。
毒をもって毒を制す。
う。これは表現が悪うございました。

その、邪魔な画面バッファの機能を逆に利用してやろーではないか、というのが今回思いついた方法です。
なに。
思いついてしまえば、じつに簡単なことなのです。

実際のプログラムのその部分をお見せします。
改行を行ったあとの処理部分です。

		 x=wherex();y=wherey();
		 if (y>=25)
			{
			for(i=0;i<80;i++)putc(0x20,stdout);
			y0=y-24;
			gotoxy(x,y0);
			gotoxy(x,y);
			}

スペースコード(0x20)を80個表示させますから、カーソルは1行下に移動して、表示画面はもう1行余分にスクロールしてしまいます。
合計2行上にスクロールして、余計な1行が下に表示されてしまいますから、その表示画面を1行下に戻せばよいのです。
それをやっているのが、
y0=y−24;
gotoxy(x,y0);
です。
y=wherey();の実行によって、yには最初の本来の改行後の画面表示の最下行の画面バッファ内の位置が保存されています。
すると、y0=y−24;を実行すると、y0には、本来の改行後の画面表示の一番上の行の、画面バッファ内の位置が入ることになります。
その行は、空白を80字表示したために余計なスクロールが行われて、表示画面から消えてしまっています。
しかし、gotoxy(x,y0);を実行して、消えてしまった行位置にカーソルを移動することで、表示画面を本来の改行後の表示画面に戻すことができるのです。
[10.8.9注記]このプログラムは正しく機能していないことがわかりました。そのことについては[第578回]で説明をしています。


最下行の右端に残っていたゴミが表示されなくなりました。
2010.8.8upload

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