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

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

[第438回]


●TURBO PASCAL(2)

前回からの続きです。
ファイルの読み書きをするのにCP/MではDMAバッファというものを使います。
フロッピーディスクのアクセスは制御が複雑なので、専用のLSIを使いました。
一般にFDC(フロッピーディスクコントローラ)と呼ばれていました。
CPUとFDCとの間のデータのやりとりは、フロッピーディスクのアクセスには時間がかかるため、通常のI/Oアクセスを使うとCPUの処理能力ががくんと落ちてしまいます。
そこでDMA(Direct Memory Access)方式で行なうことが一般的でした。
CP/MはフロッピーディスクをベースにしたOSなので、ファイルの読み書きは、そのDMAバッファを経由して行ないます。
デフォルトのDMAバッファは0080H〜00FFHの128バイトですが、メモリ上の空いているところならばどこにでもDMAバッファを置くことができます。
DMAバッファのアドレスを設定するときはファンクション1AHをコールします。

ところでファイルの読み書きをするときには、データを置くためのDMAバッファとは別に、ディスクのディレクトリエリアを読み込んでファイル名をサーチしたり、新規にファイル名を登録するという作業が必要になります。
それをデータ用のDMAバッファを使って行なうと、ディレクトリを読み込んだときにデータを破壊してしまいます。
それを避けるためCP/MではDMAバッファとは別にDIRバッファを用意して、ディレクトリを読み書きするときはそのDIRバッファを経由する、というシステムになっています。

それではデータ用のDMAバッファとディレクトリ用のDIRバッファとは完全に別物か、といいますとちょいと悩ましいことに、最初のファイル名サーチ(ファンクション11H)や次のファイル名サーチ(ファンクション12H)ではDMAバッファにディレクトリが読み込まれてしまうのです。
それじゃあ困るではないの?
んでも、これはまあファイル名サーチの結果、それをどのように利用するかを考えてみますと、そのようにせざるを得ない事情も見えてきますので、仕方がないことなのであります。
そういう仕様になっている以上、ユーザーはそのときデータを破壊されてしまわないように、DMAバッファアドレスを適宜変更してバッティングするのを避けるようにすることが求められます。

実は、そのあたりの仕様をふまえてZB3DOS(CP/M互換DOS)を作り上げていく過程で、どうせディレクトリを格納するのにもDMAバッファが使われるのなら、工夫すればDIRバッファを使わなくてもDMAバッファだけでもできるのではないか、というとんでもないことを思いついて、それを実施してしまっておりました。
全然なしというわけにはいきませんので、バッティングするときだけは、バッファのバッファにバックアップするという面倒なプログラムを書いてしまいました。

それはそれで問題なく機能しておりましたが、そこで起きてしまいましたのが、今回のTURBO PASCALのトラブルです。
おかしいじゃないの?
ファイルサーチをすれば、DMAバッファが破壊されるのは当たり前で、そんなところにジャンプテーブルを置くなんて、TURBO PASCALの開発者は何を考えているのだ?
ま、そこを使ってはならぬということはありませんから、そのようにするのは自由でありますが、それなら少なくともファイルOPENよりも前にDMAバッファを別のところに設定しているはず、と思ったのでありますが。
といいますのも、デフォルトではDMAバッファはシステムによって必ず0080Hに置かれてしまいますから、今回のように0080H〜のエリアをDMAバッファ以外の目的に使うということでありましたら、ファイルにアクセスするよりも前にDMAバッファを別のアドレスに指定しておかなくてはならないというのがものの道理です。

しかし、しかし。
ブレークポイントを設定してTURBO PASCALの動きを起動時から追跡してみましたところ、なんとDMAバッファのアドレス変更がまったく行なわれないままファイルOPENが実行されてしまいました。
ファイルOPEN(ファンクション0F)ではファイル名サーチがコールされています。
そのため、ファイルOPENによってDMAバッファに置かれていたジャンプテーブルが破壊されて、暴走してしまうという結果になったのでありますが。

H様のメールによりますと、CP/Mエミュレータですかシミュレータでありますか、そちらで実行してみると、暴走などしない、とのことなのですね。
んな、ばかな。

こういう場合。
ばかなのは決まって私でありまして。

よーく調べてみましたら、どうやらCP/Mでは、DMAバッファにディレクトリが書き込まれるのはファイル名サーチ(ファンクション11H)と次のファイル名サーチ(ファンクション12H)だけで、ファイルOPEN(ファンクション0F、ファンクション16H)やファイルCLOSE(ファンクション10H)ではDMAバッファは変化しない、ということがわかりました。
もっとよくCP/Mのソースプログラムリストを読んでみましたら、ファイル名サーチ(ファンクション11H)と次のファイル名サーチ(ファンクション12H)のときに限って、わざわざDIRバッファからDMAバッファへのコピーが行なわれていることがわかりました。

むむむむ。
そーいうことだったのか。

そこで。
ZBDOSプログラムを大幅に変更して、DIRBFとDMABFを分離しました。
これは、しかし相当に大幅なプログラム変更だったため、この後も尾を引くことになるのでありますが、それは後日のお話です。
ともあれ、そのように変更しました結果、TURBO PASCALが正常に動作するようになりました。

あ。
その説明の前に。

●またESCシーケンスを追加しました

前回のTURBO PASCALの起動画面をご覧になってお気付きになられたかも知れません。

画面をよく見ますと [0m とか [1m とかという文字が表示されています。
また新たなエスケープシーケンスです。

調べてみましたら、ESC[1m は太字指定でESC[0mは文字修飾をもとに戻すエスケープシーケンスでした。
この仲間にはそのほかに以下のものがありました。
ESC[4m 下線付き
ESC[5m 点滅
ESC[7m 白黒反転
しかしESC[0m以外はちょっと無理ですから、ESC[1m〜ESC[7mはいずれも文字の色指定を白にしました。
明るい白ですので、太字のように見える効果があります。
こんな感じになりました。

この太字(実は明るい白)は、TURBO PASCALを使うと指定され、その後もずっと指定されたままになります。
ZB3[Enter]でCP/Mモードを終了してZB3BASICに戻ると、通常の表示に戻ります。

TURBO PASCALのエスケープシーケンスにはまだ続きがあるのですが、本日は時間がなくなってしまいましたので、この続きは次回にすることにいたします。

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

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