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

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

[第424回]


●(12)エスケープシーケンスに対応

前回書きましたようにエスケープシーケンスはもともとOSの機能ではなくて、端末の機能です。
表示端末がエスケープシーケンスの機能を備えていればそのように画面に表示されますし、その機能をもっていない端末ではただの文字としか表示されません。
ここのところが一番肝心なところです。

実は毎度のことながら、はなからDOSプロンプト(コマンドプロンプト)にはエスケープシーケンスの機能は無いものと思い込んでおりました。
そこでWordStarでその一部の機能が必要であることがわかったときも、迷うことなく「エスケープシーケンスを使うことなく」その機能を作ってしまいました([第397回])。
見かけ上はESC=YX(注)と入力することでカーソルが移動しますが、実はZB3DOS.EXEがその文字列を検知し解析してカーソルをその座標に移動するようにプログラムしてあるのです。
つまり実のところエスケープシーケンスは使っておりません。

(注)実際のプログラムではESCは文字コード1BH、Y、Xは画面のY座標、X座標を示す文字です。
Y、Xは座標値に20Hを加算した値を使います。
たとえば左上隅(1,1)にカーソルを移動するには、普通の文字を画面に表示するときと同じ要領で、
1B,3D,21,21の4バイトを出力します。
CP/MやZB3BASICでは1BHを示す文字はありませんから、そのまま16進数(または10進数)を文字コードとして出力します。その後ろの3文字は16進数のまま文字コードとして出力するかまたは、=!!と出力します。

前回はESC=YXに加えて、画面クリアの機能としてESC[2Jにも対応するようにプログラムを変更しました。
上で説明しましたように、ESC=YXもESC[2JもZB3DOS.EXEが内部でその文字列を解析してそのような動作をしているので、実際には「本当の」エスケープシーケンスは使っておりません。
それだけではなくて、今までのZB3DOSではそれ以外のエスケープシーケンスをND80ZV(ND80Z3.5)から受け取っても、そのままそれをエスケープシーケンスとしてDOSプロンプト(コマンドプロンプト)に渡すようにはプログラムしてありませんでした。

これも前回少しだけ書きましたように、どのみちWindows7ではそれはただのゴミとしか受けてくれません。
しかし。
今回N様とH様からご質問のメールをいただいて、あらためて調べてみましたら、WindowsXPとWindows98では、必要な設定さえすれば、エスケープシーケンスが使えるらしいということがわかりました。
そういうことならば。
ZB3DOSはESC=YXとESC[2J以外のエスケープシーケンスを受け取った場合には、何も加工しないでそのままDOSプロンプト(コマンドプロンプト)にそれを引き渡すようにすれば、結果的にエスケープシーケンスが使えることになるのではないか?

そのように考えましたので、ZB3DOSをそのようにしてしまいました。
で。
その結果をWindows98SEで確かめました。
WindowsXPでは確認しておりません。
WindowsXPはこのところずっと起動しておりません。
マルチOSとして1台のパソコンのWindows98SEの裏に置いたままになっておりまして、ずっと使っておりませんので、今は少々面倒なのです。
ですのでWindowsXPにつきましては、WindowsXPをお持ちの皆様にご確認いただければ、と思います。
あ。
Windows7では確認いたしまして、駄目という結果が出ております。
ということで、以下はWindows98SEでの検証です。

まずはデフォルトでのテストを行ないます。
ZB3BASICでPRINT文を使ってエスケープシーケンスを記述しました。


下はそのプログラムリストです。

    10 A=0
    20 PRINT "***  ESC clear screen test  ***"
    30 PRINT CHR$($1B);"[2J"
    40 PRINT "***  ESC[2J clear screen test end  ***"
    50 PRINT "**   ESC[nm color test  ***"
    60 PRINT CHR$($1B);"[31m";
    70 PRINT "COLOR=RED  ";
    80 PRINT CHR$($1B);"[32m";
    90 PRINT "COLOR=GREEN  ";
   100 PRINT CHR$($1B);"[33m";
   110 PRINT "COLOR=YELLOW  ";
   120 PRINT CHR$($1B);"[34m";
   130 PRINT "COLOR=BLUE  ";
   140 PRINT CHR$($1B);"[35m";
   150 PRINT "COLOR=MAGENTA  ";
   160 PRINT CHR$($1B);"[36m";
   170 PRINT "COLOR=CYAN  ";
   180 PRINT CHR$($1B);"[37m";
   190 PRINT "COLOR=WHITE"


上のプログラムをデフォルトの設定のままで実行すると下の画面になります。


それではどこをどのように設定するのかといいますと、Windows98ではCドライブにあるConfig.sysに次の行を書き加えます。
device=C:¥WINDOWS¥COMMAND¥ansi.sys

変更はメモ帳でもできますが、慣れない方は事前にデスクトップなどにコピーしてバックアップを保存しておくことをおすすめします。
ファイルを書き換えたあと拡張子がTXTになっていないことをよく確認してください。
TXTになってしまっていたら、Config.sysに名前を変更してください。
下はそのように変更したWindows98SEのConfig.sysです。
ここではdevicehigh=になっています。


Windows98の場合には一旦再起動しないと変更は反映されません。
さて。
再起動後はどうなりますでしょうか?
先程と同じプログラムを同じように実行してみました。

わおぅ!
ちょいと感動です。

今度はCP/Mモードでも同じことをやってみました。
こちらはソースプログラムです。
もうちっとらしいプログラムにしたいところなのですが、なにしろ時間がありません。
もう力技です。

; ESC[2J clear screen test
;2013/6/23
;
	ORG $0100
	FCALL=$0005
;
	LD DE,LIST1
	LD C,09
	CALL FCALL
	LD E,1B;ESC
	LD C,02
	CALL FCALL
	LD DE,LIST2
	LD C,09
	CALL FCALL
	LD DE,LIST3
	LD C,09
	CALL FCALL
	LD E,1B;ESC
	LD C,02
	CALL FCALL
	LD DE,RED
	LD C,09
	CALL FCALL
	LD E,1B;ESC
	LD C,02
	CALL FCALL
	LD DE,GREEN
	LD C,09
	CALL FCALL
	LD E,1B;ESC
	LD C,02
	CALL FCALL
	LD DE,YELLOW
	LD C,09
	CALL FCALL
	LD E,1B;ESC
	LD C,02
	CALL FCALL
	LD DE,BLUE
	LD C,09
	CALL FCALL
	LD E,1B;ESC
	LD C,02
	CALL FCALL
	LD DE,MAGENTA
	LD C,09
	CALL FCALL
	LD E,1B;ESC
	LD C,02
	CALL FCALL
	LD DE,CYAN
	LD C,09
	CALL FCALL
	LD E,1B;ESC
	LD C,02
	CALL FCALL
	LD DE,WHITE
	LD C,09
	CALL FCALL
	RET
;
LIST1:"*** "
	"ESC "
	"clea"
	"r sc"
	"reen"
	" tes"
	"t **"
	"*$"
LIST2:"[2J$"
LIST3:"*** "
	"ESC["
	"2J "
	"clea"
	"r sc"
	"reen"
	" tes"
	"t en"
	"d **"
	"*"
	DB 0D
	DB 0A
	DB 24
;
RED:"[31m"
	"COLO"
	"R"
	DB 3D;=
	"RED"
	"  $"
GREEN:"[32m"
	"COLO"
	"R"
	DB 3D;=
	"GRE"
	"EN  "
	"$"
YELLOW:"[33m"
	"COLO"
	"R"
	DB 3D;=
	"YEL"
	"LOW "
	" $"
BLUE:"[34m"
	"COLO"
	"R"
	DB 3D;=
	"BLU"
	"E  $"
MAGENTA:"[35m"
	"COLO"
	"R"
	DB 3D;=
	"MAG"
	"ENTA"
	"  $"
CYAN:"[36m"
	"COLO"
	"R"
	DB 3D;=
	"CYA"
	"N  $"
WHITE:"[37m"
	"COLO"
	"R"
	DB 3D;=
	"WHIT"
	"E"
	DB 0D
	DB 0A
	DB 24
;

こちらはアセンブルリストです。

2013/6/23  16:49  esct2cpm.txt
END=024E
              ; ESC[2J clear screen test
              ;2013/6/23
              ;
              	ORG $0100
              	FCALL=$0005
              ;
0100 118901   	LD DE,LIST1
0103 0E09     	LD C,09
0105 CD0500   	CALL FCALL
0108 1E1B     	LD E,1B;ESC
010A 0E02     	LD C,02
010C CD0500   	CALL FCALL
010F 11A701   	LD DE,LIST2
0112 0E09     	LD C,09
0114 CD0500   	CALL FCALL
0117 11AB01   	LD DE,LIST3
011A 0E09     	LD C,09
011C CD0500   	CALL FCALL
011F 1E1B     	LD E,1B;ESC
0121 0E02     	LD C,02
0123 CD0500   	CALL FCALL
0126 11D201   	LD DE,RED
0129 0E09     	LD C,09
012B CD0500   	CALL FCALL
012E 1E1B     	LD E,1B;ESC
0130 0E02     	LD C,02
0132 CD0500   	CALL FCALL
0135 11E201   	LD DE,GREEN
0138 0E09     	LD C,09
013A CD0500   	CALL FCALL
013D 1E1B     	LD E,1B;ESC
013F 0E02     	LD C,02
0141 CD0500   	CALL FCALL
0144 11F401   	LD DE,YELLOW
0147 0E09     	LD C,09
0149 CD0500   	CALL FCALL
014C 1E1B     	LD E,1B;ESC
014E 0E02     	LD C,02
0150 CD0500   	CALL FCALL
0153 110702   	LD DE,BLUE
0156 0E09     	LD C,09
0158 CD0500   	CALL FCALL
015B 1E1B     	LD E,1B;ESC
015D 0E02     	LD C,02
015F CD0500   	CALL FCALL
0162 111802   	LD DE,MAGENTA
0165 0E09     	LD C,09
0167 CD0500   	CALL FCALL
016A 1E1B     	LD E,1B;ESC
016C 0E02     	LD C,02
016E CD0500   	CALL FCALL
0171 112C02   	LD DE,CYAN
0174 0E09     	LD C,09
0176 CD0500   	CALL FCALL
0179 1E1B     	LD E,1B;ESC
017B 0E02     	LD C,02
017D CD0500   	CALL FCALL
0180 113D02   	LD DE,WHITE
0183 0E09     	LD C,09
0185 CD0500   	CALL FCALL
0188 C9       	RET
              ;
0189 2A2A2A20 LIST1:"*** "
018D 45534320 	"ESC "
0191 636C6561 	"clea"
0195 72207363 	"r sc"
0199 7265656E 	"reen"
019D 20746573 	" tes"
01A1 74202A2A 	"t **"
01A5 2A24     	"*$"
01A7 5B324A24 LIST2:"[2J$"
01AB 2A2A2A20 LIST3:"*** "
01AF 4553435B 	"ESC["
01B3 324A20   	"2J "
01B6 636C6561 	"clea"
01BA 72207363 	"r sc"
01BE 7265656E 	"reen"
01C2 20746573 	" tes"
01C6 7420656E 	"t en"
01CA 64202A2A 	"d **"
01CE 2A       	"*"
01CF 0D       	DB 0D
01D0 0A       	DB 0A
01D1 24       	DB 24
              ;
01D2 5B33316D RED:"[31m"
01D6 434F4C4F 	"COLO"
01DA 52       	"R"
01DB 3D       	DB 3D;=
01DC 524544   	"RED"
01DF 202024   	"  $"
01E2 5B33326D GREEN:"[32m"
01E6 434F4C4F 	"COLO"
01EA 52       	"R"
01EB 3D       	DB 3D;=
01EC 475245   	"GRE"
01EF 454E2020 	"EN  "
01F3 24       	"$"
01F4 5B33336D YELLOW:"[33m"
01F8 434F4C4F 	"COLO"
01FC 52       	"R"
01FD 3D       	DB 3D;=
01FE 59454C   	"YEL"
0201 4C4F5720 	"LOW "
0205 2024     	" $"
0207 5B33346D BLUE:"[34m"
020B 434F4C4F 	"COLO"
020F 52       	"R"
0210 3D       	DB 3D;=
0211 424C55   	"BLU"
0214 45202024 	"E  $"
0218 5B33356D MAGENTA:"[35m"
021C 434F4C4F 	"COLO"
0220 52       	"R"
0221 3D       	DB 3D;=
0222 4D4147   	"MAG"
0225 454E5441 	"ENTA"
0229 202024   	"  $"
022C 5B33366D CYAN:"[36m"
0230 434F4C4F 	"COLO"
0234 52       	"R"
0235 3D       	DB 3D;=
0236 435941   	"CYA"
0239 4E202024 	"N  $"
023D 5B33376D WHITE:"[37m"
0241 434F4C4F 	"COLO"
0245 52       	"R"
0246 3D       	DB 3D;=
0247 57484954 	"WHIT"
024B 45       	"E"
024C 0D       	DB 0D
024D 0A       	DB 0A
024E 24       	DB 24
              ;
BLUE         =0207  CYAN         =022C  FCALL        =0005  
GREEN        =01E2  LIST1        =0189  LIST2        =01A7  
LIST3        =01AB  MAGENTA      =0218  RED          =01D2  
WHITE        =023D  YELLOW       =01F4  


上のプログラムをZドライブにCOPYして拡張子をCOMに変えました。
いよいよ実行です。


ZB3BASICと同じ結果が得られました。
もう一度、わおぅ!


●WindowsXPの場合

上でも書きましたように、WindowsXPでは試していませんが、ネットでの情報によりますと、WindowsXPでも出来るようです。
WindowsXPの場合には、Config.sysではなくて、C:¥Windows¥System32¥Config.ntを編集します。
その要領はWindows98の場合と同じです。
Config.ntに次の行を書き加えます(と、よそのページに書いてありました)。

device=%SystemRoot%¥system32¥ANSI.SYS

書き換え後再起動が必要なのかどうか、皆様で確認してみてください。
それはそうと、こういうことを体験してしまいますと、ちょいと皮肉でありますが、Windowsはだんだんと不便なものになってきているようですねえ。
ますますWindows98SEが手放せませんです。
ええ。
もう家宝のようなものです。

それに比べますと、Windows7は…。
まあ、確かに便利なところも多々ありますけれど。
こういう肝心なところで、ええーっ、できないのぉ?
となってしまうことが時折ありまして…。
困ったものですなあ。

さて。Windows8となりますと…推して知るべし、でありましょお。

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

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