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

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

[第70回]

●メールをいただきました

今回はBIOSのコンソールステータス取得ルーチンの変更作業について書くつもりだったのですが、予定変更です。

CP/Mシステムをご発注いただいておりますY様からメールをいただきました。
[第68回]で、「ファンクションコール0BHは、ただキー入力の有無をチェックするだけにも使える(それに何の意味があるか疑問ですが)…」と書きましたことへのご指摘です。

Y様は当時の事情に精通してみえて、ときどきいただくメールはとても参考になります。
以下、いただきましたメールからそのまま引用させていただきます。

☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆

現在のPCのようにキーボードやビデオディスプレィが直接つながっていなかったのが、CP/Mの初期の時代です。

この頃は、大型コンピュータやミニコンと同じく、コンピュータとオペレーターとのやり取りは全てシリアル通信によるコンソールタイプライター経由でした、

110bpsのシリアる通信で接続されているコンソールタイプライターには、現在のパソコンのようなキーボードスキャンルーチンやキーボード割り込みがありません。

プログラムが想定外の処理に入ったりした場合に、プログラムを途中で中断するときには、コンソールタイプライターにある「Break」キーを押してプログラムを中断しました。

BASICマシンの「Ctrl-C」や、WindowsPCの「Ctrl+Alt+Delete」のような機能を持ったのがコンソールタイプライターにある「Break」キーでした。

「コンソールステータスチェック」は、この「Break」キーをチェックする機能もあったと思います。
(記憶違い、勘違いの可能性もあります。間違っていたらごめんなさい)

CP/M出現以前である1975年発売のAltair8800にAltair BASIC(後のマイクロソフトBASIC)を走らすときのBIOS部分はたった3個のルーチンでした。

OSも無い時代でしたから直接BASICが動きました。

このBASICのBIOSは、完全にうる覚えですが・・・・

INCH     コンソールタイプライターから1文字読み込み (キーが押されるまで待機)
OUTCH    コンソールタイプライターに1文字出力
(名前忘れ) キーボードポーリングルーチン コンソールタイプライターに入力があるかどうかチェック

この3箇所をパッチするだけでAltair BASIC(後のマイクロソフトBASIC)をTK−80BSで動かすことができました。(メモリ配置などは除く)

キーボードスキャンが出来ない、タイプライターとのシリアル通信だけのコンピュータ側にはオペレーターからの呼び出しや、プログラム停止を受け付けるためにコンソールタイプライターのキーボードポーリングルーチン=コンソールステータスチェックが必要でした。

CP/Mやアプリケーションプログラムは、時々、このキーボードポーリングルーチンを実行して、オペレーターからの呼び出しや、プログラム停止を受け付ける必要がありました。

CP/Mやプログラムが暴走してキーボードポーリングルーチン=コンソールステータスチェックが実行されなくなると、コンソールパネルのリセットスイッチの出番となります。

1970年から77年当時の標準的なコンソールタイプライターであるテレタイプ社のASR−33のキーボードには、「Break」キーがあります。
http://www.pfu.co.jp/hhkeyboard/kb_collection/images/asr33.gif

1970年代のコンピュータの操作方法についてはASR−33のキーボードを見ると理解が進むと思いますが、この「Break」キーがどのようなコードを出力していたか情報がありません。

「Break」キーについて検索するとPCキーボードにある「Pause/Break」キーの情報しか出てきません。

現在の「Pause/Break」キーと、タイプライターに在った「Break」キーは全く異なるものですが、PCキーボードにある「Pause/Break」キーは、大昔のASR−33のキーボードに在った「Break」キーの進化系だと思います。

CP/Mの時代は、紙テープの制御コードなども利用されていたので、現状のASCIIコードの制御系や、PCのコントロールコード(ショートカット)とは異なる伝統的な制御系が利用されていました。

紙テープの制御コードである、デバイスコントロール No3(Ctrl−S)なども割り込み制御コードに利用されていたと思います。

CP/Mマシンには、BASICマイコンの頃や、現在のWindowsPCとは異なるコントロールコードが適用されていたと思いますので、WindowsPCをコンソールにして、CP/Mマシンを操作する場合は、1970年代当時のコントロールコードの対応が必要と思います。

以上、怪しい記憶をまとめましたので間違っている可能性がありますので参考程度にしてください。

☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆

Y様、毎回詳細な情報をお送りいただき有難うございます。
また今回はファンクションコール0BHについて、的確なご指摘をいただき有難うございました。

Y様にご指摘いただいて、初めて気が付きました。
それまではファンクションコール0BHの目的がいまひとつはっきり理解できずに、「なんでこんな面倒なことをしているのだろう。INKEY$的な使い方ならファンクションコール06でも間に合うはずなのに…」と思っておりました。

ファンクションコール0BHは、システムやアプリケーションの実行中に、それを強制終了させる目的で使われていたようです。
実は。
ファンクションコール0BHには、そのような機能(コントロールコードのチェック)があるらしいことは、うすうす認識してはいたのですが、その機能がそういう目的で使われる、というところにまでは、考えが及びませんでした。

前回お見せしましたCP/Mソースリストのその部分(CKCONSOL)を、もう少し下までお見せします。



1379のCALL CNTRLSで、Ctrl−Sの入力をチェックしています。
Ctrl−Sの入力を検出すると、BIOSのCONIN(コンソール入力)をコールし、Cntl−Cの入力をチェックします。
Ctrl−Cが検出されると、そこでシステムがリブートされます。

なお、この部分はデバッグのため、今のところリブートではなくて、ZB3BASICへのリターンにしてあります。

ファンクションコール0BHはシステムブレイクのために用意されていたのですねえ。
気が付きませんでした。
Ctrl−S([Ctrl][S])は、画面表示などの一時停止に使われます。
Ctrl−Sを入力することで、一時停止しておいて、そこでCtrl−Cを入力すれば、プログラムの実行を強制終了させられます。

あ。
今のところは、都合により[Ctrl][C]の代わりに[Ctrl][D]を使うようにしてあります。

[第68回]では、「わざわざファンクションコール0BHなどを使わなくても、ファンクションコール06を使えば済むのに…」などと書いていたのですけれど、これでやっとファンクションコール0BHの目的がはっきりしました。

ファンクションコール06については、のちほど説明しますが、入出力両方に使える、コンソールアクセスルーチンです。
ファンクションコール01はキー入力されるまでそこで待っていますが、ファンクションコール06はキー入力が無ければすぐにリターンしてきます。
しかしファンクションコール06は、システム内部ではCtrl−S、Ctrl−Cなどのチェックは行ないませんから、必要ならユーザーがそのようなプログラムを組まなければなりません。
そこのところがファンクションコール0BHを使ったコンソールステータスのチェックとファンクションコール06を使ってコンソールステータスをチェックすることの大きな相違点だったのです。

納得。です。

あ。
そうでした。
忘れるところでした。

[Pause/Break]キーについてです。
今回のメールをいただくまで、そんなキーがあることなど全く知りませんでした。
「なんじゃ、そりゃ」ということで、キーボードを眺め回してみて、やっとみつけました。
キーボードのレイアウトによって相違があるかも知れませんが、一番上の列の右端にありました。

むむむ。
何だ。このキーは?
ということで、調べてみましたら。

どうやらこのキーは、たとえばユーザープログラムの実行によって、画面に連続して文字を表示しているときなどに、それを一時停止させるときなどに使うようです。
このキーを押すと画面表示が停止(pause)します。
何かキーを押すとpauseが解除されて表示が再開されます。
停止しているときに[Ctrl][C]を入力すると、ブレイクします。
また表示などの実行中に、[Ctrl]キーとともに[Pause]を押すと、ブレイクします。

このキーは、たとえばgetch()などでコードを取得しようとしても、できません。
Win32APIなどですと[Pause]のキーコードを取得することもできるようです。
そうすると、[Pause]キーを利用してCP/Mの実行を停止させることなどもできるのかもしれませんが。
まあ、しかし。
CP/Mではせっかくのファンクションコール0BHの機能をそのまま利用して、[Ctrl][S]でポーズ、そしてそのあと[Ctrl][C]でブレイクする、というのがスタンダードでよろしいのではありませんでしょうか。

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

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