復活!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
前へ
次へ
ホームページトップへ戻る