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

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

[第421回]


●SUBMIT

SUBMITはバッチコマンドです。
ZB3DOS(CP/M互換DOS)のバグ取りにご協力いただいております大分県のH様、長野県のN様からSUBMITが使えませんというメールをいただいておりました。
私もSUBMITを使ってみて、全く反応がないことを確認しております。
結論から先に書いてしまいますと、ZB3DOSではバッチ処理についてはSUBMITの代わりに前回も説明いたしました/BATを使っていただくようにお願いいたします。

互換性ということからしますと、それはちょいと面白くないのではないか?
ええ。私としましてもできることならSUBMITも使えるようにしたいと思いましたです。
ですが。
互換性と利便性、実用性を秤にかけますと、そういう結論になってしまいました。

もうプログラムサイズが限界なのです。
それにこのところバグ取りにずいぶん時間を費やしてしまいました。
ここでSUBMITが使えるようにしようと考えますと、おそらくまたさらに何日間かを犠牲にしなくてはなりません。
勿論、そうするだけの価値なり必要性がありましたならば、それはさらに何日かを犠牲にしましても、そうすべきでありましょう。

しかし。
SUBMITについては、そこまでする必要がありましょうや?

私としましては自画自賛ですけれど、SUBMITよりも/BATのほうがはるかに使いやすく、かつ優れていると考えております。
たとえSUBMITの機能を使えるようにしたとしましても、おそらくその出番はない、と思います。
/BATにつきましては、大分県のH様がトランジェントコマンドの評価テストに活用していただいてそのログファイルをいくつかお送りいただいておりますので、後ほど参考例としてご紹介させていただきます。

そういう理由でSUBMITは使えませんが、ただ使えませんというだけでは、なんとなくすっきりしないものが残ります。
何か互換性に欠けるところがあるのではないか?
それで使えないのだろう。
なんて邪推したくなってしまいます。

しかしSUBMITに限っては通常のプログラムの互換性の問題から使えないというのではなくて、あくまでSUBMIT固有の問題なのです。
もっと具体的にいいますと、それはBIOSやBDOSの機能ではなくて、CCPの機能なのです。
そのあたりを納得していただくために、ごく簡単にSUBMITの仕組みを説明することにいたします。

SUBMITもPIPやSTATなどと同じようにトランジェントコマンドです。
SUBMITを使うためには、あらかじめバッチ処理の手続きを記述したバッチファイルを用意します。
バッチファイルは拡張子がSUBのファイルですが、中身はテキストファイルです。
仮にそのバッチファイルをABC.SUBとします。

バッチ処理を実行するには
SUBMIT ABC[Enter]
と入力します。
すると。
なにごともなく処理は終了してしまいます。

実はこのとき、バッチ処理のための一時ファイル$$$.SUBが作られます。
$$$.SUBの中身もテキストファイルですが、ちょっと特殊なファイルです。
もとのバッチファイルABC.SUBの1行を1レコード(128バイト)に割り当ててファイルが作られます。
さらに特殊なのは、元のバッチファイルとは順番が全く逆で、ファイルの最後のレコードから前に向かって1行ずつが割り当てられたファイルになっていることです。

さて、そこからがCCPの出番です。
コマンドの処理が終了するたびに、次のコマンドをコンソールから入力するために、必ずCCPの先頭に戻ってきます。
CP/MのCCPでは、このとき常にまず$$$.SUBの有無をチェックします。
そして$$$.SUBをみつけると、その最後のレコードを読み込んで、コンソール入力バッファにコピーします。
その後$$$.SUBの最後のレコードを削除します。

こうすることによって、$$$.SUBの最後のレコードには常に次に実行すべきコマンド行が書かれていることになります。
さすがにCP/Mの開発者は只者ではありませんでした。
なかなかに巧妙なアイデアでちょっと普通では思いつかないようなテクニックです。

それはともかく、そのようにしてバッチファイルに書かれていたコマンド行の1行がコンソールバッファに入れられてリターンしますから、CCPはそれを普通にコンソールから入力されたコマンドと同じように実行します。
その処理が終わってCCPの先頭に戻ってくると、そこでまた$$$.SUBがチェックされ、最後のレコード(つまり次に実行されるコマンドが書かれたレコード)がコンソールバッファにコピーされ、それがまた実行されます。
そのようにして$$$.SUBの最後のレコードが実行されてしまうと$$$.SUBは空になりますから、そこで削除されてバッチ処理は終了します。

ざっと簡単に説明しますと、そういう処理なので、これをZB3DOSのもとで実行できるようにするためには、ZCCPで最初に$$$.SUBをチェックして、それがあればその最後のレコードをコンソール入力バッファにコピーするとともに$$$.SUBの最後のレコードを削除するようにプログラムを書き換えなくてはなりません。

そのように書けば簡単なようですが、実際にプログラムにするとある程度のサイズの処理になります。
上にも書きましたように、もうそれだけのサイズを追加する余地が残っていないのです。
それにバッチ処理を中止するための手続きは今までまったく想定していませんでしたから、それができるようにしようとすると、また全部ひっくり返さなくてはなりません。

ZB3DOSでSUBMITが使えません、というのはそういう理由からなのです。
ですので$$$.SUBを読み込んで、そのレコードを後ろから1レコードずつコンソール入力バッファにコピーする、というところはプログラムしてありませんが、SUBMITコマンドそのものは正しく実行されます。

試しに適当なバッチ処理ファイルを作成して、そのファイルに対してSUBMITを実行してみてください。
実行後に$$$.SUBが作成されることが確認できます。
その$$$.SUBの中身をVFDUMPで確認してみてください。
ファイルの最後のレコードから前に向かって、各レコードに元のバッチファイルの一行がそれぞれ書き込まれていることが確認できるはずです。

このあと大分県のH様からお送りいただいた/BATの実行例をお見せするつもりだったのですが、本日は時間がなくなってしまいましたので、それは次回にさせていただきます。

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

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