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

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

[第426回]


●ESCシーケンスをエミュレート

前回WindowsXPではESCシーケンスが使えません、と書きましたところ、長野県のN様からメールをいただきました。
CP/MEmulatorというソフトを動かしてみましたら、ちゃんとエスケープシーケンスが使えました。
だから何か方法があるのではありませんか?
というお尋ねです。

ええ。
きっとそういうお話が出るだろうと思っていました。
あの。
そのCP/MEmulatorはコマンドプロンプトで動いているのではありませんでしょう?
なんたってエミュレータですから何でもエミュレートするように作られているのでしょう。
エスケープシーケンスもエミュレートしているでしょうけれど、だからといって、コマンドプロンプトでエスケープシーケンスを実行しているわけではありませんでしょう。

エミュレートという意味では[第423回]のESC[2Jはエミュレートです。
実際にコマンドプロンプトにESC[2Jを渡しているわけではありません。
カーソル移動のESC=YXもエミュレートです。
[第424回]でWindows98SE上で実行したESC[nmはエミュレートではありません。
ホンモノのエスケープシーケンスです。
でもそれはWindowsXPでは動きませんでした。

Windows98SEで動いただけで、WindowsXPでは動作確認しないで、エスケープシーケンスが使えました、なんて画像つきでホームページに書いてしまいました。
実はWindowsXPでは動きませんでした。ごめんなさい。

いや、いや、いや。
それで終わったんではいささか、といいますか、非常に面白くありません。
もう。ほんとに忙しいのですけれど。
ええ。
面白くありませんから、カラー表示のエスケープシーケンスをエミュレートしてしまいました。

あ。
いまどきですと、たいていはWin32APIでやってしまいますですね。
しかし。
私はかなり抵抗しておりまして。
どうしても必要な場合以外はWin32APIなど使いたくはありません。
できるだけMicrosoft様の呪縛から逃れてフリーでいたいのですよお。

ですので今回のエスケープシーケンスではWin32APIは使っておりません。
何を使ったかといいますと、
TEXTCOLOR()関数とTEXTBACKGROUND()関数です。
使い方はチョー簡単です。
TEXTCOLOR(RED);
とか
TEXTBACKGROUND(BLUE);
だけでいいのです。
ですけれど。
この関数については、日本語のサイトではまず出てきません。
もうみんなかなりWIN32APIに毒されてしまっておりますようで。
英文のサイトで検索すると一発です。
この違いは何なのでしょう?

このように書きますと。
でもWIN32APIを使えばもっと細かい色の指定などが自由にできて、そのほうが便利なのではありませんか?
なんてご批判いただいたりしてしまいます。

いえ。それは違うのですよねえ。
もともとカラー制御など考えていませんでしたし、ましてそれをエスケープシーケンスでやるなどということは全く意識の外でした。
ですので今回はとにかくエスケープシーケンスのエミュレートができればそれでよいのでありまして、はなから詳細なカラー制御ができるようにしようなどとは露ほども考えておりませぬ。

ま。
とにかくそのようにしまして、カラー指定のエスケープシーケンスをZB3DOS.EXEに組み込んでしまいました。

動作テストです。
こちらはZB3BASICです。

Windows7(32bit)のコマンドプロンプトでの実行です。

ほら。この通り。

もちろん。実際にエスケープシーケンスが機能しているわけではありません。
ZB3DOS.EXEがそれをエミュレートしています。

こちらが上で実行しましたBASICプログラムです。

    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);"[44m";
    70 PRINT "BACKGROUNDCOLOR=BLUE  ";
    80 PRINT CHR$($1B);"[30m";
    90 PRINT "COLOR=BLACK  ";
   100 PRINT CHR$($1B);"[47m";
   110 PRINT "BACKGROUNDCOLOR=WHITE  ";
   120 PRINT CHR$($1B);"[31m";
   130 PRINT "COLOR=RED  ";
   140 PRINT CHR$($1B);"[32m";
   150 PRINT "COLOR=GREEN  ";
   160 PRINT CHR$($1B);"[45m";
   170 PRINT "BACKGROUNDCOLOR=MAGENTA  ";
   180 PRINT CHR$($1B);"[33m";
   190 PRINT "COLOR=YELLOW  ";
   200 PRINT CHR$($1B);"[42m";
   210 PRINT "BACKGROUNDCOLOR=GREEN  ";
   220 PRINT CHR$($1B);"[34m";
   230 PRINT "COLOR=BLUE  ";
   240 PRINT CHR$($1B);"[46m";
   250 PRINT "BACKGROUNDCOLOR=CYAN  ";
   260 PRINT CHR$($1B);"[35m";
   270 PRINT "COLOR=MAGENTA  ";
   280 PRINT CHR$($1B);"[43m";
   290 PRINT "BACKGROUNDCOLOR=YELLOW  ";
   300 PRINT CHR$($1B);"[36m";
   310 PRINT "COLOR=CYAN  ";
   320 PRINT CHR$($1B);"[37m";
   330 PRINT "COLOR=WHITE  ";
   340 PRINT CHR$($1B);"[39m";
   350 PRINT "COLOR=STANDARD  ";
   360 PRINT CHR$($1B);"[41m";
   370 PRINT "BACKGROUNDCOLOR=RED  ";
   380 PRINT CHR$($1B);"[49m";
   390 PRINT "BACKGROUNDCOLOR=STANDARD  ";

続いてCP/Mモードでテストです。


CP/Mモードでもこの通りです。


こちらは上で実行しましたESCT3CPMのソースプログラムです。
; ESC[2J clear screen test
;ESC[xm color disp test
;2013/6/23 6/26
;
	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,BGBLUE
	LD C,09
	CALL FCALL
;
	LD E,1B;ESC
	LD C,02
	CALL FCALL
	LD DE,BLACK
	LD C,09
	CALL FCALL
;
	LD E,1B;ESC
	LD C,02
	CALL FCALL
	LD DE,BGWHITE
	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,BGMAGENTA
	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,BGGREEN
	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,BGCYAN
	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,BGYELLOW
	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
;
	LD E,1B;ESC
	LD C,02
	CALL FCALL
	LD DE,STNDRD
	LD C,09
	CALL FCALL
;
	LD E,1B;ESC
	LD C,02
	CALL FCALL
	LD DE,BGRED
	LD C,09
	CALL FCALL
;
	LD E,1B;ESC
	LD C,02
	CALL FCALL
	LD DE,BGSTNDRD
	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
;
BLACK:"[30m"
	"COLO"
	"R"
	DB 3D;=
	"BLAC"
	"K  $"
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  $"
STNDRD:"[39m"
	"COLO"
	"R"
	DB 3D;=
	"STAN"
	"DARD"
	"  $"
BGBLACK:"[40m"
	"BGCO"
	"LOR"
	DB 3D;=
	"BLAC"
	"K  $"
BGRED:"[41m"
	"BGCO"
	"LOR"
	DB 3D;=
	"RED"
	"  $"
BGGREEN:"[42m"
	"BGCO"
	"LOR"
	DB 3D;=
	"GRE"
	"EN  "
	"$"
BGYELLOW:"[43m"
	"BGCO"
	"LOR"
	DB 3D;=
	"YEL"
	"LOW "
	" $"
BGBLUE:"[44m"
	"BGCO"
	"LOR"
	DB 3D;=
	"BLU"
	"E  $"
BGMAGENTA:"[45m"
	"BGCO"
	"LOR"
	DB 3D;=
	"MAG"
	"ENTA"
	"  $"
BGCYAN:"[46m"
	"BGCO"
	"LOR"
	DB 3D;=
	"CYA"
	"N  $"
BGWHITE:"[47m"
	"BGCO"
	"LOR"
	DB 3D;=
	"WHIT"
	"E  $"
BGSTNDRD:"[49m"
	"BGCO"
	"LOR"
	DB 3D;=
	"STAN"
	"DARD"
	"  $"
;

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

2013/6/26  21:3  esct3cpm.txt
END=03C1
              ; ESC[2J clear screen test
              ;ESC[xm color disp test
              ;2013/6/23 6/26
              ;
              	ORG $0100
              	FCALL=$0005
              ;
0100 111F02   	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 113D02   	LD DE,LIST2
0112 0E09     	LD C,09
0114 CD0500   	CALL FCALL
0117 114102   	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 115B03   	LD DE,BGBLUE
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 116802   	LD DE,BLACK
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 119703   	LD DE,BGWHITE
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 117A02   	LD DE,RED
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 118A02   	LD DE,GREEN
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 116E03   	LD DE,BGMAGENTA
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 119C02   	LD DE,YELLOW
0183 0E09     	LD C,09
0185 CD0500   	CALL FCALL
              ;
0188 1E1B     	LD E,1B;ESC
018A 0E02     	LD C,02
018C CD0500   	CALL FCALL
018F 113203   	LD DE,BGGREEN
0192 0E09     	LD C,09
0194 CD0500   	CALL FCALL
              ;
0197 1E1B     	LD E,1B;ESC
0199 0E02     	LD C,02
019B CD0500   	CALL FCALL
019E 11AF02   	LD DE,BLUE
01A1 0E09     	LD C,09
01A3 CD0500   	CALL FCALL
              ;
01A6 1E1B     	LD E,1B;ESC
01A8 0E02     	LD C,02
01AA CD0500   	CALL FCALL
01AD 118403   	LD DE,BGCYAN
01B0 0E09     	LD C,09
01B2 CD0500   	CALL FCALL
              ;
01B5 1E1B     	LD E,1B;ESC
01B7 0E02     	LD C,02
01B9 CD0500   	CALL FCALL
01BC 11C002   	LD DE,MAGENTA
01BF 0E09     	LD C,09
01C1 CD0500   	CALL FCALL
              ;
01C4 1E1B     	LD E,1B;ESC
01C6 0E02     	LD C,02
01C8 CD0500   	CALL FCALL
01CB 114603   	LD DE,BGYELLOW
01CE 0E09     	LD C,09
01D0 CD0500   	CALL FCALL
              ;
01D3 1E1B     	LD E,1B;ESC
01D5 0E02     	LD C,02
01D7 CD0500   	CALL FCALL
01DA 11D402   	LD DE,CYAN
01DD 0E09     	LD C,09
01DF CD0500   	CALL FCALL
              ;
01E2 1E1B     	LD E,1B;ESC
01E4 0E02     	LD C,02
01E6 CD0500   	CALL FCALL
01E9 11E502   	LD DE,WHITE
01EC 0E09     	LD C,09
01EE CD0500   	CALL FCALL
              ;
01F1 1E1B     	LD E,1B;ESC
01F3 0E02     	LD C,02
01F5 CD0500   	CALL FCALL
01F8 11F702   	LD DE,STNDRD
01FB 0E09     	LD C,09
01FD CD0500   	CALL FCALL
              ;
0200 1E1B     	LD E,1B;ESC
0202 0E02     	LD C,02
0204 CD0500   	CALL FCALL
0207 112003   	LD DE,BGRED
020A 0E09     	LD C,09
020C CD0500   	CALL FCALL
              ;
020F 1E1B     	LD E,1B;ESC
0211 0E02     	LD C,02
0213 CD0500   	CALL FCALL
0216 11AB03   	LD DE,BGSTNDRD
0219 0E09     	LD C,09
021B CD0500   	CALL FCALL
021E C9       	RET
              ;
021F 2A2A2A20 LIST1:"*** "
0223 45534320 	"ESC "
0227 636C6561 	"clea"
022B 72207363 	"r sc"
022F 7265656E 	"reen"
0233 20746573 	" tes"
0237 74202A2A 	"t **"
023B 2A24     	"*$"
023D 5B324A24 LIST2:"[2J$"
0241 2A2A2A20 LIST3:"*** "
0245 4553435B 	"ESC["
0249 324A20   	"2J "
024C 636C6561 	"clea"
0250 72207363 	"r sc"
0254 7265656E 	"reen"
0258 20746573 	" tes"
025C 7420656E 	"t en"
0260 64202A2A 	"d **"
0264 2A       	"*"
0265 0D       	DB 0D
0266 0A       	DB 0A
0267 24       	DB 24
              ;
0268 5B33306D BLACK:"[30m"
026C 434F4C4F 	"COLO"
0270 52       	"R"
0271 3D       	DB 3D;=
0272 424C4143 	"BLAC"
0276 4B202024 	"K  $"
027A 5B33316D RED:"[31m"
027E 434F4C4F 	"COLO"
0282 52       	"R"
0283 3D       	DB 3D;=
0284 524544   	"RED"
0287 202024   	"  $"
028A 5B33326D GREEN:"[32m"
028E 434F4C4F 	"COLO"
0292 52       	"R"
0293 3D       	DB 3D;=
0294 475245   	"GRE"
0297 454E2020 	"EN  "
029B 24       	"$"
029C 5B33336D YELLOW:"[33m"
02A0 434F4C4F 	"COLO"
02A4 52       	"R"
02A5 3D       	DB 3D;=
02A6 59454C   	"YEL"
02A9 4C4F5720 	"LOW "
02AD 2024     	" $"
02AF 5B33346D BLUE:"[34m"
02B3 434F4C4F 	"COLO"
02B7 52       	"R"
02B8 3D       	DB 3D;=
02B9 424C55   	"BLU"
02BC 45202024 	"E  $"
02C0 5B33356D MAGENTA:"[35m"
02C4 434F4C4F 	"COLO"
02C8 52       	"R"
02C9 3D       	DB 3D;=
02CA 4D4147   	"MAG"
02CD 454E5441 	"ENTA"
02D1 202024   	"  $"
02D4 5B33366D CYAN:"[36m"
02D8 434F4C4F 	"COLO"
02DC 52       	"R"
02DD 3D       	DB 3D;=
02DE 435941   	"CYA"
02E1 4E202024 	"N  $"
02E5 5B33376D WHITE:"[37m"
02E9 434F4C4F 	"COLO"
02ED 52       	"R"
02EE 3D       	DB 3D;=
02EF 57484954 	"WHIT"
02F3 45202024 	"E  $"
02F7 5B33396D STNDRD:"[39m"
02FB 434F4C4F 	"COLO"
02FF 52       	"R"
0300 3D       	DB 3D;=
0301 5354414E 	"STAN"
0305 44415244 	"DARD"
0309 202024   	"  $"
030C 5B34306D BGBLACK:"[40m"
0310 4247434F 	"BGCO"
0314 4C4F52   	"LOR"
0317 3D       	DB 3D;=
0318 424C4143 	"BLAC"
031C 4B202024 	"K  $"
0320 5B34316D BGRED:"[41m"
0324 4247434F 	"BGCO"
0328 4C4F52   	"LOR"
032B 3D       	DB 3D;=
032C 524544   	"RED"
032F 202024   	"  $"
0332 5B34326D BGGREEN:"[42m"
0336 4247434F 	"BGCO"
033A 4C4F52   	"LOR"
033D 3D       	DB 3D;=
033E 475245   	"GRE"
0341 454E2020 	"EN  "
0345 24       	"$"
0346 5B34336D BGYELLOW:"[43m"
034A 4247434F 	"BGCO"
034E 4C4F52   	"LOR"
0351 3D       	DB 3D;=
0352 59454C   	"YEL"
0355 4C4F5720 	"LOW "
0359 2024     	" $"
035B 5B34346D BGBLUE:"[44m"
035F 4247434F 	"BGCO"
0363 4C4F52   	"LOR"
0366 3D       	DB 3D;=
0367 424C55   	"BLU"
036A 45202024 	"E  $"
036E 5B34356D BGMAGENTA:"[45m"
0372 4247434F 	"BGCO"
0376 4C4F52   	"LOR"
0379 3D       	DB 3D;=
037A 4D4147   	"MAG"
037D 454E5441 	"ENTA"
0381 202024   	"  $"
0384 5B34366D BGCYAN:"[46m"
0388 4247434F 	"BGCO"
038C 4C4F52   	"LOR"
038F 3D       	DB 3D;=
0390 435941   	"CYA"
0393 4E202024 	"N  $"
0397 5B34376D BGWHITE:"[47m"
039B 4247434F 	"BGCO"
039F 4C4F52   	"LOR"
03A2 3D       	DB 3D;=
03A3 57484954 	"WHIT"
03A7 45202024 	"E  $"
03AB 5B34396D BGSTNDRD:"[49m"
03AF 4247434F 	"BGCO"
03B3 4C4F52   	"LOR"
03B6 3D       	DB 3D;=
03B7 5354414E 	"STAN"
03BB 44415244 	"DARD"
03BF 202024   	"  $"
              ;
BGBLACK      =030C  BGBLUE       =035B  BGCYAN       =0384  
BGGREEN      =0332  BGMAGENTA    =036E  BGRED        =0320  
BGSTNDRD     =03AB  BGWHITE      =0397  BGYELLOW     =0346  
BLACK        =0268  BLUE         =02AF  CYAN         =02D4  
FCALL        =0005  GREEN        =028A  LIST1        =021F  
LIST2        =023D  LIST3        =0241  MAGENTA      =02C0  
RED          =027A  STNDRD       =02F7  WHITE        =02E5  
YELLOW       =029C  

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

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