MSX Datapack wiki化計画

4章 MSX-DOS2への移植の注意

 この章では、MSX-DOS1上でプログラムを作成する実力を持った方を対象にして、MSX-DOS2の機能を十分に生かしたプログラムを作る際の注意点について解説します。

 4.1 ファイルハンドルの利用

 ファイルにアクセスするには、MSX-DOS1のときにはFCBを使いましたが、MSX-DOS2ではこの他にファイルハンドルを使うことが可能です。ファイルハンドルを使ったアクセスには以下のような利点がありますので、これを使うことを強くお奨めします。

  1. カレントディレクトリ以外のファイルを扱える。
  2. FCBを保持するには37バイト必要だが、ファイルハンドルを保持するには1バイトでよい。
  3. ファイル名を「8バイトの主ファイル名と3バイトの拡張子」に整形する必要がない。

従来のFCBを使ったファイルI/Oは、以下のような手順を踏んでいました。

1 FCBを用意する。
2 _FOPEN(0FH) または_FMAKE(016H)を呼ぶ。
3 ブロックサイズを設定する(普通は1)。
4 FCBのランダム・レコード・フィールドを設定する。
5 _SETDTA(01AH)で転送アドレスを設定する。
6 RANDOM READ、WRITE(_RDBLK 027H、_WRBLK 026H)を呼ぶ。
7 _FCLOSE(010H)を呼ぶ。

これに対してファイルハンドルを使ったI/Oは以下のようになります。

1' パス名(ASCIIZ 文字列:ヌル文字で終了する文字)を用意する。
2' _OPEN(043H)または_CREATE(044H)を呼んでハンドル番号をもらう。
4' _SEEK(04AH)を読んで読みたい・書きたいバイトの所へ移動する。
6' _READ・_WRITE(048H・049H)を呼ぶ。
7' _CLOSE(045H)を呼ぶ。

 ファイルハンドルを使う場合は3'や5'はなくなっています。これは、ブロックサイズは1に固定され、転送アドレスは_READ、_WRITE時に指定されるためです。
 FCBによるI/Oと違って、ファイル名は8+3のフォーマットに直す必要はありません。またファイルハンドルを得たら以降パス名は不要です。プログラムはファイルハンドル番号(1バイト)だけを記憶していれば、その後の処理ができるようになっています。
 ASCIIZで書かれたファイル名を8+3のフォーマットに変換するには_PFILE(05CH)が便利です。「.」、「..」や「*」などの扱いも行います。
 個々のファンクションの詳細は、17.3「ファンクションの説明」を参照して下さい。

 4.2 漢字を扱う際の注意

 漢字の内部表現はシフトJISです。シフトJISは第1バイトが080H〜09FH、0E0H〜0FCHで、第2バイトが040H〜07EH、080H〜0FCHの範囲にあります。注意しなければならないのは第2バイトが、他の第1バイトコード(040H〜07EH、0A0H〜0DFH)や漢字の第1バイトの範囲と重なっていることです。その結果、1バイトを見ただけでは、それがどんな文字か判らないということになります。
 00H〜03FH、および07FHは、漢字の第1バイト、第2バイトのどちらとも重なっていないので、1バイト見ただけで漢字ではないと判断できます。しかし、それ以外の場合、は漢字かどうかを判断することはできません。
 つまり、どんな文字かを知るためには、00H〜03FH、07FHが見つかったところから、順番にチェックしていかなければなりません。例えば漢字テキストファイルのある場所からファイルの先頭に向かって、ある文字を検索する、などの作業は決して簡単なものではありません。単に現在のスクリーンモードがANKモードか漢字モードかを調べるには、拡張BIOSコールを使います。A=0、D=011H、E=0にして0FFCAHを呼び、A=0で戻ってきたらANKモードです。ただし、このときSPはページ1以外になければなりません。
 文字の属性などを調べるには_CHKCHR(05DH)のファンクションコールを使います。調べる文字列内の文字を順番にこのファンクションに渡すことにより、文字の種類を判別できます。ANKモードか漢字モードかの判断は、このファンクション中で行われるので、呼び出す側はモードを調べる必要ありません。
 漢字を含むパス名やファイル名を判断するのには_PARSE(05BH)、_PFILE(05CH)を使います。漢字の第2バイトが「\」(05CH)である場合でも、このファンクションが適切な処理を行います。ANKモードか漢字モードかの判断は、このファンクション中で行われるので、呼び出す側はモードを調べる必要がありません。

 4.3 I/Oコントロールの利用

 アプリケーションによって、スクリーンのサイズや、出力がスクリーンにいくのかファイルまたはデバイスにいくのかが問題になる場合があります。_IOCTL(04BH)はこのためのファンクションで、今まで0F3B0H(LINLEN)を見て判断していたプログラムは、このファンクションを使うように変更することが望ましいでしょう。

 4.4 環境変数の利用

 アプリケーションによっては、環境変数を使うことによって操作性や性能が大幅に向上するものがあります。例えばテンポラリファイルを作成するディレクトリの指定などがあります。環境変数を扱うファンクションには、_GENV(06BH)、_SENV(06CH)、_FENV(06DH)があります。
 環境変数それ自体はアプリケーションから直接見える空間にはなく、カーネルのデータセグメントにあります。これらのファンクションは、環境変数とアプリケーション空間との橋渡しをするものです。