復活!CP/M ワンボードマイコンでCP/Mを!
CP/MがTK−80互換のワンボードマイコンの上で復活します
ND80ZVとMYCPU80の上でCP/Mが走ります!
[第423回]
●(9)WordStarでカレントディスクが変更できません
また間が空いての更新になってしまいました。
次から次へとよくもまあと呆れるといいますか、めげてしまうほど問題が出てくるものですから、その対策のために時間を取られてしまって、結局ホームページの更新は後回しになってしまいます。
今回もまた長野県のN様からのメールです。
やっとのことでなんとかWordStarも動くようになったのですが、なんとなくどこかがまだおかしいように感じておりました。
ただ私は実際にWordStarは使ったことがないものですから、どこがどのようにおかしいのかよくわかりません。
長野県のN様からのメールによりますと、Lコマンドでカレントディスクを変更しても編集コマンドDや実行コマンドRを使うともとのドライブに戻ってしまうとのご指摘です。
メールで指示いただいた通りに操作してみましたら、確かにご指摘の通りです。
どうもカレントディスクの設定手続きに問題があるようです。
これはかなり大ごとでありました。
どこがおかしいのかという追求と、その結果どこをどのように直すべきかというあたりをつかんで、実際にプログラムを修正するのにほぼ2日間かかってしまいました。
やはりカレントドライブの扱いにアナがあったことがわかり、ZBDOSのファイル関連(OPEN、CLOSE、READ、WRITEなど)を大幅に書き直すことになってしまいました。
なかなかにしんどい作業ではありましたが、しかし、私ひとりで検証しておりましたら、このようなバグは到底見つけ出せなかったと思います。
これもひとえに実に熱心に検証をしてくださっております長野県のN様、大分県のH様のご協力のお蔭と感謝いたしております。
まことに有難いことです。
やっとのことで修正を完了しましたZB3DOSプログラムをN様にお送りしましたところ、ほどなくN様から「WordStar
がうまく動くようになりました」というメールが届きました。
やっとこれでZB3DOSの当面のデバッグも完了か、とほっと一息ついたのでありますが…。
●(10)CLSがうまく働きません
N様からは続けてメールが届きました。
ZB3DOSではエスケープシーケンスは使えないのですか?
プログラムを作っていて画面クリアができないので苦労しています。
というメールでした。
エスケープシーケンスはESCコード(1BH)に続いて何文字かの文字コードを組み合わせることで、主に画面制御などの特殊な働きをディスプレイ端末に行なわせるもので、たとえばカーソルの位置制御とか文字種、色の表示などを指定することができました(プリンタに対しても特殊な働きを指定することができました)。
しかしそれは昔のお話でWindowsの時代になりましてからは、ほとんど過去のものになってしまいました。
WindowsのDOSプロンプト(コマンドプロンプト)ではデフォルトの設定ではエスケープシーケンスは働きません。
このことにつきましては後ほどまた詳しく説明をいたします。
もともとエスケープシーケンスは直接CP/Mに関わる機能ということではなく、CP/Mをインストールするシステムのハードウェアのもつ機能ということになりますから、それはZB3DOS(CP/M互換DOS)の範囲外の機能であるということになります。
でありますから、当初からZB3DOS(CP/M互換DOS)の機能としてはエスケープシーケンスは全く考慮しておりませんでした。
しかしWordStarを何とか動くようにしてみよう、という作業のなかでカーソル位置指定のためのエスケープシーケンスESC=YXだけはどうしても必要であることがわかりました。
それがないとWordStarの画面表示がぐちゃぐちゃになってしまいます。
そこでESC=YXだけはZB3DOS(CP/M互換DOS)の機能としてその働きをプログラムで行なわせるようにしました。
ESC=YXは[第397回]で説明をしています。
そういうことですから、ZB3DOS(CP/M互換DOS)ではそのほかのエスケープシーケンスは働きません。
N様には申し訳ありませんが、ここまで来るまでにたっぷり時間がかかってしまっていますから、このうえエスケープシーケンスにまで対応するというのは、ちょいと無理です。
あしからずご了承を、というメールを書こうとしまして、ふと、そういえばZB3BASICには画面クリア命令としてCLSがあったっけ、と余計なことを思い出してしまいました。
実はこのCLS命令、コマンドの/CLSというのもあるのですが、ともにND80ZV(ND80Z3.5)のZB3BASIC操作説明書からは落ちてしまっていました。
ZB3BASICを起動して>が表示されているときに
>/CLS[Enter]
と入力すると画面がクリアされます。
一方BASICプログラムの中で
10 CLS
のように使うことで、プログラム実行中に画面をクリアすることができます。
のはずだったのですが…。
その使用例を記事に書こうと思いまして、簡単なプログラムを書いて実行してみましたら。
あれま。
プログラムの動きがおかしくなってしまいました。
むむ。
バグがある…。
ということで、またもや今度はZB3BASICのCLS命令のバグ取り作業をすることになってしまいました。
やっとのことでまともに動くようになったZB3BASICのCLS命令の実行例です。
こちらは実行前、プログラムをLIST表示させたところです。
こちらが実行後の画面です。
●(11)画面クリアのエスケープシーケンスも組込みました
そうこうしておりましたら、今度は大分県のH様からメールが届きました。
やっぱりこちらもエスケープシーケンスについてのお尋ねです。
エスケープシーケンスがうまく機能していないようですが、ZB3DOSのエスケープシーケンスはANSIでしょうか?
画面の色表示については何も説明がありませんが、色の表示はできますでしょうか?
上にも書きましたように、エスケープシーケンスにつきましてはZB3DOSの守備範囲外ということで逃げてしまうつもりでおりましたが。
考えてみましたら、N様、H様が熱心にご協力していただきましたればこそ、ZB3DOSのデバッグができたことに間違いはありません。
私ひとりではとてもこれだけ沢山のバグは見つけ出せませんでしたでしょう。
間違いなくN様、H様のご協力の賜物であります。
そのお二人からそろってエスケープシーケンスについてお尋ねをいただいてしまいましたからには、いや、これはとても逃げてはおれませんでしょう。
覚悟を決めました。
そこで。
画面クリアのエスケープシーケンスもプログラムで実行できるようにしてしまいました。
画面クリアのエスケープシーケンスは
ESC[2J
です。
下はESC[2Jで画面クリアをする簡単なテストプログラムです。
しかしWindowsのDOSプロンプト(コマンドプロンプト)で普通にこれを実行しても、この画面のようになってしまい、画面クリアはできません。
Windows98やWindowsXPではDOSプロンプト(コマンドプロンプト)でエスケープシーケンスを扱うためにはConfig.sysまたはConfig.ntにそのための記述が必要です。
しかしそのようにしてもWindows7ではやはり実行できません。
そこで今回はそのような設定の変更をすることなくESC[2Jの画面出力で画面クリアをするようにZB3DOS.EXEをプログラム変更しました。
下はそのように変更したZB3DOSを起動して、上と同じプログラムを実行した結果の画面です。
30行のPRINT文でESC(1BH)と[2Jを画面に表示すると、それが画面クリアとして働いていることがわかります。
あ。
今気が付きました。
ここは
30 PRINT CHR$($1B);”[2J”;
とすべきでした。
最後に ; が無いために画面クリア後に1行改行されてしまいました。
こちらは同じことを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 RET ; LIST1:"*** " "ESC " "clea" "r sc" "reen" " tes" "t **" "*$" LIST2:"[2J$" LIST3:"*** " "ESC[" "2J " "clea" "r sc" "reen" " tes" "t en" "d **" "*$" ; |
2013/6/23 11:53 esccls.txt END=0166 ; ESC[2J clear screen test ;2013/6/23 ; ORG $0100 FCALL=$0005 ; 0100 112001 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 113E01 LD DE,LIST2 0112 0E09 LD C,09 0114 CD0500 CALL FCALL 0117 114201 LD DE,LIST3 011A 0E09 LD C,09 011C CD0500 CALL FCALL 011F C9 RET ; 0120 2A2A2A20 LIST1:"*** " 0124 45534320 "ESC " 0128 636C6561 "clea" 012C 72207363 "r sc" 0130 7265656E "reen" 0134 20746573 " tes" 0138 74202A2A "t **" 013C 2A24 "*$" 013E 5B324A24 LIST2:"[2J$" 0142 2A2A2A20 LIST3:"*** " 0146 4553435B "ESC[" 014A 324A20 "2J " 014D 636C6561 "clea" 0151 72207363 "r sc" 0155 7265656E "reen" 0159 20746573 " tes" 015D 7420656E "t en" 0161 64202A2A "d **" 0165 2A24 "*$" ; FCALL =0005 LIST1 =0120 LIST2 =013E LIST3 =0142 |